リトマステストというのは、マルチプロセッサの構成においてメモリアクセスの順序などをテストするためのツールらしい。 あまり私も良く分かっていないのだが、RISC-Vのメモリコンシステンシモデルの定義においてよく話題に上がるテストだ。
そしてRISC-Vのリトマステストを行うためのリポジトリも公開されている。
ダウンロードしてビルドしてみる。
最初にOPAMというツールが必要なようだ。
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
次にlitmus-tests-riscvをチェックアウトする。
git clone https://github.com/litmus-tests/litmus-tests-riscv.git
cd litmus-tests-riscv
必要なツール群をインストールする。
sudo apt-get install libcap-dev curl -L https://github.com/containers/bubblewrap/archive/v0.4.1.tar.gz cd bubblewrap-0.4.1 ./autogen.sh make sudo make install opam init
<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> Processing 4/12: [ocaml-base-compiler: make world.opt] -> installed base-bigarray.base -> installed base-threads.base -> installed base-unix.base -> installed ocaml-base-compiler.4.10.0 -> installed ocaml-config.1 -> installed ocaml.4.10.0 Done. # Run eval $(opam env) to update the current shell environment
herdtoolsというリトマステストを生成するためのツールをインストールする。
opam install herdtools7
<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> installed conf-m4.1 -> installed dune.2.5.0 -> installed menhirLib.20200211 -> installed menhirSdk.20200211 -> installed menhir.20200211 -> installed ocamlfind.1.8.1 -> installed herdtools7.7.55 Done. # Run eval $(opam env) to update the current shell environment
opam env
とすると環境設定用のコマンドが大量に出力される。どうやらシェルのスタート時にopam env
を実行するように設定しておけば良さそうだ。
opam env
OPAM_SWITCH_PREFIX='/home/msyksphinz/.opam/default'; export OPAM_SWITCH_PREFIX; CAML_LD_LIBRARY_PATH='/home/msyksphinz/.opam/default/lib/stublibs:/home/msyksphinz/.opam/default/lib/ocaml/stublibs:/home/msyksphinz/.opam/default/lib/ocaml'; export CAML_LD_LIBRARY_PATH; OCAML_TOPLEVEL_PATH='/home/msyksphinz/.opam/default/lib/toplevel'; export OCAML_TOPLEVEL_PATH; MANPATH=':/home/msyksphinz/.opam/default/man'; export MANPATH; PATH='/home/msyksphinz/.opam/default/bin:/home/msyksphinz/.cargo/bin/:/home/msyksphinz/.cargo/bin:/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/bin:/storage/eda/tools/img/cs_v131/Toolchains/mips-img-elf/2015.06-05/bin:/home/msyksphinz/.local/opt/mips/simulators/iasim/IASim_4_1_0/bin:/home/msyksphinz/work/riscv/swimmer_riscv/build:/home/msyksphinz/software/sbt/bin/:/home/msyksphinz/others/usr/bin/:/home/msyksphinz/.cargo/bin/:/home/msyksphinz/.cargo/bin:/storage/eda/tools/img/cs_v131/Toolchains/mips-img-linux-elf/2015.06-05/bin:/storage/eda/tools/img/cs_v131/Toolchains/mips-img-elf/2015.06-05/bin:/home/msyksphinz/.local/opt/mips/simulators/iasim/IASim_4_1_0/bin:/home/msyksphinz/work/riscv/swimmer_riscv/build:/home/msyksphinz/software/sbt/bin/:/home/msyksphinz/others/usr/bin/:/home/msyksphinz/.cargo/bin:/home/msyksphinz/bin:/home/msyksphinz/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/msyksphinz/software/sbt/bin/:/home/msyksphinz/software/sbt/bin/:/home/msyksphinz/work/scripts/:/usr/local/scala/bin:/usr/local/go/bin:/home/msyksphinz/go/bin:/home/msyksphinz/others/usr/wit/0.10.1-14-ga7c9344/:/home/msyksphinz/work/riscv/wake/bin:/home/msyksphinz/riscv-gnu/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin:/home/msyksphinz/node_modules/.bin:/home/msyksphinz/work/riscv/wit/:/home/msyksphinz/software/idea-IC-192.6603.28/bin:/home/msyksphinz/others/usr/0.10.1-18-g81e5f35/:/home/msyksphinz/node_modules/.bin/:/home/msyksphinz/others/idea-IC-192.7142.36/bin:/usr/local/go/bin:/home/msyksphinz/software/sbt/bin/:/home/msyksphinz/work/scripts/:/usr/local/scala/bin:/usr/local/go/bin:/home/msyksphinz/go/bin:/home/msyksphinz/others/usr/wit/0.10.1-14-ga7c9344/:/home/msyksphinz/work/riscv/wake/bin:/home/msyksphinz/riscv-gnu/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin:/home/msyksphinz/node_modules/.bin:/home/msyksphinz/work/riscv/wit/:/home/msyksphinz/software/idea-IC-192.6603.28/bin:/home/msyksphinz/others/usr/0.10.1-18-g81e5f35/:/home/msyksphinz/node_modules/.bin/:/home/msyksphinz/others/idea-IC-192.7142.36/bin:/usr/local/go/bin'; export PATH
という訳でmakeでテストを生成してみよう。
make -B hw-tests-src/run.sh CORES=2
なにかいろいろテストが生成された。このテストを今度はGCCでコンパイルする。
cd hw-tests-src make GCC=riscv64-unknown-elf-gcc
以下のように怒られてしまった。Linux版のriscv-gccが必要なのかな?昔の作業環境からコピーして使ってみよう。
riscv64-unknown-elf-gcc -D_GNU_SOURCE -DFORCE_AFFINITY -Wall -std=gnu99 -O2 -pthread -static -c -o SB+fence.tsoxps.o SB+fence.tsoxps.c riscv64-unknown-elf-gcc: error: unrecognized command line option '-pthread' Makefile:39: recipe for target 'SB+fence.tsoxps.o' failed
あらら、また怒られた。どうもGCCが古いのか?調査が必要だ。
riscv64-unknown-linux-gnu-gcc -D_GNU_SOURCE -DFORCE_AFFINITY -Wall -std=gnu99 -O2 -pthread -static -c -o 2+2W+porlrls.o 2+2W+porlrls.c 2+2W+porlrls.c: Assembler messages: 2+2W+porlrls.c:267: Error: unrecognized opcode `sw.rl t1,0(a5)' 2+2W+porlrls.c:269: Error: unrecognized opcode `sw.rl a1,0(a4)' 2+2W+porlrls.c:234: Error: unrecognized opcode `sw.rl t1,0(a5)' 2+2W+porlrls.c:236: Error: unrecognized opcode `sw.rl a1,0(a4)'