2013-02-27 145 views
0

我有一個程序,其目的是添加特定的數據到一個主陣列。隨機數測試passesTest(randomNumber)每秒執行數百萬次,偶爾會通過測試並將隨機數推送到數組的末尾。所以大部分時間,數組只是坐在那裏,而計算正在進行。MPI_Allgather我的代碼瓶頸,我該如何解決它?

我決定將這個過程與MPI並行化,因爲我認爲執行隨機數測試的1000個處理器會大大提高速度,而且由於內存寫入非常少見,所以MPI應該非常適合這項工作。非常令我沮喪的是,我的程序在mpirun -np 1上運行速度最快,並且隨着我添加的每個過程而顯着變慢。

在我while循環包含passesTest(randomNumber)末,我有MPI::COMM_WORLD.Allgather()從每一個指示是否有需要推到數組新的隨機數過程中收集的標誌。如果有任何標誌爲true,則我執行另一個Allgather()實際收集此數據並將其推送到陣列的每個進程的本地副本。再次,這第二個Allgather()執行很少,因爲測試很少通過。

所以我猜測我的瓶頸是收集每個MPI進程的所有標誌,看看是否有新的數據。每個隨機數的測試執行起來都很快,所以我認爲現在每秒數十億次循環的數據量顯着減少,因爲從多個進程收集數據的開銷很大。這是一個很好的猜測嗎?我是MPI的新手,因此我不知道Allgather()涉及哪種時間範圍。

如果這是原因,那麼當測試通過時,我如何才能與其他進程「交互」?這完全是我想要做的。換句話說,如果一個隨機數字通過一個測試,然後發送一條消息到所有其他進程,以停止他們正在做的事情,並將該數字添加到他們的數組中。

+0

因此,大概你將數據推送到數組上的順序並不重要,並且你希望在實際測試中不依賴新數據,爲什麼你要做所有不必要的通信?在本地計算所有東西,並在最後將大量數據推回(或者每隔幾億次迭代或其他方式)。 – Voo 2013-02-27 06:02:48

+0

嗯,我實際上在實際測試中依賴於新數據:(我簡化了這個問題的所有內容 – Nick 2013-02-27 06:38:02

+1

從有關優化的問題中刪除必要的依賴關係可能實際上並不是非常有用,我擔心。在我們可以說什麼之前,你必須描述數據依賴的確切形式。 – Voo 2013-02-27 06:41:36

回答

0

首先我強烈地第二個Voo和Hristo Iliev的評論。

MPI_Allreduce開始檢查通行證明顯更快 - 它需要傳輸少得多的數據。然而Allreduce仍然需要>2 * log2(n) * latency。對於1000個進程,取決於您的系統,它可能大約爲100微秒。如果每秒鐘有數百萬次測試,意味着每次測試只需要幾十秒的時間,那麼每次測試之後的集體操作確實會損害您的性能 - 無論每個單獨的通信步驟的設計如何最佳,都變得非常清楚。

現在不知道依賴關係,很難提出根本性的改進建議。假設沒有命中,你可以考慮推測性地執行一些迭代,在找出命中之後丟棄無效的迭代。

此外,我建議MPI_AllreduceMAX確定需要添加的最高隨機數。重複該操作,直到全部添加。如果通常只有很少的添加,這顯然只有效。

相關問題