19 |
RISC-Vの調査 (8) |
ループにおける効率調査
前稿のプログラムは命令試験プログラムだったので、キャッシュの効果が出ていませんでした。そのため、ここではループにおける効率の向上を調査します。合わせてgccの効率も調べます。
int main() {
for (int j = 0; j < 100; j++) {
for (int i = 0; i <= 9; i++) {
*UART0_ADDR = '0'+i;
}
*UART0_ADDR = '\n';
}
}
このようなループの関数を作成し、gccにより-O, -O2, -O3でコンパイルします。まず+v1で実行命令数を確認すれば、それぞれ、5617、5517、2422実行命令数となりました。
次に+v2でパイプラインの状況を確認します。
状態 | StageF | StageD | Stage1 | Stage2 | Stage3 |
---|---|---|---|---|---|
BUSY | 91 | 0 | 1,150 | 2,251 | 0 |
EMPTY | 106 | 198 | 178 | 1,410 | 3,664 |
PIPE処理 | 9,187 | 9,186 | 8,056 | 5,723 | 5,720 |
合計 | 9,384 |
状態 | StageF | StageD | Stage1 | Stage2 | Stage3 |
---|---|---|---|---|---|
BUSY | 88 | 0 | 23 | 2,259 | 0 |
EMPTY | 106 | 172 | 170 | 284 | 2,544 |
PIPE処理 | 7,972 | 7,994 | 7,973 | 5,623 | 5,622 |
合計 | 8,166 |
状態 | StageF | StageD | Stage1 | Stage2 | Stage3 |
---|---|---|---|---|---|
BUSY | 152 | 0 | 1,023 | 2,264 | 0 |
EMPTY | 4 | 131 | 131 | 1,138 | 3,403 |
PIPE処理 | 5,672 | 5,697 | 4,674 | 2,426 | 2,425 |
合計 | 5,828 |
これらの表の合計欄がマシンサイクルを意味しています。従って、最適化度合いに対するCPIは、-O, -O2, -O3のそれぞれで1.67、1.48、2.41となりました。
表279.3の-O3においてはインナーループを展開しているため、命令キャッシュミスが若干増加しており、デコードステージ以下のパイプラインバブルが発生していますが、命令数をぐっと少なくしてマシンサイクルを縮めています。いずれも表264.1と比較すると、ループであるため命令キャッシュミスによるパイプラインストールがかなり少なくなっており、効率が向上しています。