RISC-V Workshop Zurichで発表されたRISC-V Bit Manipulation Spec 0.90の資料がアップロードされたので、さっそく概要を把握してみる。
ちなみに、詳細な資料はこちらを参照した方がよい。
- Better Living Through Bit ManipulationHigher Performance at Lower Power (RISC-V BitManip Task Group)
https://content.riscv.org/wp-content/uploads/2019/06/17.10-b_wolf.pdf
- RISC-V Bitmanip (Bit Manipulation) Extension
Better Living Through Bit Manipulation Higher Performance at Lower Power
RISC-V Bit-Manip Task Group
- ミッション
- 仕様 ver 0.90
- ビットカウント・ローテートシフト・ビットセット・ビットクリア・ビット交換・ビットマスク付きのビット抽出・ビット挿入
- 個別のZb_拡張に構成されている。
- "Zbb" (ベース仕様) スモールコア向け
- "B" ラージコア向け
- "Zbt" 3ソースオペランド向け命令
デザインのCriteria
アーキテクチャの一貫性
スレッショルドメトリック : 新命令に必要な要件
- 少なくとも3つの命令を新命令に置き換えることができる、もしくは、分岐を避ける、もしくは
- 頻繁使用される、かつ実装が単純である。
データ駆動
- 新命令のメリットは、マイクロベンチマークにより示されなければならない、かつ
- 実アプリケーションにて有効であることを示さなければならない。
ハードウェアが単純であること
- 命令は実装するにあたりシンプルであり、タイミングと回路面積面でもリーズナブルであるものでなければならない。
- リファレンス実装として、再利用可能な"B-ALU"という実装が限定されたライセンスで提供される。
コンパイラサポート
高性能と低消費電力
- 同じ処理をより短い命令で実行できるようになる。
- 性能向上につながる。
- 多くのトランジスタを挿入する必要が無い。
- 低消費電力につながる。
- "Zbb"はスモールコア向け、"B"はラージコア向け
- ルックアップテーブルにおいて、メモリアクセスの回数を削減できる。
- さらなる高性能化
- さらなる低消費電力化
現在の状況
- Z-Extension(Zbb以外)はほぼStable状態
- C言語のリファレンスモデルおよびオペコードのエンコーディング済み
- Imperas RISC-Vシミュレータにより"B"系列のサポート
- binutilsおよびriscv-isa-sim(Spike)へのパッチを用意している。
<rvintrin.h>
でのポータブルなイントリンジックを用意している。- ネイティブコードに対して、asmのテンプレートを使用する
- エミュレーションテストのためのC言語動作モデルを提供する
- gccへのパッチを用意している。
今後の予定
- Post-0.90のレビュー・ワークショップ後のフィードバック
- ソフトウェアツールチェインのサポートを完成させる。
- "B-ALUs"リファレンスをビルドしリリースする。
- ベンチマークをビルドする。
- マイクロベンチマークおよび実アプリケーション
- "Zbb"および"B"拡張を最終決定させる。
- コンプライアンステストおよびフォーマルモデルを作成する。
新しい命令の一覧表
私たちが現在必要なもの
- 本日リリースした、0.90仕様に対するフィードバック
- 新しい命令の提案および既存の命令の変更の提案はすぐに終了します。すぐにフィードバックを投稿してください。
- タスクグループに加入してください https://lists.riscv.org/g/tech-bitmanip/
- GitHubのIssueを作成してください https://github.com/riscv/riscv-bitmanip
- RISC-Vワークショップで我々と議論してください。
- ベンチマークの問題およびより良い完全なベンチマークプログラム。"B"命令系列を使うものと使わないもの両方を用意する。
<rvintrin.h
の使用例
#include <rvintrin.h> int find_nth_set_bit(unsigned int value, int cnt) { return _rv32_ctz(_rv32_bdep(1 << cnt, value)); }
#include <rvintrin.h> // CRC for Aeronautical Information Exchange Model (AIXM) uint32_t crc32q(const uint32_t *data, int length) { uint32_t crc = 0; for (int i = 0; i < length; i++) { crc ^= _rv32_grev(data[i], -8); crc = _rv32_clmulr(crc, 0xFF7FBFB1); crc = _rv32_clmul(crc, 0x814141AB); } return crc; }
ImperasのサポートしているBitManip(B)拡張およびriscvOVPsimのリファレンスシミュレータ
ビット操作拡張
性能評価及びコンパイラ開発のために、アーリーアクセスのシミュレータを提供している。
仕様が決定されるまではカスタム拡張として実装されている。
- サポートされている命令:32 & 64ビットの実装にそれぞれ含まれている。
テスト
定義された命令のためのテストはすべて記述されている。ハンドコードされたバイナリ実装は、マクロを使って実装されている。
CLZ
の例```asm
DECODE_ENTRY(0, CLZ, "|0110000|00000|.....|001|.....|0010011|")
.macro CLZ rd rs1 .int 0x60001013 | *1
- ファンネルシフト (fsl, fsr, fsri)
clmul
をサポートできないスモールプロセッサ向け- CRC32およびCRC32Cの多項式のみをサポート
bmat[x], bmatflip
命令、RV64, RV128のみ)
- 64ビットの数値を8x8の行列で表現する。
- 行列積をANDを乗算と[X]ORで表現する。
*1:\rd&0x1F)<<7) | ((\rs1&0x1F)<<15) .endm // Call to perform a count leading zeros of register x8, placing result in x9 CLZ 9 8 ```
ビット操作命令概要
- シンプルな命令
- Count leading/trailing zeros (clz, ctz)
- Population count (pcnt)
- Min/max (min[u], max[u])
- Logic with rs2 negate (andn, orn, xnor)
- Shift ones (slo[i], sro[i])
- Rotate shift (rol, ror[i])
- Single-bit set/clear/invert/extrace (sbset, sbclr, sbinv, sbext)
- Packing two XLEN/2 words into one XLEN word (pack)
- ビット組み換え命令
- ビット組み換え命令はビットのインデックスについてxxxである
- ローテートシフト = add/subtract (mod XLEN)
- 一般的なビット反転 = マスクを用いたXOR
- 一般的なシャッフル = ビットインデックによるビット組み換え
- 殆どの場合において、疑似命令として定義される。
- 3項演算命令(Zbt)
- 条件付きMove (cmov)
- 条件付き Mix (rs1 & rs2) | (rs3 & ~rs2
- ビット組み換え命令はビットのインデックスについてxxxである