C++如何优化矩阵乘法 gemm

311 天前
 Folder

最近在用 C 手写模型推理, 其中 gemm 可以说是核心计算, 于是决定以学习为目的自己尝试优化一下.

用 3 个 for 循环可以实现最基本的矩阵乘法, 在我用 simd, blocking, 并行计算这些方法之后, 速度比 naive 版本的快了很多, 但还是会比 openblas 慢不少. 接下来该怎么做有点没头绪了. 我想知道有没有办法能进一步提升? 谢谢

代码地址: https://github.com/Avafly/optimize-gemm

4055 次点击
所在节点    算法
26 条回复
Folder
310 天前
@foool #19
非常感谢你的回复.
1. 最大 GFLOPS 这个我没算, 是以 openblas 的为目标优化的 (试过别的库, 有比 openblas 更快的).
2. 3. 很好的建议, 我回头再优化测试看看.
4. 我是脚本跑 100 次取最优值的.
5. 使用 schedule(static)是因为 for 循环中每次计算量近似才用的, 不过我试过去掉这个, 其实性能基本没区别.
Folder
310 天前
@dingyaguang117
你是说它们不是传统的 C=AB, 而是用了 Strassen/Winograd 之类的方法减少了复杂度吗?
dingyaguang117
310 天前
@Avafly 不确定 openblas 是否用到了 Strassen/Winograd 算法,感觉想要追求更显著突破可能是需要换算法的
B1ankCat
310 天前
tdxdxoz
308 天前
@Avafly 不熟悉你这个问题的背景,但是矩阵乘法本身现在已经能做到 O(n^2.37)左右了。比较实用、常数没那么大的也有 O(n^2.8)左右的算法。
tdxdxoz
308 天前
@Avafly 就是你说的 Strassen/Winograd

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1091967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX