MPI4PY - 如何避免通信错误

2024-06-02 18:39:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用过MPI代码,并且对这些概念有一些基本的想法,但是我自己从来没有做过任何MPI开发。我从并行化我的一些python代码开始。以下是我要做的事情:

IMPORT STUFF
...
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
status = MPI.Status()
comm.Barrier()
## CREATE EMPTY ARRAYS
if rank == 0:
   t_start=MPI.Wtime()
   tt =np.zeros(nt)
   ezp=np.zeros(nt)
   ezm=np.zeros(nt)
## NUMBER CRUNCHING LOOP
for it in range(rank,nt,comm.size):
   ...
   DO SOMETHING
   ...
## IF RANK == 0, POPULATE OWN PARTS OF ARRAY
   if rank == 0:
      tt[ it] = ltt
      ezp[it] = lezp
      ezm[it] = lezm
   if rank > 0:
   ## IF RANK != 0, SEND DATA TO PROC 0
      snddata=[it,ltt,lezp,lezm]
      comm.send(snddata, dest=0, tag=13)
   else:
#  IF RANK == 0, RECEIEVE THE DATA FROM ALL PROCS AND POPULATE
#  CORRESPONDING ARRAY ELEMENTS
      for src in range(1,comm.size):
         rcvdata=comm.recv(source=src,tag=13,status=status)
         tt[ rcvdata[0]] = rcvdata[1]
         ezp[rcvdata[0]] = rcvdata[2]
         ezm[rcvdata[0]] = rcvdata[3]
comm.Barrier()
...
WRITE THE RESULTS tt[:], ezp[:], ezm[:] TO FILE

我运行代码

^{pr2}$

问题是有时循环分解并不能为proc提供相同大小的循环。E、 g.如果nt=21,我使用2个procs,proc0循环:

^{3}$

程序1循环:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

因此,对于it=20,proc0会一直等待proc1的消息,而proc1什么也没有做。很明显,对于任何不具有nt%np=0的nt和np的组合,我得到了这个问题。在

在这种情况下,设置通信的好方法是什么?在

谢谢!在


Tags: 代码sizeifstatusnpzerositcomm
1条回答
网友
1楼 · 发布于 2024-06-02 18:39:21

首先想到的方法是在一个(或两个)调用中发送所有数据。在

  • 如果存在“最有可能”的状态,则接收最可能的状态。发送者将发送它所拥有的,但是可以接收少于请求的数量。

  • 如果这不可行,那么使用两条消息:一条发送/接收对交换一个int,即下一条消息中期望的值的数量。那么下一条消息有那么多值。

您没有明确要求,但您的代码以“将结果写入文件”结尾。也许你可以避免同时发送/接收?如果您所做的只是收集排名为0的答案,那么您可能需要研究MPI-IO方法,并让每个进程直接写入该文件。在

相关问题 更多 >