惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Spread Privacy
Spread Privacy
T
Threatpost
L
LINUX DO - 热门话题
Google Online Security Blog
Google Online Security Blog
I
InfoQ
大猫的无限游戏
大猫的无限游戏
博客园_首页
爱范儿
爱范儿
有赞技术团队
有赞技术团队
V
Visual Studio Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Jina AI
Jina AI
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
K
Kaspersky official blog
L
LangChain Blog
G
GRAHAM CLULEY
B
Blog RSS Feed
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
雷峰网
雷峰网
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Vercel News
Vercel News
T
Tor Project blog
T
The Exploit Database - CXSecurity.com
T
Troy Hunt's Blog
W
WeLiveSecurity
T
Threat Research - Cisco Blogs

算法

Knuth 2025 圣诞讲座:把骑士巡游变成精准匹配问题 - V2EX 已知网易云音乐的歌单的上限是一万首。还有某个歌单的歌曲加入到另外一个歌单会自动去重,并且非重复的都在歌单开头。有没有手动去掉指定歌单中听过的歌曲的方法? Leetcode 1. 两数之和 算法可视化演示(1/100) 建了一个 LeetCode Hot 100 刷题讨论群,大佬们有兴趣的冲冲冲 不用 AI 挑战? 看看大家的算法水平 - V2EX 请教一个集合 ChunkBySize 的算法 - V2EX Tiktok 的算法有多厉害? US 搞的定 LLM,为什么学不会 tt 的算法? - V2EX 🎥 最长递增子序列(LIS)算法讲解 | 真诚分享一次 AC 背后的思路 👉 https://www.bilibili.com/video/BV1inEQzvEaK/ 跪求大佬指点! 10GB+数据查重最优解,哪种算法能扛住? 几百万个三维坐标中判断富集的簇,如何做比较好? - V2EX 去楼下超市买东西发现个活动,满 18 送可乐一瓶,发现有点意思 - V2EX 面试遇到怪题,大家有什么思路吗 - V2EX 如何避免露出 prompt 给用户 - V2EX 这个算法有多难? 把 Ai 也难到了 - V2EX 帮忙这个题到底是咋解啊?? - V2EX 求个思路 背抓测试测算两个中指之间距离 - V2EX 算法题:给出任意两个表,找出两个表所有的关联关系 - V2EX 请问我这段 2-hop 算法的 Rust 实现还能怎么优化 - V2EX 求个思路:判断两个及以上的图形是否重叠。 - V2EX 有什么 3 维矩阵匹配算法吗? - V2EX 有没有各种算法的列表?最好是重点介绍输入、输出和适用范围 - V2EX [招聘] [兼职] [算法] 招聘录制算法视频 长期合作 - V2EX [线上] 求 算法大佬录制视频 - V2EX 请教应该去学习使用什么算法或者思路,在同一时间编排考试上 - V2EX 多算法级联一定能加强安全性吗? - V2EX 算法小白手撸扫雷小游戏,有没有大佬指点一下? - V2EX 求教,路径规划的一个问题思路 - V2EX 抽卡随机算法请教 - V2EX 工程算法难题,求大神 - V2EX 请教算法大佬们一个使用遗传算法排课的问题 - V2EX 各个社区的 trends 推荐,背后的算法逻辑是怎样的呀? - V2EX 请教一个算法问题,给学生分配校车乘车路线 - V2EX 应该如何制定排班表,有什么好的方案吗? - V2EX 广度遍历算法探测两个节点之间的联通性并打印路径 - V2EX 汽车沙漠抛锚,如何处理淡水? - V2EX 求个算法, 组合总和类型的, 从给定数组中取数, 要求取出来的数字总和在某个范围内 - V2EX 抽奖、老虎机、随机数、Fortuna、搞钱! - V2EX 请问这个场景可以归结为哪种算法? - V2EX 求助估算队列剩余处理时间的问题 - V2EX 人类目前算法领域最高的结晶,是什么? - V2EX nvida jetson 替代品 - V2EX 有没有大佬帮我解答一个关于比赛分组的算法问题? - V2EX 对转账做排序保证账户永远都是非负的 - V2EX 关于一道面试遇到的算法题 - V2EX 求教,这个逻辑应该怎么写 - V2EX [请教] 生活中的算法题:密码尝试次数 - V2EX 求一个动态规划算法 - V2EX HashMap ❤️ Heap - V2EX 一个简单但是我不会的算法题 - V2EX
C++如何优化矩阵乘法 gemm - V2EX
Folder · 2024-11-23 · via 算法

Folder

 

Folder · 2024 年 11 月 23 日 · 5894 次点击

这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

  • c++
  • gemm
  • 优化

    26 条回复    2024-11-26 15:38:14 +08:00

    nagisaushio

    1

    nagisaushio      2024 年 11 月 23 日

    函数签名改成这样试试

    void matmul(const float * restrict A, const float * restrict B, float * restrict C,
    const int M, const int N, const int K)

    elfive

    2

    elfive      2024 年 11 月 23 日 via iPhone

    如果是 intel 平台,可以考虑使用 Intel Intrinsics Library ,会比 OpenBLAS 快不少。

    Folder

    5

    Folder      2024 年 11 月 23 日

    @elfive #2 什么库不重要, 主要是想自己优化 gemm 来学习一下. 实际项目中会都测试一边选性能最好的用的.

    Folder

    6

    Folder      2024 年 11 月 23 日

    @nagisaushio 这个确实有一些帮助, 不过只能提升一点点大概 0.1GFLOPS 吧, 还是和 openblas, blis 这些有断档的差距. 感觉更多还是算法设计方面的问题, 这部分不知道该怎么做了.

    Folder

    7

    Folder      2024 年 11 月 23 日

    @AirCrusher 谢谢分享, 这个有点猛汇编都用上了, 我回头看下. 其实后面我看过类似的就是 flame 的教程, 基本上里面的技术都应用到了已经.

    Donaldo

    8

    Donaldo      2024 年 11 月 23 日

    歪个楼,请问你 README 的矩阵图是用什么画的?

    WonderfulRush

    11

    WonderfulRush      2024 年 11 月 23 日

    可以看看这篇文章 里面讲了 cpu 矩阵乘的优化 https://justine.lol/matmul/

    Folder

    12

    Folder      2024 年 11 月 23 日

    @WonderfulRush
    刚看完这篇文章然后看到你的评论...
    那个文章挺好的, 但是技术部分讲得有点简略, 而且其实很多提到的技术我已经用了, 比如 blocking, simd 等等.

    tankeco

    14

    tankeco      2024 年 11 月 23 日

    我感觉你取 index 就做了不少乘法,不确定编译器能不能帮你优化掉,你自己把 index 改成累加的方式试试

    Folder

    16

    Folder      2024 年 11 月 23 日

    @tankeco
    是的, 这点我也觉得要花时间想下怎么减少 index.
    其实已经优化过一次 index 了, 现在保留的都是为了分块和区分多线程访问空间的, 后面个人感觉这不是影响速度的最大的因素就没继续花心思了.

    foool

    18

    foool      2024 年 11 月 23 日

    对比 openblas 中 cblas_sgemm 也是 4 并行度的吗?

    foool

    19

    foool      2024 年 11 月 23 日

    几个小建议和疑问:
    1 先大致理论分析下最大能够达到的 GFLOS 是多少(考虑 CPU 多 port 都可以执行运算);
    2 先用单线程跑到最高速率,排除多线程调度或资源竞争导致的劣化;
    3 尝试加上预取指令,perf 看看瓶颈在哪里
    4 测试多次,取最优值,看你测试了一次,都会有“冷启动”的问题。
    5 omp parallel for schedule(static) 是在编译时就确定代码位于哪个线程了吗,会导致 cache 相关问题吗( false sharing )

    Folder

    21

    Folder      2024 年 11 月 23 日

    @foool #19
    非常感谢你的回复.
    1. 最大 GFLOPS 这个我没算, 是以 openblas 的为目标优化的 (试过别的库, 有比 openblas 更快的).
    2. 3. 很好的建议, 我回头再优化测试看看.
    4. 我是脚本跑 100 次取最优值的.
    5. 使用 schedule(static)是因为 for 循环中每次计算量近似才用的, 不过我试过去掉这个, 其实性能基本没区别.

    Folder

    22

    Folder      2024 年 11 月 23 日

    @dingyaguang117
    你是说它们不是传统的 C=AB, 而是用了 Strassen/Winograd 之类的方法减少了复杂度吗?

    dingyaguang117

    23

    dingyaguang117      2024 年 11 月 23 日

    @Avafly 不确定 openblas 是否用到了 Strassen/Winograd 算法,感觉想要追求更显著突破可能是需要换算法的

    tdxdxoz

    25

    tdxdxoz      2024 年 11 月 26 日 via Android

    @Avafly 不熟悉你这个问题的背景,但是矩阵乘法本身现在已经能做到 O(n^2.37)左右了。比较实用、常数没那么大的也有 O(n^2.8)左右的算法。

    tdxdxoz

    26

    tdxdxoz      2024 年 11 月 26 日 via Android

    @Avafly 就是你说的 Strassen/Winograd