2

したがって、パイプライン化されたプロセッサの分岐予測で使用される基本的な手法を理解しています-2ビット飽和カウンター、2レベル適応予測器など.

ここに私の質問があります:

1) 分岐ターゲットの予測: なぜこれが重要なのか、またここで使用されているメカニズムにはどのようなものがあるのか​​? 分岐について考えるとき、「bne r2, r3, LABEL」と考えます。これは、r2 != r3 の場合、PC (プログラム カウンター) = PC + LABEL を意味する LABEL に分岐することを意味します。ここでターゲットを予測することの何がそんなに不思議なのですか? コンパイルされた LABEL の値に基づいて、それがどうなるかがわかります。私はおそらくここでポイントを見逃しています。

2) プログラム カウンタ値自体 (例: 0x4001000C)、または少なくともその最後の数ビットが、分岐予測スキームの一部として使用されるのはなぜですか? PC の最後の 4 ビットが (4 ビットの) 分岐履歴レジスタに連結され、その 8 ビットの値がパターン履歴テーブルへのアクセスに使用されるスキームを見ました。PCはかなり恣意的だと​​思います!

これらの問題を理解していただきありがとうございます

4

2 に答える 2

6

ここでターゲットを予測することの何がそんなに不思議なのですか? コンパイルされた LABEL の値に基づいて、それがどうなるかがわかります。

CPU パイプラインの深さとキャッシュ レイテンシのため、命令をフェッチしてから完全にデコードして分岐先を特定し、その命令をフェッチできるようになるまでには、多くのサイクルが必要です。したがって、次の命令をプリエンプティブにフェッチするためにターゲットを予測します。

プログラム カウンタ値自体 (例: 0x4001000C)、または少なくともその最後の数ビットが、分岐予測スキームの一部として使用されるのはなぜですか?

PC は特定の分岐命令を一意に識別するためです。他にどのように分岐予測テーブルにインデックスを付けるつもりですか?

于 2012-06-23T23:55:13.797 に答える
4

もう少し色を加えるには

1)ブランチターゲット予測は、あなたが与えた例ではそれほどではありません。これは、仮想関数や計算された分岐など (switch ステートメントなど) ではより重要です。どちらの場合も、分岐先はコンパイル時に不明です。仮想関数の場合は、メモリ ロケーション (仮想関数テーブル) からロードする必要があり、switch ステートメントの場合は、通常、テーブルでブランチ オフセットを検索することによって実行されます。仮想関数のケースは無条件ですが、それでも BTB を大量に使用します。

2) プレディクタには基本的に 2 つの一般的なクラスがあります。グローバルなものとアドレスごとのものです。グローバル予測子には、はるかに長いパターン履歴 (取得/非取得の履歴) を処理できるという利点があります。アドレスごとの予測子には、特定の支店の場所に固有であるという利点がありますが、通常は履歴が短くなります (アドレスごとであり、多くのスペースを占有するため)。多くのプロセッサは、グローバル予測子とアドレスごとの予測子の両方があり、予測子 (信頼推定子) があり、より良い答えを与えると予想される予測子を選択する、トーナメント ブランチ予測子と呼ばれることが多いものを使用します。

于 2012-06-25T22:08:07.820 に答える