我有一個程序超過100個子程序,我試圖讓這個代碼運行得更快,我試圖編譯這些使用並行標誌的子程序。我想知道如果我想使用並行標誌,我需要在程序中定義哪些變量或參數。與沒有並行標誌的程序相比,使用並行優化標誌增加了程序的運行時間。使用並行優化標誌時需要定義什麼?
任何建議,非常感謝。非常感謝。
最好的問候, Jdbaba
我有一個程序超過100個子程序,我試圖讓這個代碼運行得更快,我試圖編譯這些使用並行標誌的子程序。我想知道如果我想使用並行標誌,我需要在程序中定義哪些變量或參數。與沒有並行標誌的程序相比,使用並行優化標誌增加了程序的運行時間。使用並行優化標誌時需要定義什麼?
任何建議,非常感謝。非常感謝。
最好的問候, Jdbaba
我可以給你一些一般原則,但不知道你的具體的編譯器和平臺/操作系統,我將不能夠幫助你明確。據我所知,在Fortran編譯器中使用的所有自動並行化方案最終都使用OpenMP或MPI命令將循環拆分爲線程或進程。問題是與這些方案有關的一定數量的開銷。例如,在一個案例中,我有一個程序,它使用由供應商提供的優化庫作爲編譯庫,而不進行優化。由於我的所有子程序和函數都在優化器的大循環內部或外部,並且由於只有對象數據,所以自動並行器無法執行ipo,因此它不能使用多於一個內核。在這種情況下運行時間,由於爲OpenMP加載的DLL,/ qparallel實際上增加了運行時間的10%。
作爲一個說明,autoparallelizers不是魔術。從本質上講,他們所做的只是自動矢量化技術所做的相同類型的工作,即查找沒有依賴前一次迭代的數據的循環。如果它檢測到變量在迭代之間發生變化或者編譯器無法辨別,那麼它不會嘗試並行化循環。
如果使用的是英特爾Fortran編譯器,則可以打開診斷開關「/ qpar-report3」或「-par-report3」,爲您提供有關循環的依賴關係樹的信息,以瞭解爲什麼它們失敗優化。如果您無法訪問您正在使用的大部分代碼,特別是帶有主循環的部分,則很有可能代碼中沒有太多機會使用自動並行程序。
在任何情況下,您總是可以嘗試減少依賴關係並重新編寫代碼,使其更適合自動並行化。