我正在使用 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 秒
特征细节
您可以获取我的特征码(作为 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秒