MPI和用C多维数组分配(MPI and multidimensional array alloca

2019-08-01 10:53发布

我尝试使用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

Answer 1:

这不是一个MPI的问题,这是一个C和多维数组的问题。

问题是,在C有没有保证您的分配矩阵实际上是P*P连续int秒。 所以,当你试图驱散P*P起始于整数matrix[0][0]谁知道你发送了什么。

此代码:

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

首先分配的阵列P指针到int和然后设置每一个以其中已经分配的指针P整数。 但是,有一个在所有不能保证matrix[1]开始的地方matrix[0]结束。 如果要做到这一点-和这样做,无论对于MPI和通常用于技术计算应用多d阵列通常-必须手动分配的存储器中的连续块,并且具有matrix点到其中:

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



文章来源: MPI and multidimensional array allocation in C
标签: c++ memory mpi