7

我目前正在探索用于线性代数的 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 brary 可以从犰狳中使用?或者,有没有办法以某种方式提取 Matlab 线性代数库并在 C++ 中使用它们?

4

4 回答 4

15

LAPACK 不做矩阵乘法。BLAS 提供矩阵乘法。

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

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

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

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

于 2013-07-14T12:57:01.403 回答
4

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

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

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

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

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

希望这可以帮助

于 2013-09-25T14:27:04.390 回答
1

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

于 2013-07-14T12:00:56.207 回答
0

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

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

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

于 2013-07-14T12:11:39.357 回答