BLAS,LAPACK和ATLAS之间有什么关系

mak*_*ghi 131 c blas lapack atlas

我不明白BLAS,LAPACK和ATLAS是如何相关的以及我应该如何一起使用它们!我一直在查看他们的所有手册,我对BLAS和LAPACK以及如何在我找到的极少数示例中使用它们有了一般概念,但我找不到任何使用ATLAS的实际示例来查看它与这两个.

我正在尝试对矩阵做一些低级别的工作,我的主要语言是C.首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS.有没有什么好的网页提供一些很好的例子,说明如何一起使用这些(在C中)?换句话说,我正在寻找使用这三个(或其中任何一个子集!)的教程.总之我很困惑!

Ste*_*non 145

BLAS是低级矩阵和向量算术运算的集合("通过标量乘以向量","将两个矩阵相乘并添加到第三个矩阵"等等).

LAPACK是高级线性代数运算的集合.诸如矩阵因子分解(LU,LLt,QR,SVD,Schur等)之类的东西,用于执行诸如"找到矩阵的特征值",或"找到矩阵的奇异值"或"求解线性系统"之类的事情".LAPACK建立在BLAS之上; 许多LAPACK用户使用LAPACK接口,根本不需要了解BLAS.LAPACK通常与BLAS分开编译,并且可以使用您可用的任何高度优化的BLAS实现.

ATLAS是BLAS接口的便携式相当好的实现,它还实现了一些最常用的LAPACK操作.

"你应该使用什么"取决于你正在尝试做什么以及你正在使用什么平台的细节.但是,对于"使用ATLAS + LAPACK",你不会走得太远.


Foa*_*oad 37

前一阵子,当我开始在做一些线性代数C,它来到我作为一个惊喜地看到有这么几个教程BLAS,LAPACK和其他基本API,S尽管他们在某种程度上许多其他库的基石.出于这个原因,我开始收集所有的例子/教程我能找到所有在互联网上的BLAS,CBLAS,LAPACK,CLAPACK,LAPACKE,ATLAS,OpenBLAS...在这个Github上回购.

好吧,我应该警告你,作为一名机械工程师,我在管理这样的git存储库或GitHub方面经验不足.对你们来说,这看起来一团糟.但是,如果你设法克服凌乱的结构,你会找到各种可能有帮助的例子和说明.我已经尝试了大部分,确保他们编译.那些不编译的我已经提到了.我已修改其中许多是可编译的GNU compilers(gcc,g++gfortran).我已经制作了MakeFile一些你可以阅读的内容,以了解如何Fortran/FORTRAN在一个C或一个程序中调用个别例程C++.我还为mac和linux添加了一些安装说明(对不起windows家伙!).我还制作了一些bash .sh文件来自动编译其中的一些库.

但要你的另一个问题:BLASLAPACK相当API不是特定SDK秒.它们只是规范或语言扩展的列表,而不是实现或库.随着中说,有原始的实现通过入NetlibFORTRAN 77谈论的时候,大多数人是指(容易混淆的!)BLASLAPACK.所以如果你在使用这些时看到很多奇怪的东西,那API是因为你实际上是在调用FORTRAN例程C而不是C库和函数.ATLASOpenBLAS有一些最好的实现BLAS,并LACPACK就我知道的.它们符合原始版本API,尽管据我所知,它们是C/C++从头开始实现的(不确定!).还有的GPGPU的实现API使用S OpenCL:CLBlast,clBLAS,clMAGMA,ArrayFireViennaCL提一些.还有针对特定硬件或平台优化的供应商特定实现,我强烈反对任何人使用它们.

我建议任何想要学习BLAS和使用LAPACK的人C都是先学习FORTRAN-C混合编程.上述回购的第一章专门讨论这个问题,在那里我收集了许多不同的例子.

PS我一直在处理存储库的dev分支.它似乎稍微不那么凌乱!

  • 我认为部分混淆是 BLAS 是一个 API/规范,但还有*也* BLAS(来自 Netlib)的“参考实现”,也被称为“BLAS 库”。通常,当人们说 BLAS 时,他们指的是 API,因为参考实现未经过优化,因此在实践/行业中使用不多。ATLAS 提供了一些 LAPACK 子例程的优化实现,然后有选择地从 LAPACK 本身中提取其余的子例程,以在构建的 ATLAS lib 文件中生成完整的 LAPACK 实现。 (3认同)
  • @Noah_S 这并不矛盾,每个库都有一个 API,这使得在保持 API 兼容的同时重新实现实际功能成为可能,这就是 LAPACK 所发生的情况。 (3认同)
  • @Noah_S 我不会将维基百科用作“the”参考,但据我所知,LAPACK 有多种实现。我认为现在称其为 API 更为准确。但如果我错了,请纠正我。 (2认同)

小智 11

到目前为止,ATLAS已经过时了。它是在人们认为针对各种平台优化BLAS超出人类能力的时候开发的,因此,自动生成和自动调整是必须的。

在2000年代初期,出现了Kazushige Goto,他展示了如何手动编码高效的实现。您可能会喜欢《纽约时报》上的一篇有趣的文章:https//www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html

Kazushige一方面对矩阵矩阵乘法的高性能实现背后的理论有更好的了解,另一方面对它们进行了更好的设计。他的方法通常在当前CPU上表现最好,但不在ATLAS自动调整的搜索空间中。因此,ATLAS本质上是劣等的。Kazushige对BLAS的实施被称为GotoBLAS。他加入行业时被称为OpenBLAS。

GotoBLAS背后的思想被重构为一个新的实现,即类似于BLAS的库实例化软件(BLIS)框架(https://github.com/flame/blis),该框架实现了相同的算法,但结构代码更少需要针对新架构进行自定义实施。BLIS用C编码。

这次讨论表明,BLAS的实施很多。BLAS本身是该接口的事实上的标准。ATLAS曾经是最先进的技术。它不再。