FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V Workshop Zurichで発表されたRISC-V Bit Manipulation Spec 0.90

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

github.com


Better Living Through Bit Manipulation Higher Performance at Lower Power

RISC-V Bit-Manip Task Group

  • ミッション
    • Unprivileged ISAの拡張を定義する。
    • ビットベース(非整数)の命令を追加する。
    • 整数x0...x31レジスタで有効
    • 高性能かつ低消費電力な命令を定義する。
  • 仕様 ver 0.90
    • ビットカウント・ローテートシフト・ビットセット・ビットクリア・ビット交換・ビットマスク付きのビット抽出・ビット挿入
    • 個別のZb_拡張に構成されている。
    • "Zbb" (ベース仕様) スモールコア向け
    • "B" ラージコア向け
    • "Zbt" 3ソースオペランド向け命令
f:id:msyksphinz:20190620223210p:plain

デザインの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"拡張を最終決定させる。
  • コンプライアンステストおよびフォーマルモデルを作成する。

新しい命令の一覧表

f:id:msyksphinz:20190620223254p:plain

私たちが現在必要なもの

  • 本日リリースした、0.90仕様に対するフィードバック
  • ベンチマークの問題およびより良い完全なベンチマークプログラム。"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ビットの実装にそれぞれ含まれている。
    • ANDN, GREV, SLO, SRO, ROL, ROR, FSL, FSR,
    • GREVI, SLOI, SROI, RORI, CLZ, CTZ, PCNT,
    • BMATFLIP, CRC32_B, CRC32_H, CRC32_W,
    • CRC32_D, CRC32C_B, CRC32C_H, CRC32C_W,
    • CRC32C_D, CMIX, CMOV, CLMUL, CLMULH, MIN,
    • MAX, MINU, MAXU, BDEP, BEXT, SHFL, UNSHFL,
    • BMATXOR, BMATOR, SHFLI, UNSHFLI

テスト

  • 定義された命令のためのテストはすべて記述されている。ハンドコードされたバイナリ実装は、マクロを使って実装されている。

  • CLZの例

    ```asm

    DECODE_ENTRY(0, CLZ, "|0110000|00000|.....|001|.....|0010011|")

    .macro CLZ rd rs1 .int 0x60001013 | *1

  • ファンネルシフト (fsl, fsr, fsri)
  • ビットの抽出・挿入 (Zbe, bext/bdep)
    • x86のpext, pdeb命令と似ている。
    • bext = rs1レジスタからマスクされたビット(rs2)を抜き出し、右に揃える。
    • bdep = rs1から圧縮されたビットをrs2で指定された場所に挿入する。
  • Carry-less乗算 (clmul, clmulh, clmulr)
  • CRC専用命令
    • 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
        • 一般的なシャッフル = ビットインデックによるビット組み換え
      • 殆どの場合において、疑似命令として定義される。
        • ビット反転 = (brev, aka bitreflect)
        • バイト反転 = (bswap, aka endianness-swap)
        • zip および unzip (完全ビット xxx outer (un-) shuffle)
        • ビットペアのスワップ(brev.p), nibble毎のビットスワップ(zip.n)
      • 3項演算命令(Zbt)
        • 条件付きMove (cmov)
        • 条件付き Mix (rs1 & rs2) | (rs3 & ~rs2