私はパイプラインの危険の例に取り組んでおり、次のドキュメントの質問 2 を見ています。
私は幾分助けになったこれを見つけました。
私が理解しているように、戦略は次のように機能します。
- すべてがわかるまでストール: MEM2 ステージに到達するまでストールします。私が理解しているように、これは最も単純な戦略であり、ストール サイクルはすべて => 5,5,5 で同じになります。
- 採用されていないと仮定する: 分岐が採用されていないと仮定します。この例では、分岐が行われると、IF1 ステージを過ぎてすべてを停止する必要があります => 7,0,7
- 想定: は大まかに #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