2011-07-11 58 views
5

當調用MPI_BCAST時,是否有隱含的同步?例如,如果發件人進程在其他人能夠執行BCAST之前到達MPI_BCAST,然後在沒有任何確認的情況下繼續執行?與像代碼一些最近的測試:隱含的發送者和接收者同步MPI_BCAST?

program test 
include 'mpif.h' 

integer ierr, tid, tmp 

call MPI_INIT(ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ierr) 

tmp = tid 

if(tid.eq.0) then 
    call MPI_BCAST(tmp,1,MPI_INTEGER,MPI_ROOT,MPI_COMM_WORLD, ierr) 
else 

endif 

write(*,*) tid,'done' 
call MPI_FINALIZE(ierr) 

end 

顯示,隨着兩個線程,他們都達到完成,儘管只有發送者在做MPI_BCAST通話。

輸出:

1 done   0 
0 done   0 

難道這是與MPI安裝我與(MPICH)工作出了問題,或者是MPI這個標準的行爲嗎?

回答

1

Bcast是集體通信呼叫,並且作爲這樣的塊。更準確地說,它會阻塞,直到指定通信器中的所有進程都與Bcast進行了匹配調用,此時發生通信並繼續執行。

你的代碼是用於調試目的過於簡化。你可以發佈一個工作最小的例子來證明問題嗎?

+0

OK,我已經把那我的工作完整的程序。我希望它無限期地阻塞等待別人叫MPI_BCAST如果的mpirun與超過100個處理器的推出,但在我的機器上有兩個過程使得調用write退出,與TMP – agrippa

+0

值0它並不需要阻止 - 根不需要任何來自其他隊伍的響應來繼續,所以它可能不會等待它們。特別是,在一個急切的消息協議中,根將立即發送它的消息,並且它將坐在另一個隊列中的一些緩衝區中,直到他們調用MPI_Bcast。 –

+1

@Jeremiah:不正確。 MPI標準要求在'Bcast'返回時,根緩衝區的內容已被複制到所有進程。 @ user631027:在你的程序,進程'Bcast' 0塊,但過程1立即到達'Finalize',減少MPI_COMM_WORLD的大小爲1。因此,進程0現在可以自由地完成'Bcast',因爲他是唯一一個廣播到。如果進程1調用與進程0不匹配的'Bcast',則程序將掛起。 – suszterpatt

0

我可以證明MPI_Bcast確實不是塊,至少對於根(發送)過程。如果你想確定你的程序被阻塞,你應該立即打電話給MPI_Barrier。我知道這是因爲我最近無意中叫MPI_Bcast根進程(而非集體)和執行程序持續正常,直到很久以後,當NEXT無關的呼叫MPI_Bcast,其中舊緩衝區被收進了新的不同緩衝區。這種緩衝區數據類型/長度的不匹配產生了垃圾數據,並且花了我一段時間才找到該錯誤。

+1

您好MasterHD,我相信您觀察到的行爲的原因以及導致我最初發布問題的行爲是相同的。 MPI_Bcast是一個集體MPI操作,這意味着MPI標準表示所有職級都必須參加。如果他們這樣做,那麼MPI_Bcast是一個阻塞操作。如果他們不這樣做,那麼MPI程序不符合標準,你會看到未定義的行爲。在我們的兩個案例中,這個未定義的行爲是程序愉快地沿着它的方式前進,好像沒有什麼是錯的。 – agrippa

+0

我試圖提出的一點是,如果'MPI_Bcast'確實是一個**阻塞**方法,那麼僅在根進程中調用它就會立即掛起該根進程而不允許它繼續。是你的問題還是別的? – MasterHD

+1

另外,@MasterHD,如果你的'MPI_Bcast'調用有足夠大的緩衝區,它正試圖發送,它也可能會阻塞根進程。它只完成了,因爲你可能發送少量內部緩衝的數據。 –

相關問題