パイプライン・インターロック(pipeline interlock)はデータハザード(data hazard)を検出して回避する機構です.
データハザードは,「複数の命令が入り乱れてに処理されるために,演算結果の書き込みや読み出しが機械語のプログラマが意図した順序とは前後してしまい,期待と異なった結果になってしまう状況」です.データハザードには次の3通りがあります:
- RAW(read after write)ハザード
…書き込み(Write)の後(After)にこれを読む(Read)という本来の実行順序が逆になると古い値を読んでしまう危険,
- WAW(write after write)ハザード
…書き込み(Write)の後(After)に,もういちどあらためて書き込み(Write)があるという実行順序が崩されると, 後続する処理で古い値を使ってしまうという危険,
- WAR(write after read)ハザード
…読み出し(Read)が済んでから(After)書き込み(Write)をしないといけないのに, 書き込みが早すぎると間違った値を読んでしまうという危険
パイプライン・インターロックはデータ依存関係を調べて,これらのハザードを検出し,正しい結果を保証します.インターロックは(正しく)つなぎあわせるという英語です.データ依存関係には
- 真の依存(true dependency)
…先行する命令が書き込む結果を後続する命令が使うという依存関係
- 出力依存(output dependency)
…先行する命令が書き込む記憶領域を後続する命令が書き改めるという依存関係
- 逆依存(antidependency)
…先行する命令が読み出す記憶領域を後続する命令が書き改めるという依存関係
の3通りがあり,その各々にRAW,WAW,WARのハザードが対応しています. これらのハザードを検出して, 命令を正しくつなぎあわせるのがパイプライン・インターロックです.出力依存と逆依存は使用するレジスタが十分にあれば避けられる依存関係です.この意味では真の依存だけが文字通り本質的だと言えます.
実行時,記憶領域(レジスタ)を動的に別のハードウエア資源に割り当て直すことで出力依存と逆依存を回避することはレジスタリネーミング(register renaming)と呼ばれています. 真の依存だけが本質的だという意味で,パイプライン・インターロックは真の依存のみを扱う機構ですが,出力依存と逆依存の回避にも用いられます.
プログラムカウンタの更新に係るハザードを特に制御ハザード(control hazards)と言うことがあります.条件付き分岐命令がフラグの更新より早く実行されると,正しい分岐が行われないなどの危険を特に制御ハザードと呼ぶわけです.本質はフラグの更新に係る真の依存であって,RAWハザードです.
ハザードにはデータハザードの他に構造ハザード(structural hazard)があります.
構造ハザードは異なる命令が同一のハードウエア資源を同時に使おうとする危険です.構造ハザードが起きる状況を衝突(collision)といい,そのような状況が生じないようなスケジューリングが工夫されたりします.
|