パイプライン処理
命令を命令キャッシュから読み出す
パイプライン設計では、各ステージを釣り合わせることが重要である。上述の組み立てラインの例で言えば、エンジンの工程も車輪の工程も15分で済めば、スループットはさらに向上する。レイテンシはそれでも35分だが、15分に1台の間隔で自動車を生産できるようになる。
別の設計上の配慮すべき点として、ステージ間の適切なバッファの用意がある。ステージの処理時間が不定の場合や、パイプラインの途中でデータが生成されたり破壊されたりする場合には、バッファが特に重要である。
これを制御ハザード、または分岐ハザードという。MA→IFのステージに関係する。
制御ハザードは、分岐命令がある限り逃れることのできないハザードである。しかし、その影響を小さくすることはできる。その方法が分岐予測である。現在のCPUでは、分岐命令があった場合、その結果がどちらかであると仮定(予測)して、以降の命令をあらかじめ実行しておく、という動作をしている。この場合、予測が当たっていればパイプラインのストール(停止)が実質的にないのと同じように実行できる。しかし予測が外れていた場合、先に演算していた内容を全て破棄して分岐命令の直後から演算をやり直さなければ行けないため、大幅なペナルティが発生することになる。
初期の分岐予測機能付きCPUでは分岐命令を常に条件式の結果がYESであると仮定して分岐予測を行っていたが、後に以前の結果を記憶しておいて、それを元に分岐予測をする方式に改められ、さらに、記憶に2ビットを与え、同じ結果が2回続けば予測先を変更するように改められた。現在においても分岐予測の精度向上は重要な課題の一つであり、各社ともに常に分岐予測の精度を向上させるための研究が進められている。
分岐命令発生時にロスするCPUサイクルを緩和する方法として、遅延分岐がある。分岐命令に続く命令を実行してから分岐先に制御を移す分岐方法である。分岐命令に続く一命令のみを実行して分岐するMPUとしては、MIPSなどがある。分岐命令に後続し、分岐前に実行される命令が置かれた位置を遅延スロットと呼ぶ。
制御信号を生成し、レジスタ・ファイルをレジスタ指定子で参照する