0

私はパイプラインの危険の例に取り組んでおり、次のドキュメントの質問 2 を見ています。

質問2

私は幾分助けになったこれを見つけました。

私が理解しているように、戦略は次のように機能します。

  1. すべてがわかるまでストール: MEM2 ステージに到達するまでストールします。私が理解しているように、これは最も単純な戦略であり、ストール サイクルはすべて => 5,5,5 で同じになります。
  2. 採用されていないと仮定する: 分岐が採用されていないと仮定します。この例では、分岐が行われると、IF1 ステージを過ぎてすべてを停止する必要があります => 7,0,7
  3. 想定: は大まかに #2 の逆になります。分岐が行われない場合、IF1 ステージを過ぎて失速する必要があります => 0,7,0

私の理解が正しいかどうかはわかりません。誰かが私の解決策を批判し、私の考えが正しいかどうかを教えてくれたり、どこが間違っているかを説明してくれたりしたら、大歓迎です.

EDIT1:質問に答える

1) 自分が正しかったことをいつ知ることができますか (分岐解決)?

EXステップで分岐解決がわかると思います。

2) 分岐をいつ受けたいか (正しいか間違っているか) はいつわかると思いますか?

AGステップでいつ分岐したいかわかると思います。

3) 住所はいつわかりますか?

AGステップの後に次のアドレスを知っていると思います。

EDIT2: 「すべてがわかるまで立ち止まってください。」分岐 (条件付きまたは無条件) が取られるかどうかにかかわらず、パイプラインは AG ステージ中にストールを開始し、EX ステージが完了するまでストールし続けることを理解しています。意味: すべての場合で 4 サイクル停止する必要があります。

次のようになります: I# = IF#、M# = MEM#、ST = ストール

Branch:    I1-I2-ID-AG-M1-M2-EX-WB   
Successor:    I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB

EDIT3:「取られていないと仮定する」. 名前が示すように、すべての分岐 (条件付きまたは無条件のいずれか) が行われると想定していることは理解しています。ここで発生する唯一の失速は、分岐が行われる場合です。失速は以前と同じ場所で発生します。したがって、この場合、分岐 (条件付きまたは無条件) が発生した場合は 4 つのストールが発生し、そうでない場合はストールが発生しません。

次のようになります

Branch: I1-I2-ID-AG-M1-M2-EX-WB
Taken:     I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB
Not:       I1-I2-ID-AG-M1-M2-EX-WB

EDIT4:「取られたと仮定する」。これは本質的に前の戦略の逆です。分岐が発生しない場合は 4 つのストールがありますが、分岐 (条件付きまたは無条件) が発生する場合は 1 つもありません。

次のようになります

Branch: I1-I2-ID-AG-M1-M2-EX-WB
Not:       I1-I2-ID-AG-M1-M2-EX-WB
Taken:     I1-I2-ST-ST-ST-ST-ID-AG-M1-M2-EX-WB
4

1 に答える 1

1

Decode でのジャンプであることがわかり、AGen でのジャンプ ターゲットがわかっているため、条件分岐よりもはるかに早くジャンプを解決できます。

「Assume Not Taken」は、常に PC+4 を予測することを意味すると思います。コードに実行された分岐がない場合、パイプラインでバブルは発生しません。ジャンプまたは分岐にヒットした場合は、誤って推測された命令を強制終了し、PC をリダイレクトする必要があります。

「Assume Taken」とは、ブランチを取得していて、ジャンプするターゲットがあることに気付いたら、ブランチを取得する(そして、その背後にある想定された誤った命令を殺す)ことを意味すると思います。これにより、AGen と Exe の間のサイクルが節約されます。ただし、Branch が使用されていない場合、PC を以前の状態にリダイレクトする必要があるため、動作が低下します。

于 2013-11-05T13:51:50.470 に答える