mpi4py的gather会创建与rank匹配的元素列表吗?
我在一个程序中使用mpi4py。
我用多个核心(n>1)来运行这个程序,每个核心都有自己的数字列表,我们可以称之为“核心特定列表”(core_specific_list)。
我想让排名为0的核心把所有的列表收集到一个大列表中,我们可以称之为“总列表”(big_list)。
我开始程序时(只是为了定义变量):
from mpi4py import MPI
comm = MPI.COMM_WORLD
为了创建这个总列表,我让每个核心调用:
big_list = comm.gather(core_specific_list, root = 0)
这样做确实如预期那样创建了总列表(其中每个元素都是其他核心的核心特定列表)。而且看起来每个列表元素的顺序是按照发送它的核心的排名来的(也就是说,总列表的第0个元素是排名为0的核心的核心特定列表,依此类推)。
问题:但这个假设是正确的吗?也就是说,总列表中的第j个元素是排名为j的核心的核心特定列表吗?(我知道我可以在某些情况下进行测试,就像我做的那样,但我需要确保我可以完全依赖这个假设)
谢谢。
1 个回答
3
你可以完全信赖这个行为,因为这正是MPI_GATHER
(通过comm.gather
调用)工作的方式。根据MPI标准第5.5节的内容:
根进程会接收消息,并按照进程的排名顺序存储这些消息。
...
另一种说法是,来自这个组的
n
条消息会按照排名顺序连接在一起,最终的消息就像通过调用MPI_RECV(recvbuf, recvcount·n, recvtype, ...)
一样被根进程接收。