FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

アウトオブオーダのCPUを作ろう - 性能向上作戦あれこれ(コンパイルオプションを変えて性能を上げる) -

きっかけはここらへん。

http://www.eembc.org/benchmark/reports/benchreport.php

これは Imagination TechnologiesFPGA上に実装した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を越えたぞ!