← 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 測量。

官方資料