RISC-V RVV 0.8.x spike/pk add K Extension
RISC-V RVV(Vector Extenstion)を使いたいとのことで、環境構築を行った。
RVVの仕様は絶賛策定&実装中のようで、現在は0.9.xが開発版、安定版リリースは0.8.xになっている。
仕様はこちら riscv-v-spec
gnu toolchain/エミュレータのspikeの対応はv0.8までと書いてあるけど、0.9でも動くらしい(?)ということもあったり、開発版は仕様策定とともに動きが激しい(だろう…)というのもあって、0.8.xでのビルドを行う。
ちなみに、最近は全部dockerで環境構築をしている。VirtualBoxとかUbuntuだったら何でもビルドは出来ると思われ。
ちなみに、このrepositoryは独自IS量子拡張用 k extensionの実装(gccを改造して独自の命令セットの追加、エミュレータ側でも処理可能)を加えたものになっている。
# use docker ubuntu 20.04 as root
apt-get update
apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git cmake device-tree-compiler liboscpack-dev liboscpack1
cd $HOME
mkdir work
mkdir work/riscv
export RISCV=/root/work/riscv
# make gnu toolchain
cd $HOME/work
git clone https://github.com/openql-org/riscv-gnu-toolchain -b niisato-develop
cd riscv-gnu-toolchain
git submodule update --init --recursive
mkdir build
cd build
../configure --prefix=/root/work/riscv --enable-multilib
make
export PATH=$PATH:$RISCV/bin
# get riscv tools
cd $HOME/work
git clone https://github.com/openql-org/riscv-tools -b develop-openql-wip
cd riscv-tools
git submodule update --init --recursive
# make QuEST
cd $HOME/work/riscv-tools/QuEST
mkdir build
cd build
cmake ..
make
# make spike
cd $HOME/work/riscv-tools/riscv-isa-sim
mkdir build
cd build
../configure --prefix=/root/work/riscv
make CFLAGS=-DQUEST CPPFLAGS=-DQUEST
make install
# make pk
cd $HOME/work/riscv-tools/riscv-pk/
mkdir build
cd build
../configure --prefix=/root/work/riscv --host=riscv64-unknown-elf
make
make install
export PATH=$PATH:/root/work/riscv/riscv64-unknown-elf/bin/
RVVのテストコードをお借りして…コンパイルして実行。
riscv64-unknown-elf-gcc -o -O3 -march=rv64gcv rvv.c -o rvv
spike pk rvv
bbl loader
calling v_test
0.000000, 127.000000, 252.000000, 375.000000, 496.000000, 615.000000, 732.000000, 847.000000, 960.000000, 1071.000000,
1180.000000, 1287.000000, 1392.000000, 1495.000000, 1596.000000, 1695.000000, 1792.000000, 1887.000000, 1980.000000, 2071.000000,
2160.000000, 2247.000000, 2332.000000, 2415.000000, 2496.000000, 2575.000000, 2652.000000, 2727.000000, 2800.000000, 2871.000000,
2940.000000, 3007.000000, 3072.000000, 3135.000000, 3196.000000, 3255.000000, 3312.000000, 3367.000000, 3420.000000, 3471.000000,
3520.000000, 3567.000000, 3612.000000, 3655.000000, 3696.000000, 3735.000000, 3772.000000, 3807.000000, 3840.000000, 3871.000000,
3900.000000, 3927.000000, 3952.000000, 3975.000000, 3996.000000, 4015.000000, 4032.000000, 4047.000000, 4060.000000, 4071.000000,
4080.000000, 4087.000000, 4092.000000, 4095.000000, 4096.000000, 4095.000000, 4092.000000, 4087.000000, 4080.000000, 4071.000000,
4060.000000, 4047.000000, 4032.000000, 4015.000000, 3996.000000, 3975.000000, 3952.000000, 3927.000000, 3900.000000, 3871.000000,
3840.000000, 3807.000000, 3772.000000, 3735.000000, 3696.000000, 3655.000000, 3612.000000, 3567.000000, 3520.000000, 3471.000000,
3420.000000, 3367.000000, 3312.000000, 3255.000000, 3196.000000, 3135.000000, 3072.000000, 3007.000000, 2940.000000, 2871.000000,
2800.000000, 2727.000000, 2652.000000, 2575.000000, 2496.000000, 2415.000000, 2332.000000, 2247.000000, 2160.000000, 2071.000000,
1980.000000, 1887.000000, 1792.000000, 1695.000000, 1596.000000, 1495.000000, 1392.000000, 1287.000000, 1180.000000, 1071.000000,
一応、docker hubにビルド済イメージを登録しておいた。テストコードは上記のrvvに量子用命令セットの実行を追加したものをspikeで動かす。docker pull siprop/ubuntu:rvv0.8
docker run --name test -it siprop/ubuntu:rvv0.8 bash
cd /root/test
riscv64-unknown-elf-gcc -o -O3 -march=rv64imafdkv test.c -o test
spike -q2 -r4 pk test
#qregister size : 4
#qbit size : 2
bbl loader
calling v_test
0.000000, 127.000000, 252.000000, 375.000000, 496.000000, 615.000000, 732.000000, 847.000000, 960.000000, 1071.000000,
1180.000000, 1287.000000, 1392.000000, 1495.000000, 1596.000000, 1695.000000, 1792.000000, 1887.000000, 1980.000000, 2071.000000,
—- 中略 —–
1980.000000, 1887.000000, 1792.000000, 1695.000000, 1596.000000, 1495.000000, 1392.000000, 1287.000000, 1180.000000, 1071.000000,
qooh.k (rd)10, (rs1)1, (rs2)0, (qimm6)1
qbit_idx : 3
qooh.k (rd)15, (rs1)1, (rs2)0, (qimm6)1
qbit_idx : 3
RISC-Vに独自拡張した命令セットとRVV系を同時に動かしても大丈夫なことが確認できた。