在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
。