BLAS,LAPACK和其他线性代数库的关系是什么?


26

我一直在研究我一直在从事的项目的C ++线性代数库。我仍然没有掌握的东西是BLAS和LAPACK与其他线性代数库的连接。

浏览关于线性代数库的这篇文章,我发现有趣的是:

  • 一些库独立于BLAS和LAPACK
  • 有些需要BLAS和LAPACK
  • 有些具有BLAS和LAPACK的可选接口
  • 而且据我了解,您可以使用BLAS和LAPACK直接解决线性代数问题

我可以想象有些库只是用C和Fortran编写的BLAS和LAPACK库的C ++接口,而另一些则实现了自己的替代例程,但是

  1. BLAS和LAPACK的可选接口的含义是什么?选择退出后您失去了什么,图书馆正在做什么呢?

  2. 是否有任何库提供的不仅仅是接口?例如,UMFPACK用C编写,并且具有BLAS和LAPACK的可选接口。BLAS和LAPACK不能自己做什么UMFPACK(或其他库)?

Answers:


15

据我所知,Lapack是许多算法(非对称密集本征求解器,伪二次时间对称本征求解器,快速Jacobi SVD)的唯一公开可用的实现。大多数不依赖BLAS + Lapack的库都倾向于支持非常原始的操作,例如矩阵乘法,LU分解和QR分解。Lapack包含一些用于密集矩阵计算的最复杂的算法,我相信在其他任何地方都无法实现。

因此,要回答您的问题(至少要部分回答),

  1. 通过退出BLAS / Lapack,通常不会缺少功能(除非设计了可选接口,以便没有替代实现,这种情况很少见)。如果您想执行非常复杂的操作,那么其他那些库可能也不会自己实现。由于BLAS可以针对您的体系结构进行高度调整,因此您可能会错过大量的加速器(并非没有听说过一个数量级的速度差)。

  2. 您提到了UMFPACK,它用于稀疏矩阵分解。BLAS / Lapack仅关注稠密矩阵。UMFPACK在某种程度上需要解决中等大小的问题,可以使用定制实现或通过调用BLAS / Lapack来解决。这里的区别仅在于速度。

如果非常关注速度,请尝试使用支持可选BLAS / Lapack绑定的库,并在需要更快的速度时最终使用它们。


3
  1. BLAS和LAPACK例程(最重要的是BLAS例程)的良好实现可能比相同功能的简单直接实现快得多。但是,有效的实现通常包括针对您所运行的特定计算机的非常特定的优化。甚至同一制造商的不同型号的处理器(例如Intel x86-64处理器)通常也需要非常不同的代码才能获得良好的性能。通过将优化的BLAS / LAPACK库提供给软件包,与使用未优化的例程相比,通常可以加快代码的速度。但是,由于许多临时用户可能不具备安装优化例程的专业知识,因此通常还提供使用通用未优化线性代数例程的选项。

  2. UMFPACK是稀疏矩阵(占0项的比例很高的矩阵)上的线性代数例程的库。它可以使用BLAS / LAPACK处理遇到的稠密矩阵(或矩阵内的稠密块)。


1

简短的版本:它们是主要用Fortran编写的库,由于它们的快速和优化,它们用于许多语言的数值运算-甚至某些C程序;它们还是许多算法的唯一开源实现:)

除非它们具有依赖关系,否则您不必使用它们。iirc其中大多数都是非常独立的,您可以随时编写自己的数学函数,例如针对您的体系结构的更好的矢量化函数


1
自从停止编写Fortran以来,最优化的BLAS和LAPACK例程已经有很长时间了。最快的BLAS和LAPACK例程通常不是从netlib下载的例程。大多数处理器的供应商出售或分发专门为其芯片设计的BLAS和LAPACK优化版本。
比尔·巴特

抱歉,我的意思是网上分发的-一般的;当然,特定于芯片的芯片不那么可移植:即某些Intel的矢量技巧在AMD芯片上不能很好地工作,这就是为什么它们对库不屑一顾的原因。而且我敢肯定,这些商标是否已改名?
Eiyrioü冯Kauyf

@BillBarth BLAS肯定是,但是您确定LAPACK例程也会被重写吗?只要BLAS 3的性能很高(或多线程),Afaik就可以了。
stali 2013年

1
我认为BLAS和LAPACK是函数和接口的名称。有很多不同的实现(ACML,ESSL,MKL,ATLAS等)。
Bill Barth

1
这些只是接口..。例如ATLAS,它们不是实际的库。
Eiyrioü冯Kauyf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.