2015-06-17 55 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