読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

RISC-V LLVM を用いたベンチマークビルドの方法

f:id:msyksphinz:20170325154038p:plain

前回、RISC-V LLVMをビルドしたが、実際にベンチマークプログラムをビルドするためにはどのようにすればよいのだろう。

まず、チュートリアルにのっとってみるのがよいだろう。Freedomプラットフォームの32bit RISC-Vプロセッサ向けにclangを用意する。

いろいろ調査したのだが、32bit対応のRISC-V clangをビルドするためには、現状のリポジトリに対してパッチを当てる必要がある。

RISC-V 32bit 対応Clangのビルド方法

github.com

RISC-V 32bit対応のClangはビルド方法としてはパッチを当てる必要がある。まずは普通通りriscv-llvmをチェックアウトする。

git clone https://github.com/msyksphinz/riscv-llvm.git riscv-llvm32
cd riscv-llvm32/
git submodule update --init

まずはclang向けのパッチをダウンロードしよう。

cd riscv-clang
wget https://github.com/riscv/riscv-llvm/files/893658/riscv-clang.patch.txt
patch -p1 < riscv-clang.patch.txt

次に、llvm向けのパッチをダウンロードする。

cd ../
wget https://github.com/riscv/riscv-llvm/files/893657/riscv-llvm.patch.txt
patch -p1 < riscv-llvm.patch.txt

ビルドを開始する。

cmake -DCMAKE_INSTALL_PREFIX=/opt/riscv32 -DLLVM_TARGETS_TO_BUILD="RISCV" ../
make && sudo make install

最後に、実際に使用するためにsysrootを設定しよう。以下のようにriscv32-unknown-elf-clangをリンクし、--sysrootとして設定するディレクトリを作成する。 RISCV環境は/home/msyksphinz/riscv32/に設定されているものとする。

export RISCV=/home/msyksphinz/riscv32/
cd ${RISCV}/bin/
ln -s /opt/riscv32/bin/clang riscv32-unknown-elf-clang
cd ${RISCV}
mkdir r32 && cd r32
ln -s ../riscv32-unknown-elf usr

これで、clangを利用する際に--sysroot=${RISCV}/r32と指定することでライブラリ等使用できるようになる。

次に、これを使ってベンチマークをビルドしてみよう。

FreedomプラットフォームのベンチマークプログラムにLLVM-Clangビルドを適用する

Freedomプラットフォームは、ベンチマークプログラムなどのビルドのためにテンプレートを持っている。

github.com

まずは、Dhrystoneのビルドからやってみよう。

freedom-e-sdkリポジトリのdhrystoneのディレクトリで、以下のように入力する。

make CC="riscv32-unknown-elf-clang --sysroot=/home/msyksphinz/riscv32/r32" dhry_1.o dhry_2.o dhry_printf.o dhry_stubs.o OPT=-O3
make

これは、まずはC言語で記述されているベンチマーク部分はclangでコンパイルする。次に、ライブラリ等のラッパーは単なるmakeを使ってgccでビルドする、最後にldを使ってclangで生成したobjectとリンクするという訳だ。

同じように、Coremarkのディレクトリでもビルドすることができる。

make CC="riscv32-unknown-elf-clang --sysroot=/home/msyksphinz/riscv32/r32" core_list_join.o core_main.o core_matrix.o core_portme.o core_state.o core_util.o OPT=-O3
make