没有 1 个进程的 MPI 笛卡尔拓扑

问题描述 投票:0回答:1

我需要制作一个基于笛卡尔拓扑的矩阵乘法算法。其中 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 个进程。

c mpi
1个回答
0
投票

如果你要求

MPI_Cart_create
制作一个 4x3 的网格,并且给它 13 个进程,那么一个进程将产生一个结果
MPI_COMM_NULL
。您可以使用该进程作为管理器进程。无需先
MPI_Comm_split

© www.soinside.com 2019 - 2024. All rights reserved.