2014-02-26 57 views
9

我正在寫一個多線程的openmpi應用程序,使用MPI_Isend和MPI_Irecv從多個線程在InfiniBand RDMA隊伍之間交換每秒數百個消息。的InfiniBand:傳輸速率取決於MPI_TEST *頻率

轉會是在400的順序 - 800KByte,產生約9 Gbps的進出用於每個秩,FDR的能力範圍內。簡單的MPI基準測試也表現出良好的性能。

的傳輸的完成在通過輪詢檢查在專用線程使用MPI_Testsome所有活動傳輸。

我實現了傳輸速率取決於消息率,但更重要的還取決於MPI_Testsome的輪詢頻率。也就是說,如果我每隔10ms進行一次輪詢,那麼請求的結束時間要比每隔1ms輪詢一次的時間要晚。

我預計,如果我查詢埃弗特10毫秒,而不是每1ms的,我頂多完成9ms的請求以後通知。我不希望這些傳輸本身通過減少對MPI_Testsome的調用來延遲完成,從而減慢總傳輸速率。我希望MPI_Testsome完全被動。

任何人在這裏都有線索爲什麼會發生這種行爲?

回答

9

觀察到的行爲是由於在Open MPI中執行操作進程的方式。發送發送或接收,無論是同步還是異步完成,都會導致一系列內部操作排隊。進展基本上就是那些排隊操作的處理。您可以在庫構建時選擇兩種模式:一種使用異步進度線程,另一種使用不帶缺省值的後者。

當啓用了異步進度線程編譯庫時,後臺線程負責並處理隊列。這允許後臺傳輸與用戶的代碼並行開始,但增加了延遲。沒有異步進展,操作會更快,但只有在用戶代碼調用到MPI庫時才能進行進展,例如,而在MPI_WaitMPI_Test和家庭。 MPI_Test系列功能以儘可能快的速度返回。這意味着圖書館必須在做電話之間的平衡之間取得平衡,從而放慢速度,或者快速返回,這意味着每次電話會進行更少的操作。

一些開放MPI開發人員,特別是傑夫·斯奎爾斯,訪問堆棧溢出飄飛。他可能會提供更多細節。

此行爲並不特定於打開MPI。除非大力輔助硬件,否則MPI通常按照相同的方法實施。

+1

謝謝!我沒有意識到異步級數不是默認值。我確實有一個'btl_openib_async_event_thread'運行(根據gdb)。 'btl_openib_use_async_event_thread'選項也被設置。我將從重建OpenMPI開始,看看我能否更好地控制這一方面。 –

+2

''openib'異步線程不是我提到的異步進程線程。它從InfiniBand完成隊列中讀取通知消息,可能會更新進程隊列中未決事件的狀態。 –