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