2D阵列的MPI数据类型

And*_*yga 0 c++ mpi

几个小时我试图通过MPI发送2D数组到不同的线程.代码看起来像这样(我会留下评论来展示我已经尝试过的技巧):

类型定义:

// Define datatype
//MPI_Type_contiguous(N, MPI_INT, &mpi_vector);
//MPI_Type_vector(N, N, N, mpi_vector, &mpi_matrix);
//MPI_Type_vector(N, N, N, MPI_INT, &mpi_matrix);
//MPI_Type_contiguous(N, MPI_INTEGER, &mpi_vector);
//MPI_Type_contiguous(N, mpi_vector, &mpi_matrix);
MPI_Type_vector(N, N, 0, MPI_INTEGER, &mpi_matrix);
//MPI_Type_commit(&mpi_vector);
MPI_Type_commit(&mpi_matrix);
Run Code Online (Sandbox Code Playgroud)

发送和接收:

int** tmp = new int*[N];
switch(r) {
case T1:
    inputMatrix(tmp, 2);
    MPI_Send(tmp, 1, mpi_matrix, T2, 0, MPI_COMM_WORLD);
    //task_T1();
    break;
case T2:
    //task_T2();
    inputMatrix(tmp, -1);
    MPI_Recv(tmp, 1, mpi_matrix, T1, 0, MPI_COMM_WORLD, &s);
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++) {
            cout << "  " << tmp[i][j];
        }
        cout << endl;
    }
    break;
}
Run Code Online (Sandbox Code Playgroud)

我需要这样做到早上(7个小时),我希望smb能够帮助我.

Hri*_*iev 6

MPI 不支持矩阵,其中每行分别分配,也就是指向行的指针数组.MPI 仅适用于平面阵列,其中行连续存储在内存中.使用平面阵列:

int** tmp = ...
Run Code Online (Sandbox Code Playgroud)

应该成为

int* tmp = new int[rows*cols];
Run Code Online (Sandbox Code Playgroud)

然后tmp[row][col]应该被访问为tmp[row*cols + col].

您可以从MPI_INT单个行构造连续类型,然后从整个矩阵的前一个连续类型构造连续类型.您还可以构造单个连续类型的rows*cols MPI_INT元素.第一种方法更灵活,因为您可能需要稍后发送单个行.