c - MPI_Scatter 使用 C 和动态分配内存

标签 c parallel-processing openmpi

如何使用 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/

相关文章:

c - 标准 I/O 和低级 I/O 的区别

c++ - 对于 ~95% 写入/5% 读取线程安全的 unordered_map 是否有简单的解决方案?

c - Ubuntu 上的 MPI 代码只使用了一个处理器

c - 如何生成0到1之间的随机数?

c - 如何同时处理来自 Stdin Stream 的两个输入,其中一个来自 C 中的数字键盘?

performance - 如何减少 Haskell 的并行化开销?

C、Open MPI : segmentation fault from call to MPI_Finalize(). 段错误并不总是发生,尤其是在进程数量较少的情况下

c - OpenMPI 中的 Scanf 和 Printf

c - 如何将二维数组传递给C中的函数?

c# - CancellationToken Cancel 不脱离 BlockingCollection