Skip to content

RISC-V Zvfh(min) 拡張サポート調査報告書(LLVM CodeGen段階)

作者:Lee 等
最后更新:

著作権声明

本記事は元々 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.cppzvfhmin 命令セット拡張を拡張テーブルに登録
llvm/lib/Target/RISCV/RISCV.tdzvfhmin 機能を追加し、依存 zve32f [FeatureStdExtZve32f] をマッチ
llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td & RISCVInstrInfoVSDPatterns.tdZvfh (min) 命令とパターンの追加
llvm/lib/Target/RISCV/RISCVISelLowering.cppMVT::f16 型と操作サポートを導入し、Zvfhmin が有効な場合のみ MVT::f16 ベクトル型を許可
llvm/test/CodeGen/RISCV/VentusGPGPU/half.llテストケースの追加

テストケース

種類目的
命令生成半精度命令が正しく生成されるか検証float.llhalf.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 が必要です。

页面历史