2015-06-17 50 views
6

我是一個使用LAPACK例程的新手,所以我不深入瞭解它們,並且我想在並行化循環(openmp)中使用它們。LAPACK例程線程安全嗎?

我使用Ubuntu 14.04LTS,並使用我的軟件包管理器安裝了LAPACK。安裝的版本是:

liblapack3 3.5.0-2ubuntu1  Library of linear algebra routines 3 - shared version 

相關的BLAS庫:

libblas3 1.2.20110419-7 

所以,我的第一個問題很簡單:我可以用在一個循環中LAPACK的任何子程序或函數使用OpenMP並行?。 Id est,他們線程安全嗎?

另一個問題是:我可以在我的純子程序中使用任何子程序或LAPACK函數嗎?,id est,在我編碼的子程序中定義爲純。

如果這些問題的答案都是「不與所有LAPACK程序,但其中一些」,那麼,我可以用下面的子程序?:

  • dgetrs做
  • dgetrf
  • dgetri
  • dgecon

而最後一個問題:你的LAPACK程序,用我所有的內核?ID EST,是他們已經p arallel?

回答

8

LAPACK庫預計是線程安全的。它不支持多線程,所以它不使用(全部)你的系統內核。實際上有一個特定的聲明,所有的LAPACK子程序都是線程安全的,因爲v3.3

另一方面,LAPACK被設計爲廣泛使用BLAS庫子程序。基本的BLAS也不使用任何線程。但是,有幾種流行的BLAS實現(ATLAS,OpenBLAS,MKL),它們具有大多數BLAS子例程的線程版本。如果您的LAPACK庫正在使用上述BLAS庫之一,那麼它們的子例程很可能會啓動它們自己的線程。當然,在上述庫中,用戶可以控制使用的線程數量。您可以查閱他們的文檔以找出方法。

因此,您需要檢查您使用的BLAS庫的哪個實現,以清楚地查看LAPACK的線程使用情況。

關於純函數內部的用法,我希望注意到BLAS和LAPACK都會在屏幕上輸出特定的錯誤消息(stdout或stderr)。這些消息通常與錯誤使用子程序相關,而不是數學錯誤。例如,如果您嘗試顛倒零維矩陣。如果你能保證這一點,那麼你可以說它是純粹的。

+1

而且我可以看到我不能在_pure_函數中使用它們。我收到以下錯誤:'錯誤:在(1)處調用'dgetrs'的子程序不是純粹的' –

+0

供參考:MKL爲純Fortran 95子例程提供接口https://software.intel.com/zh-cn/node/468670 – astrojuanlu