予測ミスからの回復

当然、プログラムの性質にも依存するが、今日の強力な分岐予測機構は、一般的には95%~99%正しい予測をする。しかし、100%の成功でない限りは予測ミスが発生し、プロセサは本来実行すべきでない命令を実行してしまう。

命令のコミット時点で分岐予測が間違っていること(予測ミス)が判明すると、前述のレジスタリネーミング機構を巻き戻して、予測ミスをした条件分岐命令を実行する直前の状態に戻す。

そして、条件分岐命令を再実行すると、その時点では分岐のTaken/Not Takenは確定しているので、正しい処理を行うことができる。この方法は、アウトオブオーダ実行のためのレジスタリネーミング機構を分岐予測ミスからの回復に利用する上手い方式であり、アウトオブオーダ実行を行うプロセサでは一般的に用いられている。

一方、IBMのPOWER6プロセサはインオーダ実行のマイクロアーキテクチャであるが、各サイクルごとのアーキテクチャレジスタの状態を「Recovery Unit」という専用のレジスタファイルに保存し、ハードウェアエラーや分岐予測などが発生した場合には、これらの異常発生以前の状態をRecovery Unitから取り出して異常発生前の状態を回復して実行が続けられるようになっている。

少し話しが横道に外れるが、このIBMのRecovery Unitの状態記憶にはECC(Error Correction Code)が付けられており、ハードウェアエラーで状態記憶に1ビットエラーが生じても訂正できるし、また、ハイパーバイザの処理により、Recovery Unitに記憶した状態を他のプロセサコアにコピーして実行を再開することもできる。つまり、プロセサが故障で死んでしまっても、(Recovery Unitからの読み出し機能が生きていれば)その記憶を取り出して別のプロセサに移植して、システムとしては生き続けるという究極の高信頼度メカニズムを実現している。

一方、SunのRockプロセサは、命令の発行はインオーダであるが、依存関係があり実行を開始できない命令が前にあっても、実行を終わった後続の命令をアウトオブオーダでコミットしてしまう。ただし、実行を開始できなかった命令は、積み残しの仕事メモ(Sunの用語ではDeferred命令キュー)に書き込んで記憶しておく。したがって、途中で割り込みなどが発生すると、そのままではPreciseな状態にならないのであるが、Rockは、この積み残し命令メモに書いてある命令の実行を終わってから割り込み処理を行うようになっている。また、割り込みが起こらない通常の実行でも適当な時点で積み残しを解消して、正しい実行が行われるようになっている。

つまり、Rockプロセサの場合は、条件が確定しておらず予測を必要とする条件分岐命令が出てくると、条件分岐命令を含めて予測された後続命令はすべてDeferred命令キューに書き込まれ、条件セット命令に依存しない命令だけが実行を開始される。したがって、条件が確定し、予測ミスであったことが判明しても、条件分岐命令とそれに依存する命令は積み残しメモに書かれているだけで実行を開始していないので、積み残しメモをクリアし、予測ミスした条件分岐命令から実行を再開すれば良い。

以上のように、予測ミスからの回復には、ミスした条件分岐命令の実行前の状態に戻す機構が必要であり、この方法としてアウトオブオーダ実行のためのレジスタリネーミング機構を利用する方法は追加のハードウェアが少ないうまい方法であるが、この方法に限らず、IBMのPOWER6プロセサやSunのRockプロセサのような機構で、状態を巻き戻す機構を実装しているプロセサがある。

Microsoft WordのUndoのように間違った操作を取り消すことが出来るというのは、単にミスを修正できるというだけではなく、Undo出来るという安心感を利用してアグレッシブな変更が出来るというメリットがある。プロセサも同様であり、以前の状態への巻き戻しが可能であることを利用してアグレッシブな予測実行を行うことにより、以前の命令の実行結果を待って実行するよりも高性能な実行を行う構成が一般化している。