FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

自作CPUにベクトル命令を追加する実装検討 (6. ベクトル・ループの動作確認)

自作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命令向けにより短い専用パイプラインを用意する必要があると思われる。