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

标签 c++ memory 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 连续的 int。因此,当您尝试散布从 matrix[0][0] 开始的 P*P 整数时,谁知道您发送的是什么。

这段代码:

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

首先分配一个 P 指针数组,然后将每个指针设置为已分配 P 整数的指针。但是根本不能保证 matrix[1]matrix[0] 结束的地方开始。如果你想这样做——你确实这样做了,无论是对于 MPI 还是通常对于技术计算应用程序中的多维数组——你必须手动分配连续的内存块并将 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 分配的内存。

关于c++ - C中的MPI和多维数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883259/

相关文章:

c++ - 我的 SFINAE 检查 std::map/std::vector 有什么问题?

r - 输入矩阵的每一行需要包含至少一个非零项

java - 调用 MappedByteBuffer.force() 的正当理由是什么?

python - OpenMPI : Permission denied error while trying to use mpirun

c++ - MsiEnumProductsEx 不工作

c++ - C++中单个元素的静态数组初始化

fortran - `MPI_ERR_TRUNCATE: message truncated` 错误

c++ - 使用 MPI 和 C++ 从不同节点收集数据

c++ - Windows QueueUserWorkItem C++ Release模式问题

java - 特定语言的字符串类