このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

パイプラインハザード

 パイプラインハザード(単にハザードとも呼ぶ)とは、パイプライン制御において命令と先取りしたが、命令の順序や分岐命令によってその先取りがムダになることである。

パイプラインハザードの種類

制御ハザード(分岐ハザード)

 分岐命令によって先取りした命令が無駄になること。

 分岐命令を実行した場合、次に実行される命令は、分岐が成立した場合と不成立の場合の2通りがある。分岐が成立しないと仮定して命令を先取りすると、分岐が成立した場合に先取りした命令をキャンセルし、改めて分岐が成立した場合の命令を実行しなければならない。

 このように制御ハザードによって先取りした命令のキャンセルが発生し、ムダになったクロックのことをストール(stall)もしくはインターロック(interlock)という。

 制御ハザードの解決方法として次が挙げられる。

  • 分岐先が判明するまで先取りする
  • 常に分岐が不成立(あるいは成立)と仮定して先取りを進める
    • 場合によってはストールが起こることを容認する。

データハザード

 命令が直前の命令の実行結果を使用する場合に発生するハザード。

 例えば、次のようなアセンブリコードがあったとする。

add a,b,c
lw d,a

 このとき1行目のadd命令でa←b+cを実行する。そして、2行目のlw命令でd←aを実行する。

 この命令をパイプラインで処理すると、add命令の結果が記憶装置に書き込まれる前に、lw命令がaを読み出してしまう。

 データハザードの解決方法として次が挙げられる。

  • NOP命令を挿入する
    • コンパイラによってソフトウェア的に実現される。
  • データハザードを検知したら実行結果を次の命令に直接たわしてしまう(フォワーディング)
    • 演算装置によってハードウェア的に実現される。

NOPの挿入による解決アプローチ

フォワーディングによる解決アプローチ

構造ハザード

 CPU内部の資源の衝突(コリジョン)によって発生するハザード。

 例えば、先に実行されている命令の第5ステージ(結果の格納)と後から実行されている命令の第3ステージ(オペランドフェッチ)が同じクロックタイミングで実行されていると仮定する。この2つの命令はメモリアクセスを伴う命令なので、同じバスをしようとすると衝突が発生してしまう。

 構造ハザードの解決方法として次が挙げられる。

  • ハードウェア的に回避することは可能。
    • しかし完全に構造ハザードを起こさない構成はコストの上昇を招く。
    • 構造ハザードの確率が低ければ、コスト上昇を抑えるために、多少の構造ハザードを無視するのが現実的である。

参考文献

  • 『実践コンピュータシステム』