向量遮罩執行路線圖¶
動機¶
本提案定義了 LLVM 中原生向量遮罩執行的路線圖,特別是針對具有遮罩和/或顯式向量長度的向量指令。LLVM 目前沒有與目標無關的方法來為現代 SIMD ISA(例如 AVX512、ARM SVE、RISC-V V 擴展和 NEC SX-Aurora)建模遮罩執行向量指令。只有一部分遮罩執行向量操作(例如遮罩載入和儲存)可透過內建函數使用 [MaskedIR]。
向量遮罩執行 (VP) 擴展是一個具體的 RFC 和原型實作,用於在 LLVM 中實現原生向量遮罩執行。VP 原型和所有相關討論都可以在 Phabricator 上的 VP 修補程式中找到 [VPRFC]。
路線圖¶
1. IR 級別的 VP 內建函數¶
對於 VP 的語義/指令集已達成共識。
VP 內建函數和屬性在 IR 級別可用。
TTI 具有 VP 的功能標誌(
supportsVP()
?,haveActiveVectorLength()
?)。
結果:VP 可用於 IR 級別的向量化器(LV、VPlan、RegionVectorizer),並可能與 Clang 中的內建函數整合。
2. CodeGen 支援¶
VP 內建函數轉換為第一級 SDNode(例如
llvm.vp.fdiv.* -> vp_fdiv
)。VP 合法化(將顯式向量長度合法化為遮罩 (AVX512),將 VP SDNode 合法化為預先存在的 SDNode (SSE、NEON))。
結果:基於 VP SDNode 的後端開發。
3. 將 InstSimplify/InstCombine/DAGCombiner 提升至 VP¶
引入 PredicatedInstruction、PredicatedBinaryOperator... 等輔助類別,以匹配標準向量 IR 和 VP 內建函數。
將匹配器上下文添加到 PatternMatch 和上下文感知 IR Builder API。
逐步提升 DAGCombiner,使其不僅適用於 VP SDNode,也適用於常規向量指令。
逐步提升 InstCombine/InstSimplify,使其不僅適用於 VP,也適用於常規 IR 指令。
結果:VP 內建函數的優化與標準向量指令不相上下。
4. 棄用 llvm.masked.* / llvm.experimental.reduce.*¶
透過轉換為 VP 來現代化 llvm.masked.* / llvm.experimental.reduce*。
DCE 過渡 API。
結果:VP 已取代先前的向量內建函數。
5. 遮罩執行 IR 指令¶
向量指令具有可選的遮罩和向量長度參數。這些會降低到 VP SDNode(從階段 2 開始)。
逐步淘汰 VP 內建函式,僅保留與向量化純量指令不等效的指令(reduce、shuffles 等)。
InstCombine/InstSimplify 預期常規指令中的謂詞(階段 (3) 已奠定基礎)。
結果:IR 中的原生向量謂詞。
參考文獻¶
llvm.masked.* 內建函式,https://llvm.dev.org.tw/docs/LangRef.html#masked-vector-load-and-store-intrinsics
RFC:LLVM 中向量謂詞的原型和路線圖,https://reviews.llvm.org/D57504