2013-07-14 133 views
6

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

所以,Matlab是基于高度优化的线性代数库。我的问题是,如果在Armadillo中使用更快的LAPACK/BLAS brary?或者,有没有办法以某种方式提取Matlab线性代数库并在C++中使用它们?

+2

如果你把-1,请给我,我怎么能提高我的问题的提示。 – Kasablanca

回答

12

LAPACK没有做矩阵乘法。它是BLAS提供矩阵乘法。

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

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

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

请注意,高性能线性代数在Linux和Mac OS X上比在Windows上更容易完成。

+0

谢谢你这么全面的答案! – Kasablanca

+0

我认为你最后的陈述是错误的。例如,MATLAB在Windows上比在Linux上更快。通常,Windows上的英特尔MKL速度更快。 – Royi

+0

针对Windows和Linux的MKL使用相同的代码库 – mtall

1

有没有办法以某种方式提取Matlab的线性代数库和用C使用它们++是的,C++调用Matlab的功能,请参考以下链接:How to Call Matlab Functions from C++

+0

Matlab编译器成本很高! – alexbuisson

+0

@alexbuisson那为什么是matlab?我还知道另一个线性代数库BLAS,它适用于高性能计算。 – lulyon

+0

是的,这就是我使用Octave的原因。注意到Matlab IDE和Compiler是两个不同的东西。 – alexbuisson

4

添加到什么已经说过的话,你也应该使用高优化级别:

  1. 务必请使用O2O3编译器标志。

  2. 链接到上述高性能(和可能的多线程)BLAS库。不过,AFAIK MKL只能在Unix平台上免费使用,如果你在Windows内部使用像cygwin这样的Linux机器,那么应​​该没问题,那么我猜。 OpenBLAS也是多线程的。

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

我做了我的英特尔酷睿犰狳/ MKL_BLAS和Matlab之间的快速-i7工作站。对于C++ exe,我使用-O3,MKL BLAS并定义了ARMA_NO_DEBUG。我乘以100×1000随机矩阵100次,并平均乘法时间。 C++实现比matlab快大约1.5倍。

希望这有助于