我是一个使用LAPACK例程的新手,所以我不太了解它们,我想在并行循环(openmp)中使用它们。
我使用Ubuntu14.04LTS并使用我的包管理器安装了LAPACK。安装的版本是:
liblapack3 3.5.0-2ubuntu1 Library of linear algebra routines 3 - shared version相关的BLAS库是:
libblas3 1.2.20110419-7因此,我的第一个问题非常简单:我可以在使用OpenMP并行化的循环中使用LAPACK的任何子例程或函数吗?他们的线安全吗?
另一个问题是:我可以在纯子程序中使用LAPACK的任何子例程或函数吗? id,在由我编码并定义为纯子程序的子例程中。
如果这些问题的答案不是所有的LAPACK程序,而是一些LAPACK过程,那么,我能用以下子程序来回答吗?
最后一个问题是: LAPACK程序是否使用了我所有的核心?
发布于 2015-06-17 13:31:32
LAPACK库应该是线程安全的。它不支持多个线程,所以它不使用(所有)您的系统内核。实际上,自v3.3以来,所有LAPACK子程序都是线程安全的,这是一个特定的声明。
另一方面,LAPACK被设计为广泛使用BLAS库子程序。基本BLAS也不使用任何线程。然而,有几种流行的BLAS实现(ATLAS、OpenBLAS、MKL),它们具有大多数BLAS子程序的线程版本。如果您的LAPACK库使用上述BLAS库之一,那么它们的子程序很可能启动自己的线程。当然,在上面的库中,用户可以控制使用的线程数。你可以查阅他们的文件,找出办法。
因此,您需要检查您使用的BLAS库的哪个实现,以便清楚地查看LAPACK的线程使用情况。
关于纯函数内部的使用,我希望指出,BLAS和LAPACK都会在屏幕上打印特定的错误消息(stdout或stderr)。这些消息通常与子程序的错误使用有关,而不是数学错误。例如,如果您试图反演一个零维矩阵。如果您能够确保这一点,那么您可能可以说它是纯的。
发布于 2018-06-04 11:05:35
如果我错了,请纠正我,但我认为通常LAPACK子程序并不是纯的,这不仅是因为打印出消息,而且是因为使用它来返回存储在输入变量中的结果。也就是说,例如,如果您试图反转一个矩阵,子例程类似于"inv(A)",其中A是同时输入和输出(意图(inout)),而不是"inv(A,B)“,其中A只在其中,B只在其中。
它们不可能是纯的,因为修改了它的输入。
https://stackoverflow.com/questions/30891296
复制相似问题