2016-11-30 11 views
2

をコミット、私は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を更新しないであろうと予測される

enter image description here

+1

私はそれを理解し、少なくともインテルのCPU上で、ROBは、すべての飛行中に実行するために待機しているRSに残っているものも含めて、パイプラインのアウトオブオーダー一部の内部命令を追跡します。したがって、命令は、コアのアウト・オブ・オーダー部分に発行されたときに、* ROBおよびRSの*両方に追加されます。私はこのデザインがほぼ普遍的だと思う。あなたは何とか投機的であるすべての命令を追跡できる必要があることは間違いありません。 –

+1

アーキテクチャステートのチェックポイントを提案する「キロ命令プロセッサ」(すなわち、順序外ウィンドウ> = 1k)についての論文があり、現在の状態を意味する予測ミス/例外を検出したときに最後の既知の状態にロールバックします偽です。しかし、批判的に言えば、ROBを大きくする必要はありません。なぜなら、現在の状態にどのようになったのかを覚えておく必要がなく、正確な例外をサポートするためにチェックポイントに戻って再試行できるからです。 –

答えて

0

。誤予測が検出されると、並べ替えバッファがフラッシュされます。とにかく私の知る限りでは、元のレジスタは分岐が解決されるまで更新されないため、並べ替えバッファが使用されます。私はそれを理解

+0

OPはこれを知っていて、どのように*達成されたかを詳細に尋ねています。私はその質問に対する私のコメントがOPが探しているものなのかどうか分からないので、答えとしてまだ投稿していない。 –

+0

@PeterCordes、申し訳ありません。回答を追加していたときにあなたのコメントが表示されませんでした。とにかく私は、分岐予測が解決される前に更新された値を持つ$ 3に頼って投機的実行のアイデアを少し逃したと思った。 –

+0

は私のコメントとフォローアップの考えを答えとして投稿しました。 –

0

として、少なくともIntelのCPU上で、ROBは、すべての飛行中に実行するために待機しているRSに残っているものも含めて、パイプラインのアウトオブオーダー一部の内部命令を追跡します。命令がコアのアウト・オブ・オーダー・パートに発行されると、ROBとRSの両方に命令が追加されます。

私はこのデザインがほぼ普遍的だと思います。あなたは何とか投機的であるすべての命令を追跡できる必要があることは間違いありません。


また、すべての命令がはされて誤推測する必要がフラッシュされていることが発見さ命令に依存していること。あなたが説明するようにROB全体をフラッシュし、最後の非投機的な状態に戻すことは確かに簡単です。

したがって、2番目の追加がまだ実行される必要があるにもかかわらず、誤った推測はその入力が間違っている可能性があることを意味します。それで、あなたが話している問題を正確に避けるために、それを洗い流す必要があります。

+0

私は、おそらくOOOの実行は目的を破るような種類のコミットか、すべてがフラッシュされてしまう(RS、FU、ROB)間の基本ブロックでしか実行できないと考えていました。住所。 – alex10791

+0

@ alex10791:より高度な設計では、どの命令をフラッシュする必要があるかを追跡することもでき、誤予測が解決されている間に分岐予測ミスの検出によって影響を受けなかった命令を実行し続けることができます。私はIntelがこれを紹介したときを忘れていますが、ここ10年以内に私は思います。第1世代P6は、誤予測が検出されたときにすべての投機的なuop(命令)を投棄しなければならなかった。 (私は実際にCPUデザイナーではありません、彼らはどのように動作するのか知っているので、私はそれらを最適化することができますが、一部はあまり単純化されていません。) –

+0

@PeterCordesは、この選択的なフラッシュは、インテルのプログラムオーダーで誤って予測されたポイント以降の命令をフラッシュしますか?つまり、次の命令を飛び越えて、それが取られないと予測しても、それが実際に取られれば、とにかく同じ命令を実行することになります。CPUは、後の命令が結果に依存しないことに注意してください。誤予測?それとも、誤って予測した後にすべてを洗い流すのに賢明である方がはるかに単純な場合ですが、ほとんどすべてをそのまま残しておくことができます(つまり、マシンをクリアすること)? – BeeOnRope

関連する問題