如何让一个循环自动向量化:一次浮点求和实验
来源:jsgroth.dev — jsgroth.dev · 23 分 · by zdw
📋 概述
作者用 Rust 1.98 与 Compiler Explorer 做了一组小实验:对一个简单的浮点点积函数,即便开启 opt-level=3,编译器也只生成 addss/mulss 这类标量指令;换成 AVX2 加 FMA 后指令编码变成 VEX 形式,但依然是标量运算。根因是 IEEE 754 浮点加法不满足结合律,编译器不能自由重排加法顺序,因此无法把数组按四个一组累加。手动按四元素分块之后函数立刻自动向量化,而同样的整数版本本来就能被向量化。
🔑 核心要点
- 浮点点积在 x86-64 基线下不会自动向量化。
- 换成 AVX2+FMA 也只是换了指令编码,仍是标量。
- 根因是浮点加法不满足结合律,无法重排。
- 手写四元素分块后立刻向量化。
- 同样的整数版本本来就能自动向量化。
💡 金句
想百分之百确认代码用上了向量指令,就不能依赖自动向量化,除非你每次改代码都愿意去看汇编。
👍 0
👎 0
← 返回 Hacker News 首页