FPGA開発日記

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

RISC-V Vectorized Bencmark Suite (RiVec) のRVV1.0の確認

RiVec、つまりRISC-V Vectorized Bencmark SuiteはベンチマークスイートをRISC-Vベクトル向けに移植したベンチマークスイートだ。

github.com

メインリポジトリには3つのブランチがあり、

  • master : intrinsicがEPI専用のもの、かなり古い
  • rvv-0.7 : intrinsicがRVV0.7のもの
  • rvv-1.0 : intrinsicがRVV1.0のもの

なのでrvv-1.0が一番使えるのだが、最新のRISC-V Vector のIntriniscに対応していないので微妙に使いにくい。

github.com

例えば、AXPYのループは以下のように記述されていて、vector_defines.hにその内容が定義されているのだが、

  for (i = 0; i < n;) {
    // gvl = __builtin_epi_vsetvl(n - i, __epi_e64, __epi_m1);
    gvl = vsetvl_e64m1(n - i); //PLCT

    _MMR_f64 v_dx = _MM_LOAD_f64(&dx[i], gvl);
    _MMR_f64 v_dy = _MM_LOAD_f64(&dy[i], gvl);
    _MMR_f64 v_res = _MM_MACC_f64(v_dy, v_a, v_dx, gvl);
    _MM_STORE_f64(&dy[i], v_res, gvl);
    
    i += gvl;
  }
  • vector_defines.h
//#define _MM_LOAD_i64        __builtin_epi_vload_1xi64
#define _MM_LOAD_i64(op1, op2)     vle64_v_i64m1(op1)

//#define _MM_LOAD_i32     __builtin_epi_vload_2xi32
#define _MM_LOAD_i32(op1, op2)     vle32_v_i32m1(op1)

//#define _MM_LOAD_INDEX_i64 __builtin_epi_vload_indexed_1xi64
#define _MM_LOAD_INDEX_i64(op1, op2, op3)  vlxei64_v_i64m1(op1, op2)

//#define _MM_LOAD_INDEX_i32 __builtin_epi_vload_indexed_2xi32
#define _MM_LOAD_INDEX_i32(op1, op2, op3) vlxei32_v_i32m1(op1, op2)

本当は、__riscv_の接頭語をつけなければならないはず。この辺は、アップデートしたものを後日公開できればと思う。