Мне нужно написать код, который отправляет столбцы матрицы из каждого процесса в корневой процесс.

У меня есть следующий код:

int task8(int argc, char* argv[])
{
    int rank, size;
    double matrix[100][150];
    double result_matrix[100][150];

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

    // generate matrix
    srand((int)(MPI_Wtime() * 1e4));
    for (int i = 0; i < 100; ++i)
    {
        for (int j = 0; j < 150; ++j)
        {
            matrix[i][j] = rand();
        }
    }

    if (rank != 0)
    {
        // for (int i = rank; i < 100; i += size)
        // {
        //  MPI_Gather(&matrix[i], 150, MPI_DOUBLE, &matrix[i], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        // }
        // for (int i = 0; i <= size; i++)
        // {
        //  MPI_Gather(&matrix[i], 150, MPI_DOUBLE, &result_matrix[i], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        // }
        MPI_Gather(matrix[rank], 150, MPI_DOUBLE, result_matrix[rank], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    }

    MPI_Finalize();

    return 0;
    }

Но я не понимаю, почему когда-либо выделенный пример не работает - он выдает ошибку:

C:\Users\Dima>mpiexec -n 4 D:\code\parallel\labs_exam\Project1\Debug\Project1.exe

job aborted:
[ranks] message

[0-1] terminated

[2] fatal error
Fatal error in MPI_Gather: Other MPI error, error stack:
MPI_Gather(sbuf=0x00212AB0, scount=150, MPI_DOUBLE, rbuf=0x001F55E8, rcount=150, MPI_DOUBLE, root=0, MPI_COMM_WORLD) failed
failed to attach to a bootstrap queue - 11660:216

[3] terminated

---- error analysis -----

[2] on DESKTOP-5SK57UV
mpi has detected a fatal error and aborted D:\code\parallel\labs_exam\Project1\Debug\Project1.exe

---- error analysis -----

Я пробовал запускать простые примеры из документации mpi, в которых использовалась функция MPI_gather, и они отлично работают.

0
Dmitry Sokolov 18 Июн 2020 в 21:33

1 ответ

Лучший ответ

MPI_Gather() является коллективной операцией и, следовательно, должна вызываться (с совместимыми аргументами) на всех уровнях коммуникатора.

В вашей программе ранг 0 не вызывает MPI_Gather(), поэтому ваша программа либо заблокируется, либо прервется.

1
Gilles Gouaillardet 19 Июн 2020 в 00:42