パイプライン処理
ライン生産方式などパイプライン的なものは様々なところに存在する。自動車の組み立てを考えてみよう。流れ作業の一工程として、エンジンのシャーシへの設置、フードの設置、車輪の設置があり、この順番で実施されるとする。ラインの各工程には、1台の組み立て中の自動車だけがある。エンジンを設置し終えた自動車は、次にフードの設置工程に移され、エンジン設置用の機械設備は次の自動車に取り掛かることができる。最初の自動車はさらに車輪設置工程に進み、2台目の自動車はフード設置工程に進み、3台目の自動車がエンジン設置工程に進んでくる。エンジン設置に20分かかり、フード設置に5分、車輪設置に10分かかるとすると、一度に1台ずつ組み立てると3台組み立てるのに105分かかる。しかし、ライン生産方式では75分で3台の組み立てが完了する。その後も20分間隔で自動車が組み立てられていく。
ステージ間にバッファのないパイプラインを「ウェーブパイプライン (wave pipeline)」と呼ぶ。その代わり、パイプラインの各ステージのレイテンシが釣り合うように設計されている。したがって、データはパイプライン上を波のように流れ、それぞれの波は可能な限り短く保たれる。
最大処理速度は、データを投入できる間隔で決まる。それより短い間隔でデータを投入すると、波が互いに干渉するように結果が不正になる。
データ・ハザード
処理するデータの依存関係に起因するハザードである。
このような場合、2つ目の命令で用いられている変数$2は、1つ目の命令で演算の対象になっているため、1つ目の命令の処理が全て終わらなければ正しい結果を返すことができない。そのため、直前の命令が全て終了するまでパイプラインを止める必要が発生し、これをデータ・ハザードという。レジスタが問題になる場合はWB→IDで、メモリの場合はMA→MAという関係で発生する。
データ・ハザードを防止するためには、プログラムをコンパイルする際などに、プログラムの内容に影響のない範囲でCPUに送る命令の順序を調整して、データ・ハザードが起きにくいようにする必要がある。また、ハードウェアによって、データを書き込むのと同時にパイプラインに投入することによってデータ・ハザードを軽減する方法もある。
構造ハザード
ハードウェア的な資源の競合に起因するハザードである。
WBとIDは、同一の部品(ハードウェア資源)を要求するため、資源の競合が発生してしまう。これが構造ハザードである。WBとIDを同時に実行することで発生する。通常構造ハザードは、関係するWBとIDの両ステージとも、比較的処理に要する時間が短いステージであるため、一つの時間単位をさらに2つに分けて、その前半にWB、後半にIDを実行することでハザードの発生を回避している。
制御ハザード(分岐ハザード)
制御の依存に起因するハザードである。
分岐命令がある場合、結果によって次に実行するべき命令がわからないため、パイプラインを止めて次に実行すべき命令が判明するのを待たなければならない。