LAPACK例程是否安全?

时间:2015-06-17 12:13:52

标签: multithreading fortran lapack blas

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

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

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

相关的BLAS库是:

libblas3    1.2.20110419-7

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

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

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

  • dgetrs
  • dgetrf
  • dgetri
  • dgecon

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

2 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:-1)

如果我错了,请纠正我,但我认为一般LAPACK子程序不纯,不仅因为打印输出消息而且因为用于返回存储在输入变量中的结果。也就是说,例如,如果你试图反转矩阵,子程序就像“inv(A)”,其中A是输入和输出同时(intent(inout))而不是“inv(A, B)“其中A只在,而B只在外面。

它们不能是纯粹的,因为它修改了它的输入。