2013-02-28 56 views
2

我用數值求解一些常微分方程。Hybrid:羣集上的OpenMPI + OpenMP

我有一個非常簡單的(概念上)但很長的計算。有一個非常長的陣列(~2M單元格),並且我需要執行數值積分的每個單元格。這個程序應該重複1000次。通過使用OpenMP並行機制和一臺24核機器,需要大約一週的時間才能完成(這是不可接受的)。

我有20個這樣的(24核心)機器的集羣,並考慮混合實施。我想使用MPI來傳遞這20個節點,並且在每個節點上使用常規的OpenMP並行機制。

基本上,我需要將我很長的陣列拆分爲20個(節點)X24(proccs)工作單元。

有沒有更好的實施或更好的想法的建議?我已經閱讀了很多關於這個主題的文章,並且我有印象,有時候這種混合實現不一定會帶來真正的加速。

也許我應該創建一個「工作者池」,並用我的數組或其他東西「喂」他們。

歡迎任何建議和有用的鏈接!

+0

任何良好答案都需要更多信息:進程或運行個別計算的線程之間需要什麼通信?藉助OpenMP,這些通信通常會僞裝成共享內存訪問。換句話說,與您的計算有多麼接近?令人尷尬的並行*最後,你的硬件上是否安裝了諸如Grid Engine之類的作業管理系統? – 2013-02-28 12:04:58

+0

我需要聯繫我們的系統管理員以瞭解任何Grid Engine,但到目前爲止,我從未聽說過我們的計算羣集上有這樣的引擎。 – 2013-02-28 12:48:17

+0

我需要聯繫我們的系統管理員以瞭解任何Grid Engine,但到目前爲止,我從未聽說過我們的計算羣集上有這樣的引擎。 所以,暫且讓我們考慮一下沒有任何網格引擎。 我的程序非常尷尬並行(!)。假設您需要 以任意單元格的順序在巨大數組的每個單元上應用某個函數。 (即對於參數(角度)的給定矩陣(陣列),計算每個參數(角度)的Cos的矩陣)。但是「Cos」的計算時間和矩陣的大小非常大。 – 2013-02-28 12:54:07

回答

0

如果您的計算結果與您所指出的一樣令人尷尬,那麼您應該通過將負載分散到所有20臺機器上來加快速度。由good我的意思是close to 20close to 20我的意思是你實際得到的任何數字,這讓你認爲努力是值得的。

你提出的混合解決方案當然是可行的,如果你實現它,你應該得到很好的加速。

混合MPI + OpenMP程序的一個替代方案是一個作業腳本(用您喜歡的腳本語言編寫),它將您的大型數組簡單地分成20個部分並啓動20個作業,每個機器上運行一個程序實例。當他們已經完成了另一個腳本準備重新組合結果。這將避免必須編寫任何MPI代碼。

如果您的計算機安裝了Grid Engine,則可以編寫作業提交腳本,將其作爲陣列作業提交,並讓Grid Engine負責將工作劃分給各個機器/任務。我希望其他工作管理系統有類似的設施,但我不熟悉它們。

另一種選擇是全MPI代碼,即完全刪除OpenMP並修改代碼以使用它在運行時找到的任何處理器。再說一遍,如果你的程序需要很少或沒有進程間的通信,你應該得到很好的加速。

在共享內存計算機上使用MPI有時比OpenMP更好(在性能方面),有時甚至更糟。麻煩的是,很難確定哪種方法更適合特定的具有RAM和高速緩存以及互連和總線以及所有其他變量需要考慮的架構上的特定程序。

我忽略了一個因素,主要是因爲您沒有提供任何數據可供考慮,因此您的程序需要進行負載平衡。如果您將非常大的數據集分成20個相同大小的數據塊,那麼最終會有20個相同時間的作業?如果不是這樣,並且如果你有一個想法,即工作時間如何隨着投入而變化,那麼你可能在分工方面做得更加複雜,而不是簡單地把你分成20個相等的部分。例如,你可以將它切成2000個相等的部分,並一次將它們提供給機器執行。在這種情況下,您在負載平衡方面所獲得的優勢可能會失去作業管理的時間成本。你付錢,你需要你的選擇。

從你的問題陳述我不會根據預期的表現來決定採用哪種解決方案,因爲我期望任何方法都能在性能方面進入相同的球場,但是開發工作解決方案的時間。

+0

很好的回答!我確信,對於共享內存,最好使用OpenMP而不是MPI,但現在我認爲只是按照MPI的建議重寫我的程序,讓程序訪問整個集羣上所有可用的處理器(20X24 )。關於我的陣列的大小,它是靈活的,因爲它是一個網格,我可以調整其大小,以計算單位的大小,以獲得最大的負載。 – 2013-02-28 14:51:06