我正在学习使用本征库两大矩阵的简单乘法。 该乘法似乎是明显比既Matlab和Python的慢对于相同尺寸矩阵。
有什么工作要做,以使本征运行速度更快?
问题详细信息
X:随机1000×50000矩阵
Y:随机50000×300矩阵
定时(在我2011年底的MacBook Pro)实验
利用Matlab:X * Y大约需要1.3秒
使用Enthought的Python:numpy.dot(X,Y)开〜2.2秒
使用本征:X * Y大约需要2.7秒
个人资料
你可以让我的本征代码(作为MEX功能): https://gist.github.com/michaelchughes/4742878
这MEX函数从Matlab的两个矩阵读取,并返回他们的产品。
运行没有矩阵乘积操作此MEX函数(即只是在做的IO)产生微不足道的开销,因此函数之间的IO和Matlab没有解释在性能上相差很大。 这显然实际的矩阵产品操作。
我用G ++编译,这些优化标志:“-O3 -DNDEBUG”
我使用的是最新的稳定艾根的头文件(3.1.2)。
关于如何提高本征的表现有什么建议? 任何人都可以复制我看到了差距?
UPDATE编译器似乎真的无所谓。 原来征时机使用苹果Xcode的版本的G ++完成的:LLVM-G ++ - 4.2。
当我使用G ++ - 4.7通过MacPorts的(相同CXXOPTIMFLAGS)下载,我得到2.4秒,而不是2.7。
如何编译更好任何其他建议,将不胜感激。
您还可以得到这个实验的原始C ++代码: https://gist.github.com/michaelchughes/4747789
./MatProdEigen 1000 50000 300
报告下克++2.4秒 - 4.7
首先,在做性能对比时,确保禁用了涡轮增压(TB)。 在我的系统,使用gcc 4.5从macport,没有涡轮增压,我得到3.5秒,相当于8.4 GFLOPS,而我的2.3酷睿i7的理论峰值是9.2GFLOPS,所以不算太糟糕。
MATLAB是基于Intel MKL,看到报道的性能,它清楚地使用了多线程版本。 这是不可能的一个小图书馆作为征能够在自己的CPU上击败英特尔!
NumPy的可以使用任何BLAS库,阿特拉斯,MKL,OpenBLAS,征BLAS,等我想,在你的情况下,它是使用阿特拉斯这是快。
最后,这里是你如何能得到更好的性能 :通过-fopenmp编译能够在本征多线程。 默认情况下,本征的线程数目使用由OpenMP的定义线程的默认数量。 不幸的是这个号码对应的逻辑核心的数量,而不是物理核心,所以一定要确保超线程被禁用或定义OMP_NUM_THREADS环境变量核的物理数量。 在这里,我得到1.25秒(无TB)和0.95s结核病。
究其原因Matlab是快是因为它使用了Intel MKL。 征可以用它太(见这里 ),但你当然需要购买它。
话虽这么说,有许多原因征可以慢。 为了比较蟒蛇VS MATLAB VS艾根,你真的需要在相应的语言编写的三种操作相当于版本。 还要注意的是Matlab的缓存的结果,所以你真的需要从一个新的Matlab的会议开始,以确保它的神奇是骗不了你。
此外, Matlab的墨西哥开销是不是不存在的 。 该OP报告有新版本的“修复”的问题,但如果所有的开销已经完全清除我会感到惊讶。
本征并不需要由英特尔介绍了与Sandy Bridge架构的AVX指令的优势。 这或许解释了大部分本征和MATLAB之间的性能差异。 我发现了一个分支,在增加了对AVX的支持https://bitbucket.org/benoitsteiner/eigen但据我可以告诉它不是在本征树干被合并呢。