我将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);
}