きっかけはここらへん。
http://www.eembc.org/benchmark/reports/benchreport.php
これは Imagination Technologies がFPGA上に実装したMIPS P5600のベンチマーク結果である。 これを見ると、コンパイルスイッチが、
-O3 -funroll-all-loops -fgcse-sm -fgcse-las -finline-functions -finline-limit=1000 -msoft-float -EL -G4 -fplugin=MIPS_CSG/tree_switch_shortcut_elf-2014.11-21.so -march=74kc -falign-functions=16 -mno-dsp
となっている。何となく意味は分かるが、それぞれについて調べてみよう。
- -O3 最も積極的な最適化。以下のスイッチが有効になる。-finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-loop-vectorize, -ftree-loop-distribute-patterns, -ftree-slp-vectorize, -fvect-cost-model, -ftree-partial-pre and -fipa-cp-clone options.
- -fgcse-sm ロードストアをループの外に出す効果がある、らしい
- -fgcse-las 冗長なロードストアを省略する
- -finline-functions 関数のインライン展開
- -funswitch-loops ループ内不変数をループの外に移動する
- -finline-limit インライン最大展開数
- -msoft-float ソフトウェアによる浮動小数点使用
- -falign-functions n 関数の先頭をnバイトにアラインする
これらのオプションを有効にしてコンパイルしてみる。これにより、まず命令数を削減する効果が得られた。 さらに、実際にRTLを使って性能を測定してみると、
ダイレクトジャンプ型 分岐命令予測 | 比較型分岐 命令予測1 | 比較型分岐 命令予測2 | 分岐命令 RS2段 | ALU 2並列 | LSU内バッファ | MULT/MADD 1サイクル化 | バイナリ 最適化オプション変更 | Coremark サイクル数 | CMK値 |
---|---|---|---|---|---|---|---|---|---|
レ | レ | レ | レ | レ | 562316 | 1.78 | |||
レ | レ | レ | レ | レ | レ | 544579 | 1.84 | ||
レ | レ | レ | レ | レ | レ | 469422 | 2.13 | ||
レ | レ | レ | レ | レ | レ | レ | 432935 | 2.31 |
ついにCoremark値が2.0を越えたぞ!