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)

   

测试效果:



posted @ 2017-02-27 14:42  F.Feng  阅读(157)  评论(0编辑  收藏  举报