在MPI_Gather C中寻址内存

时间:2017-02-01 17:17:53

标签: c malloc mpi pointer-arithmetic

我正在尝试将数据传递给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;

}

我收到错误消息,提示我没有正确分配内存。

1 个答案:

答案 0 :(得分:1)

指针算法是根据指针所指向的字的大小来完成的。由于phiefloat *sizeof(float)中的phie+iter*20*size*sizeof(float)是多余的,您将超出有效内存。

删除sizeof(float),或者更好地将其更改为更清晰的数组索引:&(phie[iter * 20 * size])

您还应该删除所有指针强制转换,它们都是多余的,可以隐藏问题。只有当你知道自己需要它时才应该施展。

关于您的其他问题:recvbuf的{​​{1}}参数仅在根进程中很重要。因此,只有根进程的MPI_Gather才重要。尽管如此,由于您的所有流程都经历了相同的运行循环iter,并且它们不能相互超越,因此在匹配集合期间它们将始终具有相同的MPI_Gather