ベクトル述語化ロードマップ¶
モチベーション¶
この提案は、LLVMにおけるネイティブベクトル述語化、特にマスクおよび/または明示的なベクトル長を持つベクトル命令に対するロードマップを定義します。LLVMは現在、AVX512、ARM SVE、RISC-V V拡張、NEC SX-Auroraなどの最新のSIMD ISAに対して、述語付きベクトル命令をモデル化するターゲット非依存の手段を備えていません。マスクされたロードとストアなど、一部の述語付きベクトル演算のみがイントリンシック[MaskedIR]を介して利用可能です。
ベクトル述語化(VP)拡張は、LLVMでネイティブベクトル述語化を実現するための具体的なRFCとプロトタイプ実装です。VPプロトタイプと関連するすべての議論は、PhabricatorのVPパッチ[VPRFC]で見つけることができます。
ロードマップ¶
1. IRレベルのVPイントリンシック¶
VPのセマンティクス/命令セットに関するコンセンサスがあります。
VPイントリンシックと属性はIRレベルで使用できます。
TTIはVPの機能フラグを備えています(
supportsVP()
?、haveActiveVectorLength()
?)。
結果:IRレベルのベクトル化器(LV、VPlan、RegionVectorizer)でVPを使用可能になり、ビルトイン関数を使用してClangへの統合の可能性があります。
2. コード生成サポート¶
VPイントリンシックは、第一級のSDノードに変換されます(例:
llvm.vp.fdiv.* -> vp_fdiv
)。VPの合法化(明示的なベクトル長をマスクに合法化(AVX512)、VP SDノードを既存のノードに合法化(SSE、NEON))。
結果:VP SDノードに基づいたバックエンド開発。
3. InstSimplify/InstCombine/DAGCombinerをVPに昇格¶
標準的なベクトルIRとVPイントリンシックに一致するPredicatedInstruction、PredicatedBinaryOperator、…ヘルパークラスを導入します。
PatternMatchにマッチャーコンテキストとコンテキスト認識IRビルダーAPIを追加します。
DAGCombinerを段階的に昇格させ、通常のベクトル命令と同様にVP SDノードでも動作するようにします。
InstCombine/InstSimplifyを段階的に昇格させ、通常のIR命令と同様にVPでも動作するようにします。
結果:標準的なベクトル命令と同等のVPイントリンシックの最適化。
4. llvm.masked.* / llvm.experimental.reduce.*の非推奨化¶
llvm.masked.* / llvm.experimental.reduce*をVPに変換することで最新化します。
APIを移行します。
結果:VPが以前のベクトルイントリンシックに取って代わりました。
5. 述語付きIR命令¶
ベクトル命令は、オプションのマスクとベクトル長パラメーターを持ちます。これらはVP SDノードにローワーされます(ステージ2から)。
ベクトル化されたスカラー命令と同等でないもの(reduce、shuffleなど)を除いて、VPイントリンシックを段階的に廃止します。
InstCombine/InstSimplifyは、通常の命令で述語化を期待します(ステージ3で準備が整っています)。
結果:IRにおけるネイティブベクトル述語化。
参考文献¶
llvm.masked.*イントリンシック、https://llvm.dokyumento.jp/docs/LangRef.html#masked-vector-load-and-store-intrinsics
RFC:LLVMにおけるベクトル述語化のプロトタイプとロードマップ、https://reviews.llvm.org/D57504