在 Linux 中快速制作 Armadillo C++ 库 - Ubuntu

Posted

技术标签:

【中文标题】在 Linux 中快速制作 Armadillo C++ 库 - Ubuntu【英文标题】:Making Armadillo C++ library fast in Linux - Ubuntu 【发布时间】:2020-05-20 23:24:49 【问题描述】:

最初是 Windows 用户,我通过 VirtualBox 使用 Ubuntu 操作系统,并在 Ubuntu 操作系统上安装了 GCC 9.30。我在终端中使用以下命令安装了 Armadillo、BLAS 和 LAPACK:

sudo apt-get install liblapack-dev
sudo apt-get install libblas-dev
sudo apt-get install libboost-dev
sudo apt-get install libarmadillo-dev

之后我创建了以下 .cpp 文件,该文件测量执行 20 次 500 x 500 矩阵的乘法所花费的时间:

#include <iostream>
#include <armadillo>
#include <chrono>
using namespace std;


int main() 

    chrono::steady_clock sc;
    int n = 500;
    arma::Mat<double> A = arma::randu(n, n);
    arma::Mat<double> B = arma::randu(n, n);
    auto start = sc.now();     // start timer

    for (int i = 0; i < 20; i++)
    
        arma::Mat<double> C = A * B;
    
    auto end = sc.now();
    auto time_span = static_cast<chrono::duration<double>>(end - start);
    cout << "Operation took: " << time_span.count() << " seconds !!!";
    return 0;

我使用以下命令从 Linux 终端运行文件

g++ armaC.cpp -o armaC -O3 -march=native -fopenmp -larmadillo

结果证明这非常慢,平均为 1.5 秒,而 MATLAB 大约需要 0.08 秒。其实去掉-O3或者-fopenmp这个命令好像根本没有改变速度,这似乎说明我的编译方法出了点问题。

我还尝试在终端中使用以下行运行它,其中应包含 BLAS 和 LAPACK 包:

g++ armaC.cpp -o armaC -llapack -lblas

这给了我以下错误:

有人可以帮我解决这个问题吗?

【问题讨论】:

可能是由于“参考”(== 单线程,未优化)BLAS。安装不同的 BLAS 和 LAPACK 对。阿特拉斯可以调整。 OpenBLAS 是多线程的,你真的比较苹果和橘子,因为 Matlab 附带了 MKL(你也可以安装它:github.com/eddelbuettel/mkl4deb。我发现 OpenBLAS 更可取(小得多,几乎一样快)。 犰狳文档中有一个注释,when using GCC, use of -march=native in conjunction with -fopenmp may lead to speed regressions on recent processors. 另外auto不建议在犰狳中使用。 【参考方案1】:

标准 BLAS 和 LAPACK 是速度较慢的参考实现。 使用像OpenBLAS 或Intel MKL 这样的加速版本要快得多。

在安装 Armadillo 之前,首先安装 OpenBLAS。这可以通过直接从 OpenBLAS 页面使用存档手动完成,也可以通过包管理器自动完成。

例如,在 Ubuntu 20.04 上使用以下命令:

sudo apt-get install libopenblas-openmp-dev

...然后重新安装犰狳。一般建议使用可用的most recent version。

要解决您的链接问题,请参阅 Armadillo 的 Questions 页面。

(注意:在 Ubuntu 20.04 上,不要安装 libopenblas-serial-devlibopenblas-dev。这些都是错误的。从系统中删除它们。只有 libopenblas-openmp-dev 可以正常工作。)

【讨论】:

如何卸载犰狳并在 ubuntu 中重新安装。我还没找到办法。

以上是关于在 Linux 中快速制作 Armadillo C++ 库 - Ubuntu的主要内容,如果未能解决你的问题,请参考以下文章

C ++ Armadillo:来自二维矩阵的索引数组

C# 中的 C++ Armadillo 代码 [关闭]

在 Mac OS X 上安装 C++ Armadillo 库

Armadillo/C++:如何将元素从向量分配到立方体管?

Windows Visual Studio 2015、C++11 标准和 Armadillo 库

如何在 C++ 中快速对角化矩阵?