【问题标题】:Armadillo element wise multiplication speed犰狳元素明智的乘法速度
【发布时间】:2013-05-24 15:05:11
【问题描述】:

犰狳中的元素乘法 (%) 速度是否取决于是否安装了 LAPACK/BLAS?我目前在没有安装它们的情况下运行犰狳,而且速度很糟糕。 好的,这是最简单的代码,需要永恒来计算

    #include <iostream>
    #include "conio.h"


    #include "armadillo"

    using namespace arma;
    using namespace std;

    int main(int argc, char** argv)
    {


    int n=250; 
    mat X=ones(n,n);

    mat quan;



  for (int xi=1;xi<=256;xi++)
  {  
          quan = exp(X)%exp(X);
  }



  getch();


  return 0;
  }

【问题讨论】:

  • 犰狳确实使用了 LAPACK 和 BLAS 的外部实现,所以它们肯定会影响它的速度。
  • 能贴出相关代码吗?否则我们可能只是在猜测根本原因是什么。

标签: c++ armadillo


【解决方案1】:

确保您在编译器设置中启用了优化标志(例如,在 GCC 或 Clang 中,使用 -O2 或 -O3)。 Armadillo 使用template metaprogramming,并且与任何 C++ 模板库一样,这绝对需要在编译器中启用优化才能有效。例如,这也适用于 Boost 等 C++ 模板库。

【讨论】:

  • 我已经安装了 blas 和 lapack,但似乎没有任何改变。速度远不及matlab
  • 双精度 exp() 函数在任何语言中总是很慢。使用 exp() 的近似值(可能通过编译器标志启用),或将 Armadillo 矩阵类型从“mat”更改为“fmat”。这将使用速度更快的单精度 exp。无论如何,为什么不将循环从 exp(x)*exp(y) 重新定义为 exp(x+y),这是等价的?
  • Matlab 只是封装了 MKL,它利用了并行化和所有现有的优化。如果您不与 MKL 链接并使用好的编译器(至少使用 O3 选项),您将永远无法接近
【解决方案2】:

你为什么要计算exp(X) 两次?您没有对元素乘法进行基准测试;您显然是在对 exp() 进行基准测试。另外,你为什么不使用expmat()expmat_sym()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多