【コンピュータ】前の計算結果が出るまで待って!パイプラインの「データハザード」|情報処理問題1000本ノック
パイプライン処理のスピードを狂わせる3大ハザードの第2弾。プログラムの「計算の順番(依存関係)」が原因で発生する、データハザードの仕組みを攻略しましょう。
1. 【 問題 】:パイプライン処理の阻害要因
【 問題 】 CPUのパイプライン処理において、ある命令を実行するために必要なデータが、直前の命令の処理が完了していないためにまだ利用できず、次の命令の実行を待たせる(ストールさせる)必要がある現象はどれでしょうか?
① 制御ハザード (Control Hazard)
② データハザード (Data Hazard)
③ 構造ハザード (Structural Hazard)
④ 動的ハザード (Dynamic Hazard)
2. 正解:
正解: ② データハザード(Data Hazard)
3. 解説:前の人が答えを書くまで、次の計算ができない
データハザードは、連続する命令の間に「データの依存関係(前のアウトプットが、次のインプットになる関係)」があるときに発生します。
以下のような2つの計算が連続しているとします。
・命令1: X = A + B
・命令2: Y = X × C
パイプラインでこの2つをほぼ同時に進めようとしても、命令2が掛け算を行うステージに達した瞬間、「命令1の足し算の結果(Xの値)が、まだレジスタに書き込まれていなくて手に入らない!」という事態になります。これがデータハザードです。
■ 現代CPUの対策:フォワーディング(バイパス)
・レジスタへの書き込みを待っていると遅いため、前の命令の演算器(ALU)から出たホカホカの計算結果を、レジスタを経由せずに「次の命令の演算器へ直接横流し(フォワーディング)する」専用のバイパス回路を設けることで、このハザードによる待ち時間を最小限に抑えています。
・構造ハザード = ハードウェア(メモリや演算器)の奪い合い
・データハザード = 必要なデータがまだ準備できていない(依存関係) ← ココ!
・制御ハザード = 分岐命令(if文)によって次に実行する命令が決まらない
1. 理解のコツ: 「書類のバケツリレー」をイメージしてください。1人目が「書類に金額を計算して書き込む」、2人目が「その金額にハンコを押す」という作業を並行しています。1人目が計算をモタついていると、2人目は前の書類が回ってこないため、手元にデータ(書類)がなくて作業がストップしてしまいます。これがデータハザードです。
2. 試験対策 of 視点: 「実行に必要なデータが利用できない」「処理が完了していない」「依存関係」というフレーズがあればデータハザードが一択です。構造ハザードと並んで午前試験の超ド定番なので、文章のニュアンスだけで一瞬で切り分けられるようにしておきましょう。
4. まとめ
「データの前後関係が原因で、前の処理が終わるまで次の命令がデータを読み込めずに立ち往生する現象」。これがデータハザードです。ハードウェアの工夫(フォワーディング)だけでなく、コンパイラが「依存関係のない別の命令を間にうまく挟み込む(命令の並べ替え)」といったソフトウェア側の知恵も使って、このハザードは日々克服されています。