2011-07-12 33 views
1

我想知道如果在MPI程序中指定有線程支持,所有線程都會進行MPI :: Bcast調用(使得在調用中,發送程序只支持一個線程),這是由所有其他線程接收的,還是僅僅來自每個進程的一個線程(最快)?帶線程支持和Bcast調用的MPI

回答

3

常見的MPI實現處理進程之間的通信。支持線程的實現只允許多個線程進行一些或全部MPI調用,而不僅僅是一個。調用MPI_Bcast的進程中的每個T線程表示該進程已調用MPI_Bcast T次,並且期望通信器上的所有其他等級都會執行相同的操作。

+0

新奇事物,這是有道理的。因此,來自不同進程的所有線程都會調用Bcast,這是一場重大的災難。感謝你的回答。 – SwatchPuppy

+0

Novelocrat,我還有一個問題,想象在啓用多線程支持的情況下,在同一個進程中有兩個線程,他們可以使用MPI_Send和MPI_Recv在它們之間進行通信,還是會導致死鎖? – SwatchPuppy

+0

一個進程可能可能使用Isend/Irecv與自己進行通信,但那會有點愚蠢。請記住,你的流程中的所有線程仍然是同一個MPI級別的一部分。此外,允許「MPI_Send」阻塞,直到匹配的接收完成。如果它本身就是這樣,並且沒有發佈接收,那就是僵局。 – Novelocrat

1

根據MPI執行中的線程支持級別(請檢查,MPI中的線程支持非常簡單),每個進程只進行一次MPI調用。

1

要添加到Novelocrat給出了答案:

計算的MPI的基本單位是「等級」。在MPI的大多數(全部)有趣的實現中,等級是一個過程。一個進程中的所有線程共享相同的等級ID。

MPI標準支持多級別的線程並行:MPI_THREAD_SINGLE,MPI_THREAD_FUNNELED,MPI_THREAD_SERIALIZED和MPI_THREAD_MULTIPLE。

其中,只有MPI_THREAD_MULTILE實際上有多個線程將重疊調用插入到MPI庫中。另外三種情況是應用程序聲稱Rank可以被視爲「單線程」。欲瞭解更多信息,請參閱MPI Standard entry on MPI_INIT_THREAD