问题是这个程序是否正确?
假设我想将p
中的所有MPI_COMM_WORLD
进程拆分为几个非重叠的通信器。
我通过确定一个等级m
上的master
组来执行此操作。主等级确定哪些过程需要通信,哪些不需要(基本上分析图表)。
最后,master
排名确定了我想要构建m
个传播者的m
个进程排名组。
假设我将这些m
排名组的结果发送给所有流程。
正如我发现的那样,MPI_COMM_WORLD中的所有进程都需要使用MPI_Group_?
命令创建所有这些组(即使它们不属于该组,(愚蠢?))然后创建每个通信器MPI_Comm_create
集体。
现在的问题是:流程对不属于的所有传播者做了什么,这个过程不需要哪些,但是需要它们要调用m
- 乘以集体MPI_Comm_create
函数吗?
我们可以简单地忽略所有MPI_Comm
指针并仅存储此进程所属的指针吗?不需要调用MPI_Comm_free
?
如果我想重建另一套传播者,我应该如何释放传播者?
一个过程应该只释放它所属的传播者吗?
有人可以解释这个程序是否正确? 我对这种集体创作惯例有点不确定......
非常感谢!
答案 0 :(得分:3)
听起来你可能正在以艰难的方式做事。
将大型通信器拆分为许多非重叠子通信器的最佳方法是使用MPI_COMM_SPLIT
。原型看起来像这样:
int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
将在同一个子通讯员中的每个人都贡献相同的color
。然后key
用于排列子通信器中的等级。如果您想维持订购,可以使用原始等级。
在致电MPI_COMM_SPLIT
之前,您唯一需要做的就是使用master
将MPI_BCAST
流程中的群组号码广播给其他人。