現在、自作CPUにおけるLSUのIQ(命令発行キュー)は、LSUパイプライン毎に分割されている。 これ自体を修正することも考えられるのだが、問題はIQへのディスパッチが偏りすぎていることだ。
現在の実装は非常にサボっていて、一度に発行できるメモリアクセス命令の数を4とし、LSUのパイプラインの数を2とすると、2つのIQへの命令の割り当ては "0, 1", "2, 3" としている。 これはLSU0側に命令が非常に偏るのは当たり前だ。
次に、2つのIQへの命令の割り当ては "0, 2", "1, 3" とすることを考える。 一見平等そうに見えるが、実はディスパッチグループ内で1命令しかメモリアクセス命令が存在しない場合には常に0側が使用されるため、バランスとしては非常にイマイチになる。
では、2つのIQへの割り当てをPCの下位インデックスを用いてみてはどうだ。 一見平等そうに割り当てられるように見えるが、例えば小ループで1つのメモリアクセス命令をひたすら繰り返す場合、これも同じLSU側にひたすら配置されることになってしまう。
こういう条件を加味すると、サイクル毎に先頭のIQインデックスを変えながらランダムにディスパッチするのがよさそうな気がしている。 つまり、あるサイクルはLSU0, LSU1の順番、あるサイクルはLSU1, LSU0の順番などランダムに入れ替える。
というわけで、まずは試行として2つのIQへの命令の割り当ては "0, 2", "1, 3" としてみた。実装は意外と簡単だった。
LSUのパイプラインの負荷はかなり分散されている。しかし性能自体は大きく向上しない... ここがクリティカルではないのか?もう少し解析してみる必要がありそう。