FPGA開発日記

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

rvv-intrinsic-docのテストケースをコンパイルして、シミュレーションする環境を構築する

RISC-Vのベクトルテストケースを試したくて、簡単なテストを探している。rvv-intrinsic-doc をチェックしている。

https://github.com/riscv-non-isa/rvv-intrinsic-doc

テストケースを試すためには、intrinsicをサポートしたGNU Toolchainを構築しなければならない。

git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git -b rvv-next --depth 1 rvv-next
cd rvv-next
./configure --prefix=${HOME}/riscv-rvvnext
make -j10

このツールチェインを用いて、intrinsicのテストプログラムをコンパイルする。

BINARIES = \
        rvv_branch.riscv \
        rvv_index.riscv \
        rvv_matmul.riscv \
        rvv_memcpy.riscv \
        rvv_reduce.riscv \
        rvv_saxpy.riscv \
        rvv_sgemm.riscv \
        rvv_strcmp.riscv \
        rvv_strcpy.riscv \
        rvv_strlen.riscv \
        rvv_strncpy.riscv

SPIKE_LOG = $(subst .riscv,.spike,$(BINARIES))

all: $(BINARIES)
        $(MAKE) $(SPIKE_LOG)

%.riscv: %.c
        riscv64-unknown-elf-gcc -march=rv64gcv -O3 $^ -o $@

%.spike: %.riscv
        spike --isa=rv64gcv pk $^

一つ、テストパタンを変更する必要がある。

diff --git a/examples/rvv_reduce.c b/examples/rvv_reduce.c
index d42837b..68e9758 100644
--- a/examples/rvv_reduce.c
+++ b/examples/rvv_reduce.c
@@ -34,7 +34,7 @@ void reduce(double *a, double *b, double *result_sum, int *result_count,
     vbool64_t mask = vmfne_vv_f64m1_b64(vec_a, vec_zero, vl);

     vec_s = vfmacc_vv_f64m1_m(mask, vec_s, vec_a, vec_b, vl);
-    count = count + vpopc_m_b64(mask, vl);
+    count = count + vcpop_m_b64(mask, vl);
   }
   vfloat64m1_t vec_sum;
   vec_sum = vfredusum_vs_f64m1_f64m1(vec_zero, vec_s, vec_zero, vlmax);

これでテストパタンを実行する。

make
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_branch.c -o rvv_branch.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_index.c -o rvv_index.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_matmul.c -o rvv_matmul.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_memcpy.c -o rvv_memcpy.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_reduce.c -o rvv_reduce.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_saxpy.c -o rvv_saxpy.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_sgemm.c -o rvv_sgemm.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_strcmp.c -o rvv_strcmp.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_strcpy.c -o rvv_strcpy.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_strlen.c -o rvv_strlen.riscv
riscv64-unknown-elf-gcc -march=rv64gcv -O3 rvv_strncpy.c -o rvv_strncpy.riscv
make rvv_branch.spike rvv_index.spike rvv_matmul.spike rvv_memcpy.spike rvv_reduce.spike rvv_saxpy.spike rvv_sgemm.spike rvv_strcmp.spike rvv_strcpy.spike rvv_strlen.spike rvv_strncpy.spike
make[1]: Entering directory '/home/msyksphinz/work/riscv/rvv-intrinsic-doc/examples'
spike --isa=rv64gcv pk rvv_branch.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_index.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_matmul.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_memcpy.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_reduce.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_saxpy.riscv
bbl loader
passed
spike --isa=rv64gcv pk rvv_sgemm.riscv
bbl loader
passed
spike --isa=rv64gcv pk rvv_strcmp.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_strcpy.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_strlen.riscv
bbl loader
pass
spike --isa=rv64gcv pk rvv_strncpy.riscv
bbl loader
pass