ベクトル述語化ロードマップ

モチベーション

この提案は、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におけるネイティブベクトル述語化。

参考文献

[VPRFC]

RFC:LLVMにおけるベクトル述語化のプロトタイプとロードマップ、https://reviews.llvm.org/D57504