制作一个跨越所有进程的通信器,进程零包括进程零

Making a communicator that spans all process exept process zero includes process zero

一些人和我正在尝试模拟游乐园,我们几乎完成了所有工作,除了一件事:我们需要实施同步屏障,但我们需要一个通信器,它需要包含除等级为零的进程外的每个进程。我正在使用 MPI_Group_excl() 来告诉一个组不应该有进程零。这是我创建组和通信器的代码片段:

MPI_Group nonzero_group, world;
MPI_Comm_group(MPI_COMM_WORLD,&world);
int zero[1];
zero[0]=0;
MPI_Group_excl(world,1,zero,&nonzero_group);
MPI_Comm nonzero;
MPI_Comm_create(MPI_COMM_WORLD,world,&nonzero);

但是当我使用 MPI_Bcast() 从进程 1 到 'nonzero' 通信器中的所有进程测试我的程序时,进程 0 执行广播并获取缓冲区。

如何创建一个从 1 到 N 的所有进程都没有进程为零的组?

这可以通过 MPI_Comm_split()

实现
int world_rank;
MPI_Comm comm;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_split(MPI_COMM_WORLD, (0 == rank)?MPI_UNDEFINED:0, 0, &comm);

MPI_COMM_WORLD 排名 0commMPI_COMM_NULL。它是您在其他队伍中期望的有效沟通者。