Я пытаюсь инициализировать 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 ++.