久しぶりにオリジナルLLVMバックエンドの話だ。少しずつ調整を進めているのだが一つのマイルストンとしてマンデルブロ曲線を描くプログラムをコンパイルしてみ実行してみようと思った。
マンデルブロ曲線は言わずと知れた数式をベースとした非常に奇妙な柄を映し出す曲線で、良くFPGAの分野でも画像処理が浮動小数点演算の性能を測定するためのベンチマークとして登場する。
マンデルブロ曲線を描くプログラムをC言語で作って、これを独自LLVMバックエンドでコンパイルし、シミュレーションして秒ができたら面白そうだ。早速やってみよう。
マンデルブロ曲線を描くプログラムとしては以下を参考にした。データを出力してGnuplotによる記述を行うものだ。
ソースコードをいくつか修正して、stdoutにデータを出力するようにしてあとはシミュレーションを行う。
riscv64-unknown-elf-gcc -o mandelbrot.riscv mandelbrot.c mandelbrot_main.c -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -static -lm -lgcc
./bin/clang -O3 --target=riscv64-unknown-elf mandelbrot.c -c -emit-llvm -o mandelbrot.riscv64.bc ./bin/llvm-dis mandelbrot.riscv64.bc -o mandelbrot.riscv64.bc.ll ./bin/llc -march=myriscvx64 -debug -disable-tail-calls -relocation-model=static -filetype=asm mandelbrot.riscv64.bc \ -o mandelbrot.myriscvx64.static.S > mandelbrot.myriscvx64.static.S.log 2>&1 riscv64-unknown-elf-gcc mandelbrot_main.c -o mandelbrot_main.riscv.o -c -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -static -lm -lgcc riscv64-unknown-elf-gcc -o mandelbrot.llvm.riscv mandelbrot.myriscvx64.static.S mandelbrot_main.riscv.o \ -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -static -lm -lgcc
アセンブリの出力までをLLVMで実行して、最後のリンクはgccによって行う。これによりバイナリが生成されるので、今度はspikeによりシミュレーションを行う。
spike pk mandelbrot.llvm.riscv > data.txt
最後にGnuplotによりデータの生成を行う。
gnuplot png.gnuplot # mandelbrot.pngが生成される。
結果は以下のようになった。上手く行った。