2016-05-11 17 views
1

代码:为什么Gather()失败,如果每个进程的根本身是自己的?

#mpiexec -n 2 python3 gather.py 
from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

a = 1 
comm.barrier() 
b = comm.gather(a, root=rank) 
print("b:", b, rank) 
comm.barrier() 

输出应为:

B:[1,1],0

B:[1,1],1

然而,程序不会打印任何内容并且不会终止。这是什么原因以及如何实现理想的输出?

+0

我认为_every_进程应该指定相同的根(以便他们都知道在哪里发送数据)。现在,每个进程都将自己定义为根,所以他们都认为他们是接收者,只是坐在那里等待别人发送数据。 – mgilson

+0

@mgilson这听起来合乎逻辑。你知道我还有什么可以达到预期的结果吗?我不想使用AllGather()顺便说一句。 – SpiderRico

+0

我认为这取决于期望的结果_is_。通常,想法是将其他进程上的所有数据收集到指定的进程。你知道你想收集数据的过程吗? – mgilson

回答

1

MPI中的所有集体操作必须由各自的通信器中的所有进程调用。许多参数在所有进程中必须相同。该参数的语义非常有据可查的MPI standard

的argumentsroot和comm必须对所有 过程相同的值。

但是接着又有MPI_Allgather,之后所有的数据在所有进程上都可用 - 即没有根。

相关问题