MPI 发送矩阵列 (C++)

MPI send matrix columns (C++)

本文关键字:C++ 阵列 MPI      更新时间:2023-10-16

我尝试将矩阵的第二列和第三列从具有 MPI 的秩一和二的进程发送到秩为零的进程。

在互联网上,我找到了这个例子 http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node70.htm#Figure4 并编写了一段代码:

#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char *argv[]) {
    int id;
    int matrix[3][3];
    int matrixB[9];
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &id);
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            if(id == 0)
                matrix[i][j] = 0;
            else
                matrix[i][j] = j+1;
    MPI_Datatype matrixSpalte;
    MPI_Type_vector(3, 1, 3, MPI_INT, &matrixSpalte);
    MPI_Type_commit(&matrixSpalte);
    MPI_Gather(&matrix[0][id], 1, matrixSpalte, &matrixB[0], 1, matrixSpalte, 0, MPI_COMM_WORLD);
    if(id == 0)
        for(int i=0; i<9; i++) {
            if(i % 3 == 0)          
                cout << endl;
            cout << matrixB[i] << " (" << i << ") ";
        }

    MPI_Finalize();
    return 0;
}

但输出是:

0 (0) 0 (1) 1351992736 (2)
0 (3) 254423040 (4) 1 (5)
0 (6) 2 (7) 1351992752 (8)

它应该是:

1 (0) 2 (1) 3 (2)
1 (3) 2 (4) 3 (5)
1 (6) 2 (7) 3 (8)

我不知道为什么这不起作用。我希望有人可以帮助我找到代码中的错误。

您的真诚,

解决方案(感谢乔纳森·杜尔西):

#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char *argv[]) {
    int id;
    int matrix[3][3];
    int matrixB[9];
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &id);
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            if(id == 0)
                matrix[i][j] = 0;
            else
                matrix[i][j] = j+1;
    MPI_Datatype matrixSpalte, tmp;
    MPI_Type_vector(3, 1, 3, MPI_INT, &tmp);
    MPI_Type_create_resized(tmp, 0, sizeof(int), &matrixSpalte);  // !!!
    MPI_Type_commit(&matrixSpalte);
    MPI_Gather(&matrix[0][id], 1, matrixSpalte, matrixB, 1, matrixSpalte, 0, MPI_COMM_WORLD);
    if(id == 0)
        for(int i=0; i<9; i++) {
            if(i % 3 == 0)          
                cout << endl;
            cout << matrixB[i] << " (" << i << ") ";
        }

    MPI_Finalize();
    return 0;
}

MPI_Gather应该传递一个缓冲区,该缓冲区可以将所有元素存储在一个连续的数组中。看看这里的图片

也就是说rbuf必须指向 9 int s 的数组。这就是您收到Abort trap: 6错误的原因,如此处所述。您正在尝试通过matrix[0][8] matrix[0][3]写作

此外,您的recv_type必须MPI_INT