gpt4 book ai didi

c - MPI_Gather C 中的内存寻址

转载 作者:行者123 更新时间:2023-11-30 15:00:39 25 4
gpt4 key购买 nike

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

}

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

最佳答案

指针算术是根据指针所指向的字的大小来完成的。自 phiefloat *sizeof(float)phie+iter*20*size*sizeof(float)是多余的,并且您超出了有效内存。

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

您还应该删除所有指针转换,它们都是多余的并且可以隐藏问题。仅当您知道需要时才应进行转换。

关于您的附加问题:recvbuf MPI_Gather的参数仅在根进程中有意义。因此只有iter根进程的重要性。尽管如此,由于您的所有进程都会经历相同的运行循环 MPI_Gather ,并且他们无法超越对方,他们将永远拥有相同的iter在匹配收集期间。

关于c - MPI_Gather C 中的内存寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com