我想将MPI_comm_world
分成较小的传播者,所以我学会了使用this link中的MPI_Comm_split
我在这里复制代码,它显示了如何将MPI_comm_world
拆分为4色
// Get the rank and size in the original communicator
int world_rank, world_size;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int color = world_rank / 4; // Determine color based on row
// Split the communicator based on the color and use the
// original rank for ordering
MPI_Comm row_comm;
MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm);
int row_rank, row_size;
MPI_Comm_rank(row_comm, &row_rank);
MPI_Comm_size(row_comm, &row_size);
printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n",
world_rank, world_size, row_rank, row_size);
MPI_Comm_free(&row_comm);
现在,如果我将我的任务分配给不同颜色的通信器,并且每个任务在其颜色域中并行。每个任务还有一个文件写入操作。
通常情况下,如果只有MPI_comm_world
,我们会使用if(world_rank==0)
来保证只有一个进程同时进行写作。
但是,现在我们有不同的颜色,每种颜色都有自己的工作,必须将自己的结果写入文件。
if(color_rank==0)
显然还不够。
那么保证来自不同沟通者的两个流程同时进行写作的最佳方法是什么?