C语言 BLAS、LAPACK和ATLAS之间的关系是什么?



我不明白BLAS,LAPACK和ATLAS是如何相关的,以及我应该如何一起使用它们!我一直在浏览他们所有的手册,我对 BLAS 和 LAPACK 有一个大致的了解,以及如何在我找到的极少数例子中使用它们,但我找不到任何使用 ATLAS 的实际示例来了解它与这两个之间的关系。

正在尝试对矩阵做一些低级工作,我的主要语言是 C。首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS。有没有好的网页给出一些关于如何一起使用这些(在 C 中(的好例子?换句话说,我正在寻找有关使用这三个(或它们的任何子集!简而言之,我很困惑!

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

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

ATLAS是BLAS接口的可移植性相当好的实现,它也实现了一些最常用的LAPACK操作。

"你应该使用什么"在某种程度上取决于你尝试做什么的细节以及你正在使用的平台。 但是,"使用ATLAS + LAPACK"不会出错太多。

前,当我开始在C做一些线性代数时,我很惊讶地发现BLASLAPACK和其他基础API的教程如此之少,尽管事实上它们是许多其他库的基石。出于这个原因,我开始收集我在互联网上可以找到的所有示例/教程,用于BLASCBLASLAPACKCLAPACKLAPACKEATLASOpenBLAS......在这个 Github 存储库中。

好吧,我应该警告你,作为一名机械工程师,我在管理这样的 git 存储库或 GitHub 方面几乎没有经验。首先,对你们来说,这似乎是一团糟。但是,如果您设法克服混乱的结构,您会发现各种示例和说明可能会有所帮助。我已经尝试了其中的大多数,以确保它们编译。以及我提到的那些不编译的。我已经修改了其中的许多,以便可以用GNU compilers(gccg++gfortran(进行编译。我已经制作了MakeFile,您可以阅读这些例程以了解如何在CC++程序中调用单个Fortran/FORTRAN例程。我还为Mac和Linux提供了一些安装说明(对不起Windows家伙!(。我还制作了一些bash .sh文件,用于自动编译其中一些库。

但是回到你的另一个问题:BLASLAPACK相当API不是特定的SDK。它们只是规范或语言扩展的列表,而不是实现或库。话虽如此,Netlib 在 FORTRAN 77 中有一些原始实现,大多数人在谈论BLASLAPACK时都会提到(令人困惑!因此,如果您在使用这些API时看到很多奇怪的东西,那是因为您实际上是在C中调用FORTRAN例程,而不是C库和函数。 据我所知,ATLASOpenBLASBLASLACPACK的最佳实现。它们符合原始API,尽管据我所知,它们是从头开始C/C++实现的(不确定!有使用OpenCLAPI的GPGPU实现:CLBlast,clBLAS,clMAGMA,ArrayFire和ViennaCL等等。还有一些针对特定硬件或平台优化的供应商特定实现,我强烈建议任何人使用它们。

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

附言我一直在不时地在存储库的开发分支上工作。似乎不那么凌乱!

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曾经是最先进的。 它不再是。

据我所知,在完成 ATLAS 存储库之后,它似乎包括 C 语言中 BLAS 的重新实现。还有更多的东西,但我希望它能回答这个问题。

最新更新