我目前正在学习C++,希望能够使用矩阵并加速整个过程。之前使用过Python+Numpy+OpenBLAS。
我认为C++ + Eigen + MKL可能会更快,或者至少不会更慢。
以下是我的C++代码:
#define EIGEN_USE_MKL_ALL
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <chrono>
using namespace std;
using namespace Eigen;
int main()
{
int n = Eigen::nbThreads( );
cout << "#Threads: " << n << endl;
uint16_t size = 4000;
MatrixXd a = MatrixXd::Random(size,size);
clock_t start = clock ();
PartialPivLU<MatrixXd> lu = PartialPivLU<MatrixXd>(a);
float timeElapsed = double( clock() - start ) / CLOCKS_PER_SEC;
cout << "Elasped time is " << timeElapsed << " seconds." << endl ;
}
我的 Python 代码:
import numpy as np
from time import time
from scipy import linalg as la
size = 4000
A = np.random.random((size, size))
t = time()
LU, piv = la.lu_factor(A)
print(time()-t)
我的时间安排:
C++ 2.4s
Python 1.2s
C++比Python慢的原因是什么?
我正在使用以下方式编译C++:
g++ main.cpp -o main -lopenblas -O3 -fopenmp -DMKL_LP64 -I/usr/local/include/mkl/include
MKL绝对起作用了:如果我禁用它,运行时间大约为13秒。
我还尝试了C++ + OpenBLAS,这也给了我大约2.4秒的运行时间。
有什么想法为什么C++和Eigen比numpy/scipy慢?
-DNDEBUG
编译时,所需的时间是多少? - Henri Menke-march=native
编译,并使用Eigen 3.x来利用CPU的AVX指令。由于我这里得到了0.7秒的结果,你应该能得到1秒到最多2秒之间的结果。 - ggael