如何使用 MPI_Scatter 发送以下矩阵是否有帮助
float **u, **u_local;
if (rank == 0){
u = (float**) malloc(N * size * sizeof(float*));
for(i = 0; i < N * size; i++){
u[i] = (float*) malloc(M * sizeof(float));
memset(u[i], 0, M * sizeof(float));
}
}
我想将 u[N][M] 矩阵平等地发送到所有进程 (u_local) N 行数 M 列数
谢谢
最佳答案
最简单的解决方案是以线性方式分配内存:
float **u, *u_stor;
if (rank == 0) {
// Watch out for possible integer overflow while computing memory size
u_stor = malloc(N * size * M * sizeof(float));
for (i = 0; i < N * size; i++) {
u[i] = &u_stor[i * M];
}
memset(u_stor, 0, N * size * M * sizeof(float));
}
此代码不是单独分配 u
的每一行,而是分配一 block 与整个矩阵一样大的内存,然后为 u[i]
分配一个指向u_stor
中第 i
行的开头。现在,行连续放置在内存中,可以使用简单的分散:
float **u_local, *u_local_stor;
u_local_stor = malloc(N * M * sizeof(float));
for (i = 0; i < N; i++)
u_local[i] = &u_local_stor[i * M];
MPI_Scatter(u[0], N * M, MPI_FLOAT,
u_local[0], N * M, MPI_FLOAT,
0, MPI_COMM_WORLD);
关于c - MPI_Scatter 使用 C 和动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12767263/