パイプラインの欠点

パイプラインは必要不可欠な技術であると言えるのだが、残念ながら欠点もある。例えば命令Bの内容が命令Aの結果に依存する場合だ。もし命令Aの内容が「この命令の結果がYESならそのまま命令Bを実行。NOなら命令Bを無視。」であった場合、命令Aの結果によってBの処置が変わってしまうので、Aが完全に終了するまでBに手をつけることができない。
これに威力を発揮するのが「分岐予測」という機能だ。「分岐予測」とは、文字通り「先の命令の結果を予想し、次の命令の準備を始めておく」手法である。ちなみに実際に計算を始めてしまうのは「投機実行」と呼ばれる。「命令Aの結果はまだ出ていないが、多分YESだろうから、命令Bの処理を始めてしまおう」という機能だ。予測には例えば過去の結果を記録しておいて「前回は○○となったから、今回もそうなるだろう」と判断する方法がある。これが合致すれば全く問題は無く、また分岐予測は時には90%以上の的中率を誇るのだが、予測なので外れる場合がある。この場合、命令Bは最初から処理のやり直しを余儀なくされ、これが大幅なタイムロスとなる。命令B以降にC、D...などが詰め込まれていた場合は、B共々一旦全ての処理を取り消してやり直しすることになるため、深いパイプラインほど(後ろに詰め込む命令が多いので)ダメージが大きい。「パイプラインハザード」と呼ばれるこの現象が起きるたび、CPUの能力は激減してしまうのだ。
というわけでid:yuta-celestialさんありがとうございました。


この辺りの内容は突っ込まれても困る。文字数の関係でメッチャ削ったし。(言い訳カッコワルイ)