犰狳库是否会减慢矩阵运算的执行速度?

时间:2018-05-17 07:57:29

标签: c++ performance visual-c++ armadillo

我已经将MATLAB代码转换为C ++以加速它,使用Armadillo库来处理C ++中的矩阵运算,但令人惊讶的是它比MATLAB代码慢10倍!

所以我测试了Armadillo库以查看它是否是原因。下面的代码是一个简单的测试代码,用于初始化两个矩阵,将它们相加并将结果保存到新矩阵中。一段代码使用Armadillo库,而另一段则不使用。使用犰狳的部分太慢(注意经过的时间)。

它是否真的会减慢执行速度(虽然它应该加快速度)或者我错过了一些东西?

#include<iostream>
#include<math.h>
#include<chrono>
#include<armadillo>
using namespace std;
using namespace arma;
int main()
 {
   auto start = std::chrono::high_resolution_clock::now();
   double a[100][100];
   double b[100][100];
   double c[100][100];
   for (int i = 0; i < 100; i++)
     {
       for (int j = 0; j < 100; j++)
         {
           a[i][j] = 1;
           b[i][j] = 1;
           c[i][j] = a[i][j] + b[i][j];
         }
     }

     auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = finish - start;
    std::cout << "Elapsed time: " << elapsed.count() << " s\n";
    auto start1 = std::chrono::high_resolution_clock::now();
    mat a1=ones(100,100);
   mat b1=ones(100,100);
   mat c1(100,100);
   c1 = a1 + b1;
   auto finish1 = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed1 = finish1 - start1;
   std::cout << "Elapsed time: " << elapsed1.count() << " s\n";
   return 0;


}

以下是我得到的答案:

Elapsed time: 5.1729e-05 s
Elapsed time: 0.00025536 s

如你所见,犰狳明显变慢了!最好不要使用Armadillo库吗?

2 个答案:

答案 0 :(得分:1)

首先确保已启用blaslapack库,Armadillo doc处有说明。 第二件事是它可能是犰狳中更广泛的内存分配。如果您重新构建代码以首先进行内存初始化

#include<iostream>
#include<math.h>
#include<chrono>
#include<armadillo>
using namespace std;
using namespace arma;
int main()
 {
   double a[100][100];
   double b[100][100];
   double c[100][100];
   mat a1=ones(100,100);
   mat b1=ones(100,100);
   mat c1(100,100);

   auto start = std::chrono::high_resolution_clock::now();
   for (int i = 0; i < 100; i++)
     {
       for (int j = 0; j < 100; j++)
         {
           a[i][j] = 1;
           b[i][j] = 1;
           c[i][j] = a[i][j] + b[i][j];
         }
     }
   auto finish = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed = finish - start;
   std::cout << "Elapsed time: " << elapsed.count() << " s\n";

   auto start1 = std::chrono::high_resolution_clock::now();
   c1 = a1 + b1;
   auto finish1 = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed1 = finish1 - start1;
   std::cout << "Elapsed time: " << elapsed1.count() << " s\n";

   return 0;
}

有了这个,我得到了结果:

Elapsed time: 0.000647521 s
Elapsed time: 0.000353198 s

我用(在Ubuntu 17.10中)编译它: g++ prog.cpp -larmadillo

答案 1 :(得分:0)

我认为问题来自于你根本不使用犰狳。您唯一地使用它来创建比C ++的普通2D数组更复杂的变量,但实际上仅此而已。 Armadillo可以为您做的是为您提供非常快速的矩阵运算,如c1=a1+b1;中所示,没有循环。

但是如果你只是把它写成一个elemetwise操作,你就是不使用armadillo。它与使用MATLAB进行矩阵乘法相同,但自己编写矩阵乘法。您当时没有使用MATLAB的库!