2012-10-16 62 views

回答

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(...) 

或任何變種程序需要

+0

確定。現在,如果我添加「MPI_BCAST(&i,1,MPI_INT,0,COMM);」到主功能以及,我的原始聲明是否正確? (從節點是否會在主節點中廣播「i(== 0)」,並將所有從節點中的「i」值設置爲0?) –