レジスタ・リネーミング
書き込み後の書き込み
同じレジスタまたはメモリアドレスへの書き込みが二回あった場合、二回目の書き込み内容が最終的に格納されていなければならない。これは一つ目の書き込みを必要に応じて実質的に無いものとすれば解決できる。
コミットされたマシンの状態。
論理レジスタ番号でインデックスされたRAM。
典型的にはリオーダーバッファからリタイアあるはコミットされて出てきた値が書き込まれる。
トランスメタのCrusoeプロセッサはストアバッファを持っていて、これが一種のメモリ・リネーミングになっている。
プログラムがレジスタの再利用をやめれば、レジスタ・リネーミングの必要はなくなる。 いくつかの命令セット(たとえばIA-64)では、非常に多くのレジスタが使えるようになっているが、それは主にレジスタ・リネーミングをしないためである。 この手法には下記の問題がある。
コンパイラにとってはレジスタを再利用しないことはコード量の増大を招く。ループ処理では、ループするたびに違うレジスタを使用しなければならなくなり、コードが複雑になってしまう(ただし、IA-64ではレジスタローテーションという技法でこれを回避している)
レジスタ数が増えるとそれを識別するためのビット数が増え、命令ワードが大きくなってしまう。
多くの命令セットが歴史的に少数のレジスタを使っており、いまさら変更できない。
コードサイズが増えるというのは重要で、そのために命令キャッシュでキャッシュミスが起きやすくなり、結果としてパイプラインがストールすることが多くなってしまう。(同じ命令キャッシュサイズの場合)
アーキテクチャ上のレジスタが3ビットから5ビットで識別される(8~32コのレジスタを識別できる)としたら、タグは一般に6から8ビットとなる。 リネームファイルはサイクル毎に命令を入力ポートから読み込んで、リネームを施した(若干長くなった)命令を出力ポートに出力する。 レジスタファイルはポート数の二乗に比例して回路が大きくなるため、物理的に大きく、電力も消費する。
タグインデックス付レジスタファイルという形式では、データ格納のための大きなひとつのレジスタファイルがあり、タグ毎にひとつのレジスタを持っている。たとえば、マシンが80本のレジスタを物理的に持っていたら、タグは7ビットとなり、タグ値のうち48種類は使用されない。 またこの形式では、命令が実行ユニットに発行されると、ソースレジスタのタグが物理レジスタファイルに送られ、それらのタグに対応したレジスタの内容が実行ユニットに渡される。
予約機構(Reservation Stations)という形式では、より小さなレジスタファイルが複数存在し、それぞれが個々の実行ユニットに対応している。 各命令の各オペランドはそれらレジスタファイルのいずれかの場所に対応している。 この形式では、実行ユニットに命令が発行されると、その実行ユニットに対応したレジスタファイルからオペランドに指定されたレジスタ内容が実行ユニットに送られる。