python矩阵运算库效率_基准矩阵乘法性能:C++(EGIN)比Python慢得多

在经过漫长而痛苦的安装和编译之后,我在Matlab、C++和Python中进行了基准测试。在

我的电脑:MAC OS High Sierra 10.13.6,带Intel(R)Core(TM)i7-7920HQ CPU@3.10GHz(4核,8线程)。我有Radeon Pro 560 4096 MB,因此这些测试中没有涉及到GPU(我从未配置过openCL,也没有在np.show_config()中看到它)。在

软件:

Matlab 2018A,Python 3.6,C++编译器:苹果LLVM版本91.0(CLAN-902.0.37.2),G++- 8(自制程序GCC 82.0).82.0/P>

1)Matlab性能:时间=(14.3+-0.7)ms,执行10次运行a=rand(1000,1000);

b=rand(1000,1000);

c=rand(1000,1000);

tic

for i=1:100

c=a*b;

end

toc/100

2)Python性能(%timeit a.dot(b,out=c)):15.5+-0.8

我还为python安装了mkl库。当numpy与mkl:14.4+-0.7相关联时,它会有所帮助,但很少。在< P > 3)C++的性能。对原始代码(参见问题)进行了以下更改:noalias函数,以避免不必要的时间矩阵创建。

用c++11chorno库测量时间

在这里,我使用了许多不同的选项和两个不同的编译器:

^{2}$

执行时间~146 ms3.2 Added -march=native option:

执行时间~46+-2ms3.3 Changed compiler to GNU g++ (in my mac it is called gpp by custom-defined alias):

gpp -std=c++11 -I/usr/local/Cellar/eigen/3.3.5/include/eigen3/eigen main.cpp -O3

执行时间222ms3.4 Added - march=native option:

执行时间~45.5+-1ms

在这一点上,我意识到Eigen不使用多线程。我安装了openmp并添加了-fopenmp标志。请注意,在最新的clang版本上openmp不起作用,因此我必须从现在开始使用g++。我还通过监视Eigen::nbthreads()的值和macos活动监视器来确保我实际使用了所有可用的线程。在3.5 gpp -std=c++11 -I/usr/local/Cellar/eigen/3.3.5/include/eigen3/eigen main.cpp -O3 -march=native -fopenmp

执行时间:16.5+-0.7ms

3.6最后,我安装了“英特尔mkl库”。在代码中很容易使用它们:我刚刚添加了#define EIGEN_USE_MKL_ALL宏,就这样。但是很难链接所有库:gpp -std=c++11 -DMKL_LP64 -m64 -I${MKLROOT}/include -I/usr/local/Cellar/eigen/3.3.5/include/eigen3/eigen -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl main.cpp -o my_exec_intel -O3 -fopenmp -march=native

执行时间:14.33+-0.26毫秒(编者注:这个答案最初声称使用了-DMKL_ILP64,即not supported。也许以前是这样,或者碰巧有用。)

结论:在Python/Matlab中对矩阵乘法进行了高度优化。它是不可能(或,至少,非常难)做得明显更好(在CPU上)。

CPP代码(至少在MAC平台上)只有经过充分优化(包括全套优化选项和“英特尔mkl库”)才能获得类似的性能。

我本可以在openmp支持下安装旧的clang编译器,但由于单线程性能相似(约46毫秒),所以这似乎没有帮助。

如果能与本机英特尔编译器icc一起使用,那就太好了。不幸的是,这是专有软件,与“英特尔mkl库”不同。

感谢您的讨论

米哈伊尔

编辑:为了比较,我还使用cublasDgemm函数对我的gtx980gpu进行了基准测试。计算时间=12.6毫秒,这与其他的results.兼容。CUDA几乎和CPU一样好的原因是:我的GPU没有很好地针对双精度进行优化。对于浮点运算,GPU时间=0.43毫秒,而Matlab的时间为7.2毫秒

编辑2:为了获得显著的GPU加速,我需要对更大尺寸的矩阵进行基准测试,例如10k x 10k

编辑3:将接口从MKL_ILP64更改为MKL_LP64,因为ILP64是not supported.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值