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


142

我不了解BLAS,LAPACK和ATLAS之间的关系,以及如何将它们一起使用!我一直在浏览他们的所有手册,对BLAS和LAPACK以及它们在很少发现的示例中如何使用都有一个大致的了解,但是我找不到使用ATLAS的任何实际示例来了解它们与ALAS的关系这两个。

我正在尝试对矩阵做一些底层工作,我的主要语言是C。首先,我想使用GSL,但是它说如果要获得最佳性能,则应该使用BLAS和ATLAS。有没有一个很好的网页给出了一些很好的示例(如何在C中一起使用)?换句话说,我正在寻找使用这三个(或它们的任何子集!)的教程。总之我很困惑!


Answers:


156

BLAS是低级矩阵和矢量算术运算的集合(“将矢量乘以标量”,“将两个矩阵相乘并加到第三个矩阵”等)。

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

ATLAS是BLAS接口的一种可移植的,相当不错的实现,它还实现了一些最常用的LAPACK操作。

“您应该使用”什么在某种程度上取决于您要执行的操作以及所使用的平台的详细信息。但是,“使用ATLAS + LAPACK”不会出错。


感谢您的解释。您知道如何使用ATLAS + LAPACK的任何示例吗?我需要查看一些示例以了解如何使用它们!我了解它们的用途以及所做工作的理论,但是我几乎找不到C中有关如何在实践中实现的示例。
makhlaghi 2013年

1
@astroboy:能给我一些您实际上想做什么的信息吗?LAPACK特别是一个巨大的库。
斯蒂芬·佳能

为了简单起见,假设我有一个矩阵,并且想将其乘以某个值。我该如何在C语言中结合ATLAS和(LAPACK或BLAS)?我只想看看如何实现这些功能。netlib.org/lapack/lapacke.html中有一些示例,但没有提及ATLAS!
makhlaghi

是否可以像BLAS,LAPACK或MKL这样的对象透明地处理比内存更大的objetcs?
skan

1
@MinhNghĩa:有一个标准netlib.org/blas/blast-forum,但是(a)没有强制执行-没有测试套件的标准并不是真正的标准-(b)我不认为任何人都可以实现该文档描述的整套接口。嗯,很理想。
斯蒂芬·佳能

40

前一阵子,当我开始在中进行线性代数运算时C,我惊讶地发现BLASLAPACK以及其他基本APIs的教程如此之少,尽管事实上它们是许多其他库的基石。出于这个原因,我开始收集所有的例子/教程我能找到所有在互联网上的BLASCBLASLAPACKCLAPACKLAPACKEATLASOpenBLAS...在这个Github上回购

好吧,我应该警告您,作为机械工程师,我在管理这样的git仓库或GitHub方面经验不足。对你们来说,它首先看起来像是一团糟。但是,如果您设法克服混乱的结构,则会发现各种示例和说明,可能会有所帮助。我已经尝试了其中大多数,以确保它们可以编译。我提到过那些没有编译的东西。我修改了其中的许多内容,使其可与GNU compilersgccg++gfortran)一起编译。我编写了MakeFiles,您可以阅读该书,以了解如何Fortran/FORTRANCC++程序中调用各个例程。我还为Mac和Linux放了一些安装说明(对不起Windows家伙!)。我也做了一些bash .sh 文件以自动编译其中一些库。

但要你的另一个问题:BLASLAPACK相当API不是特定SDK秒。它们只是规范或语言扩展的列表,而不是实现或库。随着中说,有原始的实现通过入NetlibFORTRAN 77谈论的时候,大多数人是指(容易混淆的!)BLASLAPACK。因此,使用这些APIs 时如果看到很多奇怪的事情,是因为实际上是在调用FORTRAN例程C而不是在C库和函数中调用例程。ATLASOpenBLAS有一些最好的实现BLAS,并LACPACK就我知道的。它们符合原始格式API,即使据我所知,它们是在C/C++从头开始(不确定!)。有APIs的GPGPU实现,其中包括OpenCLCLBlastclBLASclMAGMAArrayFireViennaCL。还有针对特定硬件或平台优化的特定于供应商的实现,我强烈劝阻任何人使用它们。

我对任何人谁想要使用学习的建议BLAS,并LAPACKC是学习FORTRAN-C第一混合编程。提到的回购协议的第一章专门讨论此问题,在那里我收集了许多不同的示例。

PS我一直在不时地在存储库的dev分支上工作。似乎少了一些混乱!


LAPACK的维基百科页面以“ LAPACK(线性代数软件包)是一个标准软件库”开头。您是说不对吗,因为它是API规范而不是实现?
Noah_S

1
经过一些研究,似乎LAPACK和BLAS实际上是实现。NetLib关于BLAS的常见问题解答:“ BLAS(基本线性代数子程序)是为执行基本矢量和矩阵运算提供标准构件的例程”。在LAPACK的GitHub页面上:“ LAPACK是Fortran子例程的库”。在此基础上,并通读LAPACK的GitHub项目,我的印象是BLAS和LAPACK实际上是实现-LAPACK建立在BLAS之上以提供更复杂的功能。
Noah_S

1
@Noah_S我不会将Wikipedia用作“该”参考,但是据我所知,LAPACK有多种实现。我认为现在称它为API更准确。但是如果我错了,请纠正我。
1

2
我认为部分困惑是BLAS是API /规范,但是BLAS 有一个“参考实现”(来自Netlib),也被称为“ BLAS库”。通常,当人们说BLAS时,它们指的是API,因为参考实现未经优化,因此在实践/行业中使用不多。ATLAS提供了一些LAPACK子例程的优化实现,然后有选择地从LAPACK本身中提取其余子例程,以在内置的ATLAS lib文件中生成完整的LAPACK实现。
Andrew Janke

1
@Noah_S没有矛盾,每个库都有一个API,这使得可以在保持API兼容的同时重新实现实际功能,而LAPACK就是这种情况。
安德烈

17

到目前为止,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曾经是最先进的技术。它不再。


0

据我所知,在浏览了ATLAS存储库之后,它似乎包括在C中重新实现BLAS。它所包含的内容不止于此,但我希望它能回答这个问题。

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.