x86-64 浮点与 SIMD 入门
从 XMM 标量运算到 packed SSE、AVX、对齐与功能检测
x86-64 浮点与 SIMD 入门
本文以教学为目的。 以支持 SSE2 的 x86-64 user mode 为起点;AVX 系列必须同时确认 CPU 与 OS state。
看到 XMM 并不代表程序已 vectorized。addss 只加低位的一个 float,addps 则并行加四个 float。同一寄存器可用于 scalar 与 packed 运算。
XMM 不是类型
packed float32 : 4 × 32-bit lanes
packed float64 : 2 × 64-bit lanes
scalar float32 : low 32 bits
scalar float64 : low 64 bits
packed int32 : 4 × 32-bit lanes
addss xmm0, xmm1
addsd xmm0, xmm1
addps xmm0, xmm1
addpd xmm0, xmm1
opcode 决定解释。x87 是旧式 stack-register 模型;SSE/SSE2 使用 XMM 与主要双操作数形式;AVX 加入 YMM 与 VEX 三操作数;AVX-512 再加入 ZMM 与 mask。
lane 运算与对齐
movups xmm0, [rcx]
movups xmm1, [rdx]
addps xmm0, xmm1
结果是 [a0+b0, a1+b1, a2+b2, a3+b3],不是跨 lane 传 carry 的 128 位整数加法。
movaps xmm0, [rcx] ; aligned
movups xmm0, [rcx] ; unaligned
movdqa xmm0, [rcx]
movdqu xmm0, [rcx]
aligned 形式遇到错误地址可能 fault。base allocation 对齐并不保证每个 field offset 对齐,也要考虑 cache line 与 page 边界。
浮点顺序与 NaN
IEEE 754 加法不满足结合律,vector reduction 会改变求和顺序,可能与 scalar 基准不逐 bit 相同。契约要包含容许误差、NaN、infinity、signed zero、rounding 与 fast-math 选项。
ucomiss xmm0, xmm1
jp unordered_case
ja above_case
NaN 会产生 unordered。ucomiss 与 comiss 的异常细节不同,必须确认真正产生标志的 opcode。
shuffle、reduction 与 AVX
shufps xmm0, xmm1, imm8
pshufd xmm0, xmm1, imm8
用指令手册解码 immediate 的 lane 选择。大量 shuffle 可能表示 AoS/SoA 转换、transpose、broadcast 或 horizontal reduction。
AVX 前要验证 CPUID、OS extended state、XGETBV 的 XMM/YMM 启用状态以及部署 CPU 保证。支持 AVX 不代表支持 AVX2 或 AVX-512。某些边界上的 vzeroupper 用于避免部分 CPU 的 legacy-SSE transition penalty。
System V 通常把 XMM 视为 caller-saved;Microsoft x64 则要求保存 xmm6~xmm15 的低 128 位。Windows handwritten ASM 必须正确 save/restore 与 unwind。
tail 与 overread
长度不是 vector 宽度倍数时需要 scalar tail 或 mask。因为“allocation 似乎有 padding”而越过 logical end 会破坏 object、page、sanitizer 或 concurrency 契约,除非 API 明示保证,否则不要 overread。
auto-vectorization 可能因 alias、loop-carried dependency、call、strict FP、cost model 或 target ISA 不足而失败。先看 vectorization report 与 intrinsic。
总结
XMM 是 128 位存储空间,opcode 决定 scalar/packed 与 lane 类型。SIMD 同时处理多元素,但增加 alignment、tail、FP 重排、feature detection 与 ABI 保存契约。先证明正确性,再在真实 workload 测量。