だんだんネタも無くなってきたので、CoremarkをRISC-VのGCCでコンパイルするにあたり、本当に最適なオプションになっていたのかを調査してみようと思う。
以前までのCoremarkは、以下のオプションでコンパイルしていた。
PORT_CFLAGS = -O2 -g $(MACHINE_TARGET) -DITERATIONS=$(ITERATIONS)
いくつか効果のありそうなコンパイルオプションを追加してみよう。まずは、現在の自作RISC-VプロセッサはLoad-Useが弱いため、ループアンローリングしてスケジュールを最適化させるため、-funroll-loops
を導入してみる。
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としては悪くなっている。
-O3
でコンパイルすると
-O3
でコンパイルすると、コンパイルエラーになることは分かっている。memsetが足りないということだ。これは自分で実装して、どうにか-O3を使えるようにするしか無いかなあ。