在以下代码中:
if (rank==0) master();
else slave();
...
void master()
{
int i=0;
}
...
void slave()
{
int i=1;
MPI_BCAST(&i,1,MPI_INT,0,COMM);
}
从节点是否在主节点中广播“i(== 0)”并将所有从节点中的“i”值设置为0?
答案 0 :(得分:2)
从你发布的内容来看,你的语义是正确的还有点不清楚 - 通信器中的所有进程都必须调用MPI_BCAST
,这是MPI的集体操作之一。然后,您的程序就像在MPI_BCAST
调用中指定根的进程将消息发送到指定通信器中的所有其他进程,然后接收消息。
您的代码段表明,如果只调用您称之为“奴隶”的进程,那么您认为对MPI_BCAST
的调用是成功的,这是不正确的。
但是,您的通话语法是正确的。
编辑以回应评论
我相信所有进程都必须执行调用MPI_BCAST
的代码段。如果您按照建议,伪代码是这样的:
if (myrank == master) then
do_master_stuff ...
call mpi_bcast(...)
end if
if (myrank /= master) then
call mpi_bcast(...)
do_worker_stuff ...
end if
然后呼叫将失败;您的程序很可能会停止,直到作业管理或操作系统通知并将其丢弃。 MPI中没有用于跨范围“匹配”对MPI_BCAST
(或任何其他集合通信例程)的调用的机制。
你的伪代码应该是这样的
if (myrank == master) then
do_master_stuff ...
end if
if (myrank /= master) then
do_worker_stuff ...
end if
! all together now
call mpi_bcast(...)
或您的程序需要的任何变体