自作CPUの実装、ロードストア命令のバンク化を実現した結果分岐予測の性能ボトルネックが明らかになった。
性能ボトルネックになっているのは、s0
ステージで命令フェッチ、s2
ステージで分岐先を予測とということで合計2サイクル分岐予測に必要だったため、命令ディスパッチ幅(5命令)以内の分岐命令の場合予1サイクルバブルが発生してしまい性能が向上できない。
そこで、試験的にBTBとBIMの適用をs2
ステージからs1
ステージに移動して分岐先を1サイクル速くアップデートするように変更する。
まだRASの方を1サイクル縮めていないので完全に検証は出来ていないのだが、単純なループならば動くようになった。
.section .text _start: la x1, data addi x2, x1, 256/8 li x20, 500 loop: ld x10, 0(x1) ld x11, 0(x2) addi x20, x20, -1 bne x20, zero, loop #include "common_pkg.S" TEST_FINISH
一応、これまでの動作に比べてバブルが無くなり、バンク化した効果がベンチマークで顕著に見えるようになってきた。
同じプログラムを流して、
- バンク化+分岐予測1サイクル:1692サイクル / 2021命令
- 非バンク化+分岐予測1サイクル:2121サイクル / 2021命令
割と顕著に性能差が出た。まあこれは小ループだからかな。