FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討 (23. ベクトルストア命令の取り扱い)

ベクトルストア命令の投機的実行について考える。

通常、投機的実行を行うと、ストア命令はアドレスとデータを保持してその命令がコミット状態(例外などで破棄されない)になるまで待ち合わせ、コミット状態になった時点でキャッシュに書き戻す。 しかしベクトル命令は一度に生成されるメモリアドレスが多すぎて、固定量の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