矩阵乘法的快速LAPACK/BLAS
Fast LAPACK/BLAS for matrix multiplication
我现在正在探索线性代数的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上更容易实现。
除了已经说过的,您还应该使用高级别的优化:
-
请确保使用O2或O3编译器标志。
-
链接到上述高性能(可能还有多线程)BLAS库。AFAIK MKL只在Unix平台上免费提供,不过,如果你在windows中使用像cygwin这样的Linux盒子,我想这应该没问题。OpenBLAS也是多线程的。
-
在许多库中,设置符号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以获得更高的性能,但它是一个商业包,
- 直接在RcppArmadillo中调用LAPACK例程
- Armadillo正在为共享的lapack库获取未定义的参考
- LAPACK函数在第一次迭代后变慢
- BLAS 2 级波段矩阵向量积多个向量
- 有没有一种算法可以将 LAPACK 排列更改为真正的排列?
- Lapack函数DGTSV通过C /Visual Studio提供未解决的外部符号
- MATLAB faster than LAPACK?
- SuperLu和LaPack的比较在与犰狳进行基准测试时失败
- 检查并行化 BLAS 例程的结果
- Blas 和 Lapack 库是否有本机 C++(不是 C)接口?
- 推广到多个BLAS/LAPACK库
- 矩阵乘法的快速LAPACK/BLAS
- 在Windows 7的Qt Creator项目中链接MLPACK, Armadillo和LAPACK/BLAS
- 与LAPACK和BLAS的链接会导致c++异常无法处理
- BLAS/LAPACK未安装:如何安装
- 在c++中调用lapack和blas
- 可变大小阵列与LAPACK/BLAS
- 将英特尔的MKL(BLAS&LAPACK)连接到GCC
- Armadillo C++和BLAS和ATLAS在mingw32下找不到lapack BLAS
- C++中的矩阵操作(使用 Blas/Lapack 或其他替代方案)