レジスタリネーミング

命令の実行結果は、プログラムに書かれた命令順に実行したものと同じにならなければいけないが、これが実現できれば、原理的には命令の発行(Issue)、実行(Execute)、完了(Complete)の順序はプログラム順である必要はない。特に、実行時間の長い命令の後に、その結果に依存しない命令がある場合は、その命令を先に実行するOut of Order実行により性能が改善できることを見てきた。

命令の実行だけでなくその他の段階でも、その処理は命令順に行うことは必須ではないが、元々、プログラム順(インオーダ)に実行されるというモデルでプログラムが作られているので、ハードウェアとしてはプログラム順以外の順で命令を発行するメリットはない。もちろん、プログラムの命令列が浮動小数点演算命令だけが長く続き、その後に整数演算命令が続くというようになっていると、浮動小数点演算命令用のリザベーションステーションの数が不足で、依存関係の無い後続の整数演算命令が発行できないというような問題が生じるので、浮動小数点演算命令と整数演算命令が適当にまざって出現する方が実行の効率が良いのであるが、このような広い範囲での命令の順序の最適化はCやFortranなどの高級言語プログラムから機械語命令に変換するコンパイラの仕事であり、そのために大量のハードウェアを注ぎ込むのは得策ではないというのが一般的な理解である。

そして、命令の完了は、実行結果を他のプロセスや外部に出力する場合にはプログラム順の実行と一致する必要がある。また、いつ発生するか分からない外部からの割り込みに対してPreciseな割り込みを実現するためには、すべての時点でプログラム順に命令を完了させるほうが簡単であるので、Issue(発行)はインオーダ、実行はアウトオブオーダ、完了はインオーダという組み合わせが一般的である。

しかし、Sun Microsystemsの「Rock」プロセサでは一般にアウトオブオーダ完了を行い、結果の出力や割り込みの時点では、インオーダ完了と矛盾のない状態を作るという方式をとっており、インオーダ完了でなければならないということは無い。

Tomasuloアルゴリズムでは、前の例では、FDIVの結果を格納するF1レジスタが後続のFSUB命令の結果の格納に使われるようになると、FDIVの結果はF1経由ではなく仮想レジスタであるリザベーションステーション経由でFADDに受け渡される。これは非常にうまいやり方であるが、FDIVの結果はレジスタには反映されないので、Preciseな割り込みが実現できない原因になっている。

このため、最近のマイクロプロセサでは、すべての値をレジスタに残すような方式が採られる。このためには、

FDIV F1←F2、F3
FADD F4←F1、F2
FSUB F1←F2、F3

のような命令列がある場合、FDIVの結果とFSUBの結果は同じF1レジスタに格納されるが、物理的には別のレジスタに書き込み、FSUBの結果でFDIVの結果が上書きされないようにしてやればよい。

これを実現する方法として、命令の実行結果を格納する論理レジスタには、その論理レジスタ番号に拘わらず、必ず空いている物理レジスタを割り当てるという処理を行う。つまり、各論理レジスタに物理レジスタ番号という別名を与えるので、この処理や処理方式をレジスタリネーミング(Register Renaming)という。