我正在尝试将数据传递给MPI_Gather
。我按如下方式分配内存:
float *phie, *phitemp;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
phitemp=(float *) malloc(20*sizeof(float));
if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float));
然后让所有进程使用MPI_Gather()
将数据发送到排名1,如下所示:
for (iter=0;iter<itermax;iter++) {
MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD);
iter=0;
}
我收到错误消息,提示我没有正确分配内存。
答案 0 :(得分:1)
指针算法是根据指针所指向的字的大小来完成的。由于phie
是float *
,sizeof(float)
中的phie+iter*20*size*sizeof(float)
是多余的,您将超出有效内存。
删除sizeof(float
),或者更好地将其更改为更清晰的数组索引:&(phie[iter * 20 * size])
您还应该删除所有指针强制转换,它们都是多余的,可以隐藏问题。只有当你知道自己需要它时才应该施展。
关于您的其他问题:recvbuf
的{{1}}参数仅在根进程中很重要。因此,只有根进程的MPI_Gather
才重要。尽管如此,由于您的所有流程都经历了相同的运行循环iter
,并且它们不能相互超越,因此在匹配集合期间它们将始终具有相同的MPI_Gather
。