165

I don't understand how BLAS, LAPACK and ATLAS are related and how I should use them together! I have been looking through all of their manuals and I have a general idea of BLAS and LAPACK and how to use them with the very few examples I find, but I can't find any actual examples using ATLAS to see how it is related with these two.

I am trying to do some low level work on matrixes and my primary language is C. First I wanted to use GSL, but it says that if you want the best performance you should use BLAS and ATLAS. Is there any good webpage giving some nice examples of how to use these (in C) all together? In other words I am looking for a tutorial on using these three (or any subset of them!). In short I am confused!

4

4 回答 4

177

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

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

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

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

于 2013-07-25T12:42:25.750 回答
53

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

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

但是转到您的另一个问题:BLASand LAPACKare rather APIs not specific SDKs。它们只是规范或语言扩展的列表,而不是实现或库。话虽如此, Netlib在 中存在原始实现FORTRAN 77,大多数人在谈论BLASand时都会提到(令人困惑!) LAPACK。因此,如果您在使用这些 s 时看到很多奇怪的东西,那API是因为您实际上是在调用FORTRAN例程C而不是C库和函数。据我所知,ATLAS并且OpenBLAS是一些最好的实现。它们符合原始的,尽管据我所知,它们是在BLASLACPACKAPIC/C++从头开始(不确定!)。有APIs 的 GPGPU 实现使用OpenCLCLBlastclBLASclMAGMAArrayFireViennaCL 等等。还有针对特定硬件或平台优化的供应商特定实现,我强烈反对任何人使用它们。

我对任何想学习 usingBLASLAPACKin的人的建议C是首先学习FORTRAN-C混合编程。提到的 repo 的第一章专门讨论这个问题,在那里我收集了许多不同的例子。

PS我一直在开发存储库的开发分支。它似乎不那么凌乱了!

于 2017-02-13T20:08:06.130 回答
34

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

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

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

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

这个讨论表明有很多 BLAS 的实现。BLAS 本身就是接口的事实上的标准。ATLAS 曾经是最先进的。它不再是。

于 2018-09-03T22:47:41.190 回答
0

据我所知,在通过 ATLAS 存储库工作之后,它似乎包括在 C 中重新实现 BLAS。除此之外还有更多内容,但我希望它能回答这个问题。

于 2017-03-09T18:34:16.770 回答