2014-09-23 129 views
1

我在使用我的MPI程序中的pthreads時遇到問題。我的程序運行良好,不涉及pthreads。但是,我決定並行執行耗時的操作,因此我創建了一個執行以下操作的pthread(MPI_Probe,MPI_Get_count和MPI_Recv)。我的程序在MPI_Probe上失敗並且沒有返回錯誤代碼。這是我的初始化MPI環境與MPICH一起使用pthreads

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided_threading_support); 

所提供的線程支持是「3」,我以爲是MPI_THREAD_SERIALIZED。關於如何解決這個問題的任何想法?

+0

發佈您的代碼。 – Jeff 2015-04-19 23:46:23

回答

-1

如果你的MPI實現是不是願意給你MPI_THREAD_MULTIPLE,有三件事情可以做:

  1. 得到一個新的MPI實現。
  2. 用臨界區保護MPI調用。
  3. 用線程切出它。

我建議#3。 MPI 的整點是並行 - 如果您發現自己爲單個MPI子進程創建多個線程,則應該考慮這些線程是否應該是獨立的子進程。

特別是MPI_THREAD_MULTIPLE。我可能會看到MPI_THREAD_SERIALIZED的用法,如果你的線程是主要子進程線程的子子進程工作者......但是MULTIPLE意味着你在所有地方拋出數據。這會讓您失去MPI提供的主要便利,即同步。你會發現自己實質上是在MPI之上重新實現MPI。

好的,現在您已經閱讀了所有內容,其中的熱門話題是:3 MPI_THREAD_MULTIPLE。不過實話說。重新考慮你的架構。

+1

有一些有效的用例將MPI(所謂的混合方法)與線程(pthread,OpenMP或其他)結合起來。事實上,許多代碼的先決條件是對大量節點進行良好的擴展,其中各個節點/套接字上的線程組合以及節點之間的MPI通信的組合。 當您有基於加速器的系統時(每個加速器可能有一個MPI等級,並且每個加速器有多個內核),使用MPI通信的不同線程也是有意義的。 – bcumming 2014-09-24 08:48:19

2

提供的線程支持是'3',我認爲它是MPI_THREAD_SERIALIZED。

的MPI標準定義線程支持水平命名常量和只要求它們的值是單調的,即MPI_THREAD_SINGLE < MPI_THREAD_FUNNELED < MPI_THREAD_SERIALIZEDMPI_THREAD_MULTIPLE <。實際的數字值是特定於實現的,不應該被使用或與之比較。

默認情況下,MPI通信調用永遠不會返回除MPI_SUCCESS以外的錯誤代碼。原因是,MPI在MPI調用返回之前調用通信器的錯誤處理程序,並且所有的通信器最初都是以MPI_ERRORS_ARE_FATAL作爲錯誤處理程序安裝的。該錯誤處理程序終止程序並通常打印一些調試信息,例如失敗的原因。 MPICH(及其無數變體)和Open MPI都對導致終止的原因提供了非常詳盡的報告。

啓用用戶錯誤處理上的溝通comm,你應該做以下電話:

MPI_Comm_set_errhandler(comm, MPI_ERRORS_RETURN); 

當心錯誤代碼返回 - 他們的數值也是實現特定的。