MPI_Bcast分段错误

3
我正在传播一个指针到一个数组。
MPI_Bcast(&xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);

来自进程0并从非0进程接收此广播

MPI_Bcast(&xd_sim_recv, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);

当我尝试读取接收到的值时,会出现段错误 11。就像这样。
for(i=0; i<Numlines_Sim; i++)
printf("%f\n",xd_sim_recv[i]);fflush(stdout);

这里出了什么问题,您能帮我修复一下吗?

1
除了根进程之外,您是如何分配变量 xd_sim_recv 的? - Nicolás Ozimica
float *xd_sim_send, *xd_sim_recv; xd_sim_send = (float *)calloc(Nooflines_Sim, sizeof(float)); xd_sim_recv = (float *)calloc(Numlines_Sim, sizeof(float)); - rkrara
抱歉,打错了,我是说 xd_sim_recv。 - rkrara
你不需要给向量的地址,因为这些变量已经是指针了。只需直接给它们,不要加上 &。请参见下面的答案。 - Nicolás Ozimica
2个回答

5

发送指针没有意义,因为在另一个并行进程中该指针将无效,应该发送缓冲区:

MPI_Bcast(xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);

更不用说,即使通过某种非凡的幸运方式指针是有效的,你也从未发送它所指向的数据。 - suszterpatt
展示一下你如何使用MPI_Recv。 - Ramy Al Zuhouri
MPI_Bcast(xd_sim_recv, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD); - rkrara
Numlines_Sim是否大于或等于Nooflines_Sim? - Ramy Al Zuhouri
两个进程的值相同,只是根进程和其他进程的名称不同。 - rkrara

4
如果你想要在一个除了根进程使用的向量中接收数据,那么你应该像这样做(伪代码):
if (THIS PROCESS IS ROOT) {
    MPI_Bcast(xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);
} else {
    MPI_Bcast(xd_sim_recv, Numlines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD);
}

没有&,因为变量xd_sim_sendxd_sim_recv已经是指针了,这正是MPI_Bcast所需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接