2014-12-04 33 views
0

我以爲我對此有一個非常清楚的瞭解,直到兩天前,但現在我可能會過度思考和迷惑自己。我會解釋我在做什麼,然後問一些可能簡單的問題,但我迄今爲止搜索並發現了相互矛盾的答案。當然有人可以讓我直接。希望快速平行最佳Lapack例程(gfortran)問題

我寫了一個Fortran代碼,利用LAPACK例程來解決特徵值問題。我的問題是(A-LB)x = 0,其中L是我的特徵值,x是我的特徵向量,A和B是方形的,複雜的,非對稱的非厄米非三角矩陣。 A和B都是NxN,在我的代碼中N通常在1000到3000之間。

現在代碼完美地工作。我正在使用LAPACK優化的地圖集安裝。我專門運行例行ZGGEV(link),因爲現在我需要所有的特徵值解和所有相關的特徵向量解。

現在我試圖優化我的代碼以加快運行速度。我們實驗室中的所有計算機都包含4個或8個核心CPU,並在Ubuntu上運行。在解決這個問題時,我可以做些什麼來利用我的全部CPU?我一直在尋找到它下面的事情:

  • 我安裝一個優化OpenBlas庫,它肯定要快,但我發現它仍然只使用1個核心(也就是它使用了更多的我想一個小高峯。這個峯值是BLAS軟件包並行運行,而LAPACK僅限於一個內核?)
  • 我調查了等離子體,但它看起來並不像它會解決我目前形式的等式。
  • 我已經研究過ScaLAPACK,但此刻此刻已經過去了,我不確定值得學習如何利用8核CPU。此外,我在代碼的後面部分使用openmp線程,並且從未將openmp與MPI結合在一起。

最後,我有幾個具體的問題布拉斯:

  1. 阿特拉斯自帶的 「libptcblas」 和 「libptf77blas」 庫。這些應該是線程庫,但我使用它們時並沒有注意到差別,事實上它運行速度稍慢(我猜是由於開銷)。我需要打電話來利用這些電話嗎?我有理由在「libcblas」和「libf77blas?」上使用這些庫嗎?
  2. 在OpenBlas中,它還構建了一個非常具體的「libopenblas_penrynp-r0.2.12」。這是線程版本嗎?再次,我沒有注意到運行這個blas與運行「libopenblas」有什麼區別。

希望有人可以清除我的一些布拉斯問題,並指出我朝着更快的解決方法。謝謝!

回答

1

您是否正確期待主要來自BLAS而不是LAPACK例程的多線程行爲。矩陣的大小足夠大以利用多線程環境。我不確定在ZGGEV例程中擴展BLAS的用法,但它應該不止是一個尖峯。

關於您的具體問題。

  1. 雖然我沒有用ATLAS庫廣泛,它被稱爲 說:「要使用的線程數是在編譯時確定」。 請參考http://math-atlas.sourceforge.net/faq.html#tnum
  2. 具體的libopenblas_*.alibopenblas.a的複製或軟鏈接。線程號在編譯時再次定義。

請檢查庫構建中的日誌文件和std.out,並確認它們已識別出正確數量的CPU。

我注意到你提到過多臺機器。請注意,ATLAS是一個自動調整的庫。所以你必須在每臺機器上重新編譯庫。另一方面,Openblas在make接受​​選項。該庫動態指定每臺機器中的優化例程。

我對你的多線程測試的建議是在你的程序中使用

$ make DYNAMIC_ARCH=1 NUM_THREADS=8 

然後CALL ZGEMM打造Openblas。這是絕對的優化,應該顯示多線程行爲。

+0

非常感謝!我很確定我現在完全明白了。我爲每臺電腦建立了一個單獨的ATLAS。根據你的建議,我在ZGEMM上用Openblas做了一些測試,我確實看到了並行加速。經過進一步檢查,我確實得到了ZGGEV的一些加速,但很少。然而,Openblas的運行速度仍然比ATLAS快得多,所以這是一個優點。 – 2014-12-05 07:35:51