MPI Communicators管理

时间:2014-02-21 16:28:52

标签: c++ mpi

问题是这个程序是否正确?

假设我想将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? 如果我想重建另一套传播者,我应该如何释放传播者? 一个过程应该只释放它所属的传播者吗?

有人可以解释这个程序是否正确? 我对这种集体创作惯例有点不确定......

非常感谢!

1 个答案:

答案 0 :(得分:3)

听起来你可能正在以艰难的方式做事。

将大型通信器拆分为许多非重叠子通信器的最佳方法是使用MPI_COMM_SPLIT。原型看起来像这样:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

将在同一个子通讯员中的每个人都贡献相同的color。然后key用于排列子通信器中的等级。如果您想维持订购,可以使用原始等级。

在致电MPI_COMM_SPLIT之前,您唯一需要做的就是使用masterMPI_BCAST流程中的群组号码广播给其他人。