Частично заполненная декартова сетка MPI - PullRequest
0 голосов
/ 21 апреля 2020

Можно ли создать декартову сетку MPI, которая только "частично" заполнена узлами? Следующий фрагмент кода обобщает проблему. Я создаю сетку 4x4 и запустил программу только с 15 процессорами, что вызывает ошибку «MPI_ERR_DIMS: неверное измерение топологии».

Ниже приведен код, который воспроизводит ошибку (при запуске с несколькими процессорами). менее 4x4 = 16):

MPI_Comm
create_topology(int size)
{
    MPI_Comm grid;
    int dims[2] = {4,4};
    int periods[2] = {0,0};

    MPI_Dims_create(size, 2, dims);
    printf("dims = {%d,%d}", dims[0], dims[1]);
    MPI_Cart_create(MPI_COMM_WORLD, 2, dims,
        periods, 0, &grid);

    return grid;
}

int
main(int argc, char** argv)
{
    MPI_Comm topo;
    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    /* Initializing the grid */
    topo = create_topology(size);

    /* Printing coordinates */
    int coords[2];
    MPI_Cart_coords(topo, rank, 2, coords);

    if(rank == 0) {
        printf("Root:    [%d] -> [%d,%d]\n",
            rank, coords[0], coords[1]);
    } else {
        printf("Process: [%d] -> [%d,%d]\n",
            rank, coords[0], coords[1]);
    }

    MPI_Finalize();
    return 0;
}

Я также попытался напрямую передать массив dims [] {4,4}, не используя функцию MPI_Dims_create, которая вызвала MPI_ERR_ARG из MPI_Cart_create.

Есть ли способ сделать это?

...