gpt4 book ai didi

matlab - 如何加速 Eigen 库的矩阵乘积?

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:08 25 4
gpt4 key购买 nike

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

在 g++-4.7 下报告 2.4 秒

最佳答案

首先,在进行性能比较时,请确保您禁用了涡轮增压 (TB)。在我的系统上,使用来自 macport 的 gcc 4.5 并且没有涡轮增压,我得到 3.5s,对应于 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)。

关于matlab - 如何加速 Eigen 库的矩阵乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14783219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com