シミュレータを分離したものなので、浮動小数の定数畳み込み等が実機の挙動と異なります。
- レイトレ
run.sh size
- レイトレ以外は
cargo run (-r) -- --lib ./programs/libs/stdlibs.ml *.ml
- e.g
cargo run -- --lib ./programs/libs/stdlibs.ml ./programs/others/gcd.ml
cargo run -- --help
でコマンドオプションは確認してください- ライブラリを最初にconcatするので、mincamlみたく未定義なら外部関数扱いということはせず、未定義は全部エラーになります
- concatはコマンドライン引数libで与えた順番で行われるので、グローバル変数とかは最初にお願いします。
- レイトレの三角関数用ライブラリが
programs/libs/trigs.ml
, レイトレのその他ライブラリはprograms/libs/miniMLRuntime.ml
ここのprint_int
には0~999しか引数にこないと仮定して末尾呼び出しにしています。 - レイトレ以外のテストで用いるライブラリは
programs/libs/stdlibs.ml
こちらはprint_int
に与える引数の数として一般の整数が取れるよう、末尾呼び出しじゃない形にしています。
- ocamlソースに変換できる段階の中間コードを出力したら、それらは
test_intercode/others.sh
で、programs/others/*.ml
の実行結果が正しいものになるかどうかをテストできるようにしています。レイトレも、sin/cos/atanを自作ライブラリに置き換え、浮動小数定数は単精度に丸めて、配布のmakeをした結果と合致するかをtest_intercode/raytracer.sh
でテストできます。
最適化(追加順) | サイズ4・P6 | サイズ256・P6 |
---|---|---|
無し | 13,713,335 | 20,333,480,365 |
traceを引く boolをなくす前にfcmpのインライン化 |
12,858,559 | 18,676,604,129 |
末尾呼び出し最適化 | 12,485,473 | 18,121,239,556 |
インライン化 サイズ100まで (と一度しか呼ばないもの) |
5,290,298 | 8,045,816,356 |
インライン化 サイズ135 | 4,783,880 | 7,226,113,263 |
stack_mapを基本ブロック毎ではなく関数毎に 定数0のzero置き換え |
4,295,913 | 6,615,568,679 |
Spill,スケジューリング対応 (Save/Restoreはスケジューリングしていない) インラインサイズ500 |
実行命令数 3,772,126 クロック数 6,935,893 IPC 0.54385585 |
実行命令数 5,648,212,479 クロック数 10,797,569,061 IPC 0.52310038 |
最適化(追加順) | サイズ4・P6 | サイズ256・P6 |
---|---|---|
2nd ISA 対応 (インライン500) | 3,193,404 | 4,585,022,644 |
callee導入 | 3,144,216 | 4,495,230,321 |
tailだけの基本ブロック合体 mirで定数畳み込み |
2,981,677 | 4,170,782,796 |
faddabs導入 | 2,945,739 | 4,094,593,586 |
共通部分式削除 | 2,779,969 | 3,826,670,547 |
ifの6bit即値化 | 2,628,491 | 3,563,836,725 |
float_tableによるいくつかの浮動小数命令即値化 | 2,538,240 | 3,473,356,762 |
bf*.zeroの導入 | 2,503,145 | 3,423,089,378 |
ifの中にない比較はifを新たに入れずに比較演算で代用 | 2,484,816 | 3,418,293,409 |
fmax, fminの導入 | 2,482,610 | 3,414,894,235 |
0/1を返すifを比較に変換し、それをなるべくifに埋め込み | 2,458,725 | 3,367,255,713 |
mir削除の修正 K正規化形のifの種類増やした | 2,438,994 | 3,351,222,061 |
float_tableにある定数の読み込みはaddfi使用 | 2,408,478 | 3,342,585,055 |
virtでもcse(loadについては保守的) | 2,307,820 | 3,289,306,003 |
xorのif埋め込み、コピー伝播(干渉グラフによる) | 2,283,990 | 3,273,752,601 |
virtでのloadのcseを改善 | 2,275,597 | 3,253,716,109 5,732,490,480クロック |
小さい基本ブロックを複製により合体(サイズ4), store直後のload除去 | 2,203,303 | 3,136,734,509 5,561,185,457クロック |