!Fotran->LLVM IR->C Fortanのプログラム(なすぱら)をLLVMの中間表現にして, そこからC言語に変換して,MIPSのクロスコンパイラでバイナリ生成という 長い道のりでプログラムを実行してみた.(ISは,C->LLVM IR->C) だいたい,↓のような感じでコンパイル. BT,LU,SPは各ソースコードからまずOBJ作ってリンク # compile OBJ=`echo $1 | sed 's/\.f$/.o/g'` CBE=`echo $1 | sed 's/\.f$/.cbe.c/g'` LL=`echo $1 | sed 's/\.f$/.ll/g'` BC=`echo $1 | sed 's/\.f$/.bc/g'` /usr/local/llvm-gcc-4.2-2.6-x86_64-linux/bin/llvm-gfortran \ -S -emit-llvm -I../../lib/MPI -O2 -Wall $1 -o $LL /usr/local/llvm-2.6/bin/llvm-as -o - $LL | /usr/local/llvm-2.6/bin/opt -std-compile-opts -o $BC /usr/local/llvm-2.6/bin/llc -march=c $BC /usr/local/mipsel-gcc4.2/usr/bin/mipsel-linux-gcc -O2 -Wall -I../../lib/MPI -O2 -c $CBE -o $OBJ # link /usr/local/mipsel-gcc4.2/usr/bin/mipsel-linux-gcc \ -O2 -Wall -static \ -o ../bin/cg.S.4 \ ../common/print_results.o ../common/timers.o ../common/randdp.o \ ../../lib/MClib.o ../../lib/MPI/mpi.o ../../lib/MPI/mpif.o \ $OBJ \ -lgfortran -lgfortranbegin -lm まず,うまくいくというのがすごいなあ,と. で,実行時間の比較をしてみると,仕方ないのだけど,割と遅くなってしまっている. {{ref_image comp-gcc-llvm_s.png}} {{ref_image comp-gcc-llvm_ratio_s.png}} llvm-gfotranのところで最適化しない方がいいとか,ちょこちょこ試してみたけど, 実行時間におけるたいした違いは確認できなかった. ここで,BT,LU,SPはいくつかのFotranソースから構成されているベンチマーク... うーん,コアのソースの部分だけLLVM介するとかやってみるかなあ. ちなみにコード数 {{ref_image loc_s.png}} ...コード数っていう,ざっくりな割に,なんとなくの相関がみられるのが面白い !日々メモ * VMWareFusion上のdebianとのファイル共有が面倒になったので,すっぱりとhomeを/mnt/hgfs/miyoに変更.楽になった. (Mon Jan 25 17:51:18 2010 +0900) * ParsecのblackscholesをC->LLVM->Cでコンパイルしたバイナリの実行時間は2%増.これは嬉しい. (Mon Jan 25 17:40:59 2010 +0900) * やっぱりLLVMでFotran->C変換したプログラムは断然遅い.コア部分だけ変換するようにしないとだめだな... (Mon Jan 25 14:38:01 2010 +0900)