オリジナルLLVMバックエンドの話の続き。もう少し高度なプログラムとしてレイトレースのコードをコンパイルして実行してみようと思う。 レイトレースのプログラムは非常に複雑だが、これがきちんとコンパイルできるだろうか。
レイトレースのプログラムは以下を使用した。PPMの画像を出力することができるらしい。
- Introduction to Ray Tracing: a Simple Method for Creating 3D Images
これを多少改造して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
上手く行った。