如果您的計算結果與您所指出的一樣令人尷尬,那麼您應該通過將負載分散到所有20臺機器上來加快速度。由good
我的意思是close to 20
和close to 20
我的意思是你實際得到的任何數字,這讓你認爲努力是值得的。
你提出的混合解決方案當然是可行的,如果你實現它,你應該得到很好的加速。
混合MPI + OpenMP程序的一個替代方案是一個作業腳本(用您喜歡的腳本語言編寫),它將您的大型數組簡單地分成20個部分並啓動20個作業,每個機器上運行一個程序實例。當他們已經完成了另一個腳本準備重新組合結果。這將避免必須編寫任何MPI代碼。
如果您的計算機安裝了Grid Engine,則可以編寫作業提交腳本,將其作爲陣列作業提交,並讓Grid Engine負責將工作劃分給各個機器/任務。我希望其他工作管理系統有類似的設施,但我不熟悉它們。
另一種選擇是全MPI代碼,即完全刪除OpenMP並修改代碼以使用它在運行時找到的任何處理器。再說一遍,如果你的程序需要很少或沒有進程間的通信,你應該得到很好的加速。
在共享內存計算機上使用MPI有時比OpenMP更好(在性能方面),有時甚至更糟。麻煩的是,很難確定哪種方法更適合特定的具有RAM和高速緩存以及互連和總線以及所有其他變量需要考慮的架構上的特定程序。
我忽略了一個因素,主要是因爲您沒有提供任何數據可供考慮,因此您的程序需要進行負載平衡。如果您將非常大的數據集分成20個相同大小的數據塊,那麼最終會有20個相同時間的作業?如果不是這樣,並且如果你有一個想法,即工作時間如何隨着投入而變化,那麼你可能在分工方面做得更加複雜,而不是簡單地把你分成20個相等的部分。例如,你可以將它切成2000個相等的部分,並一次將它們提供給機器執行。在這種情況下,您在負載平衡方面所獲得的優勢可能會失去作業管理的時間成本。你付錢,你需要你的選擇。
從你的問題陳述我不會根據預期的表現來決定採用哪種解決方案,因爲我期望任何方法都能在性能方面進入相同的球場,但是開發工作解決方案的時間。
任何良好答案都需要更多信息:進程或運行個別計算的線程之間需要什麼通信?藉助OpenMP,這些通信通常會僞裝成共享內存訪問。換句話說,與您的計算有多麼接近?令人尷尬的並行*最後,你的硬件上是否安裝了諸如Grid Engine之類的作業管理系統? – 2013-02-28 12:04:58
我需要聯繫我們的系統管理員以瞭解任何Grid Engine,但到目前爲止,我從未聽說過我們的計算羣集上有這樣的引擎。 – 2013-02-28 12:48:17
我需要聯繫我們的系統管理員以瞭解任何Grid Engine,但到目前爲止,我從未聽說過我們的計算羣集上有這樣的引擎。 所以,暫且讓我們考慮一下沒有任何網格引擎。 我的程序非常尷尬並行(!)。假設您需要 以任意單元格的順序在巨大數組的每個單元上應用某個函數。 (即對於參數(角度)的給定矩陣(陣列),計算每個參數(角度)的Cos的矩陣)。但是「Cos」的計算時間和矩陣的大小非常大。 – 2013-02-28 12:54:07