FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討 (28. ベクトル命令のキャッシュ境界を超えるアクセスの対応)

これまでのベクトルロード命令は、すべて1つのリクエストがキャッシュの境界を超えないように制御してきた。 しかし実際にはそんなことはなく、キャッシュの境界を超える場合はそれに応じて相応の処理を行わなければならない。 それについて考えた。

まず、ベクトルメモリアクセスのアドレスが計算されると、それがキャッシュラインを跨ぐかどうかを判定する(これは仮想アドレスでも判定できる)。 基本的には、現在のアドレス + DLEN/8の値が次のキャッシュラインに移っているかどうかをチェックすればよい。

キャッシュラインを挟んでいる場合、命令を分割して、2つのキャッシュラインへのアクセスに分割する。 そして面倒くさいのが、最後にベクトル・レジスタへの書き込みを行う際にマージをする必要があるということだ。この辺の論理の変更も必要になる。

ハザードが起きると大変だ。例えば1つ目のキャッシュラインへのアクセスがキャッシュ・ミスなどでハザードを起こし、次のキャッシュラインへのアクセスがミスなしで完了した場合、どのように処理すべきなのか。 基本的には、順番にリクエストがくることを想定すべきなので、1つ目のキャッシュラインへのアクセスがハザードを起こした時点で2番目のリクエストも一緒に殺して、2つともリトライをすべきだということになる。 この辺の処理もうまく行う必要がある。

さらに、上書きの処理だ。VL < VLMAXの時は、古いベクトルレジスタの値を読んできてマージし、それを上書きする。 しかしこのようなリクエストの分割を行った際はより面倒くさい。 2番目のキャッシュ・リクエストだけがリプレイしているときは、古いレジスタではなく自分自身の書き込みレジスタを読み直して、マージする必要がある。 つまり、1番目のリクエストは古いベクトル・レジスタを読み直して、2番目のベクトル・レジスタは(リプレイしているのであれば)、自分自身の書き込みレジスタを再び呼ばなければならないということだ。結構面倒くさいな...