MPI_Gather中2D阵列存储的方式

时间:2018-08-09 15:31:11

标签: c parallel-processing mpi distributed-computing

我将3个进程/内核设置为并行计算p。之后,我想将一个进程的数据乘以一个进程,最后将它们加起来,即执行p(rank==0) * p(rank==1) + p(rank==0) * p(rank==2) + p(rank==1) * p(rank==2)。 由于我不知道MPI_Allgather之后的存储方式,因此结果似乎是错误的。有人可以帮忙看看在问号处如何处理吗?

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main(int argc, char *argv[])
{
float **p=NULL, **buffer=NULL;
int it, nt=3, i, j, NP, MYID, nx=1, nz=2, nsrc=3, isrc;

MPI_Init ( &argc, &argv );
MPI_Comm_size ( MPI_COMM_WORLD, &NP );
MPI_Comm_rank ( MPI_COMM_WORLD, &MYID ); 

p = (float **)malloc(nz*sizeof(float *));
buffer = (float **)malloc(nz*sizeof(float *));
for (i=0; i<nz; i++){
     p[i] = (float *)malloc(nx*sizeof(float));
     buffer[i] = (float *)malloc(nx*sizeof(float));
}
memset(p[0],0,nz*nx*sizeof(float));

for (it=0; it<nt; it++){    

    for (isrc=MYID; isrc<nsrc; isrc+=NP){
        for (j=0; j<nz; j++){
            for (i=0; i<nx; i++){
                p[j][i] += 1.5 + (float)(isrc) + (float)(j);                    
            }
        }

    } 
    MPI_Allgather(&p[0][0],nx*nz,MPI_FLOAT,&buffer[0][0],nx*nz,MPI_FLOAT,MPI_COMM_WORLD);
}

?????   

MPI_Finalize();
exit(0);
}

0 个答案:

没有答案