ベンチマーキングのために、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くらいは出てほしい。