RiVec、つまりRISC-V Vectorized Bencmark SuiteはベンチマークスイートをRISC-Vベクトル向けに移植したベンチマークスイートだ。
メインリポジトリには3つのブランチがあり、
master
: intrinsicがEPI専用のもの、かなり古いrvv-0.7
: intrinsicがRVV0.7のものrvv-1.0
: intrinsicがRVV1.0のもの
なのでrvv-1.0
が一番使えるのだが、最新のRISC-V Vector のIntriniscに対応していないので微妙に使いにくい。
例えば、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_
の接頭語をつけなければならないはず。この辺は、アップデートしたものを後日公開できればと思う。