パイプラインハザード(単にハザードとも呼ぶ)とは、パイプライン制御において命令と先取りしたが、命令の順序や分岐命令によってその先取りがムダになることである。
分岐命令によって先取りした命令が無駄になること。
分岐命令を実行した場合、次に実行される命令は、分岐が成立した場合と不成立の場合の2通りがある。分岐が成立しないと仮定して命令を先取りすると、分岐が成立した場合に先取りした命令をキャンセルし、改めて分岐が成立した場合の命令を実行しなければならない。
このように制御ハザードによって先取りした命令のキャンセルが発生し、ムダになったクロックのことをストール(stall)もしくはインターロック(interlock)という。
制御ハザードの解決方法として次が挙げられる。
命令が直前の命令の実行結果を使用する場合に発生するハザード。
例えば、次のようなアセンブリコードがあったとする。
add a,b,c lw d,a
このとき1行目のadd命令でa←b+cを実行する。そして、2行目のlw命令でd←aを実行する。
この命令をパイプラインで処理すると、add命令の結果が記憶装置に書き込まれる前に、lw命令がaを読み出してしまう。
データハザードの解決方法として次が挙げられる。
NOPの挿入による解決アプローチ
フォワーディングによる解決アプローチ
CPU内部の資源の衝突(コリジョン)によって発生するハザード。
例えば、先に実行されている命令の第5ステージ(結果の格納)と後から実行されている命令の第3ステージ(オペランドフェッチ)が同じクロックタイミングで実行されていると仮定する。この2つの命令はメモリアクセスを伴う命令なので、同じバスをしようとすると衝突が発生してしまう。
構造ハザードの解決方法として次が挙げられる。