をコミット、私はROBのコミットを実行したまでは変更が行われていないことを理解しています。並べ替えバッファが
機能ユニット(のFU)の結果は、上の彼らの結果は、共通データバス(CDB)を言うと実行が終了ROBにでき書き込みます。その後、ROBはブランチが正常に予測されたかどうかを判断し、そうでない場合はROBをフラッシュします。私は理解していない何
はのFUのCDB放送から来たリザベーションステーションの更新に何が起こるかである、彼らはフラッシュすべきではない/何とかロールバック?
私は
$ S3が0に初期化され
addi $s1, $zero, 8
addi $s2, $zero, 9
addi $s3, $zero, 0
bneq $s1, $s2, L1
addi $s3, $s3, 1 // first increment
L1:
addi $s3, $s3, 2 // second increment
、 (おそらく最高ではない)と、その後の枝のミス予測が結果が1増加すると$ S3の原因となることができます例RSにブロードキャストされる。
$ s3は、2の2番目のインクリメントで実行を開始する準備ができています。同時に分岐ミス予測が検出され、ROBがフラッシュされますが、加算器のRSは変更されません。間違った価値を持ち、ROBにフラッシュされることはありませんでした。
これはどのように解決されますか?
私は修正しながら、私は卒業し、これを思い付いた、私は重要な何かをしないのです、私は非常に経験豊富ではないよと思われます。分岐が取られるように、$s3
の更新(最初の増分)は、データをリオーダバッファにバッファリングされることを、実際のレジスタ$s3
を更新しないであろうと予測される
私はそれを理解し、少なくともインテルのCPU上で、ROBは、すべての飛行中に実行するために待機しているRSに残っているものも含めて、パイプラインのアウトオブオーダー一部の内部命令を追跡します。したがって、命令は、コアのアウト・オブ・オーダー部分に発行されたときに、* ROBおよびRSの*両方に追加されます。私はこのデザインがほぼ普遍的だと思う。あなたは何とか投機的であるすべての命令を追跡できる必要があることは間違いありません。 –
アーキテクチャステートのチェックポイントを提案する「キロ命令プロセッサ」(すなわち、順序外ウィンドウ> = 1k)についての論文があり、現在の状態を意味する予測ミス/例外を検出したときに最後の既知の状態にロールバックします偽です。しかし、批判的に言えば、ROBを大きくする必要はありません。なぜなら、現在の状態にどのようになったのかを覚えておく必要がなく、正確な例外をサポートするためにチェックポイントに戻って再試行できるからです。 –