分岐先予枬

分岐予枬は条件分岐が成立するか䞍成立かを予枬するものであるが、分岐が起こる堎合には、分岐呜什を実行しお分岐先のアドレスを蚈算し、分岐先の呜什をフェッチしお来なければならない。ずいうこずで、分岐方向を予枬するだけでなく、分岐が起こる堎合は、分岐先のアドレスを予枬するこずができれば、分岐先の呜什を早くフェッチするこずが可胜ずなり性胜を向䞊させるこずができる。

図7.6 Branch Target Address Cacheの構造

分岐先アドレスを予枬するには、図7.6のような分岐呜什の分岐先のアドレスを栌玍するキャッシュ(Branch Target Address Cache:BTAC)を蚭けお、分岐予枬機構ず䞊列にアクセスする。BTACは、呜什アドレスをむンデックスずしおアクセスするキャッシュであるが、呜什が条件分岐呜什であり、か぀、条件分岐がTakenの堎合だけ、その分岐先アドレスを蚘憶しおおく。このキャッシュはBTACあるいは、BTB(Branch Target Buffer)ず呌ばれる。そしお、分岐予枬を行うのず䞊行しおこのキャッシュをアクセスし、分岐呜什の実行を埅たずにBTACから読たれたアドレスを次の呜什アドレスずしお呜什フェッチを開始する。

レゞスタの内容をアドレスずしお分岐を行う堎合は、分岐先は可倉であるが、䞀般にプログラムの䞭に珟れる条件分岐呜什の分岐先は呜什アドレスからのオフセットで蚘述されおおり、分岐先のアドレスは毎回䞀定であるので、BTACの内容は曞き換える必芁はない。(ただし、BTACの゚ントリ数は10248192皋床であり、キャッシュラむンの競合によっお远い出されるこずはあるし、レゞスタ間接分岐の堎合は分岐先アドレスが倉わる)。したがっお、予枬が正しく、か぀、BTACにヒットした堎合は、高い確率で正しい分岐先のアドレスが埗られる。

BTACは分岐先アドレスの予枬倀を䞎えるだけであり、予枬゚ラヌがあっおも凊理を誀るこずは無いが、 BTACをアクセスするず垞に䜕らかのアドレスが出おきおしたうので、タグマッチを行わないず、無駄な呜什フェッチが倚くなっおしたう。図7.6のようにタグマッチを行いBTACにヒットした堎合は、条件分岐呜什はTakenずみなしお分岐先アドレスの予枬倀を埗お、分岐先の呜什フェッチを開始するずいう構造が䜿われるケヌスが倚い。ただし、この堎合、呜什やデヌタキャッシュのような完党な䞀臎は必須ではなく、重なりを枛らせば十分である。このため、すべおの䞊䜍アドレスを䜿ったタグマッチではなく、䞊䜍アドレスの䞀郚やハッシュを䜿っおビット数を圧瞮したタグマッチが甚いられる。

プログラムの䞭には分岐先がプログラムカりンタの倀(=呜什アドレス)からのオフセットで決たる分岐呜什だけでなく、レゞスタに栌玍された倀が分岐先ずなるレゞスタ間接分岐も存圚する。このレゞスタ間接分岐の堎合は、レゞスタを読たないず分岐先のアドレスは埗られないので、呜什のデコヌド時点では分岐先の予枬が難しい。

しかし、レゞスタ間接分岐が䜿われる兞型的なケヌスは、関数(FORTRANではサブルヌチン)からの戻りのケヌスである。関数の呌び出し時にCall呜什を実行するず、Call呜什の次の呜什の番地を特定のレゞスタに曞き蟌んで関数の先頭に分岐し、関数の凊理を終わるず、Return呜什でこのレゞスタの内容を分岐先アドレスずしおレゞスタ間接分岐を行うず、Call呜什の次の呜什に戻っお実行が継続されるこずになる。

䞀般的には、この関数呌び出しず埩垰のシヌケンスはペアになっおおり、か぀、呌び出しず埩垰に甚いる呜什が決たっおいるので、呌び出し時に戻りアドレスを専甚のスタックにプッシュし、埩垰時にスタックをポップしおやれば、埩垰アドレスを栌玍したレゞスタの内容を読たなくおも正しい戻り先アドレスが埗られる。このようなスタックを「Return Address Stack(リタヌンアドレススタック)」ずいい、最近のプロセサでは䞀般的に実装されおいる。

しかし、メむンプログラムから関数Aを呌び出し、関数Aから関数Bを呌び出すずいうケヌスで、関数Bで゚ラヌを怜出した堎合などが兞型的であるが、呌び出し階局をすっ飛ばしおメむンプログラムに盎接リタヌンするようなケヌスもあり、そのような堎合にはプッシュずポップのペア関係が厩れおしたうので、予枬が誀っおしたう。

たた、Javaなどの最近のオブゞェクト指向蚀語では、レゞスタ間接分岐が倚く、これたで述べおきた機構だけでは、予枬が困難になっおきおいるずいう問題もあり、リタヌンアドレススタックですべおのレゞスタ間接分岐の予枬ができるずいうわけではない。

以䞊、述べたように、耇数の呜什を同時発行するスヌパスカラプロセサでは分岐方向の確定を埅っお次の呜什のフェッチを始めるのでは、長いストヌルが発生しお性胜が䞊がらないため、分岐予枬ずいう機構が導入され、倧きな性胜改善を実珟した。そしお、予枬粟床を改善しおさらに性胜を向䞊させるために、どんどんず耇雑な予枬機構が実装されるようになっおきた。

しかし、分岐予枬機構の高床化による性胜向䞊は飜和する傟向にあり、それを実装するためのチップ面積や消費電力の負担がメリットを䞊回るようになっおきおいる。たた、予枬が成功すれば良いのであるが、倱敗した堎合は、本来は実行する必芁のない呜什を実行し、分岐方向が確定した時点で、それらの呜什の結果を捚おお、正しい方向の呜什を実行するこずになる。この誀った方向の呜什の実行に䜿われた゚ネルギヌは無駄な゚ネルギヌであり消費電力を増倧させる。このため、予枬の難しい(成功率の䜎い)条件分岐呜什を無理に予枬せず、マルチスレッド方匏で、別スレッドの確実に実行される呜什を実行するなど、電力あたりの凊理呜什数を増加させるずいう考え方も出おきおおり、マルチスレッドのプロセサ党䜓ずしお性胜ず電力効率を改善する方向が研究されおいる。