c-M中的MPI和多维数组分配

我尝试使用MPI_Scatter,发送矩阵行(动态分配),但它仅发送一行,其他行则为垃圾.当我使用静态内存分配时-一切都很好.

MPI_Init(&argc, &argv);
int **matrix, *matrix_stor, *row,rank, P;
MPI_Comm_size(MPI_COMM_WORLD, &P);
row = new int [P];
for(int i = 0; i < P; i++)
{
    row[i] = 0;
}
matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

//int matrix[4][4], row[4], rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (rank == 0){
    for(int i = 0; i < P; i++){
        for(int j = 0; j < P; j++){
            matrix[i][j] = rand()%20;
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}
cout << endl;

MPI_Scatter(&matrix[0][0], P, MPI_INT,&row[0], P, MPI_INT,0,MPI_COMM_WORLD);
for(int i = 0; i < P; i++)
    cout << row[i] << " ";
cout << endl;
free(matrix);
free(row);
MPI_Finalize();
return 0;

结果是:
源矩阵:
1 7 14 0
9 4 18 18
2 4 5 5
1 7 1 11
收到的行:
1 7 14 0
3626672 3626800 0 0
16 1 119 -33686019
-33686019 -572662307 524296 786765

解决方法:

这不是MPI问题,而是C和多维数组问题.

问题在于,在C中无法保证您分配的矩阵实际上是P * P连续整数.因此,当您尝试从矩阵[0] [0]开始分散P * P int时,谁知道您要发送的内容.

这段代码:

matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

首先分配一个P个指向int的指针的数组,然后将每个指针设置为一个已分配了P ints的指针.但是,根本无法保证matrix [1]从matrix [0]结束的地方开始.如果要执行此操作(而且对于MPI以及通常在技术计算应用程序中通常用于多维数组的操作),都必须手动分配连续的内存块并在其中分配矩阵点:

matrix = new int *[P];
int *data = new int [P*P];
for(int i = 0; i < P; i ++)
    matrix[i] = &(data[P*i]);

然后分散应该起作用.

还要注意,您应该使用delete而不是free()来释放分配给new的内存.

上一篇:python-mpi4py:动态数据处理


下一篇:C如何为MPI程序创建Makefile?