ちょっとベクトルレジスタについて似たようなアイデアを考えたので探して読んでみた。
- Delaying physical register allocation through virtual-physical registers
https://ieeexplore.ieee.org/document/809456
MICRO-32
物理レジスタのLate Allocation(実行終了時)を可能にする新しい物理レジスタ管理方式を提案する。
- レジスタの使用量を最大化するオンデマンド割り当て
- 古い命令が若い命令によって遅延させられるのを防ぐスティール・メカニズム
各物理レジスタが割り当てられる平均サイクル数が短縮される。
従来よりも早く目的地の物理レジスタを取得できるようになる。
その結果、命令の早期実行が可能になる。
Introduction
現在のスーパスカラ・プロセッサは厳密に必要なレジスタよりも多くのレジスタを必要とする。
- 各命令はその結果が利用可能になるよりもずっと前(デコード時)に、その宛先オペランド用に物理レジスタを割り当てる。
- その消費者がコミットした(同じ論理宛先レジスタを持つ次の命令がコミットした)ずっと後に解放される。
図1. スーパスカラ・プロセッサが使用する物理レジスタの平均数(書き込み+非書き込み)と、早期割り当てのために実際に無駄になるレジスタのの数(非書き込み)の割合を示している。
liのような一部のプログラムでは、平均で53%、特定の実行サイクルでは500%もの増加となっている。
本論文の提案:疎のレジスタが格納する値が利用可能になるまで(実行ステージの終了時)まで、遅延させることを可能にするスキーム(仮想ー物理レジスタ方式)。この割り当て方式を用いた仮想ー物理割り当て方式により、物理レジスタを大幅に削減することができることを防ぐ。
5つのSpecFP95ベンチマークにおいて、77本のFPレジスタを持つ仮想物理レジスタ構成が、101本のレジスタ構成を持つ従来のレジスタ構成とほぼ同等の性能を達成することができることを示す。
2. 仮想ー物理レジスタ
物理レジスタの目的:値の格納と依存関係の追跡。後者の目的で飲み、デコード時にレジスタを割り当てる必要がある。したがって、プロセッサが依存関係を追跡するためにに別のアーティファクトを使用すれば、記憶場所の割り当てを削減できる → Virtual Register (VP)と呼ぶ。
VPは単なるタグであり、物理的なストレージを必要としない。
- 命令がデコードされると、その行先の論理レジスタは、フリーのVPレジスタのプールから取得したVPレジスタにマップされる。
- 命令が実行段階の最終サイクルに入ると、VPレジスタは秋物理レジスタのプールから取り出した物理レジスタにマップされる。
- 命令がコミットされると、同じ論理書き込みレジスタを持つ前の命令によって割り当てられたVPレジスタと物理レジスタがそれぞれの秋プールに解放される。
2つのマップ・テーブルが必要である
- GMT : 論理レジスタをVPに関連付ける
- PMT : VPレジスタを物理レジスタにマッピングする
問題:VPは必要な最大量、すなわち論理レジスタの数にインフライトする命令の最大数を加えた数の提供が必要である。
一方で、物理レジスタはアクセス時間を保つために、最小サイズに抑えることが必要である。そのため、実行中にすべての命令が実行打開を終了したときに空いている物理レジスタを見つけることは保証されない。
従って、物理レジスタをどのようなポリシーで命令に割り当てるかは、性能にとって非常に重要である。
- 従来のリネーム方式 : 利用可能な物理レジスタプログラム順に割り当て、物理レジスタが足りなくなるとプロセッサに命令のデコードをストールさせる。
- 仮想ー物理レジスタ方式 : ウィンドウ内のもっとも古い命令に物理レジスタを割り当てることによって同じ動作を達成することができる。
- ほかの方式 : ある命令が実行を終了し、空き物理レジスタがない場合、その命令は命令キューに保持され、その間にいくつかの物理レジスタが解放されることを期待して、後で実行される。
- ただし、その命令がOldestな命令であれば、それ以上コミットが進まないため物理レジスタが解放されない。
- そこで、ウィンドウ内で最も古い命令のうち、宛先オペランドを持つ命令にはNRR(Number of oldest instruction in the window)からレジスタが割り当てられる。
- それ以外の物理レジスタはオンデマンドに割り当てられる。
3. 仮想ー物理レジスタのための新しいレジスタ割り当てのアプローチ
考察:プロセッサの性能がNRRの値に非常に敏感である。単一のプログラムであったとしても、実行の異なるセクションにわたってNRRの値を変化させることで大きな利点が得られる。
NRRを動的にチューニングするスキームが重要であるということである。図2は64本の物理レジスタがあると仮定し、NRRを1から32まで変更させたときのliとappluのIPCを示している。
ベンチマーク・スイート全体だと、最適なNRRの値は32であり、64本の物理レジスタに対する最大値となる。
実際には、事前にレジスタを割り当てるスキームのみがデッドロックを回避する唯一のアプローチというわけではない。本研究の近似方法は、以下の2つのルールに基づいている:
- レジスタはより早く使用できる命令に割り当てる。こうすることで、未使用レジスタの平均数が最小になる。
- 2つの命令のうち1つがレジスタ不足により遅れる場合、それは若い命令のほうを遅らせるべきである。
これらを実現するために、以下の方式をとる:
- 各命令は実行段階の最後のサイクルで、空きレジスタがあれば物理レジスタを割り当てる。
- ある命令が実行ステージの再修サイクルに到達し、空きレジスタがない場合、既にレジスタを割り当てている若い命令があるかをチェックする。もしそうであれば、若い命令に割り当てられているレジスタを盗んで、古い命令に割り当て直す。
- すでにレジスタが割り当てられている若い命令が複数ある場合、最も若い命令が選択される。このレジスタ割り当て方式をDSY (on-Demand with Stealing from Younger)と呼ぶ。
この仮想ー物理レジスタの方式では、命令実行完了時にVPと物理レジスタの両方をブロードキャストする。命令キュー内のエントリは、VPレジスタを使ってソースオペランドの入手性を識別し、命令実行時にその物理レジスタにアクセスすることでデータの取得を行う。
DSYでは、当該命令(i1
)が物理レジスタを確保できないことが明らかになった場合、ROBに対して通知を行い、i1
よりも若い命令ですでに物理レジスタを割り当てている若い命令を選ぶ(これをi2
とする)。
i1
はi2
が割り当てた物理レジスタを奪い、それに応じてPMTを更新する。この時、i2
がこれまでに使用していたVPタグ(VP2
)を命令キューにブロードキャストし、一致するソースオペランドをreadyでないとマークし直す。
命令i2は最終的に再び実行され、その先に新しい物理レジスタP3を割り当てる必要がある。