使用带动态分配内存的C的MPI_Scatter

时间:2012-10-07 08:29:53

标签: 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列数

谢谢

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是以线性方式分配内存:

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的每一行,而是分配一块与整个矩阵一样大的内存,然后将u[i]指向i的开头指向u_stor 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); 中的第一行。现在行连续地放在内存中,可以使用简单的分散:

{{1}}