FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討(43. AXPYベンチマークを動かす)

ベンチマーキングのために、RISC-Vのベクトル命令で構成されたAXPYを動作させてみることにする。 前回の実行では、各イタレーションで、かなりの空きサイクルがある。MSHRの空きも大きい。やはりもうちょっとアグレッシブにMSHRの割り当てを行って、可能な限りキャッシュミスを減らしたい。

0000000080002000 <axpy_intrinsics>:
    80002000:   f20507d3                fmv.d.x fa5,a0
    80002004:   02d05863                blez    a3,80002034 <axpy_intrinsics+0x34>
    80002008:   4701                    li      a4,0
    8000200a:   40e687bb                subw    a5,a3,a4
    8000200e:   05b7f7d7                vsetvli a5,a5,e64,m8,ta,mu
    80002012:   0db7f057                vsetvli zero,a5,e64,m8,ta,ma
    80002016:   00379513                sll     a0,a5,0x3
    8000201a:   0205f407                vle64.v v8,(a1)
    8000201e:   02067c07                vle64.v v24,(a2)
    80002022:   9f3d                    addw    a4,a4,a5
    80002024:   b287dc57                vfmacc.vf       v24,fa5,v8
    80002028:   02067c27                vse64.v v24,(a2)
    8000202c:   95aa                    add     a1,a1,a0
    8000202e:   962a                    add     a2,a2,a0
    80002030:   fcd74de3                blt     a4,a3,8000200a <axpy_intrinsics+0xa>
    80002034:   8082                    ret

試行したのは、アグレッシブなMSHRの割り当てと、一度ハザードを発行して命令を生成し続けて可能な限りMSHRにリクエストを確保する方式だ。 これでMSHRを可能な限り使いつくすことを想定する。

それでもかなり性能が悪い。いろいろ見ていると、MSHRのアグレッシブな割り当てをしても、かなりの空きがある。 よく見てみると、ハザードの要因としては、MSHRへの割り当てだけでなく、L1Dのコンフリクトもしているようなので、L1Dコンフリクトの場合はuopを即時全部消して、 MSHRの割り当ての場合はMSHRに割り当て続けてみよう。この場合はどうだろう。

439067:ISS CYCLE is updated to RTL = 000000000001e90c
471163:ISS CYCLE is updated to RTL = 0000000000027c51
// 64KBのデータ計算で37701サイクルかかっている。1サイクルあたり1.73B (=13-bit)なので、かなり遅い。DLEN=128-bitで、データのロード・ストア合わせてロードx2+ストアx1なので、128/3=42-bitくらいは出てほしい。