我被要求並行化現有的c程序以減少其運行時間。 我只有一些(非常有限)使用基本MPI的經驗(而且我所有的編程知識都是自學的,所以它有點不準確)。我目前正試圖找出最佳的並行化方法。MPI並行化有助於多次讀取大量數據
當前,在主循環的每次迭代(M =迭代次數)期間,程序順序地訪問一組輸入文件(N =文件數) - 每個文件長度不同。在所有輸入文件被讀取後,程序對數據進行排序並更新一組輸出文件。 N和M在開始時都是已知的,並且N總是大於M.實際上,N太大而無法將所有輸入數據讀入內存,因此每次讀取文件時,只有與該主循環相關的信息迭代被保留。
我相信我可以使每個主循環迭代獨立,但每次迭代仍然需要訪問所有N個文件。使用OpenMPI(在Rocks上運行的技術上的OpenRTE 1.6.2,即RedHat Linux)來並行化該程序的最佳方式是什麼?
我的第一個想法是簡單地在多個線程中分離輸入文件的讀入,每個線程處理文件的子集,然後在最後對輸入進行排序。
我的第二個想法是將線程中的主M循環分開,這將更好地利用MPI。但是這種方法是否需要複製每個線程中的所有輸入文件(以避免讀取衝突)?如果是這樣,我擔心複製文件可能會抵消從主循環並行獲得的任何時間。另外,除了爲每種方法構建測試程序之外,是否還有更簡單的方法來確定哪種方法更快?
編輯:文件系統是NFS。
閱讀完評論後,我回過頭去對代碼進行了一些測試。該程序將其運行時讀數的93%用於數據。從已經說過的話來看,單獨的並行可能並不是最好的解決方案。在這一點上,似乎有必要真正查看程序的計算並儘量減少讀入需求。
非常感謝您的答覆。
你將在哪種文件系統上運行?並行化多少將有助於完全取決於文件系統的類型。單一的本地文件系統或共享的NFS將迅速收回報酬。如果你有一個並行的文件系統,比如光澤,或者你將文件分發到多個本地文件系統,那麼你可能會看到一些性能的提高,但是你需要調查文件系統的持續帶寬處理和在什麼條件下。 – jefflarkin
您可能會發現一對固態硬盤更便宜,性能提高超過幾小時。我認爲在決定優化什麼之前,您需要仔細衡量I/O和處理之間的平衡。 –
我正在使用具有4個節點的岩石羣集(每個節點24個處理器)。文件系統是NFS。除此之外,如果不先在Rocks手冊中查看它,我就不會了解該系統的其他任何內容。 – Lance