FPGA開発日記

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

BOOM (Berkeley Out-of-Order Machine) のマイクロアーキテクチャドキュメントを読む (4)

RISC-VのアウトオブオーダコアであるBOOM (Berkely Out-of-Order Machine) について勉強を進めている。以下のドキュメントを日本語に訳しながら読んでいくことにした。

docs.boom-core.org


The Backing Predictor (BPD)

Next Line Predictor (NLP) がうまく予測しているときは、プロセッサの バックエンド に実行すべき命令の切れ目のないストリームが提供されます。 NLP (Next-Line Predictor)は、1サイクルの高速な予測を行うことができますが、 コストが高く(面積と電力の両方の観点から)、非常に小さく(数十本の分岐しか記憶できない)、 非常にシンプルです( Bi-Modal Table (BIM) のヒステリシスビットは非常に複雑で長い履歴パターンを学習することができません)。

より複雑な分岐の動作を捉えるために、BOOMは Backing Predictor (BPD) をサポートしています。

BPDの目標は、(願わくば)高い面積密度で非常に高い精度を提供することです。BPDは分岐成立/不成立の情報のみを生成します; つまりどの命令が分岐命令で どこが分岐先であるかの情報を得るためには、他のエージェントに依存することになります。BPDは、この情報をBTBから得るか、または命令キャッシュから命令がフェッチされるのを待って、 自分でデコードすることができます。 これにより、PCタグと分岐ターゲットをBPD内に保存する必要がなくなります 7

BPD は、Fetch ステージを通してアクセスされ、 命令キャッシュアクセスやBTBと並行してアクセスされます( Fig. 8 参照)。 これにより、BPDをシーケンシャルメモリ(フリップフロップの代わりに SRAM)に格納することができます。 いくつかの巧妙なアーキテクチャにより、BPDをシングルポートの SRAM に格納して、望ましい密度を実現することができます。

f:id:msyksphinz:20210505220143p:plain

Fig. 8 BOOMの フロントエンド . ここでは、図の下の部分にBTBとBranch Predictorが見えます。 命令キャッシュから戻ってきた命令はすぐにデコードされます。 BTBや Backing Predictor (BPD) から取られたと予測されるブランチは、 F4 ステージから フロントエンド にリダイレクトされます。 予測スナップショットとメタデータは、 Branch Rename Snapshots (予測ミスの後に予測器を修正するため)とFetch target Queue (FTQ)( Commit ステージで予測器を更新するため)に保存されます。

分岐予測の生成

予測を行う際、BPDは以下のものを提供しなければなりません。

  • 予測を行ったか?
  • 分岐成立/不成立の予測のビットベクタ

最初の箇条書きにあるように、BPDは、 予測を行わない場合があります。 これは、予測者がタグを使ってその予測が有効かどうかを通知したり、構造的な危険性があって予測ができない場合があるためです。

BPD は、分岐成立/不成立の予測のビットベクタを提供します。 ビットベクタのサイズは、パイプラインの Fetch Width と一致します ( フェッチパケット の各命令に対して1ビット)。 後のFetchステージでは、 フェッチパケット 内の命令をデコードし、ブランチターゲットを計算し、BPDの予測ビットベクタと連動して、 フロントエンド リダイレクトを行うべきかどうかを決定します。

ジャンプとジャンプレジスタ命令

BPD とは別に取り扱われます。8

NLPは、「分岐の成立した」命令のPCとターゲットPCを学習するので、 ジャンプやジャンプレジスタ命令を予測することができます。

もし NLPJAL命令を予測しなかった場合、 パイプラインは F4 で フロントエンド をリダイレクトします( Fig. 5 参照)。9

NLPで予測されなかったジャンプレジスター命令は、 予測されないままパイプラインに送られます。 JALR命令では、レジスタファイルを読み込んでジャンプ先を推測する必要があるため、 NLPが予測を行わなかった場合には、何もできません。

Backing Predictorの更新

一般的に、BPDは Commit ステージで更新されます。 これにより、BPDが誤ったパスの情報で汚染されるのを防ぐことができます。10 ただし、BPDはグローバルヒストリーを利用しているため、 フロントエンド がリダイレクトされるたびに、 このヒストリーをリセットする必要があります。 したがって、BPDは、Fetch 段階で発生した投機的な更新をリセットするために、 予測誤りが発生したExecute 中にも(部分的に)更新されなければなりません。

予測を行う際、BPDは「応答情報パケット」をパイプラインに渡します。 この「情報パケット」は、コミット時までFetch target Queue (FTQ)に格納されます。11 「情報パケット」に対応するすべての命令がコミットされると、「情報パケット」は(最終的な分岐の結果とともに)BPDに設定され、BPDが更新されます。Fetch Target Queue (FTQ)は FTQ を対象としており、 Commit の際に予測器を更新するために必要なスナップショット情報を扱います。Rename Snapshot Stateは Branch Rename Snapshots を対象としています。 これは Execute ステージでの誤判定の際に予測子を更新するために必要なスナップショット情報を処理します。