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