C++ MPI通讯器管理

C++ MPI通讯器管理,c++,mpi,C++,Mpi,问题是这个程序是否正确 假设我想将MPI\u COMM\u WORLD中的所有p进程拆分为几个不重叠的通信程序。 我通过确定一个级别上的m组master来实现这一点。主等级决定哪些进程需要通信,哪些进程不需要通信(基本上分析图表)。 最后,master列组已确定了我要与之构建m通讯器的m进程列组。 假设我将这些mrank组的结果发送给所有进程 正如我所发现的,MPI_COMM_世界中的所有进程都需要使用MPI_Group命令创建所有这些组(即使它们不属于该组,(愚蠢地?),然后使用MPI_COM

问题是这个程序是否正确

假设我想将
MPI\u COMM\u WORLD
中的所有
p
进程拆分为几个不重叠的通信程序。 我通过确定一个级别上的
m
master
来实现这一点。主等级决定哪些进程需要通信,哪些进程不需要通信(基本上分析图表)。

最后,
master
列组已确定了我要与之构建
m
通讯器的
m
进程列组。 假设我将这些
m
rank组的结果发送给所有进程

正如我所发现的,MPI_COMM_世界中的所有进程都需要使用
MPI_Group
命令创建所有这些组(即使它们不属于该组,(愚蠢地?),然后使用
MPI_COMM_create
共同创建每个通信器

现在的问题是:一个进程如何处理它不属于
且该进程不需要的所有通讯器,但它们需要调用
m
-乘以集体
MPI\u Comm\u create
函数

我们是否可以忽略所有的
MPI\u Comm
指针,只存储该进程所属的指针?无需调用
MPI\u Comm\u free
? 如果我想重建另一组通讯器,我应该如何释放通讯器? 进程是否应该只释放它所属的通信器

有人能解释一下这个程序是否正确吗? 我有点不确定这个集体创作惯例


非常感谢

听起来你可能做得很艰难

将大型通信器拆分为多个不重叠的子通信器的最佳方法是使用。原型如下所示:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
将在同一个子单元中的每个人贡献相同的
颜色。然后使用
在子通信程序中排列列组。如果您想保持顺序,可以使用原始排名


在调用
MPI\u COMM\u SPLIT
之前,您需要做的唯一一件事是使用
MPI\u BCAST

将组号从
master
进程广播给其他所有人。听起来您可能做得很艰难

将大型通信器拆分为多个不重叠的子通信器的最佳方法是使用。原型如下所示:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
将在同一个子单元中的每个人贡献相同的
颜色。然后使用
在子通信程序中排列列组。如果您想保持顺序,可以使用原始排名


在调用
MPI\u COMM\u SPLIT
之前,您需要做的唯一一件事是使用
MPI\u BCAST

将组号从
master
进程广播给其他所有人。听起来您可能做得很艰难

将大型通信器拆分为多个不重叠的子通信器的最佳方法是使用。原型如下所示:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
将在同一个子单元中的每个人贡献相同的
颜色。然后使用
在子通信程序中排列列组。如果您想保持顺序,可以使用原始排名


在调用
MPI\u COMM\u SPLIT
之前,您需要做的唯一一件事是使用
MPI\u BCAST

将组号从
master
进程广播给其他所有人。听起来您可能做得很艰难

将大型通信器拆分为多个不重叠的子通信器的最佳方法是使用。原型如下所示:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
将在同一个子单元中的每个人贡献相同的
颜色。然后使用
在子通信程序中排列列组。如果您想保持顺序,可以使用原始排名



在调用
MPI\u COMM\u SPLIT
之前,您需要做的唯一一件事是使用
MPI\u BCAST

将组号从
master
进程广播给其他所有人,这是一个很好的答案,但对我的问题并没有真正的帮助。我知道我可以使用这个函数进行拆分,如果可以,我也可以使用这个函数。在这种情况下,我不能。我在思考上述问题,我对创建和释放通讯器非常不确定。我想我不明白为什么需要创建一组额外的通讯器。MPI_Comm_创建不是集体的吗进程需要调用此函数来创建新的通信器,即使它不属于新的通信器,这就是它变得奇怪的地方!没错。如果您正在使用一个新的MPI实现,那么有一个新函数可以使用,名为
MPI\u COMM\u CREATE\u GROUP
,它不需要任何人参与。啊,谢谢你,我会看看这个函数=)很高兴知道!回答得很好,但对我的问题没有帮助。我知道我可以使用这个函数进行拆分,如果可以,我也可以使用这个函数。在这种情况下,我不能。我在思考上述问题,我对创建和释放通讯器非常不确定。我想我不明白为什么需要创建一组额外的通讯器。MPI_Comm_创建不是集体的吗进程需要调用此函数来创建新的通信器,即使它不属于新的通信器,这就是它变得奇怪的地方!没错。如果您正在使用一个新的MPI实现,那么有一个新函数可以使用,名为
MPI\u COMM\u CREATE\u GROUP
,它不需要任何人参与。啊,谢谢你,我会看看这个函数=)很高兴知道!回答得很好,但对我的问题没有帮助。我知道我可以接受这个