ベクトルストア命令の投機的実行について考える。
通常、投機的実行を行うと、ストア命令はアドレスとデータを保持してその命令がコミット状態(例外などで破棄されない)になるまで待ち合わせ、コミット状態になった時点でキャッシュに書き戻す。 しかしベクトル命令は一度に生成されるメモリアドレスが多すぎて、固定量のSTQを割り当てるのは効率が悪いように思われる。 そこで、命令のアドレスが確定すると同時にSTQに割り当てを行う動的割り当ての方式を採用し、さらにストアデータを保持しないことでフォワーディングを抑制する代わりに回路面積を削減する方式を考える。
まず、それぞれのSTQはアクセスアドレスに基づいてバンク化し、独立に動作する。 さらに、格納された命令がコミット状態になると、それをストアバッファに移動してL1Dキャッシュのアップデート作業に入ることにする。
実際には、ベクトル命令でL1Dキャッシュを消費するのはキャッシュの無駄だという話もあると思うのでこの辺は実装によるものと思うのだが、L1Dキャッシュをアップデートしないのであれば、まずはL1Dに存在しているかどうかをチェック及びMSHRに存在しているかどうかを確認し、その後L2キャッシュに直接書き込むという方式が考えられる。
このような実装を追加して、一応非常に基本的なベクトルメモリアクセスが動き始めた。
99 / 116 : vle8_v : PASS 100 / 116 : vle32_v : PASS 101 / 116 : vse32_v : PASS 102 / 116 : vse8_v : PASS 103 / 116 : vmfeq_v_v : PASS 104 / 116 : vadd_v_v_chain : PASS 105 / 116 : vmfgt_v_f : PASS 106 / 116 : vmfle_v_v : PASS 107 / 116 : vmflt_v_v : PASS 108 / 116 : vle16_v : PASS 109 / 116 : vmfne_v_v : PASS 110 / 116 : vle64_v : PASS 111 / 116 : vse64_v : PASS 112 / 116 : vse16_v : PASS 113 / 116 : rvv_memcpy_lmul8 : MATCH