我有一個程序,其目的是添加特定的數據到一個主陣列。隨機數測試passesTest(randomNumber)
每秒執行數百萬次,偶爾會通過測試並將隨機數推送到數組的末尾。所以大部分時間,數組只是坐在那裏,而計算正在進行。MPI_Allgather我的代碼瓶頸,我該如何解決它?
我決定將這個過程與MPI並行化,因爲我認爲執行隨機數測試的1000個處理器會大大提高速度,而且由於內存寫入非常少見,所以MPI應該非常適合這項工作。非常令我沮喪的是,我的程序在mpirun -np 1
上運行速度最快,並且隨着我添加的每個過程而顯着變慢。
在我while
循環包含passesTest(randomNumber)
末,我有MPI::COMM_WORLD.Allgather()
從每一個指示是否有需要推到數組新的隨機數過程中收集的標誌。如果有任何標誌爲true
,則我執行另一個Allgather()
實際收集此數據並將其推送到陣列的每個進程的本地副本。再次,這第二個Allgather()
執行很少,因爲測試很少通過。
所以我猜測我的瓶頸是收集每個MPI進程的所有標誌,看看是否有新的數據。每個隨機數的測試執行起來都很快,所以我認爲現在每秒數十億次循環的數據量顯着減少,因爲從多個進程收集數據的開銷很大。這是一個很好的猜測嗎?我是MPI的新手,因此我不知道Allgather()
涉及哪種時間範圍。
如果這是原因,那麼當測試通過時,我如何才能與其他進程「交互」?這完全是我想要做的。換句話說,如果一個隨機數字通過一個測試,然後發送一條消息到所有其他進程,以停止他們正在做的事情,並將該數字添加到他們的數組中。
因此,大概你將數據推送到數組上的順序並不重要,並且你希望在實際測試中不依賴新數據,爲什麼你要做所有不必要的通信?在本地計算所有東西,並在最後將大量數據推回(或者每隔幾億次迭代或其他方式)。 – Voo 2013-02-27 06:02:48
嗯,我實際上在實際測試中依賴於新數據:(我簡化了這個問題的所有內容 – Nick 2013-02-27 06:38:02
從有關優化的問題中刪除必要的依賴關係可能實際上並不是非常有用,我擔心。在我們可以說什麼之前,你必須描述數據依賴的確切形式。 – Voo 2013-02-27 06:41:36