def _update_ready(self):
if self.comm.rank == 0:
while self.comm.Iprobe(source=MPI.ANY_SOURCE, tag=MPI_TAG_READY):
buf = numpy.empty(1, dtype='i')
self.comm.Recv([buf, MPI.INT], source=MPI.ANY_SOURCE, tag=MPI_TAG_READY)
rank = buf[0]
self._closing_ranks.append(rank)
log_debug(logger, self._log_prefix + "Received closing signal from rank %i (%i/%i)" % (rank,len(self._closing_ranks),self.comm.size))
if len(self._closing_ranks) == self.comm.size:
for i in range(1, self.comm.size):
send_buf = numpy.array(1, dtype='i')
self.comm.Send([send_buf, MPI.INT], dest=i, tag=MPI_TAG_READY)
recv_buf = numpy.empty(1, dtype='i')
self.comm.Recv([recv_buf, MPI.INT], source=i, tag=MPI_TAG_READY)
self._ready = True
log_debug(logger, self._log_prefix + "Master sent out ready signals to slaves")
else:
if self.comm.Iprobe(source=0, tag=MPI_TAG_READY):
recv_buf = numpy.empty(1, dtype='i')
self.comm.Recv([recv_buf, MPI.INT], source=0, tag=MPI_TAG_READY)
send_buf = numpy.array(1, dtype='i')
self.comm.Send([send_buf, MPI.INT], dest=0, tag=MPI_TAG_READY)
self._ready = True
log_debug(logger, self._log_prefix + "Slave rank %i received ready signals from master" % self.comm.rank)
评论列表
文章目录