繁体   English   中英

c++ 犰狳中的矩阵乘法非常慢

[英]Matrix multiplication in c++ armadillo is very slow

我正在使用犰狳做一些基本的乘法,但由于某种原因,它需要很长时间才能完成。 我对 c++ 很陌生,所以我可能做错了什么,但即使在这个非常基本的例子中我也看不到它:

#include <armadillo>
#include <iostream>

using namespace arma;

int main(){
    arma::vec coefficients = {1.0, 1.09, 1.08};
    arma::mat X = arma::mat(100000, 3, fill::randu) * coefficients;

    cout << X.n_cols;
}

当我的意思是非常慢时,我已经运行了这个例子几分钟但它没有完成

编辑

我用perf stat./main运行脚本,但一段时间后停止了它,因为它不应该花那么长时间。 这是 output。

^C./main: Interrupt

 Performance counter stats for './main':

        257,169.20 msec task-clock                #    1.003 CPUs utilized          
             3,342      context-switches          #   12.995 /sec                   
               215      cpu-migrations            #    0.836 /sec                   
             1,312      page-faults               #    5.102 /sec                   
   963,025,520,077      cycles                    #    3.745 GHz                    
   542,959,361,927      instructions              #    0.56  insn per cycle         
   113,002,342,332      branches                  #  439.409 M/sec                  
     1,095,168,312      branch-misses             #    0.97% of all branches        

     256.349026907 seconds time elapsed

     147.860947000 seconds user
     109.317743000 seconds sys

Armadillo 是一个基于模板的库,可用作仅头文件库。 只需包括其 header 并确保您链接到一些 BLAS 和 LAPACK 实现。 当像这样使用时,犰狳假设你有一个可用的 BLAS 和 LAPACK 实现 如果您尝试在犰狳中使用任何需要它们而不与它们链接的功能,您将收到链接错误。 如果您没有 BLAS 和/或 LAPACK,您可以更改armadillo_bits/config.hpp文件并注释掉其中的一些定义,以便 armadillo 使用其自己的(较慢)该功能的实现。

或者,可以将犰狳编译为包装库,在这种情况下,您只需链接“犰狳”包装库。 它的 CMake 代码将尝试在配置期间确定您可用的内容并“注释掉适当的定义”以防您没有可用的要求,这反过来又会使其使用较慢的实现。 该“配置”代码错误地确定您没有可用的 BLAS,因为 BLAS 是提供快速矩阵乘法的代码。

我的建议是确保您安装了 BLAS 和 LAPACK,并将犰狳用作仅头文件库,确保将您的程序与 BLAS 和 LAPACK 链接。

另一种选择是使用柯南package管理器安装犰狳。 柯南最近添加了一个安装犰狳的配方。 它的优点是它将安装犰狳所需的一切(它安装了 openblas,它提供了 BLAS 和 LAPACK 实现)并且它与系统无关(类似于 Python 中的虚拟环境)。


笔记

在您提到的评论中,它与g++ main.cpp -o main -DARMA_DONT_USE_WRAPPER -larmadillo -llapack 原因是即使你安装了包装库,如果你定义ARMA_DONT_USE_WRAPPER ,你实际上是在使用犰狳作为一个只有头文件的库。 您可以将-larmadillo -llapack替换为-lblas -llapack

为什么不使用 Julia 或 ruby 代替?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM