自作CPUにおいて、ある程度ベクトル移動命令が動作するようになってきた。 アウト・オブ・オーダ実行を前提とするので、ある程度高速にベクトル・ループが回ることを確認したい。
以下のようなベクトル・ループを作成した。
main: li a5,0 li a1,100 li a2,99 .L2: subw a4, a1, a5 vsetvli a4, a4, e64, m1, ta, mu vmv.v.i v24, 0xa addw a5, a4, a5 ble a5, a2, .L2
結論から言うと、ループを一回回すのに7サイクル掛かっている。
- ベクトル命令自体の実行が3サイクル
- VSETVLI命令の実行が4サイクル
- 分岐とアドレス計算が並列にその他
のような感じがしている。
もうちょっと見てみると、そもそもの命令が、subw a4 --> vsetvli a4 --> addw a5
のループになっている。subwとaddwはパイプライン実行できるようになっているが、vsetvliが動作するCSUパイプラインはそこまでアグレッシブに動く仕組みにはなっていない。
より高性能化を目指すならば、やはりvsetvl命令向けにより短い専用パイプラインを用意する必要があると思われる。