在MPI_Gather C中寻址内存

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

}

我收到错误消息表明我没有正确分配内存。

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

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

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

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