Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading LAPACK例程是线程安全的吗?_Multithreading_Fortran_Lapack_Blas - Fatal编程技术网

Multithreading LAPACK例程是线程安全的吗?

Multithreading LAPACK例程是线程安全的吗?,multithreading,fortran,lapack,blas,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例程的新手,所以我对它们不太了解,我想在并行化循环(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的任何子例程或函数吗?在我编写并定义为纯的子例程中

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

  • dgetrs
  • dgetrf
  • 吉特里
  • 吉肯

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

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

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

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


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

如果我错了,请纠正我,但我认为通常LAPACK子例程不是纯的,这不仅是因为打印输出消息,而且是因为用于返回存储在输入变量中的结果。也就是说,例如,如果您尝试反转矩阵,子例程类似于“inv(a)”,其中a是同时输入和输出(intent(inout)),而不是“inv(a,B)”,其中a仅为in,B仅为out


它们不可能是纯函数,因为函数会修改其输入。

我可以看出,我不能在纯函数中使用它们。我得到以下错误:
错误:在(1)处对'dgetrs'的子例程调用不是纯的
供参考:MKL为纯Fortran 95子例程提供接口Fortran有一个
子例程的概念。他们确实修改了自己的论点,但这并不重要,关键是他们没有副作用。修改输出参数不是副作用,它是一种完全线程安全的效果。其次,消息的打印不是纯粹的,但它们必须是线程不安全的并不重要。此打印可以在
关键
部分完成(使用OpenMP、互斥体或您使用的任何线程),这将使其线程安全。