著作権声明
本記事は元々 xlinsist/llvm-project Issue #2 に掲載され、原作者は私自身です。元リポジトリのライセンス Apache License 2.0 に従っています。この内容をもとに、再編集して当ブログで公開します。
概要
調査目標
- ventus-llvm に Zvfh (min) 拡張サポートを追加する
開発背景
- Ventus 向けに半精度 16 ビット half 浮動小数点データ型のサポート追加
- 本プロジェクトは half 型の段階的なサポート(スカラ型(Zhinx (min))およびベクトル型(Zvfh (min)))を目標とします
- Zhinx (min) 拡張は基本的に動作し、現在 PR のレビューおよび修正中です
ニーズ分析
- half 型はより低い精度と範囲を持ち、メモリ消費が少なくスループットが高いです
公式 Zvfh (min) パッチまとめ
- パッチ先:D151414
- 対象ファイル:
RISCVISAInfo.cpp
RISCVFeatures.td
RISCVISelLowering.cpp
RISCVInstrInfoVPseudos.td
RISCVInstrInfoVSDPatterns.td
RISCVInstrInfoVVLPatterns.td
RISCVSubtarget.h
**.ll
- 主な変更点:
- zvfhmin の登録
- f16 用の型・命令の合法化処理を追加
- f16 に対する
vfwcvt.f.f.v
vfncvt.f.f.w
命令の処理 - 現在のデバイスが f16 ベクトル命令に対応しているか判定
- f16 関連の SDNode と機械命令のマッピング追加
- テストケースの追加
変更ファイル
ファイルパス | 変更内容 |
---|---|
llvm/lib/Support/RISCVISAInfo.cpp | zvfhmin 命令セット拡張を拡張テーブルに登録 |
llvm/lib/Target/RISCV/RISCV.td | zvfhmin 機能を追加し、依存 zve32f [FeatureStdExtZve32f] をマッチ |
llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td & RISCVInstrInfoVSDPatterns.td | Zvfh (min) 命令とパターンの追加 |
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | MVT::f16 型と操作サポートを導入し、Zvfhmin が有効な場合のみ MVT::f16 ベクトル型を許可 |
llvm/test/CodeGen/RISCV/VentusGPGPU/half.ll | テストケースの追加 |
テストケース
種類 | 目的 | 例 |
---|---|---|
命令生成 | 半精度命令が正しく生成されるか検証 | float.ll を half.ll に書き換え |
型変換 | half と float32 の変換 | vfwcvt.f.f.v , vfncvt.f.f.w |
補足
Zvfhmin は変換( vfwcvt.f.f.v f16=>f32
, vfncvt.f.f.w f32=>16
)のみサポートし、半精度ベクトル算術演算は直接サポートしません。算術演算には zvfh が必要です。