← SEARCHABLE ARCHIVE
Assembly · 2026-08-15

x86-64 浮点与 SIMD 入门

从 XMM 标量运算到 packed SSE、AVX、对齐与功能检测

INTERACTIVE READING MODE →

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 测量。

官方资料