mpi4py busy idle 问题 + 变通方法
在测试mpi4py发现,对于一些已经执行完所有代码的process,其CPU的占用仍为100%,比如
测试代码(文件test.py):
#!/usr/bin/env python3
import mpi4py.MPI as mpi
import time
comm = mpi.COMM_WORLD
rank = comm.Get_rank()
if (rank == 0):
time.sleep(15)
在终端执行: mpirun -np 3 ./test.py,发现rank=0的进程处在sleep,CPU占用为0,而其他两个进程CPU占用却为100%,如图:
变通方法:
#!/usr/bin/env python3
import mpi4py.MPI as mpi
import time
class mpiComm(mpi.Intracomm):
def __new__(cls, comm=mpi.COMM_WORLD, recvSleep=0.1):
self = super(mpiComm, cls).__new__(cls, comm.Dup())
self._recvSleep = recvSleep
return self
def recv(self, source=0, tag=0, status=None):
sts = mpi.Status()
whilenot self.Iprobe(source=source, tag=tag, status=sts):
time.sleep(self._recvSleep)
return super(mpiComm, self).recv(source=sts.source, tag=sts.tag, status=status)
comm = mpiComm()
rank = comm.Get_rank()
nproc = comm.Get_size()
if (rank == 0):
time.sleep(15)
for i in range(1, nproc):
comm.send(None, dest=i, tag=1)
else:
comm.recv(source=0, tag=1)
测试效果: