Как I / O 2-мерный массив расположен в области общей памяти MPI? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь инициализировать 2-мерный массив (размер: NxN), который расположен в области общей памяти MPI. Идея последующего кода заключается в следующем: я пытаюсь инициализировать и извлечь данные, расположенные в области общей памяти, используя MPI. Вот что я придумал:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
#include <mpi.h>

void initMatrix(int** matrix, int matrixSize)
{
    srand(static_cast<unsigned>(time(NULL)));

    for (int i = 0; i < matrixSize; i++)
    {
        for (int j = 0; j < matrixSize; j++)
            matrix[i][j] = std::rand() % 100 + 1;
    }
}

std::string showMatrix(int** matrix, int matrixSize)
{
    std::stringstream str;

    for (int i = 0; i < matrixSize; i++)
    {
        str << "[ ";

        for (int j = 0; j < matrixSize; j++)
            str << matrix[i][j] << " ";

        str << "]" << std::endl;
    }

    return str.str();
}

int main(int argc, char** argv)
{
    MPI_Init(&argc, &argv);

    MPI_Comm commSize{ 0 };
    MPI_Comm_size(MPI_COMM_WORLD, &commSize);

    int myRank{ 0 };
    MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

    MPI_Comm MPI_COMM_SHARED{ 0 };
    MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, myRank, MPI_INFO_NULL, &MPI_COMM_SHARED);

    int nodeSize{ 0 };
    MPI_Comm_size(MPI_COMM_SHARED, &nodeSize);

    int nodeRank{ 0 };
    MPI_Comm_rank(MPI_COMM_SHARED, &nodeRank);

    int** masterMatrix{ nullptr };
    MPI_Win matrixWinHandle{ 0 };
    if (myRank == 0)
        MPI_Win_allocate_shared(commSize * commSize * sizeof(int), 1, MPI_INFO_NULL, MPI_COMM_SHARED, &masterMatrix, &matrixWinHandle);
    else
        MPI_Win_allocate_shared(0, 1, MPI_INFO_NULL, MPI_COMM_SHARED, &masterMatrix, &matrixWinHandle);

    int** slaveMatrix{ masterMatrix };
    MPI_Aint winSizeMatrix{ 0 };    
    int winDispMatrix{ 0 };

    if (nodeRank != 0)
        MPI_Win_shared_query(matrixWinHandle, 0, &winSizeMatrix, &winDispMatrix, &slaveMatrix);

    if (nodeRank == 0)
    {
        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, MPI_MODE_NOCHECK, matrixWinHandle);
        initMatrix(slaveMatrix, commSize);
        MPI_Win_unlock(0, matrixWinHandle);
    }

    MPI_Barrier(MPI_COMM_WORLD);

    if(myRank != 0)
        std::cout << showMatrix(slaveMatrix, commSize) << std::endl;

    MPI_Finalize();
    return 0;
}

Вывод программы для 2 процессоров выглядит следующим образом:

job aborted:
[ranks] message

[0] process exited without calling finalize

[1] terminated

---- error analysis -----

[0] on MY-COMPUTER-NAME
ProgramLocation.exe ended prematurely and may have crashed. exit code 255

Основываясь на моем сеансе отладки, я знаю, что программа аварийно завершает работу, когда задействован matrix[i][j]. Память распределяется правильно в области разделяемой памяти, поэтому, вероятно, я не пытаюсь инициализировать нераспределенную память (что на самом деле не должно быть проблемой для компилятора C ++ на этапе компиляции). Я предполагаю, что MPI требует некоторой «специальной» процедуры для доступа к таким данным через разделяемую память. Это то, что я хотел бы спросить.

P.S. Я использую MS-MPI v9.0.1 и Visual C ++.

...