【问题标题】:Fast LAPACK/BLAS for matrix multiplication用于矩阵乘法的快速 LAPACK/BLAS
【发布时间】:2013-07-12 10:14:58
【问题描述】:

我目前正在探索用于线性代数的 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++ 中使用它们?

【问题讨论】:

  • 如果你输入-1,请给我一个提示,告诉我如何改进我的问题。

标签: c++ armadillo


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您如此全面的回答!
  • 最后一条语句也与仅在 Windows 中提供的 OpenBLAS 相矛盾,还是我遗漏了什么?
  • OpenBLAS的源码可以从github.com/xianyi/OpenBLAS/releases获取
【解决方案2】:

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

  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 倍。

希望对你有帮助

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Matlab 编译器成本很高!
    • @alexbuisson 那为什么是matlab?我知道还有一个线性代数库,BLAS,它适用于高性能计算。
    • 是的,这就是我使用 Octave 的原因。请注意,Matlab IDE 和 Compiler 是两个不同的东西。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2017-01-10
      • 2011-11-30
      • 2013-03-24
      相关资源
      最近更新 更多