もちろん、状態は毎回チェックされます。しかし、チェックされるまでには、CPUパイプラインに到達しています。それまでの間、他の命令もパイプラインに入り、さまざまな実行段階にあります。
通常、条件の直後に条件分岐命令が続き、条件がTRUEと評価されると分岐するか、条件がFALSEと評価されると分岐します。これは、条件がTRUEまたはFALSEに評価されるかどうかに応じて、条件命令と分岐命令の後にパイプラインにロードされる命令の2つの異なるストリームがあることを意味します。残念ながら、条件命令と分岐命令を読み込んだ直後、CPUは条件がどのように評価されるかをまだ知りませんが、それでもパイプラインへの読み込みを続けなければなりません。そのため、条件の評価対象に関する推測に基づいて、2つの命令セットのいずれかを選択します。
後で、条件命令がパイプラインを上に移動するときに、評価する時間になります。その時点で、CPUはその推測が正しかったか間違っているかを調べます。
推測が正しいことが判明した場合、ブランチは正しい場所に行き、正しい命令がパイプラインにロードされました。推測が間違っていることが判明した場合、条件分岐命令の後にパイプラインにロードされたすべての命令は間違っていたため、破棄する必要があり、命令のフェッチは正しい場所から再度開始する必要があります。
修正
StarWeaverのコメントに応えて、単一の命令を実行するためにCPUがしなければならないことのアイデアを与えるには:
MOV AX,[SI+10]
人間が「SIに10を加えた単語をAXにロードする」と私たちが単純に考えているような単純なものを考えてください。おおよそ、CPUは次のことを行う必要があります。
- PC(「プログラムカウンターレジスタ」)の内容をアドレスバスに出力します。
- データバスから命令オペコードを読み取ります。
- PCをインクリメントします。
- オペコードをデコードして、それをどう処理するかを把握します。
- PCの内容をアドレスバスに出力します。
- データバスから命令オペランド(この場合は10)を読み取ります。
- PCをインクリメントします。
- オペランドとSIを加算器に送ります。
- 加算器の結果をアドレスバスに出力します。
- データバスからAXを読み取ります。
これはなんと10ステップです。これらのステップの一部は、パイプライン化されていないCPUでも最適化されます。たとえば、CPUは次のステップと並行してほとんど常にPCをインクリメントします。PCは非常に特殊なレジスタであるため、簡単に実行できます他のジョブに使用されることはないため、この特定のレジスタにアクセスするためにCPUの異なる部分間で競合する可能性はありません。しかし、それでも、このような単純な命令には8つのステップが残っています。CPUに代わって、ある程度の高度化をすでに想定していることに注意してください。たとえば、結果が読み取られる前に実際に加算を実行する加算器、
次に、のようなより複雑なアドレス指定モードMOV AX, [DX+SI*4+10]
とMUL AX, operand
、CPU内で実際にループを実行して結果を計算するようなはるかに複雑な命令が存在することを考慮してください。
したがって、ここでの私のポイントは、「原子レベル」のメタファーはCPU命令レベルには適していないということです。実際のロジックゲートレベルまでさかのぼりたくない場合は、パイプラインステップレベルに適している場合があります。