從你發佈的內容來看,你有語義的權利有點不清楚 - 通信器中的所有進程都必須調用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(...)
或任何變種程序需要
確定。現在,如果我添加「MPI_BCAST(&i,1,MPI_INT,0,COMM);」到主功能以及,我的原始聲明是否正確? (從節點是否會在主節點中廣播「i(== 0)」,並將所有從節點中的「i」值設置爲0?) –