矩阵乘法的快速LAPACK/BLAS

Fast LAPACK/BLAS for matrix multiplication

本文关键字:LAPACK BLAS      更新时间:2023-10-16

我现在正在探索线性代数的Armadillo C++库。据我所知,它使用LAPACK/BLAS库进行基本的矩阵运算(例如矩阵乘法)。作为一名Windows用户,我从这里下载了LAPACK/BLAS:http://icl.cs.utk.edu/lapack-for-windows/lapack/#running.问题是,与Matlab甚至R相比,矩阵乘法运算非常慢。例如,在我的计算机上,Matlab在约0.15秒内乘法两个1000x1000矩阵,R需要约1秒,而C++/Armadillo/LAPACK/BLAS需要超过10秒。

因此,Matlab是基于高度优化的线性代数库。我的问题是,是否有一个更快的LAPACK/BLAS荆棘可以从Armadillo使用?或者,有没有一种方法可以以某种方式提取Matlab线性代数库并在C++中使用它们?

LAPACK不执行矩阵乘法。BLAS提供矩阵乘法。

如果你有64位操作系统,我建议你首先尝试64位版本的BLAS。这将使您的性能立即翻倍。

其次,看看BLAS的高性能实现,例如OpenBLAS。OpenBLAS同时使用矢量化和并行化(即多核)。这是一个免费(免费)的开源项目。

Matlab内部使用"英特尔MKL"库,您也可以将其与Armadillo库一起使用。"英特尔MKL"是闭源代码,但非商业用途是免费的。请注意,OpenBLAS可以获得与"英特尔MKL"不相上下或更好的矩阵乘法性能。

请注意,高性能线性代数在Linux和Mac OS X上通常比在Windows上更容易实现。

除了已经说过的,您还应该使用高级别的优化:

  1. 请确保使用O2O3编译器标志。

  2. 链接到上述高性能(可能还有多线程)BLAS库。AFAIK MKL只在Unix平台上免费提供,不过,如果你在windows中使用像cygwin这样的Linux盒子,我想这应该没问题。OpenBLAS也是多线程的。

  3. 在许多库中,设置符号NDEBUG(例如传递编译器标志-DNDEBUG)可以关闭代价高昂的范围检查和断言。Armadillo有自己的符号,称为ARMA_NO_DEBUG,您可以手动设置,也可以编辑config.hpp头文件(位于Armadillo include目录中)并取消注释相应的行。我猜,既然你能够在armadillo中打开外部BLAS的使用,你无论如何都应该熟悉这个配置文件。。。

我在intelcore-i7工作站上快速比较了armadillo/MKL_BLAS和Matlab。对于C++exe,我使用了-O3、MKL BLAS,并定义了ARMA_NO_DEBUG。我将1000x1000个随机矩阵相乘100次,并对相乘次数取平均值。C++的实现速度大约是matlab的1.5倍。

希望这能帮助

有没有一种方法可以以某种方式提取Matlab线性代数库并在C++中使用它们?是的,对于C++调用matlab函数,请参阅以下链接:如何从C++调用matlab函数

线性代数的几个C++库提供了一种与高度优化的库链接的简单方法。

看http://software.intel.com/en-us/articles/intelr-mkl-and-c-template-libraries

您应该能够将Armadillo链接到MKL以获得更高的性能,但它是一个商业包,