我需要制作一个基于笛卡尔拓扑的矩阵乘法算法。其中 1 个进程应该是主进程,用于检查结果。我可以用什么来将他从虚拟拓扑中删除?
问题来自于使用 MPI_Cart_shift 函数。
void self_checking(int N, int num_procs)
{
MPI_Status status;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Group world_group;
MPI_Comm_group(MPI_COMM_WORLD, &world_group);
int *ranks = (int *)malloc((num_procs - 1) * sizeof(int));
for(int i = 0; i < num_procs - 1; i++)
{
ranks[i] = i;
}
MPI_Group new_group;
MPI_Group_incl(world_group, num_procs - 1, ranks, &new_group);
MPI_Comm old_comm_2d, comm_2d;
MPI_Comm_create(MPI_COMM_WORLD, new_group, &old_comm_2d);
int *dims = (int *)malloc(2 * sizeof(int));
int *periods = (int *)malloc(2 * sizeof(int));
dims[0] = dims[1] = sqrt(num_procs - 1);
periods[0] = periods[1] = 1;
MPI_Cart_create(old_comm_2d, 2, dims, periods, 1, &comm_2d);
if(rank == num_procs - 1)
{
printf("My rank is %d\n", rank);
}
else
{
int *coords = (int *)malloc(2 * sizeof(int));
MPI_Comm_rank(comm_2d, &rank);
MPI_Cart_coords(comm_2d, rank, 2, coords);
srand((unsigned int)time(NULL) + rank);
int leftrank, rightrank, uprank, downrank;
MPI_Cart_shift(comm_2d, 0, -1, &downrank, &uprank);
MPI_Cart_shift(comm_2d, 1, -1, &rightrank, &leftrank);
printf("My rank is %d, left %d, right %d, up %d, down %d\n", rank, leftrank, rightrank, uprank, downrank);
}
}
这里我需要有 p^2+1 个进程,其中 1 个是主进程,它将 2 个矩阵相乘以检查其他进程是否正确执行。但这里 MPI_Cart_shift 给出了一个错误,因为它多了 1 个进程。
如果你要求
MPI_Cart_create
制作一个 4x3 的网格,并且给它 13 个进程,那么一个进程将产生一个结果 MPI_COMM_NULL
。您可以使用该进程作为管理器进程。无需先MPI_Comm_split
。