FPGA開発日記

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

自作プロセッサの性能解析とその対策(6. コンパイラの最適化オプション追加とそれによる性能変化)

だんだんネタも無くなってきたので、CoremarkをRISC-VのGCCコンパイルするにあたり、本当に最適なオプションになっていたのかを調査してみようと思う。

以前までのCoremarkは、以下のオプションでコンパイルしていた。

PORT_CFLAGS = -O2 -g $(MACHINE_TARGET) -DITERATIONS=$(ITERATIONS)

いくつか効果のありそうなコンパイルオプションを追加してみよう。まずは、現在の自作RISC-VプロセッサはLoad-Useが弱いため、ループアンローリングしてスケジュールを最適化させるため、-funroll-loopsを導入してみる。

gcc.gnu.org

Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop. -funroll-loops implies -frerun-cse-after-loop. It also turns on complete loop peeling (i.e. complete removal of loops with small constant number of iterations). This option makes code larger, and may or may not make it run faster.

PORT_CFLAGS = -O2 -funroll-loops -g $(MACHINE_TARGET) -DITERATIONS=$(ITERATIONS)

これにより、ISSによる実行では命令数は 308822命令から264024に減少していることが確認できた。 では、これでRTLシミュレーションを実行してみよう。

命令数 Rate サイクル数 Rate
最適化オプション追加前 308822 100% 433730 100%
最適化オプション追加後 264024 85.5% 396837 91.5%

うーん、IPCとしては何故か下がってしまった。命令数としては15%程度削減できているのだが、サイクル数としては8%弱の削減数だ。どこか効率の悪いところがあるらしい。

IPC経過

緑色が最適化コンパイルオプション追加後だ。やはりIPCとしては悪くなっている。

f:id:msyksphinz:20161129024940p:plain

-O3コンパイルすると

-O3コンパイルすると、コンパイルエラーになることは分かっている。memsetが足りないということだ。これは自分で実装して、どうにか-O3を使えるようにするしか無いかなあ。