我不明白BLAS,LAPACK和ATLAS是如何相关的以及我应该如何一起使用它们!我一直在查看他们的所有手册,我对BLAS和LAPACK以及如何在我找到的极少数示例中使用它们有一个大概的想法,但我找不到任何使用ATLAS的实际示例来查看它与这两个 .
我正在尝试对矩阵进行一些低级别的工作,而我的主要语言是C.首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS . 有没有好的网页提供一些很好的例子,说明如何一起使用这些(在C中)?换句话说,我正在寻找使用这三个(或其中任何一个子集!)的教程 . 总之我很困惑!
4 回答
BLAS是低级矩阵和向量算术运算的集合(“通过标量乘以向量”,“将两个矩阵相乘并添加到第三个矩阵”等等) .
LAPACK是高级线性代数运算的集合 . 诸如矩阵因子分解(LU,LLt,QR,SVD,Schur等)之类的东西,用于执行诸如“找到矩阵的特征值”,或“找到矩阵的奇异值”或“求解线性系统”之类的事情” . LAPACK Build 在BLAS之上;许多LAPACK用户只使用LAPACK接口,根本不需要了解BLAS . LAPACK通常与BLAS分开编译,并且可以使用您可用的任何高度优化的BLAS实现 .
ATLAS是一种可移植的相当不错的BLAS接口实现,它还实现了一些最常用的LAPACK操作 .
“你应该使用什么”取决于你正在尝试做什么以及你正在使用什么平台的细节 . 但是,对于“使用ATLAS LAPACK”,你不会走得太远 .
不久之前,当我开始在
C
中做一些线性代数时,我惊讶地看到BLAS
,LAPACK
和其他基本API
的教程很少,尽管事实上它们在某种程度上是许多其他图书馆的基石 . 出于这个原因,我开始收集我在互联网上找到的所有示例/教程BLAS
,CBLAS
,LAPACK
,CLAPACK
,LAPACKE
,ATLAS
,OpenBLAS
...在this Github repo .好吧,我应该警告你,作为一名机械工程师,我在管理这样的git存储库或GitHub方面经验不足 . 对你们来说,这看起来一团糟 . 但是,如果你设法克服凌乱的结构,你会发现各种可能有帮助的例子和说明 . 我已经尝试了大部分,以确保他们编译 . 那些不编译的我已经提到了 . 我已修改其中许多内容以便与
GNU compilers
(gcc
,g++
和gfortran
)进行编辑 . 我已经制作了MakeFile
,您可以阅读以了解如何在C
或C++
程序中调用单独的Fortran/FORTRAN
例程 . 我还为mac和linux添加了一些安装说明(对不起windows家伙!) . 我还制作了一些bash
.sh
文件,用于自动编译其中一些库 .但是回到你的另一个问题:
BLAS
和LAPACK
相反API
不是特定的SDK
. 它们只是规范或语言扩展的列表,而不是实现或库 . 话虽如此,FORTRAN 77
中有Netlib的原始实现,大多数人在谈论BLAS
和LAPACK
时都会引用(令人困惑!) . 因此,如果您在使用这些API
时看到很多奇怪的事情,那是因为您实际上是在C
而不是C
库和函数中调用FORTRAN
例程 . 据我所知,ATLAS
和OpenBLAS
是BLAS
和LACPACK
的一些最佳实现 . 它们符合原始的API
,尽管据我所知它们是从头开始在C/C++
实现的(不确定!) .API
的GPGPU实现使用OpenCL
:CLBlast,clBLAS,clMAGMA,ArrayFire和ViennaCL来提及一些 . 还有针对特定硬件或平台优化的供应商特定实现,我强烈反对任何人使用它们 .我建议任何想要在
C
中使用BLAS
和LAPACK
学习的人首先学习FORTRAN-C
混合编程 . 上述回购的第一章专门讨论这个问题,我收集了很多不同的例子 .P.S. 我一直在the dev branch of the repository工作 . 它似乎稍微不那么凌乱!
ATLAS现在已经过时了 . 它是在人们认为优化各种平台的BLAS超出人类能力的时候开发的,因此自动生成和自动调谐是最佳选择 .
在21世纪初期,随后是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曾经是最先进的 . 它不再是 .
据我所知,在完成ATLAS存储库之后,似乎它包含了在C中重新实现BLAS . 除此之外还有更多内容,但我希望它能回答这个问题 .