犰狳库会减慢矩阵运算的执行速度吗?
Does armadillo library slow down the execution of a matrix operations?
我已经将 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 的速度要慢得多!最好不要使用 Armadillo 库吗?
我认为问题出在您根本没有使用犰狳。您独特地使用它来创建比普通的 C++ 二维数组复杂一点的变量,但实际上仅此而已。 Armadillo 可以为您做的是为您提供非常快速的矩阵运算,如 c1=a1+b1;
,没有循环。
但是,如果您只是将其编写为元素操作,那么您就没有使用犰狳。它与使用 MATLAB 进行矩阵乘法相同,但自己编写矩阵乘法。那你不是在使用 MATLAB 的库!
首先确保blas
和lapack
库已启用,在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
我已经将 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 的速度要慢得多!最好不要使用 Armadillo 库吗?
我认为问题出在您根本没有使用犰狳。您独特地使用它来创建比普通的 C++ 二维数组复杂一点的变量,但实际上仅此而已。 Armadillo 可以为您做的是为您提供非常快速的矩阵运算,如 c1=a1+b1;
,没有循环。
但是,如果您只是将其编写为元素操作,那么您就没有使用犰狳。它与使用 MATLAB 进行矩阵乘法相同,但自己编写矩阵乘法。那你不是在使用 MATLAB 的库!
首先确保blas
和lapack
库已启用,在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