Можно ли создать декартову сетку 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.
Есть ли способ сделать это?