比numpy/scipy openblas慢性 mkl或开放式布拉斯
Eigen + MKL or OpenBLAS slower than Numpy/Scipy + OpenBLAS
我从C atm开始,想要使用矩阵并加快速度。之前与Python Numpy OpenBlas合作。认为C 特征 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慢?
我正在使用:
编译Cg++ main.cpp -o main -lopenblas -O3 -fopenmp -DMKL_LP64 -I/usr/local/include/mkl/include
MKL肯定有效:如果我禁用它,则运行时间约为13s。
我还尝试了C OpenBlas,这也给了我2.4左右。
为什么C 和EIGEN比Numpy/Scipy慢?
时间是错误的。这是壁时钟时间与CPU时间的典型症状。当我从<chrono>
标头中使用system_clock
时,它"神奇地"变得更快。
#define EIGEN_USE_MKL_ALL
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <chrono>
int main()
{
int const n = Eigen::nbThreads( );
std::cout << "#Threads: " << n << std::endl;
int const size = 4000;
Eigen::MatrixXd a = Eigen::MatrixXd::Random(size,size);
auto start = std::chrono::system_clock::now();
Eigen::PartialPivLU<Eigen::MatrixXd> lu(a);
auto stop = std::chrono::system_clock::now();
std::cout << "Elasped time is "
<< std::chrono::duration<double>{stop - start}.count()
<< " seconds." << std::endl;
}
i用
编译icc -O3 -mkl -std=c++11 -DNDEBUG -I/usr/include/eigen3/ test.cpp
并获取输出
#Threads: 1
Elasped time is 0.295782 seconds.
您的Python版本在我的机器上报告0.399146080017
。
另外,要获得可比较的时机,您可以在Python中使用time.clock()
(CPU时间),而不是time.time()
(壁时钟时间)。
这不是一个公平的比较。Python例程以浮点精度运行,而C 代码需要重复加倍。这恰好使计算时间加倍。
>>> type(np.random.random_sample())
<type 'float'>
您应该与MatrixXf
而不是MatrixXd
进行比较,并且您的MKL代码应同样快。
相关文章:
- 将gsl c++程序与"英特尔MKL"链接
- 如何指示 CMAKE 在 Visual Studio 中使用英特尔 MKL
- 在本征C++中 MKL 的函数"zgges"等价物是多少?
- 检测 Visual Studio 项目的属性中是否启用了英特尔 MKL
- 如何使用Cmake在Linux上设置MKL
- 无法运行使用 MKL 编译的 TensorFlow
- 特征运算符如何在内部解释为 MKL 函数?
- 使用特征/英特尔 MKL 求解稀疏线性系统
- Cython通过vdMul调用MKL在元素乘法上崩溃
- Use Eigen + Intel MKL + Pardiso
- 在 MKL 库中设置 openmp
- 使用 MKL 稀疏矩阵向量乘法
- 使用 MKL 编译 Eigen3
- 英特尔 MKL 稀疏 QR 求解 C++ 返回未初始化错误
- 开放式阅读WAV文件lib
- cblas_layout在MKL.H的GCC版本中未声明
- MKL矩形矩阵Inplace转置:不使用多个核心
- 矢量垫的开放式CV切片
- 在 Linux 上实施英特尔 MKL 的 DFT 时"Segmentation fault"
- 比numpy/scipy openblas慢性 mkl或开放式布拉斯