BLAS、 LAPACK 和 ATLAS 之间的关系是什么

我不明白 BLAS,LAPACK 和 ATLAS 是如何相关的,我应该如何使用他们在一起!我一直在看他们的所有手册,我有一个 BLAS 和 LAPACK 的大致想法,以及如何使用他们与极少数的例子,我发现,但我无法找到任何实际的例子使用 ATLAS,看到它是如何与这两个相关。

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

46280 次浏览

BLAS 是一个低级矩阵和向量算术运算的集合(“用一个标量乘一个向量”,“乘两个矩阵然后加到第三个矩阵”等等)。

LAPACK 是高级线性代数运算的集合。像矩阵分解(LU,LLt,QR,SVD,Schur,等等)这样的东西,被用来做像“找到矩阵的特征值”,或“找到矩阵的奇异值”,或“解决线性系统”。LAPACK 是建立在 BLAS 之上的,许多使用 LAPACK abc 0的用户使用 LAPACK 接口,根本不需要知道 BLAS。LAPACK 通常与 BLAS 分开编译,可以使用任何高度优化的 BLAS 实现。

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

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

不久前,当我开始在 C中做一些线性代数时,我惊讶地发现,关于 BLASLAPACK和其他基础 API的教程竟然如此之少,尽管它们在某种程度上是许多其他库的基石。出于这个原因,我开始收集所有的例子/教程,我可以在互联网上找到所有的 BLASCBLASLAPACKCLAPACKLAPACKEATLASBLAS0... 在 BLAS1。

好吧,我应该提醒您,作为一名机械工程师,我在管理这样的 git 仓库或 GitHub 方面几乎没有经验。一开始你们会觉得一团糟。然而,如果你设法克服混乱的结构,你会发现所有类型的例子和说明,这可能是一个帮助。我已经尝试了其中的大部分,以确保它们能够编译。还有我提到的那些没有编译的。我已经修改了它们中的许多,使其可以用 GNU compilers(gccg++gfortran)编译。我制作了 MakeFile,你可以通过阅读来学习如何在 CC++程序中调用单个 Fortran/FORTRAN例程。我还放了一些 Mac 和 linux 的安装说明(对不起,伙计们!).我还制作了一些 bash.sh文件,用于自动编译其中一些库。

但是回到你的另一个问题: BLASLAPACKAPI而不是特定的 SDK。它们只是一个规范或语言扩展的列表,而不是一个实现或库。尽管如此,在 FORTRAN 77中还是有 LAPACK9的原始实现,大多数人都会提到(令人困惑!)当谈到 BLASLAPACK。所以如果你在使用这些 APIs 时看到很多奇怪的事情,那是因为你实际上是在 C中调用 FORTRAN例程,而不是在 C中调用库和函数。据我所知,LAPACK1和 LAPACK2是 BLASLAPACK4的一些最好的实现。它们符合原来的 API,尽管据我所知,它们是从头开始在 LAPACK6上实现的(不确定!).有一些使用 LAPACK8: API0、 API1、 API2、 API3和 API4的 API的 GPGPU 实现。还有针对特定硬件或平台优化的特定供应商实现,我强烈劝阻任何人使用它们。

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

我一直在时不时地做 存储库的 dev 分支,看起来没那么乱了!

据我所知,在处理了 ATLAS 存储库之后,它似乎包含了在 C 语言中重新实现 BLAS 的功能。除此之外,我还希望它能回答这个问题。

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 曾经是最先进的。现在不是了。