LAPACK例程是否安全?

Ant*_*ano 6 multithreading fortran blas lapack

我是一个使用LAPACK例程的新手,所以我不太了解它们,我想在并行循环(openmp)中使用它们.

我使用Ubuntu 14.04LTS并使用我的包管理器安装LAPACK.安装的版本是:

liblapack3    3.5.0-2ubuntu1     Library of linear algebra routines 3 - shared version
Run Code Online (Sandbox Code Playgroud)

相关的BLAS库是:

libblas3    1.2.20110419-7
Run Code Online (Sandbox Code Playgroud)

所以,我的第一个问题很简单:我可以在使用OpenMP并行化的循环中使用LAPACK的任何子例程或函数吗?Id est,他们是安全的吗?

另一个问题是:我可以在我的纯子程序中使用LAPACK的任何子程序或函数吗?id est,在我编写的子程序中定义为纯子程序.

如果这些问题的答案是"不是所有LAPACK程序,而是其中一些程序",那么,我可以使用以下子程序吗?:

  • dgetrs
  • dgetrf
  • dgetri
  • dgecon

最后一个问题:LAPACK程序是否使用了我的所有内核?,id est,它们是否已经并行?

zti*_*tik 10

LAPACK库应该是线程安全的.它不支持多个线程,因此它不使用(所有)您的系统核心.实际上有一个特定的声明,即自v3.3起所有LAPACK子例程都是线程安全的.

另一方面,LAPACK旨在广泛使用BLAS库子例程.基本的BLAS也不使用任何线程.然而,有几种流行的BLAS实现(ATLAS,OpenBLAS,MKL),它们具有大多数BLAS子程序的线程版本.如果您的LAPACK库正在使用上述BLAS库之一,那么它们的子例程很可能会启动它们自己的线程.当然,在上面的库中,用户可以控制使用的线程数.您可以查阅他们的文档以了解方法.

因此,您需要检查您使用的BLAS库的哪个实现,以便清楚地了解LAPACK的线程使用情况.

关于纯函数内部的用法,我想注意BLAS和LAPACK都在屏幕上打印特定的错误消息(stdout或stderr).这些消息通常与子例程的错误使用有关,而与数学错误无关.例如,如果您尝试反转零维矩阵.如果你能确保这一点,那么你可以说它是纯粹的.