用于矩阵乘法的快速LAPACK / BLAS

时间:2013-07-14 11:55:49

标签: c++ armadillo

我正在探索线性代数的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基于高度优化的线性代数库。我的问题是,是否存在从Armadillo使用更快的LAPACK / BLAS brary?或者,有没有办法以某种方式提取Matlab线性代数库并在C ++中使用它们?

4 个答案:

答案 0 :(得分:13)

LAPACK不进行矩阵乘法。它是提供矩阵乘法的BLAS。

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

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

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

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

答案 1 :(得分:4)

除了已经说过的内容之外,还应该使用高级优化:

  1. 请务必使用 O2 O3 编译器标记。

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

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

  4. 我在我的intel core-i7工作站上对armadillo / MKL_BLAS和Matlab进行了快速比较。对于C ++ exe,我使用-O3,MKL BLAS并定义了ARMA_NO_DEBUG。我将1000x1000个随机矩阵乘以100次,并对乘法时间求平均值。 C ++实现大约是matlab的1.5倍。

    希望这有帮助

答案 2 :(得分:1)

有没有办法以某种方式提取Matlab线性代数库并在C ++中使用它们?是的,对于C ++调用matlab函数,请参考以下链接:How to Call Matlab Functions from C++

答案 3 :(得分:0)

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

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

您应该能够将Armadillo与MKL联系起来以获得更高的性能,但这是一个商业套餐,