レジスタウィンドウ
レジスタウィンドウは、
コンピュータの
CPUにおいて、特にプロシージャコールや関数の呼び出しに伴う性能低下を抑制するために開発されたハードウェア技術です。多くのプログラムが頻繁に行うこの処理を効率化することで、システム全体の高速化に大きく貢献します。
CPUレジスタと課題
CPUは、超高速な小型メモリ領域である「レジスタ」を備えています。レジスタは、現在実行中の命令で頻繁に使用されるデータを一時的に保持する役割を担い、その数やアクセス速度がプロセッサの性能に直結します。レジスタが多いほど高速化が期待できますが、レジスタの設計は
CPUの命令セットと深く関連しており、一度製品として出荷された後にその数を容易に変更することはできません。
また、プログラムは様々なサブルーチンや関数から構成されており、それぞれが一時的なデータのためにレジスタを使用します。このため、プログラムの異なる部分間でレジスタの使用が競合するという問題が発生します。
コンパイラやプログラマは、プログラム全体の実行状況を詳細に把握することが難しいため、一般的に現在処理しているコードに必要なレジスタを最大限に利用しようとします。これにより、他の部分で必要なレジスタが不足したり、頻繁なデータの退避(スピル)や読み込み(フィル)が発生したりして、性能が低下する可能性があります。
レジスタウィンドウの仕組み
レジスタウィンドウは、このレジスタ使用の競合問題を解決するために考案されました。プログラムの各部分(プロシージャや関数)が必要とするレジスタセットをあらかじめ複数用意しておき、プロシージャが呼び出される際に、現在使用しているレジスタセットから新しいレジスタセットに切り替える(見えなくする)という手法を用います。
具体的には、
CPU内部に多数のレジスタを搭載しておき(これを
レジスタファイルと呼びます)、そのうちの一部のみを「ウィンドウ」として、現在実行中のプロシージャから見えるようにします。プロシージャが別のプロシージャを呼び出す際には、レジスタウィンドウを所定数だけ移動させ、新しいプロシージャからは異なるレジスタセットが見えるようにします。呼び出し元のプロシージャが使用していたレジスタは、この操作によって見えなくなり、呼び出し先のプロシージャは自身のレジスタセットを自由に使用できます。プロシージャから戻る際には、元のウィンドウに戻す処理を行います。
この方式の利点は、各プロシージャが独立したレジスタ空間を持っているかのように扱える点です。これにより、プログラマや
コンパイラは、他のプロシージャのレジスタ使用状況を気にすることなく、目の前のコードに必要なレジスタを効率的に割り当てることができます。
実装例
レジスタウィンドウは、初期の
RISCアーキテクチャで注目されました。
バークレーRISC: レジスタウィンドウの概念を初めて採用したアーキテクチャの一つです。合計64本の
レジスタファイルに対し、8本のレジスタを一つのウィンドウとして可視化しました。これにより、
レジスタファイル内で最大8レベルのプロシージャコール深度に対応できました。レジスタが溢れる(ファイルから追い出される)のは、コール深度がこの制限を超えた場合のみです。
SPARC: サン・マイクロシステムズが開発した
SPARCアーキテクチャは、レジスタウィンドウを商用実装した代表例です。
SPARCでは、複数のレジスタウィンドウが同時に見える構造を採用しています。典型的な構成では、8本のレジスタを1セットとし、入力(i)、ローカル(L)、出力(o)の3つのウィンドウセット(計24本)が隣接して見えます。プロシージャ呼び出し時には、このウィンドウ全体が16本分スライドし、呼び出し元の出力レジスタセットが呼び出し先の入力レジスタセットとして見えるようになります。これに加え、どのプロシージャからも常にアクセス可能なグローバルレジスタ(g)も8本存在します。
AMD 29000: このアーキテクチャでは、ウィンドウのサイズを可変にすることで、引数の数が少ないプロシージャでのレジスタの無駄を減らす工夫がなされています。グローバルレジスタとウィンドウ用レジスタを合わせた、より大きな
レジスタファイルを持っていました。
利点と代替手法
レジスタウィンドウ方式は、ハードウェアの追加によってプロシージャコールのオーバーヘッドを大幅に削減できる強力な手法です。特に
オブジェクト指向プログラミングのように、比較的小さなプロシージャが頻繁に呼び出されるスタイルのプログラムにおいて、その効果を発揮しやすいとされます。
レジスタファイル自体を増やせば、ウィンドウの数を増やすことができ、システム全体のレジスタオーバーフローをさらに抑制することも可能です。
一方で、レジスタウィンドウはハードウェアによる解決策ですが、レジスタの効率的な利用はソフトウェア、特に
コンパイラの最適化によっても追求できます。
スタンフォード大学で開発されたMIPSアーキテクチャは、レジスタウィンドウを採用せず、代わりに高度な
コンパイラ技術によってレジスタの割り当てと利用を最適化するアプローチを取りました。これにより、レジスタ数を抑えつつも高い性能を達成し、チップの設計を単純化するという利点を得ました。
現代のプロセッサでは、レジスタウィンドウと
コンパイラ最適化の両方、あるいはどちらか一方のアプローチが採用されています。
関連項目
レジスタ・リネーミング
*
EPICアーキテクチャ