7

我正在使用 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秒

4

3 回答 3

12

首先,在进行性能比较时,请确保您禁用了涡轮增压 (TB)。在我的系统上,使用来自 macport 的 gcc 4.5 并且没有涡轮增压,我得到 3.5 秒,对应于 8.4 GFLOPS,而我的 2.3 核心 i7 的理论峰值是 9.2GFLOPS,所以还不错。

MatLab 基于 Intel MKL,从报告的性能来看,它显然使用了多线程版本。像 Eigen 这样的小型库不太可能在自己的 CPU 上击败英特尔!

Numpy 可以使用任何 BLAS 库、Atlas、MKL、OpenBLAS、eigen-blas 等。我猜在你的情况下它使用的 Atlas 也很快。

最后,您可以通过以下方式获得更好的性能:通过使用 -fopenmp 编译在 Eigen 中启用多线程。默认情况下,Eigen 使用 OpenMP 定义的默认线程数作为线程数。不幸的是,这个数字对应于逻辑内核的数量,而不是物理内核的数量,因此请确保禁用超线程或将 OMP_NUM_THREADS 环境变量定义为内核的物理数量。在这里我得到 1.25s(没有 TB)和 0.95s 有 TB。

于 2013-02-10T09:18:16.883 回答
2

Matlab 速度更快的原因是它使用了英特尔 MKL。Eigen 也可以使用它(参见此处),但您当然需要购买它。

话虽如此,Eigen 变慢的原因有很多。要比较 python、matlab 和 Eigen,您确实需要用各自的语言编写三个等效版本的操作。另请注意,Matlab 缓存结果,因此您确实需要从一个新的 Matlab 会话开始,以确保它的魔力不会愚弄您。

此外,Matlab 的 Mex 开销并非不存在。那里的 OP 报告了较新的版本“修复”了该问题,但如果所有开销都已完全清除,我会感到惊讶。

于 2013-02-10T10:07:16.743 回答
2

Eigen doesn't take advantage of the AVX instructions that were introduced by Intel with the Sandy Bridge architecture. This probably explains most of the performance difference between Eigen and MATLAB. I found a branch that adds support for AVX at https://bitbucket.org/benoitsteiner/eigen but as far as I can tell it not been merged in the Eigen trunk yet.

于 2014-02-19T05:06:05.340 回答