遅延分岐 【delayed branch】
概要
遅延分岐(delayed branch)とは、CPUの命令実行を高速化する仕組みの一つで、分岐命令の直後に分岐先に関係なく実行する命令を実行し、分岐によってパイプライン処理に無駄が生じるのを防ぐこと。パイプライン処理では複数の命令を同時に実行状態に置くことで実行効率を高めるが、条件分岐命令が存在する場合、その次にどの命令を実行するかは条件の評価が行われるまで確定しないため、パイプラインに投入する命令列に空白が生じる「制御ハザード」(分岐ハザード)が起きる。
遅延分岐を採用したCPUでは、パイプライン内で条件分岐命令の直後に当たる位置(これを遅延スロットという)には分岐先の如何に関わらず必ず実行される命令をいくつか置いておき、分岐先が確定したら分岐先の命令をパイプラインに詰めていく。
分岐先が確定するまでの時間は分岐と無関係な命令の実行に費やされるため、分岐先がどこであっても実行時間が無駄になることはない。プログラムによっては遅延スロットに詰める命令が用意できない場合もあるため、何もしないNOP命令を実行する(その分の時間は無駄になる)。
プログラム上の(本来の)命令の並び順では分岐命令の次の命令が分岐しない場合に実行する命令となるため、遅延分岐を利用する場合はコンパイラが命令の並び順を変更し、分岐命令を遅延スロットの長さ(パイプラインステージの数)の分だけ手前に移動するといった処理を行う。
(2023.11.16更新)