我正在使用Eigen库学习两个大矩阵的简单乘法。相较于Matlab和Python,这种乘法似乎明显较慢。是否有任何方法可以使Eigen运算更快?
问题详情:
X: 随机1000 x 50000矩阵
Y: 随机50000 x 300矩阵
定时实验(在我2011年底的Macbook Pro上):
使用Matlab:X*Y需要约1.3秒
使用Enthought Python:numpy.dot(X, Y)需要约2.2秒
使用Eigen:X*Y需要约2.7秒
Eigen细节:
您可以获取我的Eigen代码(作为MEX函数):https://gist.github.com/michaelchughes/4742878 此MEX函数从Matlab中读取两个矩阵,并返回它们的乘积。
在没有矩阵乘法操作的情况下运行此MEX函数(即仅执行IO操作)会产生可忽略的开销,因此函数和Matlab之间的IO并不能解释性能差异。显然是实际的矩阵乘法操作造成了差别。
我使用这些优化标志通过g++进行编译:"-O3 -DNDEBUG"
我正在使用最新的稳定Eigen头文件(3.1.2)。
如何提高Eigen的性能?有人能够复制我看到的差距吗?
更新: 编译器似乎真的很重要。原始的Eigen计时是使用Apple XCode的g++版本llvm-g++-4.2完成的。
当我使用通过MacPorts下载的g++-4.7(相同的CXXOPTIMFLAGS)时,我得到了2.4秒而不是2.7秒。
任何其他关于如何更好地编译的建议都将不胜感激。
您还可以获取此实验的原始C ++代码:https://gist.github.com/michaelchughes/4747789 ./MatProdEigen 1000 50000 300
问题详情:
X: 随机1000 x 50000矩阵
Y: 随机50000 x 300矩阵
定时实验(在我2011年底的Macbook Pro上):
使用Matlab:X*Y需要约1.3秒
使用Enthought Python:numpy.dot(X, Y)需要约2.2秒
使用Eigen:X*Y需要约2.7秒
Eigen细节:
您可以获取我的Eigen代码(作为MEX函数):https://gist.github.com/michaelchughes/4742878 此MEX函数从Matlab中读取两个矩阵,并返回它们的乘积。
在没有矩阵乘法操作的情况下运行此MEX函数(即仅执行IO操作)会产生可忽略的开销,因此函数和Matlab之间的IO并不能解释性能差异。显然是实际的矩阵乘法操作造成了差别。
我使用这些优化标志通过g++进行编译:"-O3 -DNDEBUG"
我正在使用最新的稳定Eigen头文件(3.1.2)。
如何提高Eigen的性能?有人能够复制我看到的差距吗?
更新: 编译器似乎真的很重要。原始的Eigen计时是使用Apple XCode的g++版本llvm-g++-4.2完成的。
当我使用通过MacPorts下载的g++-4.7(相同的CXXOPTIMFLAGS)时,我得到了2.4秒而不是2.7秒。
任何其他关于如何更好地编译的建议都将不胜感激。
您还可以获取此实验的原始C ++代码:https://gist.github.com/michaelchughes/4747789 ./MatProdEigen 1000 50000 300
在 g++-4.7 下报告 2.4 秒