C++ 如何在MPI';共享内存区?
我试图初始化一个二维数组(大小:C++ 如何在MPI';共享内存区?,c++,multidimensional-array,mpi,shared-memory,C++,Multidimensional Array,Mpi,Shared Memory,我试图初始化一个二维数组(大小:NxN),该数组分配在MPI的共享内存区域。后续代码背后的想法如下:我正在尝试使用MPI初始化和检索位于共享内存区域的数据。以下是我的想法: #include <iostream> #include <iomanip> #include <sstream> #include <string> #include <ctime> #include <mpi.h> void initMatrix(
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;
}
根据我的调试会话,我知道只要涉及matrix[I][j]
,程序就会崩溃。内存在共享内存区域中被正确分配,因此,我尝试初始化非分配内存的情况可能不是这样(实际上编译阶段的C++编译器不应该是问题)。我猜MPI需要一些关于如何通过共享内存访问这些数据的“特殊”过程。这就是我想问的
S.I使用MS-MPI V90.1和Visual C++。< /P>您分配了一个向量:代码> CAMSIZE * CaseS/<代码>整数,并且不能简单地将其用作2D矩阵。您可以将其用作向量,也可以手动创建
int**
(例如,指向masterMatrix
元素的int*
数组)。我不精通C++,所以可能有更好的方法来实现这个目标。我没有从这个角度看待这个问题。事实上,是的,我可以把2D矩阵当作向量,一切都很好。不过,我相信还有其他一些解决办法。不管怎么说,它是有帮助的,所以你可以把你的想法作为一个解决方案张贴出来。
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