C 中用于矩阵乘法的 BLAS、LAPACK 或 ATLAS

计算科学 线性代数 矩阵 C 拉帕克 布拉斯
2021-11-25 22:27:09

我试图找到在 C 语言和 Windows 7 或 Ubuntu 14.04 下执行非常大的矩阵乘法的最优化方法。搜索让我找到了 BLAS、LAPACK 和 ATLAS。但是,我不知道我可以使用哪一个?我的意思是 BLAS Level 3 DGEMM 似乎适合我的情况,但我不知道如何在 C 中使用它。有人可以帮我解决这个问题吗?

先感谢您

2个回答

是的,您想调用 BLAS 例程 DGEMM。如何从 C 中调用它的起点是查看 DGEMM 的文档,您可以在网上找到该文档。然后你想了解如何从 C 调用 FORTRAN 例程(DGEMM,就像所有标准的 BLAS 例程都有一个 FORTRAN 调用约定)。例如,此文档https://computing.llnl.gov/tutorials/bgq/mixedProgramming2.pdf可能会有所帮助。

顺便说一下,LAPACK 提供了更高级别的线性代数运算,它们调用 BLAS 例程来实现其低级功能。ATLAS 是 BLAS 的高性能实现。BLAS 的另一个高性能开源实现是http://www.openblas.net/

从结构上看,DGEMM ( ) 是计算机科学中最可优化的例程之一。由于历史原因,此例程在 FORTRAN 中实现,或者该实现提供了至少一个与旧 FORTRAN 兼容的接口。如果你想从 C 中调用它,你必须注意函数参数,因为它们都需要是一个指针(即使是标量值或矩阵的大小)。C=αAB+βCαβ

为了避免这种转换为 FORTRAN 的问题,还可以使用所有主要 BLAS 实现(ATLAS、OpenBLAS、英特尔 MKL)都提供的所谓 CBLAS 接口。此接口允许您以 C 风格的方式传递所有函数参数。但它有一个大活板门。如果您使用经典的面向行的 C 样式方式存储二维数据,CBLAS 接口将以 FORTRAN 列主要格式复制所有数据,这会耗费时间和内存。因此,如果您使用 CBLAS,请尝试使用 Fortran 中的以列为主的存储。

最优化方式的问题很容易回答:如果您拥有英特尔编译器套件或至少英特尔 MKL 的许可证,请将其用作 BLAS 库。如果不是,请使用 OpenBLAS。两者都达到了计算机理论峰值性能的 90% 以上,但 OpenBLAS 在多插槽系统上的性能存在一些问题。