Eigen优化实录

举报
风吹稻花香 发表于 2021/06/05 01:07:04 2021/06/05
【摘要】 原文:https://www.zhihu.com/question/28571059?sort=created 以前也觉得 Eigen 很快,感觉和 mkl 可以媲美。但是昨天 debug 时一行一行看时间,发现这样一个矩阵乘法 要算将近一秒(),而同样的计算用 MATLAB 只需要肉眼不可察觉的时间。 我 google 了一下,在 StackOv...


原文:https://www.zhihu.com/question/28571059?sort=created


以前也觉得 Eigen 很快,感觉和 mkl 可以媲美。但是昨天 debug 时一行一行看时间,发现这样一个矩阵乘法 \mathbf{A}^{\textrm{T}}\mathbf{A} 要算将近一秒\mathbf{A} \in \mathbb{R}^{4800\times{}1000}),而同样的计算用 MATLAB 只需要肉眼不可察觉的时间

我 google 了一下,在 StackOverflow 上(How to speed up Eigen library's matrix product?)有人讨论说是 MATLAB 内部自动会调用多线程版的 mkl 里的矩阵乘法,而 Eigen 在通常状态下是单线程的,需要在编译时加上 \mathtt{-fopen} 参数使用 openmp 开启多线程。我在自己的 Mac 上尝试了一下,在线程数为 4 的情况下,时间缩短为 0.57 秒,但相比 MATLAB 的肉眼不可察觉还是有差距。

我对计算机底层的硬件不是很熟,只是最近突然觉得处理起这种可以高度矢量化的问题时,(不是非常 wisely 地)使用Eigen 还是没有经过优化的 MATLAB 快。

P.S.: 最开始的单线程版本我使用的是 OS X 自带的 \texttt{g++} 编译器,优化参数为 \texttt{-Ofast}. 测试过加上 \texttt{-msse2} 没有明显区别。这个 \texttt{g++} 实际上是Apple 封装后的 \texttt{clang++},很可惜的是不支持 openmp. 所以为了开启多线程我安装了 GNU \texttt{g++} 编译器。其它编译参数不变。

=================更新==================
刚才又上 StackOverflow 上看了别人的几个帖子( Eigen vs Matlab: parallelized Matrix-Multiplication)学习了一下,发现了几个新的 trick:
  1. 首先之前线程数我设置错误了。我的 CPU physically 应该只有两个核,四线程是 hyper-thread 的结果,多出来的两个线程并不能加速。我把 OMP_NUM_THREADS 改为 2 以后,速度变为 0.55s 左右;
  2. 如果计算矩阵乘法,使用 \mathbf{B}\texttt{.noalias()} = \mathbf{A}^{\textrm{T}}\mathbf{A} 是个不错的 trick,它可以避免生成 temporary 的矩阵存储中间结果。使用这个后缩短为 0.50s 左右;
  3. 对 Eigen 3.3 或以上的版本可以加上 \texttt{-mavx}\texttt{-mfma} 两个参数,进一步缩短为 0.40s 左右。

这样总的下来提速了约 30%.

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/60140685

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。