2014-10-07 71 views
0

假設我在5個節點上運行MPI程序,它將運行50次模擬。但是,模擬可能需要大量不同的時間。如果我有一組初始條件,比如ic1,ic2,... ic50,當一個節點/進程完成一個模擬時,我希望它使用下一個(尚未使用的)初始條件集來運行新的模擬。我最初的想法是使用MPI_Bcast或MPI_Gather s.t.所有節點都有一個int,它持有下一個要運行的索引,並在開始新的模擬之前對其進行更新。這是一個合理的想法/是否有其他和/或更好的解決方案?在MPI中跟蹤全局索引

+0

從這個描述中不太清楚你的目標是什麼。你能用一些簡短的僞代碼勾畫出來嗎? – 2014-10-08 04:19:58

回答

2

您需要共享工作隊列。有很多方法可以做到這一點。最簡單的方法是指定一個mpi等級爲「主」,其他等級爲「工人」。工作人員要求主人爲一個工作單位(您的初始條件之一),去工作,然後完成後請求主人爲新的工作單位。這裏有一些額外的細節(它說OpenMPI,但沒有關於OpenMPI的具體內容):Non-blocking data sharing through OpenMPI

有一個名爲ADLB(http://www.mcs.anl.gov/project/adlb-asynchronous-dynamic-load-balancer)的項目,它是類固醇上的工作隊列。可能(肯定)是5節點作業的矯枉過正,但對於5,000節點作業可能有意義。

您可以使用RMA共享內存並使用它來跟蹤索引。如果擁有RMA窗口的進程本身正忙於在工作單元上進行計算,則對請求做出響應可能會稍微慢一些,但是您不需要將一個MPI進程作爲主進程進行燒寫。

您可以使用MPI共享文件指針例程在磁盤上保留工作隊列。我通常對MPI共享文件指針例程很不滿意,但在這種情況下,相對於CPU工作量,I/O很小(讀取一個初始條件),那就沒問題。