FPGA開発日記

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

オリジナルLLVMバックエンドでレイトレースプログラムを実行する

オリジナルLLVMバックエンドの話の続き。もう少し高度なプログラムとしてレイトレースのコードをコンパイルして実行してみようと思う。 レイトレースのプログラムは非常に複雑だが、これがきちんとコンパイルできるだろうか。

レイトレースのプログラムは以下を使用した。PPMの画像を出力することができるらしい。

  • Introduction to Ray Tracing: a Simple Method for Creating 3D Images

https://www.scratchapixel.com/code.php?id=3&origin=/lessons/3d-basic-rendering/introduction-to-ray-tracing

これを多少改造してRISC-V GCCコンパイルし、バイナリを生成してSpikeで実行する。

riscv64-unknown-elf-g++ -o raytracer.riscv raytracer.cpp  -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -static -lm -lgcc

同様に、LLVM独自実装バックエンドを使ってコンパイルしてバイナリを生成する。今回はmain関数までを含めて全部LLVMコンパイルし、リンクだけはRISC-V GCCを使用した。

./bin/clang  -O3 raytracer.cpp -c -emit-llvm -o raytracer.riscv64.bc
./bin/llvm-dis raytracer.riscv64.bc -o raytracer.riscv64.bc.ll
./bin/llc -march=myriscvx64     -debug -disable-tail-calls  -relocation-model=static -filetype=asm \
   raytracer.riscv64.bc -o raytracer.myriscvx64.static.S > raytracer.myriscvx64.static.S.log 2>&1
riscv64-unknown-elf-g++ -o raytracer.llvm.riscv raytracer.myriscvx64.static.S  -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -static -lm -lgcc

コンパイルしたバイナリを使用してシミュレーションを実行してみよう。

spike pk ./raytracer.llvm.riscv > untitled.llvm.ppm
f:id:msyksphinz:20200613213752p:plain

上手く行った。