2016-04-05 6 views
2

これは理論的な質問ですが、私は固執しています。私はARM ISAとパイプラインデータパスを取る。私は、ブランチプレディクタを使用しています。これは簡単にするために、分岐が取られると予測します。明らかなように、ブランチが実際に取られた場合は機能しますが、それ以外の場合は失敗します。失敗した場合は、すべての変更を元に戻して元に戻す、つまりパイプラインをフラッシュする必要があります。パイプラインをフラッシュする方法は?

どのようにする必要がありますか?

いくつかの値がいくつかのレジスタに書き込まれるとどうなりますか?

次に、どのようにそのレジスタを以前の値にすることができますか?同じことが旗のために行く?

+1

関連:[非常に短いif文の本文であっても、分岐の誤予測によってパイプライン全体がフラッシュされますか?](https://stackoverflow.com/questions/29522431/does-a-branch-misprediction-flush-the-全体的なパイプライン、非常に短期間の場合でも)。ここでのコメントで説明したように、フラッシングの簡単な手法の1つは、誤予測されたブランチが退職するまで待つことです。その後、ロールバックできる正しいイン・オーダー状態がレジスタ状態にあります。それ以外の場合は、誤った予測からの高速リカバリのためにレジスタの名前変更状態をチェックポイントします(例外のような完全なフラッシュよりも速い)。 –

+1

何らかのロールバック/回復メカニズム(通常はレジスタの名前変更を伴う)がなければ、投機的なアウトオブオーダーの実行はできません。 **特別なサポートなしで分岐予測に基づいてフェッチ/デコードすることはできますが、投機的な命令でアーキテクチャ状態の唯一のコピーを変更することはできません。 (Dricの答えが指摘しているように、イン・オーダー・パイプラインは、ライト・バック・ステージまで命令を進めることができます。 –

答えて

2

アーキテクチャで定義されているように、ブランチが誤って予測され、パイプラインをフラッシュする必要がある場合は、以降のすべての命令がアーキテクチャに目に見える影響を与えることはありません。

簡単な実装(短いパイプライン)では、命令がブランチにないことを保証しているときに命令が一般的にコミットされます(つまり、構造的に可視の変更を書き込む) )影はもはやありません。

より複雑なCPUを、長いパイプラインおよびアウトオブオーダーコア、使用されている技術は、一般的に登録名の変更を使用の場合:この場合

https://en.wikipedia.org/wiki/Register_renaming

、命令が完了することができるようになり、その結果を一時レジスタまたは位置に書き込む.CPUは、状態を復元する(フラッシュの場合)か、一時的な結果をアーキテクチャレジスタにコミットするメカニズムを持ち、保証があるときにこれらの結果をもうフラッシュできない。

関連する問題