JP2007304663A - プロセッサ及びそのデータ処理方法 - Google Patents

プロセッサ及びそのデータ処理方法 Download PDF

Info

Publication number
JP2007304663A
JP2007304663A JP2006129652A JP2006129652A JP2007304663A JP 2007304663 A JP2007304663 A JP 2007304663A JP 2006129652 A JP2006129652 A JP 2006129652A JP 2006129652 A JP2006129652 A JP 2006129652A JP 2007304663 A JP2007304663 A JP 2007304663A
Authority
JP
Japan
Prior art keywords
register
instruction
data
processor
cache
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2006129652A
Other languages
English (en)
Inventor
Ryotaro Kobayashi
良太郎 小林
Taro Kajiyama
太郎 梶山
Daisuke Horibe
大介 堀部
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nagoya University NUC
Original Assignee
Nagoya University NUC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nagoya University NUC filed Critical Nagoya University NUC
Priority to JP2006129652A priority Critical patent/JP2007304663A/ja
Publication of JP2007304663A publication Critical patent/JP2007304663A/ja
Pending legal-status Critical Current

Links

Images

Abstract

【課題】レジスタ・キャッシュを有効に活用し、処理性能を好適に向上することのできるプロセッサ及びそのデータ処理方法を提供する。
【解決手段】メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、レジスタ・キャッシュのアクセスに係るインデクスを、メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、未使用の物理レジスタ番号のモジュロ・ソートを行って、命令のフェッチ順にインデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する物理レジスタ番号の割り当てるようにした。
【選択図】図1

Description

本発明は、レジスタ・キャッシュとメイン・レジスタ・ファイルとに階層化された階層型レジスタ・ファイルを有するプロセッサ、及びその内部におけるデータ処理を行う方法に関する。
プロセッサの高性能化に係るアーキテクチャとして、パイプライン処理やスーパスカラが知られている。パイプライン処理は、命令処理の各ステージの処理ユニットを独立して動作可能とした上で、1ステージの処理が終了する毎に命令を順次投入することで、複数命令の異なるステージを同時に実行させる手法である。またスーパスカラは、複数のパイプラインを用意し、複数の命令を同時並行して実行させる手法である。近年、マイクロ・プロセッサの高性能化と共に、パイプライン数及び各パイプラインの段数は、益々増加されており、それに伴いレジスタ・ファイル(RF:Register File)のエントリ数及びポート数も増加されている。
こうしたレジスタ・ファイルの肥大化は、レジスタ・ファイルのアクセス時間の増加を招き、動作周波数の向上を妨げる要因となっている。レジスタ・ファイルの肥大化によるアクセス時間の増加を抑制するための手段として、階層型レジスタ・ファイルが提案されている。
図29に、階層型レジスタ・ファイルを備えるプロセッサでの実行ユニットでの命令の実行に係るデータパスの構成を示す。このデータパスにおいて命令は、階層型レジスタ・ファイル150へのアクセスを通じて必要なオペランドを取得した上で、実行ユニット(EU:Execution Unit)151,152に投入され、実行される。そして実行ユニット151,152での命令の実行結果は、結果バス153を介して階層型レジスタ・ファイル150に書き込まれる。
階層型レジスタ・ファイル150は、レジスタ・キャッシュ(RC:Register Cache )154とメイン・レジスタ・ファイル(MRF:Main Register File )155とに階層化されている。メイン・レジスタ・ファイル155にはすべてのレジスタ値が、レジスタ・キャッシュ154には一部のレジスタ値のみが、それぞれ記録保持される。レジスタ・キャッシュ154は、エントリ数及びポート数が少ない分、メイン・レジスタ・ファイル155よりも高速動作可能となっている。
命令は、階層型レジスタ・ファイル150からのオペランドの取得に際して、まずレジスタ・キャッシュ154にアクセスし、そこに必要なレジスタ値があればそこからオペランドを取得し、無ければメイン・レジスタ・ファイル155からオペランドを取得する。このとき、レジスタ・キャッシュ154に必要なレジスタ値が保持されている、すなわち、レジスタ・キャッシュ154へのアクセスがヒットした場合には、レジスタ値を高速にアクセス可能となり、レジスタ・ファイルのアクセス時間が動作周波数に与える影響を低減することができる。
しかしながら、必要なレジスタ値がレジスタ・キャッシュ154に保持されていない場合、すなわちレジスタ・キャッシュ154へのアクセスがミス(以下、RCミスと記載する)した場合には、次のようなペナルティが発生する。まずメイン・レジスタ・ファイル155の参照に先立ってレジスタ・キャッシュ154が参照される分、レジスタ・ファイルのアクセス・レイテンシが本来よりも増加して、プログラムの実行サイクル数に悪影響を及ぼすようになる。
またRCミスの発生は、他の命令の発行を妨げる場合もある。ここでRCミスが発生する命令i0とその結果を使用する後続の命令i1とを実行する場合を想定する。この想定では、プロセッサのパイプラインが、フェッチ2段、デコード2段、発行1段、オペランド・アクセス1段、実行1段、ライトバック1段、及びコミット1段によって構成されているものとする。また命令i0の実行前には、レジスタ・キャッシュ上にはまだ何ら値が書き込まれていないものとする。あるサイクルにおいて命令i0が発行されると、その次のサイクルにおいて命令i0がレジスタ・キャッシュにアクセスする。命令i1は、このときのアクセスがヒットするとして、投機的に発行されている。しかしながら、このときの命令i1のレジスタ・キャッシュへのアクセスは必然的にミスとなるため、その次のサイクルでは命令i1のオペランド・アクセスはできないこととなる。そして、この時点で命令i1の発行は誤っていたことが確認されることになる。このように投機的発行に失敗した命令は、プロセッサの限られた命令発行幅を浪費することになり、他に有効な命令が存在した場合にそれらの発行を妨げてしまうことになる。
このように階層型レジスタ・ファイルでは、レジスタ・キャッシュ・ミス(以下、RCミスと記載する)がプログラムの実行に与える悪影響を如何に緩和するかが重要な課題となっており、より効率的なレジスタ・キャッシュの更新方法が求められている。レジスタ・キャッシュの更新方法は大きくは、書き込みポリシーと置き換えポリシーとの2つに分類することができる。書き込みポリシーとは、命令の生成した値の中からレジスタ・キャッシュに書き込む値を選択するための指針のことであり、置き換えポリシーとは、値の書き込まれるレジスタ・キャッシュのエントリを選択するための指針のことである。
従来、レジスタ・キャッシュの置き換えポリシーについて、非特許文献1及び2に記載の技術が提案されている。非特許文献1の手法では、LRU(Least Recently Used )方式でレジスタ・キャッシュの更新を行うようにしている。LRU方式とは、レジスタ・キャッシュの各エントリのうちでアクセスされた時期の最も古いエントリを、新規追加するレジスタ値に入れ替える方式である。一方、非特許文献2の手法では、レジスタ・キャッシュの各エントリに保持されたレジスト値のそれぞれについて、後続命令による参照の回数を予測し、その参照回数が少ないエントリを新規追加するレジスタ値に書き換えるようにしている。
なお、非特許文献3及び4は、クリティカル・パスの予測手法に関する従来技術文献である。
特開平11−296431号公報 特開2004−118372号公報 Caching Processor General Register (In Proc. Int. Conf. on Circuits Design, pp.307-312, 1995) Use-Base Register Caching with Decoupled Indexing (In Proc. of 31st International Symposium on Computer Architecture, pp.302-313, 2004) Focusing Processor Policies via Critical-Path Prediction (In Proc. ISCA-28, June 2001.) 低消費電力プロセッサアーキテクチャ向けクリティカルパス予測器の提案(情報処理学会研究報告 2002-ARC-149、2002年 8月)
こうした従来の手法では、参照される可能性の低いエントリからレジスタ値が置き換えられていき、参照される可能性の高いエントリについては書き換えられずに長期保持されるため、上記RCミスを効果的に削減することはできる。しかしながら、何れの手法においても、非参照期間の計測や参照回数の推定をすべての命令について行う必要がある。またレジスタ・キャッシュのエントリが物理レジスタ番号から一意に定まらないため、アクセスに際して類推検索を行う必要がある。そのため、レジスタ・キャッシュのハードウェア構成が複雑となってしまい、レジスタ・キャッシュのアクセス時間が増加してしまうという問題があり、プロセッサの処理性能を十分には向上することができないものとなっている。
なお、メモリ階層(階層型主記憶装置)でのデータ・キャッシュ・ミスの削減に係る技術としては、特許文献1及び2に記載のものが提案されている。これらはいずれもキャッシュ・メモリのインデクスの生成方法の工夫により、エントリの競合を避けてキャッシュのヒット率を向上するものであるが、あくまでメモリ階層への適用を想定したものであり、そのまま階層型レジスタ・ファイルに適用することはできないものとなっている。
本発明は、こうした実情に鑑みてなされたものであって、その解決しようとする課題は、レジスタ・キャッシュを有効に活用し、処理性能を好適に向上することのできるプロセッサ及びそのデータ処理方法を提供することにある。
上記課題を解決するため、請求項1に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、前記レジスタ・キャッシュのインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するインデクス決定手段と、命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に前記物理レジスタ番号を割り当てる物理レジスタ番号設定手段と、を備えるようにしている。
また請求項14に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、前記レジスタ・キャッシュのアクセスに係るインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する前記物理レジスタ番号の割り当てを行うようにしている。
上記プロセッサ及びそのデータ処理方法では、レジスタ・キャッシュのインデクスをメイン・レジスタ・ファイルの物理レジスタ番号から一意に定めるようにしている。そのため、アクセスに際しての類推検索が不要となることから、レジスタ・キャッシュのアクセス時間の短縮、及びハードウェア構成の簡易化が可能となる。ただし、こうした場合に、命令のレジスタ・リネーミング時に未使用の物理レジスタ番号をランダムに割り当てるとすると、物理レジスタのコミット時に書き換えられるレジスタ・キャッシュのエントリもランダムに決定されることになる。そのため、レジスタ・キャッシュの各エントリの書き換えの頻度は必ずしも平均化されず、特定のエントリの書き換えが頻発することがあり、エントリの競合によるRCミスが発生し易くなってしまう。
その点、上記構成及びデータ処理方法では、命令のレジスタ・リネーミングに際して、レジスタ・キャシュのインデクスが命令のフェッチ順にラウンド・ロビンとなるように、物理レジスタ番号の割り当てを行うようにしている。ここでのラウンド・ロビンとは、取り得る値のすべてについて、各値が1度ずつ現れるように値が順に交代されることを意味する。この場合、命令に割り当てられた物理レジスタ番号のレジスタ・キャッシュへのインデクスの値は、特定の値に偏ることなく分散されるようになり、レジスタ・キャッシュのエントリの競合が抑制されるようになる。したがって、アクセス時間の増加を招くことなく、RCミスの発生を効果的に削減することができるようになる。
なお請求項1に記載のプロセッサにおけるような物理レジスタ番号の割り当ては、より具体的には、例えば請求項2に記載のように、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させるとともに、その整列の順に物理レジスタ番号の割り当てを行うように上記物理レジスタ番号設定手段を構成することでその実現が可能である。また請求項3に記載のように、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、前記レジスタ・キャッシュのエントリ数と同数のバッファと、レジスタ・リネーミング中の命令に割り当てられる前記物理レジスタ番号を読み出す前記バッファを、命令のフェッチ順に切り替える切替手段と、を備えて上記物理レジスタ番号設定手段を構成することによっても、その実現が可能である。
また、請求項14に記載のデータ処理方法におけるような物理レジスタ番号の割り当ては、より具体的には、例えば請求項15に記載のように、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させる工程と、レジスタ・リネーミング中の命令に対してその整列順に前記物理レジスタ番号の割り当てを行う工程と、を通じて行うことができる。また請求項16に記載のように、レジスタ・キャッシュのエントリ数と同数のバッファのそれぞれに、インデクスを同一とする未使用の物理レジスタ番号を分別して格納する工程と、バッファを順次切り替えながら物理レジスタ番号を順次読み出す工程と、レジスタ・リネーミング中の命令に対してその読み出された物理レジスタ番号を同命令のフェッチ順に割り当てる工程と、を通じても、請求項14におけるような物理レジスタ番号の割り当てを行うことができる。
また、上記のような物理レジスタ番号から一意に定まるようなインデクスの決定は、例えば請求項4や請求項17に記載のように、レジスタ・キャッシュのエントリ数で物理レジスタ番号を除算したときの剰余をインデクスとして決定するようにインデクス決定手段を構成することで行うことができる。この場合、上記剰余が順次切り替わるように未使用の物理レジスタ番号を整列させた上で、その整列の順に割り当てを行うことで、レジスタ・キャッシュのインデクスをラウンド・ロビンとすることができる。
ところで多段パイプラインを有するプロセッサでは、命令の分岐予測を行って予測した分岐先の命令を投機実行することがある。この場合、分岐予測ミスが発生すると、投機的にパイプラインに投入された誤った分岐先の命令を破棄し、正しい分岐先の命令を投入しなおすことになる。このときの破棄された命令には既に物理レジスタ番号の割り当てが行われており、その破棄によってインデクスの順番に狂いが生じ、ラウンド・ロビンとならなくなってしまうことがある。こうした場合にも、請求項5及び請求項18に記載のように、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにすれば、分岐予測ミスの発生時にもインデクスはラウンド・ロビンに維持されるようになる。
一方、上記課題を解決するため、請求項6に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用されるデータとなるか否かを予測する予測手段と、前記階層型レジスタへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、を備えるようにしている。
また請求項19に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、命令の定義するレジスタ値がクリティカル・パス上の命令に使用されるデータとなるか否かの予測を行うとともに、前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、前記データとなると予測されたことを条件として同レジスタ値を前記レジスタ・キャッシュに書き込むようにしている。
RCミスによるペナルティで命令の実行が遅れると、その命令がクリティカル・パス上の命令であれば、その遅れの分、プログラム全体の実行サイクル数が増加してしまう。これに対して、その命令が非クリティカル・パス上の命令ならば、RCミスのペナルティによるプログラム全体の実行サイクル数の増加は、そのペナルティによる命令の実行の遅れ分よりも少なくなる。したがって、同じ数だけRCミスを削減できるとすれば、非クリティカル・パス上の命令のRCミスを削減するよりは、クリティカル・パス上の命令のRCミスを削減した方が、プロセッサの処理性能は向上するようになる。
その点、上記プロセッサ及びそのデータ処理方法では、クリティカル・パス上の後続命令に使用されるデータとなると予測されるレジスタ値のみがレジスタ・キャッシュに書き込まれるようになる。こうしてレジスタ・キャッシュに書き込まれるデータの種類を制限することで、レジスタ・キャッシュのデータの置き換え頻度が低減されるようになり、クリティカル・パス上の命令によって使用されるデータの受け渡しについてはRCミスの発生を大幅に低減することができる。もっとも、この場合には、非クリティカル・パス上の命令に使用されるデータについては、レジスタ・キャッシュへの書き込みがそもそも行われないことから、必然的にRCミスが発生するようにはなる。ただし、非クリティカル・パス上の命令のRCミスは、クリティカル・パス上の命令のRCミスに比べれば、プロセッサの処理性能に与える悪影響は軽微となっている。そのため、非クリティカル・パス上の命令に対するデータの受け渡しに際してRCミスがある程度発生しても、クリティカル・パス上の命令に対するデータの受け渡しに際してのRCミスの発生を防止しさえすれば、RCミスによるプロセッサ性能の低下を緩和することができる。したがって、上記構成及びデータ処理方法のように、クリティカル・パス上の命令のRCミスの発生を低減しさえすれば、RCミスによるプロセッサの処理性能の低下を好適に抑制することが可能となる。
さらに請求項7に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測する予測手段と、前記階層型レジスタ・ファイルへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、を備えるようにしている。
また請求項20に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測するとともに、前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、そのレジスタ値が前記データとなると予測されたことを条件として前記レジスタ・キャッシュに書き込むようにしている。
命令のデコード時にその命令の必要とするオペランド(データ)が結果バスに存在する場合、レジスタ・ファイルを介さずにそのデータを結果バスから直接取得する、いわゆるオペランド・バイパスによるレジスタ値の受け渡しが行われることがある。クリティカル・パス上の命令によって使用されるレジスタ値であっても、そのレジスタ値がオペランド・バイパスによって得られるのであれば、そのデータの受け渡しにレジスタ・ファイル・アクセスは行われない。そのため、そうしたデータをわざわざレジスタ・キャッシュに書き込んだところで、そのデータのアクセス時間の短縮には寄与しないばかりか、限りあるレジスタ・キャッシュの資源が無駄に消費されることとなり、その書き込みによって必要なデータがレジスタ・キャッシュから追い出されてしまう可能性がある。したがって上記構成及びデータ処理方法のように、クリティカル・パス上の命令によって使用されるデータの中で、オペランド・バイパスによっては得られないデータのみを選択してレジスタ・キャッシュに書き込むこととすれば、クリティカル・パス上の命令のRCミスの発生を更に確実に低減することができるようになる。
なお請求項6及び7に記載のプロセッサにおける予測手段は、例えば請求項8に記載のように、定義したレジスタ値が上記データであったか否かの履歴を命令毎に記録保持するテーブルを備え、そのテーブルに保持された履歴に基づいて予測を行うように構成することができる。命令の定義したレジスタ値のその後の使用態様は、先にその命令が実行されたときと同様の結果となる可能性が高いため、上記のように先の命令の実行時におけるレジスタ値の使用態様の履歴を記録し、その履歴を参照することで上記予測を行うことができる。
そうした予測手段は、より具体的には、例えば請求項9に記載のように、上記データであったレジスタ値を定義した命令の識別情報を記録保持するテーブルを有し、そのテーブルにおける命令の識別情報の有無に基づき前記予測を行うように構成することができる。ちなみに請求項9のように予測手段を構成した場合、請求項10に記載のように、そのテーブルを、命令のプログラム・カウンタの値を構成するビット列の一部をインデクスとするエントリに同ビット列の残りの部分を識別情報として記録保持するように構成することも可能である。
一方、請求項19及び20における命令の定義したレジスタ値のその後の使用態様についての予測は、例えば請求項21に記載のように、命令の定義したレジスタ値が上記条件に該当するデータであったか否かを命令毎に履歴として記録する工程と、今回もその履歴と同じ結果となるとしてデータとなるか否かを予測する工程と、を通じて行うことができる。またそうした予測は、より具体的には、請求項22に記載のように、上記条件に該当するデータとなったレジスタ値を定義した命令の識別情報を記録する工程と、レジスタ値を定義した命令の識別情報が既に記録されていれば、そのレジスタ値は上記データとなり、記録されていなければ、そのレジスタ値は上記データとならないと予測する工程と、を通じて行うことができる。
なお請求項9及び10のように予測手段を構成した場合、或いは請求項22のように予測を行う場合には、プログラムの実行中に命令間のデータ依存関係が変化すると予測結果を誤ってしまうことがある。そうした場合にも、請求項11や請求項23に記載のように、命令の実行結果に基づいて予測手段の予測結果の是非を判定し、レジスタ値がデータであるとの予測の誤りが判明したときに、該当レジスタ値を定義した命令の識別情報の登録を削除するようにすれば、上記のようなデータ依存関係の変化に対応することができる。
ところでRCミスには、他の命令の発行を妨げてしまうという問題もある。この要因は、オペランドの取得に際してRCミスが発生してしまう命令を、オペランドのレジスタ・キャッシュからの取得(RCヒット)を前提として投機的に発行してしまうことにある。したがって、オペランドの取得時にRCミスが発生する命令を事前に検出し、そうした命令の投機的に発行を行わないようにすれば、上記問題は回避することができる。
ここで請求項6〜11に記載のプロセッサ、及び請求項19〜23のデータ処理方法では、レジスタ・キャッシュに書き込むレジスタ値の種別を限定しており、それ以外の種別のレジスタ値についてはその受け渡しに際してRCミスが発生することが予め分かっている。そこでそうしたRCミスの発生が予め分かっているレジスタ値を使用する命令については、RCヒットを前提とした投機的な発行を行わないようにすれば、上記のようなRCミスによる他の命令の発行の妨害を回避することができる。
具体的には、請求項6〜11のプロセッサにおいて、
・ 請求項12に記載のように、予測手段によって上記データでないと予測されたレジスタ値を使用する命令に対して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止しつつ、命令の発行を行う命令発行手段を備えること、
・ 請求項13に記載のように、予測手段によって上記データであると予測されたレジスタ値を使用する命令に限定して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う命令発行手段を更に備えること、
或いは、請求項19〜23のプロセッサのデータ処理方法において、
・ 請求項24に記載のように、命令の発行に際して、使用するレジスタ値が上記データでないと予測された命令に対しては、レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止すること、
・ 請求項25に記載のように、命令の発行に際して、使用するレジスタ値が前記データであると予測されたことを条件として、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行うこと、
により、RCミスによる他の命令の発行の妨害を好適に回避することができる。
本発明のプロセッサ及びそのデータ処理方法によれば、レジスタ・キャッシュを有効に活用して、処理性能を好適に向上することができる。
(第1実施形態)
以下、本発明に係るプロセッサ及びそのデータ処理方法を具体化した第1実施形態を、図1〜図18を参照して詳細に説明する。なお、以下の説明では、数値を2進数で表記する場合、その値の前後に”[”、”]”をそれぞれ付して記載し、そうでない数値は10進数表記によるものとする。
上述のように階層型レジスタの有効活用には、書き込みポリシーや置き換えポリシーといったレジスタ・キャッシュの更新方法が重要な意味を持つ。ここでレジスタ・キャッシュの置き換えポリシーに着目すると、レジスタの参照には時間的局所性があることを考慮した場合、参照の時期が最も古いエントリに新規追加のレジスタ値を書き込むという上述のLRU方式が、参照の可能性の低いエントリを置き換え対象に選択可能である点で、RCミスの削減に最も効果的であると考えられる。なお、時間的局所性とは、レジスタの再参照率の時間的特性を示す言葉であり、ここでは、先の参照からの時間の経過に従ってレジスタの再参照率が低くなるという一般的傾向がある。すなわち、参照時期がもっと古いエントリは、再参照される可能性が最も低いエントリと見なすことができる。したがってLRU方式では、参照の可能性の低いと推定されるエントリから順に値が上書きされることとなる。
このようにLRU方式は、RCミスの削減には確かに有効ではあるが、レジスタ・キャッシュの書き込みが行われる都度、参照時期の最も古いエントリを探す必要がある。また値の格納されるエントリがその物理レジスタ番号とは無関係に決定されることから、レジスタ・キャッシュの参照時に連想検索を行う必要もある。このようにLRU方式では、レジスタ・キャッシュの読み書きに複雑な処理が必要であり、レジスタ・キャッシュのハードウェア構成の複雑化やアクセス時間の増加を招いてしまう。
従来、こうしたLRU方式に対して、より簡易な構成で実現可能な方式として、ダイレクト・マップ方式が知られている。レジスタ・キャッシュにおけるダイレクト・マップ方式では、レジスタ値の書き込まれるレジスタ・キャッシュのエントリを、レジスタ・リネーミング時に割り当てられたメイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するようにしている。
次に、こうした従来のダイレクト・マップ方式の詳細を説明する。ダイレクト・マップ方式では、物理レジスタ番号をレジスタ・キャッシュのエントリ数(RCエントリ数)で除算したときの剰余を、レジスタ・キャッシュのアクセスに際してのインデクスとするようにしている。こうしたレジスタ・キャッシュにおけるダイレクト・マップ方式は、メモリ階層のダイレクト・マップ方式と基本的な考え方は同じである。ちなみにメモリ階層のダイレクト・マップ方式では、メモリ・アドレスから抽出したビット列をキャッシュのエントリ数で除算したときの剰余をキャッシュ・メモリのインデクスとして使用する。
実際の階層型レジスタ装置では、エントリ数が「n」のレジスタ・キャッシュでは、2を底とするRCエントリ数nの対数、すなわちRCエントリ数を2進数表記したときのビット長を「Br」としたとき、その物理レジスタ番号の下位「Brビット」をインデクスとして使用するようにしている。例えばRCエントリ数が「4」の場合、2を底としたRCエントリ数「4」の対数は「2」であることから、物理レジスタ番号の下位2ビットがレジスタ・キャッシュのインデクスとなる。このときの番号「9(=[1001])」の物理レジスタに対応付けられるレジスタ・キャッシュのインデクスは、その下位2ビットである「1(=[01])」となる。
ところで、従来のダイレクト・マップ方式では、命令のデコード時のレジスタ・リネーミングにおける物理レジスタ番号の割り当ては、以下の態様で行われている。すなわち、従来のプロセッサのレジスタ装置には、フリー・リストと呼ばれるリストが設けられ、そのフリー・リストから物理レジスタ番号を取得して、命令のデスティネーション・レジスタ(命令の実行結果が格納されるレジスタ)に割り当てるようにしている。フリー・リストは、未使用の物理レジスタ番号が格納される、FIFO式のバッファとして構成されている。
命令の実行により、ある物理レジスタに対応する論理レジスタが再定義され、その命令のデスティネーション・レジスタとして新たに割り当てられた物理レジスタが、その再定義された論理レジスタにコミットされると、前者の物理レジスタが解放された状態、すなわち使用可能な状態となる。このとき、解放された物理レジスタの番号がフリー・リストに格納される。通常、各論理レジスタの再定義の頻度にはばらつきがあり、物理レジスタの解放タイミングにもばらつきが生じることから、フリー・リストでの物理レジスタ番号の並び方はランダムとなる。したがって、レジスタ・リネーミング時に物理レジスタ番号はランダムに割り当てられることとなり、割り当てられた物理レジスタのコミット時に書き換えられるレジスタ・キャッシュのエントリもランダムに決定されることになる。そのため、従来のダイレクト・マップ方式では、レジスタ・キャッシュの各エントリの書き換えの頻度は必ずしも平均化されず、特定のエントリの書き換えが頻発するという事態が生じ得る。そうした場合、レジスタ・キャッシュのエントリが競合して、参照される可能性の高いレジスタ・キャッシュのエントリが短時間で上書きされてしまうことから、RCミスが発生し易い状態となってしまう。
そうした従来のダイレクト・マップ方式の問題を、図1(a)を用いて説明する。なお同図1(a)及び図1(b)には、プログラムにおいて順次実行される各命令i0〜i3について、そのメイン・レジスタ・ファイル(MRF)及びレジスタ・キャッシュ(RC)のエントリ番号の割り当て態様の一例が示されている。同図において、メイン・レジスタ・ファイル及びレジスタ・キャッシュの各エントリの左側に付された数値は、エントリ番号を示している。また同図では、命令、メイン・レジスタ・ファイルのエントリ、レジスタ・キャッシュのエントリの間の対応関係が矢印にて示されている。ちなみに図1(a)及び(b)の各例では、RCエントリ数はそれぞれ「4」となっている。
ここでフリー・リストに、「4」、「7」、「9」、及び「12」〜「14」の物理レジスタ番号が格納されていたとする。上述したように、従来のダイレクト・マップ方式では、これら物理レジスタ番号のフリー・リストにおける格納の順序はランダムとなっている。図1(a)の例では、命令i0〜i3に割り当てられる物理レジスタ番号はフェッチ順に、「12」(=[1101])、「4」(=[0100])、「9」(=[1001])、「13」(=[1101])となっている。このときには、レジスタ・キャッシュの0番エントリにおいて命令i0と命令i1とが競合し、1番エントリにおいて命令i2と命令i3とが競合する。そしてその結果、レジスタ・キャッシュには4つのエントリがあり、格納すべきレジスタ値の数も4つであるであるにも拘わらず、実際には2つのエントリしか使用されておらず、書き込み直後に2つのレジスタ値が上書きされてレジスタ・キャッシュから消されてしまうことになる。物理レジスタ番号がランダムに割り当てられる従来のダイレクト・マップ方式は、ハードウェア構成が簡易である反面、こうしたエントリの競合の発生について何らの対応も取られていないことから、LRU方式のような他の方式に比してRCミスの発生頻度は高いものとなっている。
こうした競合の発生は、レジスタ・キャッシュへのインデクスがラウンド・ロビンに決定されるように、すなわち割り当て毎にインデックスが順送りに交代されるように、物理レジスタ番号の割り当てを行うことで、効果的に解消することができる。図1(b)は、そのように物理レジスタ番号の割り当てを行った場合を示している。同図1(b)の例では、命令i0〜i3のデスティネーション・レジスタの物理レジスタ番号をフェッチ順に、「12」(=[1100])、「9」(=[1001])、「14」(=[1110])、「7」(=[0111])の順に割り当てている。このときの各命令i0〜i3に対応するレジスタ・キャッシュへのインデクスはそれぞれ、「0」(=[00])、「1」(=[01])、「2」(=[10])、「3」(=[11])となり、エントリの競合は生じない。すなわち、レジスタ・キャッシュのすべてのエントリが有効に活用されている。このように、レジスタ・キャッシュのインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを実現すれば、レジスタ・キャッシュのエントリの競合を回避し、RCミスの発生を効果的に抑制することができる。
次にそうした物理レジスタ番号の割り当てを実現する、本実施形態の階層型レジスタの利用方法での物理レジスタ番号の供給手法について説明する。上記のような物理レジスタの割り当てを実現するには、レジスタ・リネーミング時に、番号をRCエントリ数で除算したときの剰余が順送りとなるように整列された状態で、物理レジスタ番号を供給する必要がある。ここでは、そうした物理レジスタ番号の整列を、モジュロ・ソート(剰余整列)と記載する。
なお物理レジスタ番号の割り当ては一般に、上述したフリー・リストを用いて行われる。よってフリー・リストに対して、格納された物理レジスタ番号のモジュロ・ソートをサイクル毎に行えば、上記のような物理レジスタ番号の供給の実現は可能である。しかしながら、フリー・リストに既に格納された値に対するソート処理を行うには、リスト内のすべての値を外部に一旦取り出し、ソートを行ってから再び格納し直すといった作業が必要で、時間が掛かりすぎるという問題がある。そこで本実施形態では、解放された物理レジスタ番号を予めモジュロ・ソートされた状態としてから、バッファに記憶していくようにしている。
続いて、上記のような物理レジスタ番号のモジュロ・ソートを実現するための、具体的な機構の構成について説明する。この機構は、MSB(剰余整列バッファ:Modulo Sorting Buffer )と呼ばれるバッファによって構成されている。このMSBは、従来の階層型レジスタ装置におけるフリー・リストの代わりとして、物理レジスタ番号の管理を行う機能を担っており、コミット時にリオーダ・バッファから物理レジスタ番号を受け取るとともに、レジスタ・リネーミング時に物理レジスタ番号を供給する。本実施形態では、このMSBが上記インデクス決定手段及び物理レジスタ番号設定手段に相当するこうせいとなっている。
このMSBによる物理レジスタ番号の割り当ては、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号の整列を行う工程と、レジスタ・リネーミング中の命令に対してその整列順に物理レジスタ番号の割り当てを行う工程と、を通じて行われる。より具体的には、前者の工程は、RCエントリ数と同数のバッファのそれぞれに、インデクスを同一とする物理レジスタ番号を分別して格納する工程を通じて行われる。また後者の工程は、バッファを順次切り替えながら物理レジスタ番号を順次読み出す工程と、レジスタ・リネーミング中の命令に対してその読み出された物理レジスタ番号を命令のフェッチ順に割り当てる工程とを通じて行われる。
まずここでは、単一命令発行の、すなわち単一サイクルに唯一つの命令を発行するプロセッサへの搭載を想定したMSBの構成を説明する。なお、図2に示すように、ここでMSBの搭載を想定するプロセッサは、フェッチ・ユニット11、デコード・ユニット12、命令ウィンドウ(I−win)13、実行ユニット(EU)14、リオーダ・バッファ(ROB)15を備えている。またプロセッサには、メイン・レジスタ・ファイル(MRF)16及びレジスタ・キャッシュ(RC)17からなる階層型レジスタ・ファイルとマップ表18とが設けられてもいる。フェッチ・ユニット11は、主記憶装置からの命令の読み込みを行う。デコード・ユニット12は、読み込まれた命令の内容の解析(デコード)し、命令ウィンドウ13及びリオーダ・バッファ15にそれぞれ格納する。またデコード・ユニット12は、デコード時に定義した物理レジスタと論理レジスタとの対応関係をマップ表18に記憶する。命令ウィンドウ13は、実行前の命令を一時的に格納するバッファであり、プロセッサの制御回路は、このバッファから命令を取り出して、実行ユニット14に順次投入する。一方、リオーダ・バッファ15は、命令を格納するFIFO(First-In First-Out)式のバッファであり、格納された命令の中で格納の順が最も早い命令の実行が終了すると、その命令が取り出される(コミットされる)。なお上述したように、階層型レジスタ・ファイルのメイン・レジスタ・ファイル16は、すべてのレジスタ値を記憶し、より高速に動作可能なレジスタ・キャッシュ17は一部のレジスタ値のみを記録する。
こうしたプロセッサに搭載されるMSB20は、それぞれインデクスを同一とする物理レジスタ番号が格納される、RCエントリ数と同数のFIFO式のバッファ(以下、FIFOと記載する)と、物理レジスタ番号の供給を行うFIFOを指示する供給ポインタとを備えて構成されている。各FIFOには、レジスタ・キャッシュ17のエントリ番号のそれぞれに対応する番号が付されており、RCエントリ数で除算したときの剰余がその番号と一致する物理レジスタ番号がそれぞれ格納される。また供給ポインタには、次に物理レジスタ番号の供給を行うFIFOの番号が保持される。すなわち、この供給ポインタの指示より、レジスタ・リネーミング中の命令に供給される物理レジスタ番号を読み込むFIFOの切り替えが行われる。なお以下の説明では、「n番」のFIFOを「FIFO(n)」と記載する。ただしFIFOの番号を2進数で表記する場合には、[XXXX]番のFIFOをFIFO[XXXX]と記載する。
このMSB20は、次のように動作する。コミット時に物理レジスタが解放されると、その空きとなった物理レジスタの番号がMSB20に通知される。MSB20は、通知された物理レジスタ番号をRCエントリ数で除算したときの剰余と一致する番号のFIFOに、その物理レジスタ番号を格納する。例えばRCエントリ数が「4」(=[ 100])で、通知された物理レジスタ番号が「9」(=[1001])の場合、「9」を「4」で除算したときの剰余である「1(=[01])番」のFIFOにその物理レジスタ番号「9」が格納される。なおRCエントリ数が「4」の場合、物理レジスタ番号の下位2ビットが上記剰余と一致するため、これを用いて格納するFIFOを決定することができる。一方、レジスタ・リネーミング時には、MSB20は、供給ポインタに保持された番号のFIFOの先頭から、物理レジスタ番号を読み出して、これを命令に供給する。そして供給ポインタの値をインクリメントする。ただし、このときの供給ポインタの値が、既にFIFO番号の最大値に達しているときには、その値を「0」にリセットする。
図3に、図1(b)と同じ状態におけるMSB20の動作態様を示す。すなわち、MSB20には、「4」、「7」、「9」、及び「12」〜「14」の6つの物理レジスタ番号が格納され、RCエントリ数は「4」となっている。この場合、FIFO(0)には、RCエントリ数で除算したときの剰余が「0」となる物理レジスタ番号「4」及び「12」が格納されている。同様に、FIFO(1)には上記剰余が「1」となる物理レジスタ番号「9」及び「13」が、FIFO(2)には上記剰余が「2」となる物理レジスタ番号「14」が、FIFO(3)には上記剰余が「3」となる物理レジスタ番号「7」が、それぞれ格納されている。
ここでプログラム開始時の供給ポインタの値が「0」であったとすると、命令i0のレジスタ・リネーミング時には、FIFO(0)の先頭から物理レジスタ番号が供給される。この場合、命令i0のデスティネーション・レジスタには、FIFO(0)の先頭に格納された物理レジスタ番号「12」が割り当てられる。そしてこの番号「12(=[1100])」の物理レジスタに対応するレジスタ・キャッシュ17のエントリは「0」となる。またこれとともに供給ポインタの値はインクリメントされて「1」となる。
その後は同様にして、命令i1〜i3に対して物理レジスタ番号「9」(=[1001])、「14」(=[1110])、「7」(=[0111])が順に割り当てられていく。こうして命令i0〜i3に割り当てられた物理レジスタに対応するレジスタ・キャッシュ17のエントリは順に、「0」、「1」、「2」、「3」となり、上述したようなモジュロ・ソートされた物理レジスタの割り当てが実現されている。
(MSBのハードウェア量の削減)
続いて、同等の機能をより少ないハードウェア量で実現可能な上記実施形態のMSBの改良について説明する。
上記のようにMSBの各FIFOには、RCエントリ数で除算したときの剰余がFIFO番号と一致する物理レジスタ番号がそれぞれ格納される。一方、上記剰余は、物理レジスタ番号の下位「Brビット」と等しくなる(Br:RCエントリ数を2進数表記したときのビット長)。したがって、各FIFOに格納される物理レジスタ番号の下位Brビットはすべて同じとなっている。
そこでここでは、各々に格納される物理レジスタ番号の下位Brビットを各FIFOの番号として用いるとともに、各FIFOには、物理レジスタ番号の下位Brビットを除いたビット列のみを記録するようにする。そしてレジスタ・リネーミング時には、供給ポインタの指定するFIFOの先頭に記録されたビット列の後ろに、供給ポインタの保持するFIFO番号を連結することで、物理レジスタ番号を復元することとする。このようにすれば、FIFOの各エントリのビット数をBrビット分節約することができる。
図4に、このように構成されたMSBにおける、図3と同様の状態での動作態様を示す。なお図中の数値はいずれも2進数で表記されている。ここでの物理レジスタ番号は4ビットで表され、それをRCエントリ数「4」で除算したときの剰余はその下位2ビットと同じとなる。したがって、このMSBの各FIFOには、空きレジスタ番号の上位2ビットが格納されることとなる。また各FIFOの番号はそれぞれ、[00](=0)、[01](=1)、[10](=2)、[11](=3)とされている。同図の状態では、供給ポインタの値が[00]となっているため、レジスタ・リネーミングにあたっては[00]番のFIFOの先頭エントリの値[11]が取り出され、その後ろに供給ポインタの値[00]を連結した[1100](=12)が、命令のデスティネーション・レジスタの物理レジスタ番号として割り当てられることになる。
(分岐予測ミスへの対応)
次に、分岐予測ミスへの対応を考慮した上記実施形態の改良について説明する。
パイプライン・アーキテクチャを採用するプロセッサでは、複数の命令が流れ作業的に同時に実行されるため、分岐命令によって実行される命令の流れが変わってしまうと、既に処理を開始した後続命令をすべて破棄しなければならず、処理効率の低下を招く。こうした分岐による処理効率の低下を軽減するための手法として、分岐予測が行われる。分岐予測は、命令が分岐するか否かを予測し、その予測に従って後続命令を投機的にパイプラインに投入する。こうした分岐予測は、具体的には、分岐命令のそれぞれについて過去の実行時における分岐の有無の履歴を分岐予測バッファに記憶しておき、次回の分岐命令の実行時には、その履歴をもとに分岐先を決定することで行われる。
こうした分岐予測にミスが発生すると、投機的にパイプラインに投入された分岐命令以降の命令のすべてが無効化(フラッシュ)される。このときに無効化された命令に既に物理レジスタ番号が割り当てられていると、上記モジュロ・ソートされた順で物理レジスタ番号が割り当てられなくなってしまう。
図5(a)〜(c)には、分岐予測ミス発生時の上記MSBの動作態様の一例を示す。ここでは、エントリ数が「4」のレジスタ・キャッシュを備えるプロセッサにて分岐命令j2を含む命令列を実行したときの、同図(a)は分岐予測ミスの判明前の、同図(b)は予測ミス判明時の、同図(c)は予測ミス判明後のそれぞれにおける、レジスタ・キャッシュ及びMSBの供給ポインタの状態を示している。なお同図(a)〜(c)のレジスタ・キャッシュの各エントリの左側に付された数値は、エントリ番号(インデクス)を示している。また命令とレジスタ・キャッシュのエントリとの間の矢印は、命令に割り当てられた物理レジスタ番号とエントリとの対応関係を示している。ちなみに、上記分岐命令j2は、命令j0,j1に引き続き実行され、その分岐先は命令j3,j4のいずれかであるとする。またプロセッサは、分岐命令j2の分岐先を命令j3と予測してこれを投機的に実行するが、正しい分岐先は命令j4であったとする。
さて同図(a)に示すように、予測ミスの判明前には、命令j3が投機的に実行されており、命令j0,j1,j3のデスティネーション・レジスタにモジュロ・ソートされた物理レジスタ番号の割り当てが行われている。すなわち、命令j0,j1,j3のレジスタ・キャッシュのインデクスがそれぞれ「0」、「1」、「2」となるように物理レジスタ番号が割り当てられている。ここで同図(b)において、分岐予測ミスが判明すると、投機的にパイプラインに投入された命令j3の処理結果がすべて破棄される。このとき、上記実施形態のMSBでは、供給ポインタの値は「3」のまま保持されるとすると、同図(c)に示すように、分岐命令j2の正しい分岐先である命令j4,j5にはそれぞれ、レジスタ・キャッシュのインデクスが「3」、「0」となる物理レジスタ番号が割り当てられる。そのため、レジスタ・キャッシュのインデクス「2」のエントリに空きがあるにも拘わらず、インデクス「0」のエントリにて競合が発生するようになる。
このように、分岐予測ミスが発生すると、モジュロ・ソートの順に物理レジスタ番号の割り当てが行われなくなることがある。こうした分岐予測ミス発生時の問題を解決するには、分岐予測ミスが判明した時点で、予測をミスした分岐命令のレジスタ・リネーミング時の値まで供給ポインタの値を巻き戻すようにすれば良い。
図6(a)〜(c)は、こうした分岐予測ミスの判明に応じた供給ポインタの値の巻き戻しを行う場合の、図5(a)〜(c)と同様の状況におけるMSBの動作態様の一例を示している。図6(a)に示すように、このときにも分岐予測ミスの判明前には、図5(a)の場合と同様に、命令j0,j1,j3にそれぞれレジスタ・キャッシュのインデクスが「0」、「1」、「2」となる物理レジスタ番号の割り当てが行われ、供給ポインタの値は「3」となっている。ただしこの場合、分岐予測ミスが判明すると、図6(b)に示すように分岐予測ミスが判明すると、供給ポインタの値が、予測をミスした分岐命令j2のレジスタ・リネーミング時の値、すなわち命令j3への物理レジスタ番号の割り当て前の値「2」に巻き戻される。その結果、図6(c)に示すように、正しい分岐先である命令j4,j5にはそれぞれ、レジスタ・キャッシュのインデクスが「2」、「3」となる物理レジスタ番号が割り当てられることとなり、先の場合のようなエントリの競合は発生しないようになる。
(複数命令発行対応型MSB)
複数のパイプラインを備え、各パイプラインにそれぞれ命令を同時に発行するスーパスカラ・アーキテクチャを採用するプロセッサでは、複数の命令に対するレジスタ・リネーミングが同時に行われる。そのため、こうしたプロセッサに採用されるMSBは、複数の物理レジスタ番号を同時に供給する必要がある。次にそうした複数命令発行に対応可能なMSBの構成について説明する。
図7に、こうした複数命令発行対応型MSBの構成を示す。同図は、メイン・レジスタ・ファイルのエントリ数が「32」、レジスタ・キャッシュのエントリ数が「8」、命令発行幅、すなわち同時発行される命令の最大数が「4」のプロセッサに採用されるMSBの一構成例を模式的に示したものである。この場合、物理レジスタ番号は5ビット、レジスタ・キャッシュのエントリ番号及びインデクスは3ビットでそれぞれ表される。またこの場合、物理レジスタ番号の下位3ビットがレジスタ・キャッシュのインデクスと一致するようになる。
このMSBは大きくは、
・ 未使用の物理レジスタ番号を保持するFIFO、
・ FIFOから命令に物理レジスタ番号を供給する供給機構、
・ アクセスしたFIFOが空のときの処理を行うリストア機構、
・ 分岐予測ミスへの対応を行う巻き戻し機構、
を備えて構成されている。
なおこのMSBでは、供給機構が、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファ(FIFO)を、命令のフェッチ順に切り替える上記切替手段に相当する構成となっている。また巻き戻し機構が、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻す、上記巻き戻し手段に相当する構成となっている。
以下、こうした複数命令発行対応のMSBの各部の構成、及びその動作の概要を説明する。
(1)FIFO
このMSBは、それぞれレジスタ・キャッシュのインデクスを同一とする物理レジスタ番号が格納される、RCエントリ数と同数のFIFOを備えている。各FIFOには、格納される物理レジスタ番号の上記インデクスと同じ番号が付されている。図7の構成例では、0番〜7番までの8つのFIFOが設けられている。
ここでは、上述のハードウェア量をより削減した単一命令発行対応型のMSB(図4参照)と同様に、物理レジスタ番号の下位Brビットを除いたビット列をFIFOに格納するようにしている。なお上述したように「Br」は、RCエントリ数のビット長である。この複数命令発行対応型のMSBでは、FIFOの各エントリの最上位に、そのエントリが空であるか否かを示すビットを加えるようにしている。ここでは、エントリの最上位ビットの値が[1]であることをもってそのエントリが空の状態、すなわち物理レジスタ番号が保持されていない状態であることを示し、同値が[0]であることをもってそのエントリに有効な物理レジスタ番号が保持されていることを示すようにしている。以下、この最上位ビットをEフラグ(Empty Flag)と呼ぶ。これにより、FIFOからの物理レジスタ番号の読み出しに際して、取得したビット列の最上位ビット(Eフラグ)を調べることで、FIFOが空であったか否かを容易に確認可能となる。
このため、物理レジスタ番号のビット長を「Bm」としたとき、FIFOの各エントリのビット数は、「(Bm−Br+1)ビット」となる。ちなみに命令への物理レジスタ番号の割り当てに際しては、そのビット列の末尾にBrビットのFIFO番号を連結することで、物理レジスタ番号を復元するようにしている。なお以下では、空のFIFOから読み出した物理レジスタ番号を「無効な物理レジスタ番号」と、空でないFIFOから読み出した物理レジスタ番号を「有効な物理レジスタ番号」と、それぞれ記載する。
図8に、図7のMSBの構成例におけるFIFOの物理レジスタ番号の格納態様の一例を示す。同図では、FIFO(0)の先頭及びその次のエントリにそれぞれ物理レジスタ番号「16」及び「24」が格納され、以降のエントリは空となっている。この場合、RCエントリ数のビット長が「3」であるため、上記のようにビット長「5」の物理レジスタ番号のうち、その下位3ビットを除いた上位2ビットの先頭に上記Eフラグを付加した3ビットのビット列がFIFO(0)の各エントリに格納されることとなる。例えば、物理レジスタ番号「16」(=[ 10000])を保持するFIFO(0)の先頭のエントリに格納される値は[ 010]となり、物理レジスタ番号「24」(=[ 11000])を保持する次のエントリに格納される値は[ 011]となる。また無効な物理レジスタ番号を保持するエントリの値は[ 1XX](ここで[X]は[0]か[1]のいずれか)となる。なお、こうした0番FIFOの有効なエントリの値[ 010],[ 011]のそれぞれについて、末尾にFIFO番号「0」(=[ 000])を連結するとともに、上記Eフラグであるその最上位ビットを取り除けば、格納した物理レジスタ番号「16」(=[ 10000])、「24」(=[ 11000])が復元されるようになる。
(2)供給機構
FIFOから命令に物理レジスタ番号を供給するための供給機構は、FIFOからのデータを読み出す処理と、読み出したデータを命令に供給する処理とを複数同時並行して行えるようにパイプライン化されている。具体的には、供給機構は、
・ FIFOから物理レジスタ番号を読み出すリード回路30、
・ FIFOから読み出した物理レジスタ番号を保持するパイプライン・レジスタ31、
・ 物理レジスタ番号の供給を開始するパイプライン・レジスタ31のエントリを指示する先頭ポインタ32、
・ パイプライン・レジスタ31に保持された物理レジスタ番号を命令に供給するサプライ回路33、
を備えて構成されている。
リード回路30は、命令発行幅と同数のリード・ポートRPを備えている。ここではリード回路30の構成の簡易化のため、各リード・ポートRPのアクセス可能なFIFOを限定するようにしている。具体的には、各リード・ポートRPはそれぞれ、リード・ポート数で除算したときの剰余が一致する番号のFIFOに対してのみアクセス可能とされている。なお以下の説明では、各リード・ポートRPに対してそのポートがアクセス可能なFIFO番号の上記剰余の値を番号として付すとともに、そのn番のリード・ポートを「リード・ポートRPn」と表記する。例えば図7では、リード・ポートRP0はFIFO(0)及びFIFO(4)に、リード・ポートRP1はFIFO(1)及びFIFO(5)に、リード・ポートRP2はFIFO(2)及びFIFO(6)に、リード・ポートRP3はFIFO(3)及びFIFO(7)に、それぞれアクセス可能とされている。ちなみに、各リード・ポートRP0〜RP3は、読み出しが行われる都度に、アクセス可能なFIFOの中からデータを読み出すFIFOを順に切り替えるようにしている。
パイプライン・レジスタ31は、上記リード・ポートRPと同数の、すなわち命令発行幅と同数のエントリを備えており、各エントリは各リード・ポートRPの出力にそれぞれ接続されている。以下、説明のため、パイプライン・レジスタ31の各エントリについても、対応するリード・ポートRPと同じ番号を付すこととする。各エントリには、上記リード・ポートRPによってFIFOのエントリから読み出された値が格納される。
サプライ回路33は、同時にレジスタ・リネーミングの行われる各命令に対して物理レジスタ番号をそれぞれ出力する、発行命令数と同数の出力バスOBを備えている。そしてサプライ回路33は、パイプライン・レジスタ31の各エントリから読み出した物理レジスタ番号をそれぞれ出力バスOBのいずれかに渡すようにしている。
出力バスOBは、パイプライン・レジスタ31のエントリから渡された物理レジスタ番号を、レジスタ・リネーミングを行う命令に供給する。なお、以下の説明では、物理レジスタ番号を供給する命令のフェッチの順に各出力バスOBに番号を付すとともに、「n番」の出力バスOBを「出力バスOBn」と表記する。例えば図7に示されるMSBの状態では、命令j5,j6,j7,j8の順にフェッチされて、同時にレジスタ・リネーミングの行われる4つの命令に対して、出力バスOB0は命令j5に、出力バスOB1は命令j6に、出力バスOB2は命令j7に、出力バスOB3は命令j8に、物理レジスタ番号をそれぞれ出力する。
ここでは構成の簡易化を図るため、パイプライン・レジスタ31を上記先頭ポインタ32によって指定されるエントリを先頭とした循環キューとして用い、その循環キュー内の値が出力バスOB上に順次読み出されるように、パイプライン・レジスタ31の各エントリ0〜3と各出力バスOB0〜OB3とを接続するようにしている。なおレジスタ・リネーミング後に先頭ポインタ32の値は、そのときにレジスタ・リネーミングを行った命令数だけ進められる。より具体的には、先頭ポインタ32の値にレジスタ・リネーミングを行った命令数を加算したものを命令発行幅で除算したときの剰余が、同先頭ポインタ32の次の値となる。例えば図7に示されるMSBの状態では、先頭ポインタ32の値が「1」であるため、パイプライン・レジスタ31の1番のエントリが出力バスOB0に、2番のエントリが出力バスOB1に、3番のエントリが出力バスOB2に、0番のエントリが出力バスOB3に、それぞれ接続される。またこのときのレジスタ・リネーミングを行った命令数は「4」であるため、先頭ポインタ32の値は「1」に更新される。
ちなみに、プロセッサの初期状態では、パイプライン・レジスタ31のエントリはすべて空となっている。そのため、初期化処理として、リード・ポートRPに接続されたFIFOのうちで番号の最も小さいものの先頭エントリから物理レジスタ番号を読み出してパイプライン・レジスタ31の各エントリに書き込むとともに、先頭ポインタ32の値を「0」にセットする処理を行う。この状態では、パイプライン・レジスタ31に格納された各物理レジスタ番号は、先頭ポインタ32の指す0番のエントリを先頭としてモジュロ・ソートされた状態となっている。その後、レジスタ・リネーミングが行われる都度、パイプライン・レジスタ31から先頭ポインタ32の指すエントリを先頭として、必要な数の物理レジスタ番号が同時に読み出され、命令に供給される。そして物理レジスタ番号が読み出されて空となったパイプライン・レジスタ31のエントリには、対応するリード・ポートRPに接続されたFIFOから読み出された物理レジスタ番号が書き込まれるようになる。
(3)リストア機構
次に、上記サプライ回路33によるパイプライン・レジスタ31のエントリへの物理レジスタ番号の書き込みに際して、アクセスされたFIFOが空のときの処理を行うリストア機構について説明する。この機構は、パイプライン・レジスタ31から読み出した物理レジスタ番号の中に、最上位ビットが[1]のもの、すなわち空のFIFOから読み出された上記無効な物理レジスタ番号が含まれていると、その物理レジスタを供給しようとした命令以降のレジスタ・リネーミングの処理をその時点で無効化させる。そして次サイクル以降は、パイプライン・レジスタ31とバックアップ・レジスタ34との双方へのアクセスを通じて、最上位ビットが[0]の有効な物理レジスタ番号の読み出しを試みる。
図7に示すように、この機構は、バックアップ・レジスタ34、ローテーション・バス35及びサプライ・バス36を備えて構成されている。
バックアップ・レジスタ34は、各出力バスOB0〜OB3に渡された値をそれぞれ格納する、命令発行幅と同数のエントリを備えている。この出力バスOB0〜OB3からバックアップ・レジスタ34の各エントリへの値の受け渡しは、命令発行幅と同数設けられたサプライ・バス36を通じて行われる。以下説明のため、バックアップ・レジスタ34の各エントリに、対応する出力バスOBの番号と同じ番号を付すこととする。
ローテーション・バス35は、バックアップ・レジスタ34の各エントリの値を、番号が1つ小さいエントリへと移行するためのバスとなっている。ただしバックアップ・レジスタ34の「0番」のエントリの値は、番号の最も大きいエントリに移行されるようになっている。
サプライ・バス36は、バックアップ・レジスタ34の各エントリの値を、レジスタ・リネーミングされる各命令に渡すためのバスとなっている。なおこのサプライ・バス36は、フェッチ順に整列された命令列の先頭から、バックアップ・レジスタ34の1番のエントリから順番に物理レジスタ番号を供給するように構成されている。したがって、サプライ・バス36の2番エントリからはフェッチ順が2番目の命令に、1番エントリからはフェッチ順が1番の命令にそれぞれ物理レジスタ番号が供給されるようになる。またバックアップ・レジスタ34の「0番」のエントリからは、フェッチ順で最後の命令に物理レジスタ番号が供給されるようになっている。
こうした機構には、バックアップ状態とリストア状態との2つの状態があり、状態に応じて異なった動作を行う。プロセッサの初期化時には、機構の状態はバックアップ状態にセットされる。
バックアップ状態では、パイプライン・レジスタ31からフェッチの順に命令へと供給される物理レジスタ番号を、バックアップ・レジスタ34に順次保存していく。このときに保存される物理レジスタ番号に、空のFIFOから読み出された無効な番号が含まれていれば、その番号を供給しようとした命令以降のレジスタ・リネーミングの結果を無効化させるとともに、先頭ポインタ32の値を1つだけ進める。そして機構の動作状態をリストア状態に遷移させる。
リストア状態では、レジスタ・リネーミングを行う命令のうち、フェッチ順で一番後の命令を除くその他の命令には、バックアップ・レジスタ34から読み出された物理レジスタ番号がサプライ・バス36を通じて供給される。すなわち、これらの命令には、本来は前サイクルにおいてフェッチ順で次の命令に供給される予定であった物理レジスタ番号が供給されることになる。このとき同時に、ローテーション・バス35を通じて、ここで物理レジスタ番号を供給したバックアップ・レジスタ34のエントリの値が1つ前の番号のエントリに、すなわち供給された命令に対応するエントリに書き込まれる。
一方、フェッチ順で一番後の命令には、パイプライン・レジスタ31から物理レジスタ番号を供給する。ただし、このときには、上述したように先頭ポインタ32の値が1つ進められていることから、前サイクルで同命令に供給される予定だったパイプライン・レジスタ31のエントリではなく、その次のエントリから物理レジスタ番号の供給が行われる。この物理レジスタ番号は、それが供給された命令に対応するバックアップ・レジスタ34のエントリに保存される。
こうして命令に供給された物理レジスタ番号の中に、無効な番号が含まれていなければ、機構の動作状態をバックアップ状態に復帰させる。一方、無効な番号が再び含まれていれば、その無効な番号を供給しようとした命令以降のレジスタ・リネーミングの結果を再度無効化させ、先頭ポインタ32の値を再び1つ分だけ進める。このときには機構の動作状態はリストア状態にそのまま維持され、再び上記のようなパイプライン・レジスタ31とバックアップ・レジスタ34との双方へのアクセスを通じた物理レジスタ番号の供給が行われることになる。
以上のように構成された供給機構及びリストア機構の動作を、図9を併せ参照して説明する。ここでは、RCエントリ数が「8」、命令発行幅が「4」、パイプラインがフェッチ、デコード、実行、ライトバック及びコミットの4ステージ構成のプロセッサで、命令j0〜j7のプログラムを実行する場合のMSBの動作を例として説明する。
・初期状態: 図9(a)は、上記プログラムの実行前のFIFOの状態を示している。同図の状態では、FIFO全体には、「0」〜「4」、「6」、「8」〜「12」、「14」の各物理レジスタ番号が保持されている。この状態では、下位3ビットの値が「5」及び「7」となる物理レジスタ番号がFIFO全体に存在しないため、5番及び7番のFIFOは空の状態となっている。
・1サイクル目: 図9(b)に、プログラム開始後の最初のサイクルにおけるMSBの状態を示す。プログラムが開始されると、まずはパイプライン・レジスタ31及び先頭ポインタ32の初期化が行われる。この初期化によって先頭ポインタ32の値は「0」にリセットされる。またリード・ポートRP0〜RP3毎に、接続されるFIFOの内で番号の最も小さいFIFOの先頭エントリから、物理レジスタ番号が読み出され、パイプライン・レジスタ31の各エントリに書き込まれる。すなわち、リード・ポートRP0では、0番のFIFOの先頭エントリから物理レジスタ番号「0」が読み出され、パイプライン・レジスタ31の0番エントリに書き込まれる。同様にリード・ポートRP1〜RP3ではそれぞれ、1番〜3番のFIFOの先頭エントリに保持された物理レジスタ番号「1」、「2」、「3」が読み出され、パイプライン・レジスタ31の1番〜3番のエントリに書き込まれる。
・2サイクル目: 図9(c)に、プログラム開始から2サイクル目におけるMSBの状態が示されている。この2サイクル目には、命令j0〜j2への物理レジスタ番号の供給が行われる。このときの先頭ポインタ32の値は「0」、レジスタ・リネーミングを行う命令数は「3」であるため、パイプライン・レジスタ31の0番〜2番のエントリから物理レジスタ番号「0」、「1」、「2」がそれぞれ読み込まれ、命令j0〜j2にそれぞれ供給される。また、このときに読み込まれた物理レジスタ番号「0」、「1」、「2」は、バックアップ・レジスタ34の0番〜2番のエントリにもそれぞれ書き込まれる。一方、ここで物理レジスタ番号の読み出されたパイプライン・レジスタ31の0番〜2番のエントリにはそれぞれ、4番〜6番のFIFOの先頭エントリから読み出された新たな物理レジスタ番号が書き込まれる。ただし、上述しように5番のFIFOは空であるため、パイプライン・レジスタ31の1番のエントリには、最上位のビットが「1」の無効な物理レジスタ番号が書き込まれる。同図では、そうした無効な物理レジスタ番号の値を「空」と表記する。なお先頭ポインタ32の値は、このときに物理レジスタ番号を供給した命令数分、すなわち3つ分進められ、「3」となる。
・3サイクル目: 図9(d)に、プログラム開始から3サイクル目におけるMSBの状態を示す。この3サイクル目には、命令j3及び命令j4への物理レジスタ番号の供給が行われる。このときの先頭ポインタ32の値は「3」、レジスタ・リネーミングを行う命令数は「2」であるため、パイプライン・レジスタ31の3番及び0番のエントリから物理レジスタ番号「3」及び「4」が読み出され、命令j3及び命令j4にそれぞれ供給される。またそれらの物理レジスタ番号「3」及び「4」は、バックアップ・レジスタ34の0番及び1番のエントリにもそれぞれ書き込まれる。更に物理レジスタ番号の読み出されたパイプライン・レジスタ31の3番及び0番のエントリにはそれぞれ、7番及び0番のFIFOの先頭エントリから読み出された物理レジスタ番号が書き込まれる。ただし、このときのパイプライン・レジスタ31の3番のエントリには、空の7番のFIFOから読み出された無効な物理レジスタ番号が書き込まれることとなる。なお先頭ポインタ32の値は、2つ分進められ、「1」となる。
・4サイクル目: 図9(e)に、プログラム開始から4サイクル目におけるMSBの状態を示す。この4サイクル目には、命令j5〜j7への物理レジスタ番号の供給が行われる。このときの先頭ポインタ32の値は「1」、レジスタ・リネーミングを行う命令数は「3」であるため、1番〜3番の各エントリから物理レジスタ番号がそれぞれ命令j5〜j7に供給されるとともに、バックアップ・レジスタ34の0番〜2番のエントリに書き込まれる。ただし、このときには、命令j5に無効な物理レジスタ番号が出力されるため、バックアップ・レジスタ34をリストア状態に移行する。これにより、命令j5以降のレジスタ・リネーミングの結果は無効化され、先頭ポインタ32の値が1つ進められる。なおこのときに物理レジスタ番号の読み出しの行われたパイプライン・レジスタ31の1番〜3番の各エントリには、1番〜3番のFIFOの先頭エントリから物理レジスタ番号「9」、「10」、「11」がそれぞれ書き込まれる。
・5サイクル目: 図9(f)に、プログラム開始から5サイクル目におけるMSBの状態を示す。この5サイクル目には、先に無効な物理レジスタ番号が供給された命令j5以降に対する物理レジスタ番号が再試行される。同図に示すように、このときの先頭ポインタ32の値は「2」となっているため、パイプライン・レジスタ31の0番のエントリから読み出された物理レジスタ番号「12」が、このときのレジスタ・リネーミングにおける最後尾の命令j7に供給されるとともに、バックアップ・レジスタ34の2番目のエントリに書き込まれる。一方、残りの命令j5及び命令j6には、バックアップ・レジスタ34の1番及び2番のエントリから物理レジスタ番号「6」及び「空」がそれぞれ供給される。命令j5及び命令j6に供給された物理レジスタ番号は、バックアップ・レジスタ34の0番及び1番のエントリに書き込まれる。この結果としてバックアップ・レジスタ34の1番及び2番のエントリに格納された物理レジスタ番号は、それぞれ番号の1つ前の0番及び1番のエントリに移行されることになる。ただし、このときの命令j6には、無効な物理レジスタ番号が出力されることになるため、バックアップ・レジスタ34はリストア状態に維持されることとなり、命令j6移行のレジスタ・リネーミングの結果が無効化され、先頭ポインタ32の値が1つ進められる。
・6サイクル目: 図9(g)に、プログラム開始から6サイクル目におけるMSBの状態を示す。この6サイクル目には、未だ処理の完了していない命令j6及び命令j7に対するレジスタ・リネーミングが再び実行される。同図に示すように、このときの先頭ポインタ32の値は「3」となっているため、ここでレジスタ・リネーミングを行う最後尾の命令j7には、パイプライン・レジスタ31の1番のエントリから読み出された物理レジスタ番号「9」が供給される。またその物理レジスタ番号「9」は、バックアップ・レジスタ34の2番エントリにも書き込まれる。一方、残りの命令j6には、バックアップ・レジスタ34の2番エントリから物理レジスタ番号「12」が供給され、その値はバックアップ・レジスタ34の1番エントリにも書き込まれる。このときには命令に対する無効な物理レジスタ番号の供給は行われなかったため、バックアップ・レジスタ34をバックアップ状態に復帰させる。なおこのときの先頭ポインタ32の値は、物理レジスタ番号の供給を行った命令数「3」だけ進められ、「2」となる。
(4)巻き戻し機構
このMSBでも、分岐予測ミスが発生したときには、MSBの状態、すなわち先頭ポインタ32の値や各リード・ポートRPが次にアクセスするFIFOの番号、パイプライン・レジスタ31の状態を、その発生以前の状態に巻き戻すようにしている。
ここでは、こうした状態の巻き戻しを行うため、分岐命令のレジスタ・リネーミングを行う都度、その分岐命令に対して再開ポイントを渡すようにしている。再開ポイントの値は、分岐命令の次にフェッチされる命令に対して物理レジスタ番号を供給するFIFOの番号とされている。この値(FIFO番号)は、分岐命令のレジスタ・リネーミング時において最後に供給の行われた物理レジスタ番号の下位「Brビット」の値に「1」を加算して得ることができる。こうした再開ポイントの受け渡しは、実際に分岐を実行するまでに処理すれば良いため、プログラムの実行速度に影響を与えることなくその処理を実行することが可能である。
巻き戻し機構は、分岐予測ミスが発生すると、まずMSBのパイプライン・レジスタ31のフラッシュと、各リード・ポートRP0〜RP3の状態のリセットとが行われる。そして、分岐予測をミスした分岐命令の保持する再開ポイントの値を用いて、各リード・ポートRP0〜RP3の状態と先頭ポインタ32の値とを巻き戻す。具体的には、再開ポイントの値の指し示す番号から命令発行数分の番号のFIFOに対して、各リード・ポートRP0〜RP3のアクセスが再開されるようにそれらの状態をセットする。また、再開ポイントの値の指し示す番号のFIFOが接続される出力バスOBの番号を先頭ポインタ32の値にセットする。これにより、再開ポイントの指示するFIFOから、物理レジスタ番号の供給を再開することができる。これらの処理後、FIFOから物理レジスタ番号が読み出され、空のパイプライン・レジスタ31に書き込まれる。
(5)各部の回路構成の詳細
続いて、以上説明した複数命令発行対応型MSBの各部の具体的な回路構成について説明する。
5−1 リード回路
まず、上記供給機構のリード回路30の詳細な回路構成を、図10を併せ参照して説明する。図10は、リード回路30における0番のリード・ポートRP0の周辺部分の回路構成を示している。上述したようにリード・ポートRP0は、FIFO[ 000]及びFIFO[ 100]のいずれかから物理レジスタ番号を受け取り、パイプライン・レジスタ31の0番エントリに出力する。なお同図に記載の数値はすべて2進数で表記されている。
各FIFOのエントリは、これに格納される物理レジスタ番号の上位(Bm−Br)ビット及びその最上位に付加されるEフラグの各ビットの値をそれぞれ保持する(Bm−Br+1)個のメモリ・セル40をそれぞれ備えて構成されている。FIFOの各エントリの同桁のメモリ・セル40同士は、それぞれパス・トランジスタ41を介してエントリ順に直列に接続されている。更にFIFOの先頭エントリでは、各メモリ・セル40の出力がパス・トランジスタ42を介してリード・ポートRPに接続されている。
また各FIFOには、その各エントリの値を出力側に1段シフトさせるためのシフト・フラグの状態を保持するメモリ・セルSと、FIFOからリード・ポートRPに値を読み出させるためのリード・フラグの状態を保持するメモリ・セルRとがそれぞれ設けられている。メモリ・セルSの出力はFIFOのエントリ間の各パス・トランジスタ41のゲートに、メモリ・セルRの出力はFIFOの先頭エントリ=出力バスOB間の各パス・トランジスタ42のゲートに、それぞれ接続されている。またメモリ・セルRの出力はANDゲート43にも接続されている。ANDゲート43には、メモリ・セルRの出力に加え、読み出し信号S-readが入力されており、その出力はメモリ・セルSに入力されている。一方、メモリ・セルRには、自身のFIFOのANDゲート43の出力を選択制御信号S-selectとし、論理レベルの信号[0]と、同じリード・ポートRPに接続された、読み出し順の一つ早いFIFOのANDゲート43の出力と、をそれぞれ入力信号A1,A2とする2入力のマルチプレクサ(mux)44の出力が入力されている。ちなみにこのマルチプレクサ44は、選択制御信号S-selectが[1]のとき[0](入力信号A1)を、同選択制御信号S-selectが[0]のとき上記読み出し順の一つ早いFIFOのANDゲート43の出力(入力信号A2)をそれぞれ選択して出力するよう構成されている。
さて図10の構成例では、物理レジスタ番号のビット長Bmが「5」、RCエントリ数のビット長が「3」であるため、物理レジスタ番号の上位2ビットの最上位にEフラグを付加した3ビットの値が、FIFOの各エントリに保持される。そのため、FIFOの各エントリは3個のメモリ・セル40で構成されている。このようなFIFOの各エントリの保持するビット列の末尾にFIFO番号を連結することで、物理レジスタ番号を復元することができる。
ここで命令発行幅の2進数表記におけるビット長を「Bi」とすると、FIFO番号の下位Biビットは、FIFOの接続されるリード・ポートRPの番号と等しく、パイプライン・レジスタ31の各エントリに保持される物理レジスタ番号の下位Biビットはそれぞれ固定されている。そのため、FIFOからパイプライン・レジスタ31へと、FIFO番号の下位Biビットをわざわざ伝送する必要はない。そこでここでは、FIFO番号の下位Biビットを除いた値のみを付加することとする。例えば図10の構成では、RCエントリ数のビット長Brが「3」、命令発行幅のビット長Biが「2」のため、FIFO番号の上位1ビットを、FIFOの先頭エントリから読み出したビット列の末尾に付加するようにしている。これにより、リード・ポートRPの配線数を減らすことができる。具体的には、このときの各リード・ポートRPの配線数はそれぞれ「(Bm−Bi+1)本」となる。
こうした「(Bm−Bi+1)本」の配線のうちの1本は、物理レジスタ番号のEフラグに、残りは物理レジスタ番号の上位「(Bm−Bi)ビット」のビット列における各ビットに、それぞれ対応する。各配線には、その配線がチャージ状態にあるか、ディスチャージ状態にあるかを検出する検出回路45が設けられており、その検出結果がパイプライン・レジスタ31の対応するエントリに送られるようになっている。
ちなみに、FIFO番号の上位「(Br−Bi)ビット」の値は、FIFO毎に固定された定数であるため、数値に応じてパス・トランジスタ42を電源Vcc又はグランドGNDに接続するようにすればよい。例えば図10の場合、リード・ポートRP0は、4本の配線L0〜L3により構成されている。Eフラグに対応する配線L0、物理レジスタ番号の上位2ビットに対応する配線L1及び配線L2は、上記パス・トランジスタ42を介してFIFO[ 000]及びFIFO[ 100]の先頭エントリの各メモリ・セルの出力にそれぞれ接続されている。一方、物理レジスタ番号の上位から3ビット目、すなわちFIFO番号の上位1ビットに対応する配線L3は、パス・トランジスタ42を介して、FIFO[ 000]ではグランドGNDに、FIFO[ 100]では電源Vccにそれぞれ接続されている。
次にこうしたリード回路30の動作を説明する。
そのFIFOのリード・フラグの値が「1」の場合、パス・トランジスタ42が導通し、そのFIFOの先頭エントリの値に応じてリード・ポートRPの各配線L0〜L3がチャージ或いはディスチャージされる。そして各配線L0〜L3のチャージ/ディスチャージ状態が検出回路45にて検出され、増幅された上でパイプライン・レジスタ31の対応するエントリに伝送される。なおパス・トランジスタ42だけでは、配線のチャージ、ディスチャージを十分高速に行えないような場合には、パス・トランジスタ42のFIFO側にインバータを配置すると良い。
一方、そのFIFOのリード・フラグの値が「1」であるときに、そのFIFOの接続されたリード・ポートRPに対する読み出し信号S-readがアサートとなると、そのFIFOのシフト・フラグが「1」にセットされる。これとともに、そのFIFOのリード・フラグの値が「0」にリセットされるとともに、同じリード・ポートRPに接続された、読み出し順が次のFIFOのリード・フラグが「1」にセットされる。
シフト・フラグが「1」となると、そのFIFOのメモリ・セル40間のパス・トランジスタ41が導通され、各エントリのメモリ・セルは、保持中の値を次段のメモリ・セルに受け渡す。これにより、FIFOの各エントリの値は出力側のエントリに1段シフトされる。なお、シフト・フラグのセット後、そのFIFOのリード・フラグはリセットされるため、FIFOの各エントリの値をシフトした後、シフト・フラグは「0」にリセットされる。
ちなみに、以上のようなリード回路30の回路構成では、同じリード・ポートRPに接続されるFIFOのリード・フラグの動作回路(メモリ・セルR、ANDゲート43、マルチプレクサ44)を、読み出し順に周巡するように直列接続する必要がある。このとき、FIFOを単純に番号順に並べて配置すると、リード・フラグの動作回路間の配線長が不必要に長くなってしまう。例えば、あるリード・ポートRPiに接続されるFIFOの番号が「a+j・b」で表されるとする。ここで「a」は、リード・ポートRPiに接続されるFIFOのうちで最も番号の小さいFIFOの番号、「b」はRCエントリ数、「j」は、そのリード・ポートRPに接続されるFIFOの総数を「n」としたときの「0」から「n−1」までの整数のいずれかである。
ここで物理レジスタ番号の読み出しがFIFO番号の小さい順に行われるとし、図11(a)に示すように各FIFOを単純に番号順に並べて設置すると、番号順で先頭の「a」番のFIFOと末尾の「a+(n−1)・b」番のFIFOとのリード・フラグの動作回路(メモリ・セルR等)同士を繋ぐ配線が他のリード・フラグの動作回路間の配線に比して著しく長くなる。そしてその結果、末尾のFIFOから先頭のFIFOへの読み出しの切り替えに遅延が生じる虞がある。
一方、図11(b)では、FIFO番号の最小のものから番号順で「n/2」番目までのFIFOを番号昇順に一つおきに配置するとともに、空きの部分に残りのFIFOを番号降順で配置するようにしている。このようにすれば、リード・フラグの動作回路(メモリ・セル等)を互いに接続するFIFOは、1つおきに、或いは互いに隣接して配置されることとなり、配線長が極端に長い部分は形成されないようになる。
なお、以上説明したリード回路30の回路構成は、FIFOの総数が命令発行幅よりも大きく、各リード・ポートRPに複数のFIFOが接続される場合を示している。FIFOの総数と命令発行幅とが一致する場合には、FIFOの先頭エントリとパイプライン・レジスタ31とを直接接続するとともに、FIFOの各エントリの物理レジスタ番号をシフトする制御信号として読み出し信号S-readを用いるようにリード回路30を構成することができる。この場合、リード回路30の規模は大幅に小さくなる。
5−2 サプライ回路
図12は、パイプライン・レジスタ31に保持された物理レジスタ番号を出力バスOB0〜OB3に供給するサプライ回路33の回路構成を示している。同図では、一部の配線やポート・トランジスタ等が省略されている。
同図に示すようにサプライ回路33は、先頭ポインタ32の保持する値を入力とするデコーダ50を備えている。具体的には、パイプライン・レジスタ31の各エントリの出力は、それぞれパス・トランジスタ51を介して各出力バスOB0〜OB3に接続されており、パス・トランジスタ51のゲートには、デコーダ50の出力線が接続されている。出力バスOB0〜OB3の各配線は、そのチャージ状態を検出する検出回路52に接続されており、その検出回路52の検出結果は増幅された上で、命令に物理レジスタ番号を供給するための出力ドライバ(同図では図示略)に渡されるようになっている。
さて先頭ポインタ32の値が入力されるとデコーダ50は、パイプライン・レジスタ31の各エントリの値がそれぞれ、先頭ポインタ32の値に応じた適切な出力バスOB0〜OB3に渡されるように、適切なパス・トランジスタ51を選択してこれを導通させる。これにより、パイプライン・レジスタ31の各エントリの値に応じて出力バスOB0〜OB3の各配線がチャージ/ディスチャージされる。出力バスOB0〜OB3の各配線のチャージ状態は、検出回路52にて検出、増幅されて上記出力ドライバに送られる。このとき、出力バスOB0〜OB3の各配線のチャージ/ディスチャージをパス・トランジスタ51だけでは十分高速に行えないのであれば、パス・トランジスタ51のパイプライン・レジスタ31側にインバータを設置すると良い。
なお、パイプライン・レジスタ31の各エントリの下位Biビットは、パイプライン・レジスタ31のエントリ番号と同じ値に常に固定されている。そのため、そうしたビット列に対応するパイプライン・レジスタ31の出力線は省略し、パス・トランジスタ51をエントリ番号に応じて電源Vcc又はグランドGNDに接続するようにすれば、パイプライン・レジスタ31の出力線数を削減することができる。
ちなみに、先頭ポインタ32の値によってデコーダ50の導通させるパス・トランジスタ51の組合せは一義的に決まるため、デコーダ50は1つだけでもサプライ回路33を十分に機能させることは可能である。ただし、そうした場合には、デコーダ50の配線が同時に駆動するパス・トランジスタ51の数が多くなってしまい、パス・トランジスタ51の動作速度の確保が困難となってしまう虞がある。こうした問題は、出力バスOB毎、或いはパイプライン・レジスタ31のエントリ毎に先頭ポインタ32及びデコーダ50をそれぞれ設置し、駆動するパス・トランジスタ51をそれぞれに分担させることで解消することができる。
図13(a)に、このように先頭ポインタ及びデコーダを多重化した場合のサプライ回路33の構成例を示す。なお同図では、0番以外の出力バスOB1〜OB3はその図示が省略されている。同図の構成例では、出力バスOB0〜OB3のそれぞれについて、先頭ポインタ32A〜32D及びデコーダ50A〜50Dが個別に設置されており、各デコーダ50A〜50Dは、それぞれ対応する出力バスOBに接続されたパス・トランジスタ51のみを駆動するように構成されている。なお、それぞれの先頭ポインタ32A〜32Dには、すべて同じ値が供給されるようになっている。このように構成すれば、回路構成が冗長とはなるが、個々のデコーダ50A〜50Dが同時に駆動するパス・トランジスタ51の数を抑えることができ、それらの駆動速度を容易に確保することが可能となる。
図13(b)には、デコーダ50AをNOR型デコーダとして構成したときのデコーダ内部の回路構成が示されている。このように多重化したときの各デコーダ50A〜50Dの構成は極単純なものとすることができる。ちなみにこのときの各デコーダ50A〜50Dの出力線が同時に駆動するパス・トランジスタは、各出力バスOB0〜OB3の配線数と同数となる。
5−3 バックアップ・レジスタ
続いてバックアップ・レジスタ34の詳細な回路構成について説明する。図14は、バックアップ・レジスタ34の3番エントリ及びその周辺部分の回路構成を示している。
バックアップ・レジスタ34の各エントリは、物理レジスタ番号の各ビットをそれぞれ記憶・保持する複数のメモリ・セル55を備えて構成されている。各メモリ・セル55は、出力バスOBから検出回路52(図12参照)を介して受け取った値を出力ドライバ56に受け渡すためのサプライ・バス36に、パス・トランジスタ57を介して接続されている。このパス・トランジスタ57のゲートには、ローテーション信号が入力されており、同ローテーション信号が論理レベルの信号「0」のときにそのソース・ドレインが導通されるようになっている。
また各エントリのメモリ・セル55は、ローテーション・バス35を介して、一つ小さい番号のエントリの同桁のメモリ・セル55にそれぞれ接続されている。ただし、0番エントリの各メモリ・セル55は、ローテーション・バス35を介して最後尾の番号のエントリの同桁のメモリ・セル55に接続されている。ローテーション・バス35上には、パス・トランジスタ58が設けられており、物理レジスタ番号を受け取るエントリのローテーション信号が論理レベルの信号「1」のときに導通される。
ローテーション信号は、バックアップ・レジスタ34のエントリ毎に個別に供給されている。このローテーション信号が論理レベルの信号「0」のときには、出力バスOBとメモリ・セル55との間のパス・トランジスタ57が導通されて、出力バスOB上の値がメモリ・セル55に書き込まれる。一方、ローテーション信号が論理レベルの信号「1」のときには、ローテーション・バス35上のパス・トランジスタ58が導通されて、番号の一つ小さいエントリの値がメモリ・セル55に書き込まれる。またこのときには、ローテーション・バス35上の値が出力ドライバ56にも供給される。なお、バックアップ・レジスタ34がバックアップ状態で動作しているときには、各エントリのローテーション信号はすべて論理レベルの信号「0」となる。一方、リストア状態で動作しているときには、フェッチ順で一番後の命令に対応するエントリのローテーション信号は論理レベルの信号「0」に、それ以外のエントリのローテーション信号は論理レベルの信号「1」となる。
5−4 プロセッサの動作周波数への影響
続いて、MSBがプロセッサの動作周波数に与える影響について検討する。MSBの導入されたプロセッサには、MSBとダイレクト・マップ方式のレジスタ・キャッシュとが搭載されている。ここでMSBの遅延時間が、レジスタ・キャッシュの遅延時間よりも短ければ、少なくともプロセッサの動作周波数に対する悪影響は無いと判断することができる。なお、ランダム・アクセルを行うレジスタ・キャッシュに対して、MSBではFIFO順に規則正しいアクセスを行うため、パイプライン化や回路構成の簡易化が容易である。ちなみに上述した回路構成では、MSBは、FIFOからパイプライン・レジスタ31に値を受け渡す第1ステージと、パイプライン・レジスタ31から出力ドライバ56に値を受け渡す第2ステージとの2ステージにパイプライン化されている。またMSBは、保持する値(物理レジスタ番号)のビット長や1命令当たりに必要とされるリード・ポート数がレジスタ・キャッシュよりも少ないため、必要な配線規模が小さくなる。そのため、MSBの遅延時間をレジスタ・キャッシュの遅延時間よりも短くすることは比較的容易に行える。
ちなみに、上述した複数命令発行型MSBを導入したプロセッサについて、MSB及びレジスタ・キャッシュの遅延時間を解析的に見積もった結果によれば、MSBの遅延時間はレジスタ・キャッシュの遅延時間よりも短くなることが確認されている。この遅延時間の解析は、レジスタ・キャッシュ及びMSBのそれぞれについて遅延時間を決定する要素(ゲート段数、配線長、配線に接続されたトランジスタ数)を、それぞれ比較検討することで行われている。この解析結果によれば、MSBの各ステージにおけるゲート段数、配線長、配線に接続されたトランジスタ数はいずれも、レジスタ・キャッシュのものよりも小さく、MSBの導入は、プロセッサの動作周波数を低下させる要因にはならないことが確認されている。
(7) MSBの評価
続いて、以上説明した本実施形態のプロセッサの性能評価の結果を説明する。発明者等は、スーパスカラ・プロセッサ用のシミュレータ(Simple Scalar Tool Set)に、階層型レジスタ・ファイルと後述の4つのレジスタ管理方式のいずれかとを組み込んで、表1に示される条件で評価を行っている。この評価には、「MIPS R100000」の拡張命令セットである「Simple Scalar/PISA」が使用されている。またこの評価には、ベンチマーク・プログラムとして、「SPECint2000 」の「bzip2 」、「gcc 」、「gzip」、「mcf 」、「paser 」、「perl」、「votex 」、及び「vpr 」の8つのプログラムが使用されている。なお「gcc 」では、最初の1ギガ個の命令を、他のプログラムでは最初の2ギガ個の命令をスキップさせた後、100メガ個の命令を実行した。
Figure 2007304663
この評価は、レジスタ管理態様のそれぞれ異なる次の4つのプロセッサ・モデルについて行われている。すなわち、
・「DMモデル」: 従来の一般的なダイレクト・マップ方式のレジスタ・キャッシュを採用するモデル、
・「MSBモデル」: ダイレクト・マップ方式のレジスタ・キャッシュを用い、上述したMSBによりモジュロ・ソートを行った上で命令への物理レジスタ番号の割り当てを行うモデル、
・「MSB−rモデル」: 上記MSBモデルに上述の巻き戻し機構を追加し、分岐予測ミス時にMSBの状態の巻き戻しを行うモデル、
・「LRUモデル」: LRU方式のレジスタ・キャッシュを用いるモデル、
の4つのモデルを評価対象としている。
いずれのモデルにおいても、書き込みポリシーとしては、命令の生成した値のすべてをレジスタ・キャッシュに書き込む「All Cache 方式」を採用している。LRUモデルについては、連想度を「2」、「4」、「full」と変化させた3つのモデル(以下、それぞれ以下、「2-WAY」、「4-WAY」、「FA」と記載する)を用意した。
まず各モデルにおけるレジスタ・キャッシュの遅延時間について述べる。DMモデル、MSBモデル及びMSB−rモデルでは、レジスタ・キャッシュへのアクセスがダイレクト・マップ方式で行われるため、物理レジスタ番号の下位ビットからRCエントリが一意に定まる。一方、LRUモデルでは、LRU方式のレジスタ・キャッシュを採用し、且つそのアクセスに連想方式を採用しているため、レジスタ・キャッシュの参照時には連想検索を行い、書き込み時には更新時刻が最も古いエントリを検索する必要がある。これらの検索処理は、連速度やRCエントリ数が増加するに従い複雑となり、レジスタ・キャッシュの遅延時間やチップ上での占有面積を増大させる要因となる。更にレジスタ・キャッシュの面積の増大は、命令の出力する値をレジスタ・ファイルに受け渡す結果バスにおける遅延時間の増大も招いてしまう。したがって、LRUモデルの評価には、後述する評価結果の数値には表れない、そうしたディメリットを考慮する必要がある。これに対して、MSB、MSB−rモデルでは、ダイレクト・マップ方式のレジスタ・キャッシュを特に変更せずにMSBを導入することができ、上述したようにMSBの遅延時間はレジスタ・キャッシュの遅延時間よりも短いため、LRUモデルのようなディメリットは存在しない。
図15に、RCエントリ数をそれぞれ「8」、「16」、「32」、「64」としたときの上記各モデルのRCミス率を示す。同図に示されるグラフの縦軸はRCミス率のベンチマーク平均を、横軸はRCエントリ数をそれぞれ示している。また各RCエントリ数における6本組の縦棒は、図中左側から順にDMモデル、MSBモデル、2-WAY、4-WAY、FAのLRUモデルのものとなっている。
同図から明らかなように、RCエントリ数「8」、「16」、「32」及び「64」のそれぞれにおけるMSBモデルのRCミス率は、DMモデルよりも「2.1%」、「4.3%」、「5.7%」、「4.1%」減少している。また同様にMSB−rモデルのRCミス率は、DMモデルよりも「2.2%」、「4.6%」、「6.4%」及び「5.2%」減少している。この結果は、2-WAYのLRUモデルと同程度となっている。一方、MSB、MSB−rモデルのRCミス率は、4-WAYやFAのLRUモデルよりは高いものの、LRUモデルでは連想度の増加につれてレジスタ・キャッシュの遅延時間や面積の増大といったディメリットが顕著となる。そのため、RCミス率のみを着目し、MSB、MSB−rモデルよりも、4-WAYやFAのLRUモデルの方が優れているとは言えないことに留意する必要がある。
なおRCミス率は、MSBモデルよりもMSB−rモデルの方が若干低く抑えられてはいるが、その差は各モデルの動作原理から予測されるものよりは軽微となっている。この原因としては、一度の分岐予測ミスの発生でフラッシュされる命令数が多く、レジスタ・キャッシュのほとんどのエントリが無効化されてしまうことが考えられる。そこでそうした仮説の正当性を確認するため、MSB、MSB−rの両モデルについて、分岐予測ミスの発生頻度とその結果として無効化されるRCエントリ数とを調査した。分岐予測ミスの発生頻度は、RCエントリ数の多少にほとんど影響を受けず、平均約68命令の実行毎に1回の分岐予測ミスが発生していることが確認されている。一方、無効化されるRCエントリ数については、図16に示す通りの結果が得られている。同図に示されるグラフの縦軸は1度の分岐予測ミスの発生により無効化されたRCエントリ数の平均値を、横軸はRCエントリの総数をそれぞれ示している。また各RCエントリ数における2本組の縦棒は、図中左側がMSBモデルのものを、図中右側がMSB−rモデルのものをそれぞれ示している。同図から明らかように、いずれの場合においても、無効化されるRCエントリの数は、RCエントリの総数の「50%」に満たず、上記仮定は正しくないことが確かめられた。
他の原因としては、分岐予測ミス時には、パイプラインのバブルが、すなわち無効化された命令の処理にパイプラインの各ステージがしばらく占有されてしまう現状が発生し、実際には、予測ミスした分岐命令以前の命令と正しい分岐先の命令とはオーバーラップ実行されていないことが考えられる。オーバーラップ実行されていなければ、これらの命令がレジスタ・キャッシュ上で競合することもなく、MSBの状態の巻き戻しは、あまり効果を奏さない。この仮説の正当性を確かめるため、正しい分岐先の命令が開始された時点において、予測ミスした分岐命令以前の命令の実行状態を調査した。その結果、RCエントリ数に拘わらず、予測ミスした分岐命令以前の命令は、正しい分岐先の命令の実行が開始された時点ではそのほとんどが実行を終了しており、実行待ちとなっている命令数は平均「0.8個」に過ぎないことが確かめられた。したがって、MSBモデルとMSB−rモデルとの間にRCミス率に殆ど差のないのは、これが原因であると考えられる。
続いて、各モデルがプロセッサの性能に与える影響について説明する。図17には、RCエントリ数をそれぞれ「8」、「16」、「32」、「64」としたときの各モデルのIPC(Instruction Per Clock :1サイクル当たりの命令実行数)の測定結果を示す。同図のグラフの縦軸は、DMモデルのIPCを基準「 100%」としたときの、他のモデルのIPCの向上率のベンチマーク平均値を、横軸はRCエントリ数をそれぞれ示している。また各RCエントリ数における5本組の縦棒は、図中左側から順にMSBモデル、2-WAY、4-WAY、FAのLRUモデルのものとなっている。
同図に示されるように、RCエントリ数によって多少の違いはあるものの、MSB、MSB−rのIPC向上率は、同程度となっている。これはRCミス率が同程度であることからも明らかである。また同じ理由により、MSB、MSB−rの両モデルのIPC向上率は、4-WAY及びFAのLRUモデルよりも低くなっているが、2-WAYのLRUモデルとは同程度となっている。
以上により、本実施形態におけるレジスタ管理方式は、レジスタ・キャッシュや結果バスの遅延時間の増大を招くことなく、連想度が「2」のLRU方式と同程度の性能向上を達成していることが分かる。一方、連想度を「4」以上とすれば、同一動作周波数での性能は本実施形態の方式よりも確かに高くはなるが、連想度を増加すれば、上述したディメリットによりプロセッサの動作周波数の向上が困難となるため、両者の優劣は一概には言えない。
一方、RCエントリ数と性能向上率との関係を見ると、MSB、MSB−rモデルの性能向上率は、RCエントリ数が「32」のときに最大となり、RCエントリ数が「64」のときにはそれよりも低くなっている。ちなみにこのときのDMモデルに対するRCミス率の削減量は平均「 6.4%」、IPC向上率は平均「 4.1%」となっている。このようにIPC向上率がRCエントリ数の増加に併せて単調増加しない理由は、RCエントリ数がある程度以上となると、エントリに余裕があるため、レジスタ・リネーミング時に物理レジスタ番号をランダムに供給しても、レジスタ・キャッシュ上でのエントリの競合が発生し難くなることにあると考えられる。なおそうしたレジスタ・キャッシュ上でのエントリの競合の発生頻度は、RCエントリ数よりはむしろ、物理レジスタ番号の供給速度を決める命令発行幅と、供給可能な物理レジスタ番号の総数を決める物理レジスタ数に依存すると考えられる。そこで上記仮説の正当性を確認するため、上記MSB−rモデルにおいて、命令発行幅と物理レジスタ数とを変化させながらIPCを測定したときのIPC向上率が最大となるRCエントリ数を確認する調査も併せ行った。
図18には、そうした調査の結果が示されている。同図に示すグラフの縦軸はDMモデルを基準「 100%」としたときのIPCの向上率のベンチマーク平均値を、横軸はRCエントリ数をそれぞれ示している。なお同図では、命令発行幅を「n」、物理レジスタ数を「m」としたモデルを(In,Pm)と表記したものが、測定結果の折れ線にそれぞれ付されている。同図に示されるように、プロセッサ構成によって、IPC向上率が最大となるRCエントリ数だけではなく、RCエントリ数に対するIPC向上率の変化傾向も変化している。したがって、本実施形態のレジスタ管理方式の性能向上率は、RCエントリ数だけでなく、命令発行幅や物理レジスタ数にも大きく依存することが確認された。
以上説明した本実施形態によれば、次の効果を奏することができる。
(1)レジスタ・キャッシュのアクセスに係るインデクスを、メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、命令のフェッチ順にインデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する物理レジスタ番号の割り当てを行うようにしている。そのため、命令に割り当てられた物理レジスタ番号のレジスタ・キャッシュへのインデクスの値を特定の値に偏ることなく分散させることができ、レジスタ・キャッシュのエントリの競合を低減して、RCミスを削減することができる。しかも、インデクスが物理レジスタ番号から一意に定められるため、レジスタ・キャシュのアクセス時間の短縮及びハードウェア構成の簡易化が可能である。したがって、レジスタ・キャッシュのハードウェア資源を有効活用して、プロセッサの処理性能を好適に向上することができる。
(2)インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させるとともに、その整列の順に物理レジスタ番号の割り当てを行うことで、割り当て順にインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを行うようにしている。具体的には、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、RCエントリ数と同数のバッファ(FIFO)を設け、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファを、命令のフェッチ順に切り替えるようにしている。そのため、比較的簡易なハードウェア構成で、割り当て順にインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを行うことができる。
(3)分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにしているため、分岐予測ミスの発生時にもインデクスをラウンド・ロビンに維持することができる。
(4)図4に示したMSBの改良構成では、各々に格納される物理レジスタ番号の下位Brビットを各FIFOの番号として用いるとともに、各FIFOには、物理レジスタ番号の下位Brビットを除いたビット列のみを記録するようにしている。そしてレジスタ・リネーミング時には、供給ポインタの指定するFIFOの先頭に記録されたビット列の後ろに、供給ポインタの保持するFIFO番号を連結することで、物理レジスタ番号を復元するようにしている。そのため、FIFOの各エントリのビット数をBrビット分節約し、より少ないハードウェア量でMSBを具現とすることができる。
なお、上記実施形態は以下のように変更してもよい。
・上記MSBに設けられる巻き戻し機構は、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにしている。こうしたインデクスの巻き戻しを行わない場合、分岐予測ミスが発生すると、一時的にモジュロ・ソートの順に物理レジスタ番号の割り当てが行われなくなることがある。もっとも、そうした一時的なモジュロ・ソートの乱れがプロセッサの処理性能に与える悪影響を許容できる場合には、巻き戻し機構を割愛し、その分、ハードウェア量を削減するようにしても良い。
・上記実施形態では、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、RCエントリ数と同数のバッファ(FIFO)を設け、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファを命令のフェッチ順に切り替えることで、物理レジスタ番号をモジュロ・ソートするようにしていた。こうした物理レジスタ番号のモジュロ・ソートは、これ以外の手法により行うこともできる。例えば、
○ 未使用の物理レジスタ番号をモジュロ・ソートした上でフリー・リストに順次蓄積し、そのフリー・リストから命令に供給する物理レジスタ番号を読み出す、
○ 未使用の物理レジスタ番号を一旦フリー・リストに保持させた後、フリー・リスト内の物理レジスタ番号をモジュロ・ソートする、
○ 未使用の物理レジスタ番号をフリー・リストに保持させ、レジスタ・リネーミングに際して、インデクスが適切な値の物理レジスタ番号をフリー・リストから検索して供給する、
といった手法によっても、命令に供給される物理レジスタ番号のモジュロ・ソートを行うことはできる。
・上記実施形態では、物理レジスタ番号をRCエントリ数で除算したときの剰余をレジスタ・キャッシュのインデクスとして設定するようにしていた。もっとも、物理レジスタ番号から一意に定まるようにインデクスを設定すれば、命令のフェッチ順にインデクスがラウンド・ロビンとなるように物理レジスタ番号の割り当てを行うことは可能であり、それにより特定の値へのインデクスの偏りを抑え、RCミスを削減することはできる。
(第2の実施形態)
以下、本発明に係るプロセッサ及びそのデータ処理方法を具体化した第2実施形態を、図19〜図28を参照して詳細に説明する。以下の説明では、数値を2進数で表記する場合、その値の前後に”[”、”]”をそれぞれ付して記載し、そうでない数値は特に断りの無い限り、10進数表記によるものとする。
上述したように、RCミスが発生すると、オペランドのアクセス・レイテンシが増加したり、他の命令の発行が妨げられたりするといったペナルティが生じる。上述したように、従来、レジスタ・キャッシュの書き込みポリシーや書き換えポリシーの改良によってRCミスの発生頻度を低減する対策が幾つか提案されている。しかしながら、レジスタ・キャッシュにはすべてのレジスタ値が保持されない以上、RCミスの発生を完全には無くすことができないため、たまたま発生したRCミスがプログラムの実行時間に決定的な悪影響を与えてしまう可能性は否めないものとなっている。
本実施形態のプロセッサ及びそのデータ処理方法では、プログラム全体の実行時間・実行サイクル数を決定するクリティカル・パスに着目したレジスタ・キャッシュの書き込みポリシーを採用することで、レジスタ・キャッシュ・ミス(RCミス)が発生してもプロセッサ性能が低下され難いようにしている。ここでのクリティカル・パスとは、プログラムの実行サイクル数を決定する命令列のことである。クリティカル・パス上にある命令の実行の遅延は、プログラム全体の実行サイクル数の増加に直結する。
図19にクリティカル・パスの一例を示す。同図には、命令i1〜i9の9つの命令からなる命令列のデータ・フロー・グラフが示されている。同図において、各命令i0〜i9を表すノード同士を繋ぐ矢印は、命令間のデータ依存関係を示している。実線の矢印はオペランド・バイパスによって、破線の矢印はレジスタ・ファイル・アクセスによって、それぞれデータの受け渡しが行われることを示している。ちなみに「オペランド・バイパス」とは、命令のデコード時にその命令の必要とするオペランド(データ)が結果バスに存在する場合に、レジスタ・ファイルを介さずにそのデータを結果バスから直接取得することをいう。なお各命令i0〜i9の表記において「i」の右に付された数値「1」〜「9」は命令のフェッチ順を示している。同図においてノードが強調して表示された命令列「i1→i3→i4→i8→i9」で構成されるパスがクリティカル・パスとなっている。クリティカル・パスは、命令列のデータ・フロー・グラフにおける最も長いパスとなっている。
ここでプログラム全体の実行サイクル数を必要最小限に抑えることを考えると、クリティカル・パス上の命令の実行の遅れは許容できないこととなる。これに対して非クリティカル・パス上の命令では、プログラム全体の実行サイクル数を増加させることなく、少なくとも1サイクルの実行の遅延を許容することができる。
そこで本実施形態では、クリティカル・パス上の命令によって使用されるデータのみをレジスタ・キャッシュに書き込むようにしている。こうしてレジスタ・キャッシュに書き込まれるデータの種類を制限することで、レジスタ・キャッシュのデータの置き換え頻度が低減されるようになり、クリティカル・パス上の命令によって使用されるデータの受け渡しについてはRCミスの発生を大幅に低減することができる。もっとも、この場合には、非クリティカル・パス上の命令に使用されるデータについては、レジスタ・キャッシュへの書き込みがそもそも行われないことから、必然的にRCミスが発生するようにはなる。ここでRCミスのペナルティを「nサイクル」とすると、RCミスが発生したときのプログラム全体の実行サイクル数の増加は、クリティカル・パス上の命令ではそのまま「nサイクル」となるが、非クリティカル・パス上の命令では「nサイクル」未満となる。そのため、非クリティカル・パス上の命令のRCミスは、クリティカル・パス上の命令のRCミスに比べれば、プロセッサ性能の低下は軽微なものに留まることになる。したがって、非クリティカル・パス上の命令に対するデータの受け渡しに際してRCミスがある程度発生しても、クリティカル・パス上の命令に対するデータの受け渡しに際してのRCミスの発生を防止しさえすれば、RCミスによるプロセッサ性能の低下を緩和することができる。
ちなみにクリティカル・パス上の命令によって使用されるデータにおいても、そのデータが上述のオペランド・バイパスによって得られるのであれば、そのデータの受け渡しにレジスタ・ファイル・アクセスは行われない。そのため、そうしたデータをわざわざレジスタ・キャッシュに書き込んだところで、そのデータのアクセス時間の短縮には全く寄与しないことになる。そればかりか、そうしたデータまでもがレジスタ・キャッシュに書き込まれるのであれば、限りあるレジスタ・キャッシュの資源が無駄に消費されることとなり、その書き込みによって必要なデータがレジスタ・キャッシュから追い出されてしまう可能性がある。そこでここでは、クリティカル・パス上の命令によって使用されるデータの中で、オペランド・バイパスによっては得られないデータのみを選択してレジスタ・キャッシュに書き込むこととする。なお以下の説明では、クリティカル・パス上の命令によって使用されるデータをCデータ(Critical Data )と記載する。またCデータの中でオペランド・バイパスでは得られないデータをNBCデータ(Non-Bypassed Critical Data)と記載する。
図20を用いて、こうした本実施形態のレジスタ・キャッシュの書き込みポリシーの作用を説明する。同図は、先の図19のデータ・フロー・グラフに示される命令列について、同図(a)はすべてのデータをレジスタ・キャッシュに書き込む場合の、同図(b)はNBCデータに限定してレジスタ・キャッシュに書き込む場合のそれぞれにおける命令の実行態様の例を示している。同図(a)(b)の縦軸は、命令の実行されるクロック・サイクルを示している。また各命令を表すノード同士を繋ぐ矢印は、命令間のデータ依存関係をそれぞれ示している。なお実線で示される矢印は、データの受け渡しがオペランド・バイパスで行われることを、破線で示される矢印は、データの受け渡しがレジスタ・ファイル・アクセスを通じて行われることをそれぞれ意味している。
ちなみに、同図では、RCミスのペナルティが「2サイクル」であると、すなわちデータの取得に際してRCミスが発生した場合にその命令の実行がそうでない場合よりも2サイクル遅れるものとしている。また説明を分かり易くするために、レジスタ・キャッシュのエントリは「2」しかないものとする。
図20(a)は、命令の生成するデータのすべてをレジスタ・キャッシュに随時書き込んでいく場合を示している。命令i2の生成したデータは、後続の命令i4によって使用されるが、そのデータは、その後に実行された命令i3及び命令i5の生成した2つのデータが書き込まれたことで、命令i4の実行時には既にレジスタ・キャッシュ上から追い出されてしまっている。そのため、命令i4にRCミスが発生することになる。この命令i4は、クリティカル・パス上にあるため、その実行がRCミスにより2サイクル遅れると、プログラム全体の実行サイクル数がその分増加してしまうようになる。
図20(b)は、上記NBCデータのみをレジスタ・キャッシュに書き込む場合を示している。上記命令列では、上記NBCデータは、命令i2から命令i4に受け渡されるデータのみであるため、命令i2の生成したデータのみがレジスタ・キャッシュに書き込まれる。そのため、クリティカル・パス上の命令i4の実行時まで、命令i2の生成したデータは追い出されることなくレジスタ・キャッシュ上に保持されることになる。したがって、この場合には、クリティカル・パス上の命令i4のRCミスは発生しないようになる。一方、非クリティカル・パス上の命令i7では、使用するデータがレジスタ・キャッシュに書き込まれないため、必然的にRCミスが発生することにはなる。ただし、そのペナルティによって同命令i7の実行が2サイクル遅れても、プログラム全体の実行サイクル数は増加しない。
このようにレジスタ・キャッシュに書き込むデータをNBCデータに限定すれば、プログラム全体の実行サイクル数の増加に直結するクリティカル・パス上の命令のRCミスを大幅に低減し、RCミスによるプロセッサの性能低下を効果的に緩和することができる。一方、上述したようにRCミスには、他の命令の発行を妨げてしまうという問題もある。本実施形態では、この問題についても、対策を講じるようにしている。
上述したようにRCミスの発生が他の命令の発行を妨げてしまう要因は、オペランドの取得に際してRCミスが発生してしまう命令を、オペランドのレジスタ・キャッシュからの取得(RCヒット)を前提として投機的に発行してしまうことにある。したがって、オペランドの取得時にRCミスが発生する命令を事前に検出し、そうした命令の投機的に発行を行わないようにすれば、上記問題は回避することができる。
ここで本実施形態では、上述したようにNBCデータに限定してレジスタ・キャッシュに書き込むようにしている。そのため、オペランドがNBCデータ以外の命令は必ずRCミスが発生することが分かっている。したがって、オペランドがNBCデータ以外の命令については、RCヒットを前提とした投機的な発行を禁止すれば、RCミスにより他の命令の発行が妨害されないようにすることができる。例えば先の図20(b)に例示した命令列の実行態様では、NBCデータである命令i2の生成したデータのみがレジスタ・キャッシュに書き込まれるため、オペランドがNBCデータでない命令i7には必ずRCミスが発生することが予め分かっている。そのため、RCヒットを前提として命令i7を投機的に発行しないようにすれば、そのRCミスが他の命令の発行を妨げることを事前に防止することができる。
以上説明したように本実施形態のプロセッサのデータ処理方法では、RCミスがプロセッサの性能に与える悪影響を緩和するために、
(イ) レジスタ・キャッシュに書き込むデータをNBCデータに限定すること、
(ロ) NBCデータをオペランドとする命令に限定して、RCヒットを前提とした投機的な発行を実施すること、
といった2つの対策を採っている。以下、こうしたデータ処理方法を実現するための具体的なプロセッサの構成について説明する。
(プロセッサの構成)
図21に、本実施形態のプロセッサの構成例を示す。同図に例示するプロセッサは、フェッチ・ユニット101、デコード・ユニット102、命令ウィンドウ(I−win)103、実行ユニット(EU)104、リオーダ・バッファ(ROB)105を備えている。またプロセッサには、メイン・レジスタ・ファイル(MRF)106及びレジスタ・キャッシュ(RC)107からなる階層型レジスタ・ファイルとマップ表108とが設けられてもいる。フェッチ・ユニット101は、主記憶装置からの命令の読み込みを行う。デコード・ユニット102は、読み込まれた命令の内容の解析(デコード)し、命令ウィンドウ103及びリオーダ・バッファ105にそれぞれ格納する。またデコード・ユニット102は、デコード時に定義した物理レジスタと論理レジスタとの対応関係をマップ表108に記憶する。命令ウィンドウ103は、実行前の命令を一時的に格納するバッファであり、プロセッサの制御回路は、このバッファから命令を取り出して、実行ユニット104に順次投入する。一方、リオーダ・バッファ105は、命令を格納するFIFO(First-In First-Out)式のバッファであり、格納された命令の中で格納の順が最も早い命令の実行が終了すると、その命令が取り出される(コミットされる)。なお上述したように、階層型レジスタ・ファイルのメイン・レジスタ・ファイル106は、すべてのレジスタ値を記憶し、より高速に動作可能なレジスタ・キャッシュ107は一部のレジスタ値のみを記録する。
また、このプロセッサには、クリティカル・パス予測機構(CP予測機構109)が設けられている。CP予測機構109は、フェッチした命令がクリティカル・パス上にあるか否かを予測する。なおCP予測機構109としては、非特許文献3及び4等に見られるように、様々な予測手法に基づくものが提案されている。例えばQold型予測機構は、命令ウィンドウ、又はリオーダ・バッファに存在する命令の中で最も古い命令をクリティカル・パス上の命令と見なすことで予測を行う機構である。またToken 伝搬型予測機構は、実行結果を渡すことで実行可能な状態となる後続命令の数が予め定められた判定値以上となる命令を、クリティカル・パス上の命令と見なすことで予測を行う機構である。これ以外にも、CP予測機構としては、
・命令ウィンドウに存在する命令の中で最も古い命令に実行結果を渡す命令をクリティカル・パス上の命令と見なす、
・同一のサイクルに実行される命令の中で最も多くの後続命令に実行結果を渡す命令をクリティカル・パス上の命令と見なす、
といったような様々な予測手法を用いるものが提案されている。本実施形態のプロセッサに設けられるCP予測機構109としては、どの様な予測手法を用いるものを採用しても良い。勿論、精度の高い予測手法を用いる機構を採用することが望ましいが、一般的な傾向として予測精度の向上に伴って機構の複雑度が増加するため、現実的にはそれらのバランスを考慮して予測方式の選定を行うことになる。
さらにこのプロセッサには、上記対策(イ)及び(ロ)に対応した動作を行うため、NBCデータ予測機構とRCミス検出機構との2つの機構が設けられている。
NBCデータ予測機構は、RDIテーブル(Register definition Information Table )110とNBCデータ・テーブル111とを備えて構成されている。このNBCデータ予測機構は、実行結果がNBCデータとなる命令を予測し、その命令の実行結果のみをレジスタ・キャッシュ107に書き込むように動作する。
RCミス検出機構は、その実行によって生成されるオペランドがNBCデータでない命令を検出し、その検出した命令に依存する命令、すなわち非NBCデータのオペランドを受け取る命令が、RCヒットを前提として投機的に発行されないようにする。こうしたRCミス検出機構は、従来一般のプロセッサに採用されるマップ表108に簡単な修正を加えることで実現することが可能である。
次に、これら両機構の詳細を説明する。
(NBCデータ予測機構)
NBCデータ予測機構では、過去の実行結果がNBCデータであった命令は、次回の実行時にも実行結果がNBCデータであるとの想定のもとに、実行結果がNBCデータとなる命令を予測する。NBCデータ予測機構の予測に係る具体的な動作は次の態様で行われる。まずRDIテーブル110を用いて、コミットされた命令のうちで、実行結果がNBCデータであった命令のPC(プログラム・カウンタの値)を求める。そしてその結果得られたPCを、NBCデータ・テーブル111に登録する。命令のフェッチ時にNBCデータ・テーブル111を参照し、その命令のPCがそのテーブルに登録されているか否かによって、その命令の実行結果がNBCデータとなるか否かを予測する。
すなわち、本実施形態では、こうしたNBCデータ予測機構が上記予測手段に相当する構成となっている。そしてこのNBCデータ予測機構は、命令の定義したレジスタ値がレジスタ・ファイルへの書き込み条件を満たしていたか否かを、すなわちNBCデータであったか否かを命令毎に履歴として記録する工程と、今回もその履歴と同じ結果となるとしてNBCデータとなるか否かの予測を行う工程と、を通じてNBCデータの予測を行うようにしている。より具体的には、前者の工程は、上記条件に該当するレジスタ値(NBCデータ)を定義した命令の識別情報(PCの識別タブ)をNBCデータ・テーブル111に記録する工程を通じて行われる。また後者の工程は、レジスタ値を定義した命令の識別情報がNBCデータ・テーブル111上にあれば、そのレジスタ値はNBCデータとなり、記録されていなければNBCデータとならないと予測する工程を通じて行われる。
次に、こうしたNBCデータ予測機構のRDIテーブル110及びNBCデータ・テーブル111の具体的な構成を説明する。以下では、両テーブルの動作原理がより理解しやすいように、まずは、実行中に命令間の依存関係が変化しないことを前提とした場合のそれらテーブルの基本構成を説明する。そしてその後、実行中の命令間の依存関係の変化に対応可能としたNBCデータ予測機構の改良構成について説明する。
(1) RDIテーブル
図22に、実行結果がNBCデータとなった命令のPCを求めるためのRDIテーブル110の構成を示す。同図に示すようにRDIテーブル110は、論理レジスタ番号をインデクスとし、その各エントリに各論理レジスタ番号に対応するレジスタを定義した命令のPCを保持するように構成されている。RDIテーブル110の更新は、コミットされた命令のデスティネーション・レジスタに対応するエントリに、その命令のPCを書き込むことで行われる。すなわち、このRDIテーブル110には、各論理レジスタに値を定義した命令のPCが記録される。
したがって、クリティカル・パス上の命令がコミットされるときに、オペランド・バイパスでは得られなかったオペランド、すなわちNBCデータがあれば、そのNBCデータの論理レジスタ番号をインデクスとしてRDIテーブル110を参照することで、NBCデータを定義した命令のPCを得ることができる。
(2) NBCデータ・テーブル
図23に、NBCデータ・テーブル111の構成を示す。NBCデータ・テーブル111は、PCの下位ビットをインデクスとし、その各エントリにNBCデータを定義した命令を識別するためのタグを保持するように構成されている。タグとしては、上記インデクスとして用いる下位のビット列を除いた命令のPCを上位ビットが用いられる。例えばPCのビット長が「32ビット」で、インデクスをPCの「下位2ビット」とした場合、PCの「上位30ビット」がタグとして用いられる。
NBCデータ・テーブル111には、上記RDIテーブル110の参照を通じてNBCデータを定義した命令のPCが求められると、そのPCを識別するタグが登録される。すなわち、そのPCの下位ビットに対応するエントリに、同PCの残りのビット列の値が書き込まれる。
こうしたNBCデータ・テーブル111には、NBCデータを定義した命令のPCの識別タグのみが登録されることになる。したがって、このNBCデータ・テーブル111にPCの識別タグが登録されていれば、その命令が先に実行されたときにNBCデータを定義したことを確認することができる。よって命令のフェッチ時にNBCデータ・テーブル111を参照することで、その命令の実行結果がNBCデータであるか否かの予測を行うことができる。具体的には、命令のフェッチ時にそのPCの下位ビットをインデクスとしてNBCデータ・テーブル111を参照し、得られたタグとフェッチする命令のPCの上位ビットとを比較する。その結果、両者が一致するのであれば、その命令の実行結果はNBCデータであると予測する。
(3)NBCデータ予測機構の更新動作
続いて、上記の如く構成されたRDIテーブル110及びNBCデータ・テーブル111を備えるNBCデータ予測機構の更新動作について説明する。ここでの更新動作とは、RDIテーブル110を用いてNBCデータを定義した命令を特定し、そのPCの識別タグをNBCデータ・テーブル111に登録するまでの一連の動作を表している。
ここでは例として、命令i1〜i4の4つの命令からなる命令列が実行されたときのNBCデータ予測機構の更新動作を説明する。図24(a)にそうした命令列のデータ・フロー・グラフを示す。また図24(b)に、各命令のPC、ソース・レジスタ番号、デスティネーション・レジスタ番号、及び演算の種別を示す。同図(a)でのノード及び矢印の表示は、先の図19での表示態様と同じである。なお、同図中の矢印の添字は、依存元命令から依存先命令に受け渡されるオペランドの論理レジスタ番号を示している。ちなみに、図中の命令列においてNBCデータとなるのは、命令i2から命令i7に受け渡されるオペランドr2のみとなっている。
さらに、ここでは命令長を「32ビット」とし、PCはバイト単位(ここでは「1バイト」=「8ビット」)で表している。なお同図では、PCを16進数表記で示している。この場合、命令長が「4バイト」であるため、各命令に付されるPCの値は「4」刻みとなり、いずれのPCにおいても下位2ビットの値は[00]となる。そこでここでは、PCから命令長分の下位2ビットを除いた「30ビット」のビット列について、その下位2ビットを、すなわちPCの下位から数えて4ビット目から3ビット目までのビット列を、NBCデータ・テーブル111のインデクスとするようにしている。例えばPCが「54(=[ 0…01010100]:「 0…0 」の部分には「0」が25個連続する)」である命令i2の場合、その下位から数えて4ビット目から3ビット目までの値[01]がNBCデータ・テーブル111のインデクスとして用いられることになる。
図25(a)〜(c)に、こうした命令列の実行に際してのNBCデータ予測機構の更新動作の態様を、時系列順に示す。ここでは、RDIテーブル110の内部のうち、更新動作の説明に関係のないエントリについては省略して示している。またここでは、NBCデータ・テーブル111のエントリ数は「4」としている。
図25(a)は、上記命令列の実行を開始する前のNBCデータ予測機構の初期状態を示している。このときのRDIテーブル110及びNBCデータ・テーブル111は、何も登録されていない状態となっている。
図25(b)は、命令i1〜i3がコミットされた後の状態を示している。命令i1はデスティネーション・レジスタ番号が「1」となる、すなわち論理レジスタr1を定義するため、そのコミットに際しては、RDIテーブル110の1番目のエントリに、自身のPCである「50」が書き込まれる。また同様にして命令i2のコミット時にはその2番目のエントリに「54」が、命令i3のコミット時にはその3番目のエントリに「54」が、それぞれ書き込まれる。
図25(c)は、命令i4がコミットされた後の状態を示している。このときには、上記CP予測機構109により命令i4がクリティカル・パス上にあるとの予測がなされ、またまたオペランド・バイパスの有無を調べることでオペランドr2の値がオペランド・バイパスでは得られなかったことの確認がなされており、オペランドr2は、NBCデータであると分かっている。そこで、まずRDIテーブル110のオペランドr2に対応するエントリを参照し、NBCデータである同オペランドr2を定義した命令i2のPCを調べる。これにより、命令i2のPCである「54」が得られる。
次に得られた命令i2のPCから、その下位から数えて4ビット目から3ビット目までの値[01]をNBCデータ・テーブル111へのインデクスとして取り出し、そのインデクスに対応する1番のエントリに残りの28ビットのビット列[ 0…0101](「 0…0 」の部分には「0」が25個連続する)をタグとして登録する。こうしてNBCデータを定義した命令i2のPCがNBCデータ・テーブル111に登録される。
次回に、この命令i2がフェッチされたときに、そのPCの一部をインデクスとしてNBCデータ・テーブル111を参照すると、それにより得られるタグと自身の上位ビットとが一致するため、NBCデータ予測機構により命令i2は、NBCデータを定義する命令であると予測されることになる。
(4) 実行結果がNBCデータでなくなった命令への対応
以上説明したNBC予測機構の基本的な構成では、命令間のデータ依存関係がプログラムの実行中に変化しないとの前提のもとに、NBCデータ・テーブル111に登録された命令は、それ以降も常に実行結果がNBCデータとなると予測するようにしていた。しかしながら、実際のプログラムの実行中には命令間のデータ依存関係が変化することがしばしばある。こうした場合、NBCデータ・テーブル111に登録された命令の実行結果は必ずしもNBCデータとはならないため、NBCデータの予測結果を誤ることがある。
こうした実行中の命令間のデータ依存関係の変化に対応するため、上述のNBCデータ予測機構の基本構成に、以下の改良を施す。まずRDIテーブル110の各エントリに、NBCデータの予測を失敗したか否かの履歴を記録するフラグを追加する。以下、このフラグをP(Predicted )ビットと呼ぶ。Pビットは、対応するエントリにPCの記録された命令がNBCデータを定義する命令であると予測されたときに、その値が「1」にセットされ、その予測が正しいことが確認されたときにその値が「0」にリセットされる。したがって、Pビットが「1」のままのエントリにPCの記録された命令は、NBCデータ予測に失敗したと判断することができる。
このように改良したNBCデータ予測機構でのPビットの更新動作を説明する。命令のコミット時にその命令の実行結果がNBCデータであると予測されていたのであれば、そのデスティネーション・レジスタに対応するPビットを「1」にセットし、そうでないのであれば「0」にリセットする。またその命令がクリティカル・パス上の命令であると予測されていた場合、その命令が取得したオペランドにNBCデータがあれば、そのNBCデータの論理レジスタ番号に対応するPビットを「0」にリセットする。
次に、NBCデータ予測失敗時のNBCデータ・テーブル111のエントリの削除動作を説明する。命令がコミットされたとき、その命令のデスティネーション・レジスタに対応するRDIテーブル110のエントリを参照し、これから上書きするエントリのPビットを確認する。ここでPビットが「1」であったのであれば、NBCデータ予測に失敗しているため、上書き前のPCをインデクスとしてNBCデータ・テーブル111を参照し、対応するエントリに登録されているタグをクリアする。
すなわち、ここでは上記NBCデータ予測機構の予測の是非を命令の実行結果に基づいて判定するようにしている。そしてレジスタ値がNBCデータであるとの予測結果の誤りが判明したときには、そのレジスタ値を定義した命令の識別情報(PCの識別タグ)の記録をNBCデータ・テーブル111上から削除するようにしている。
(RCミス予測機構)
続いて、命令のオペランドの取得に際してRCミスが発生するか否かを予測するRCミス予測機構について説明する。本実施形態のプロセッサでは、NBCデータのみがレジスタ・キャッシュに書き込まれるため、レジスタ・ファイル・アクセスを通じて非NBCデータの取得に際しては必然的にRCミスが発生する。RCミス予測機構は、この性質を利用して、オペランドがNBCデータでない命令を、RCミスが発生する命令として検出する。
上述したように本実施形態では、こうしたRCミス予測機構を、マップ表108に修正を加えることで実現するようにしている。図26に、こうしたRCミス予測機構としての機能を追加されたマップ表108の構成を示す。
従来の一般的なプロセッサのマップ表の各エントリには、対応する論理レジスタに割り当てられた物理レジスタ番号のみが保持される。RCミス予測機構としての機能を兼ね備えた本実施形態のマップ表108のエントリには、これに加え、対応する論理レジスタがNBCデータであるか否かを表すフラグが保持される。以下、このフラグをNBCビットと呼ぶ。ここではNBCビットの値「1」はNBCデータであることを、値「0」は非NBCデータであることをそれぞれ表すようにしている。
次にこうしたマップ表108でのNBCビットの更新動作、及びこれを利用したRCミスの予測動作について説明する。コミット時に命令の実行結果がNBCデータであることが確認されたのであれば、そのデスティネーション・レジスタに対応するエントリのNBCビットの値は「1」にセットされ、そうでなければ「0」にリセットされる。一方、レジスタ・リネーミング時に命令のソース・レジスタ番号をインデクスとしてマップ表108を参照し、そのエントリのNBCビットの値が「0」であれば、そのソース・レジスタ番号に対応するオペランドはNBCデータではないため、当該命令はRCミスの発生する命令と判定する。一方、そうでなければ、RCミスの発生しない、すなわちレジスタ・キャッシュのアクセスにヒットする命令と判定する。
例えば先の図19にデータ・フロー・グラフを示した命令列の実行においては、命令i6の実行結果はNBCデータではないと予測されるため、そのデスティネーション・レジスタに対応するマップ表108のNBCビットの値は「0」にリセットされる。命令i7のフェッチ時には、このNBCビットを参照することで、命令i6から受け取るオペランドがNBCデータではないことが確認される。これにより命令i7は、オペランドの取得に際してRCミスが発生する命令であることが検出されるようになる。
プロセッサの制御回路は、こうしたマップ表108を参照し、命令のデスティネーション・レジスタに対応するエントリのNBCビットの値が「0」であれば、RCヒットを前提としたその命令の投機的な発行を禁止する。換言すれば、プロセッサの制御回路は、命令のデスティネーション・レジスタに対応するマップ表108のエントリのNBCビットの値が「1」であることを条件として、RCヒットを前提とした命令の投機的な発行を実施する。したがって本実施形態では、こうしたプロセッサの制御回路が上記命令発行手段に相当する構成となっている。
(プロセッサの性能評価)
続いて、以上説明した本実施形態のプロセッサの性能評価の結果を説明する。発明者等は、スーパスカラ・プロセッサ用のシミュレータ(Simple Scalar Tool Set)に、階層型レジスタ・ファイルと後述の4つのモデルのいずれかを組み込んで、表2に示される条件で評価を行っている。この評価には、「MIPS R100000」の拡張命令セットである「Simple Scalar/PISA」が使用されている。またこの評価には、ベンチマーク・プログラムとして、「SPECint2000 」の「bzip2 」、「gcc 」、「gzip」、「mcf 」、「paser 」、「perl」、「votex 」、及び「vpr 」の8つのプログラムが使用されている。なお「gcc 」では、最初の1ギガ個の命令を、他のプログラムでは最初の2ギガ個の命令をスキップさせた後、100メガ個の命令を実行した。クリティカル・パス予測機構としては、上述のToken 伝搬型の予測機構を用いることとした。
Figure 2007304663
この評価は、レジスタ・キャッシュの書き込みポリシーのそれぞれ異なる次の4つのプロセッサ・モデルについて行われている。すなわち、
・「AC(All Cache )モデル」: 命令の生成したすべての値をレジスタ・キャッシュに書き込むモデル、
・「NB(Non Bypass)モデル」: オペランド・バイパスによって後続命令に渡さなかった値のみレジスタ・キャッシュに書き込むモデル、
・「CP(Critical Path )モデル」: クリティカル・パス上の命令に使用され、且つオペランド・バイパスによって後続命令に渡さなかった値のみレジスタ・キャッシュに書き込む、本実施形態における書き込みポリシーを採用するモデル、
・「ideal モデル」: レジスタ・キャッシュへのアクセスが常にヒットするとした理想的なモデル、
の4つのモデルを評価対象としている。いずれのモデルにおいても、置き換えポリシーとしては、参照の時期が最も古いエントリにレジスタ値を書き込む、上述のLRU方式を用いている。
図27に、RCエントリ数を論理レジスタ数と同数の「32」とし、ACモデルを基準「 100%」としたときの、各ベンチマーク・プログラムにおけるNB、CP、ideal の各モデルのIPC(Instruction Per Clock )の向上率を示す。IPCは、1サイクル当たりの命令実行数を意味し、プロセッサ性能の指標値となっている。
同図に示されるように、NBモデルでは、ACモデルに対して最大で「11.8%」、平均で「 6.4%」のIPCの悪化が認められる。NBモデルでは、オペランド・バイパスによって後続命令に渡されたレジスタ値はレジスタ・キャッシュに書き込まないようにしている。ここで命令の結果値が1度しか参照されないとすると、NBモデルでは、無駄な書き込みの頻度が低下してRCミスが削減されるため、ACモデルよりもIPCは向上する筈である。しかしながら、測定結果がこれとは逆となるのは、オペランド・バイパスによって後続命令に渡されたレジスタ値が、その後、再び別の後続命令によって参照される場合が少なからず存在するためであると考えられる。
一方、本実施形態の書き込みポリシーを採用するCPモデルでは、ACモデルに対して、最大で「14.8%」、平均で「 6.2%」のIPCの向上が達成されている。またNBモデルに対しては、最大で「22.9%」、平均で「13.5%」のIPCの向上が見られる。このように、この測定結果によって、クリティカル・パスに着目した本実施形態のプロセッサのデータ処理方法の有効性を確認することができる。もっとも、ideal モデルに比べれば、IPC向上率に、最大で「36.0%」、平均で「12.5%」の差があり、未だ改善の余地は残されている。
表3は、RCエントリ数を「32」とした場合の、ACモデル及びCPモデルにおけるレジスタ・キャッシュのヒット精度に関する測定結果を示している。同表には、命令がクリティカル・パス上にある場合(CP)と非クリティカル・パス上にある場合(NPC)とのそれぞれにおける、全実行命令数に対するRCミス数及びRCヒット数の割合が示されている。更にRCミスについては、RCミス検出機構によるRCミスの検出が成功した場合と失敗した場合とに分けてその割合が示されている。なお同表の「その他」の欄に分類されるのは、オペランド・バイパスによりオペランドを得た命令や、そもそもオペランドの取得を必要としない命令である。
Figure 2007304663
本実施形態では、非クリティカル・パス上の命令のRCミスを許容する代わりに、プログラム全体の実行サイクル数にRCミスがより直接的な悪影響を与えるクリティカル・パス上の命令のRCミスを削減することを狙いとしている。しかしながら、RCエントリ数を「32」としたこの測定結果では、非クリティカル・パス上の命令に対するCPモデルでのRCミス率は、狙い通りにACモデルよりも高くなっているものの、クリティカル・パス上の命令に対するCPモデルでのRCヒット率はACモデルとほぼ同程度に留まっている。一方、RCミス検出機構がRCミスの検出に失敗した割合はわずか「 2.2%」であり、RCミスが他の命令の発行を妨げるという問題については、そのほとんどを回避することができている。
ちなみにクリティカル・パス上の命令、非クリティカル・パス上の命令の双方のRCミス率の合計は、CPモデルよりもACモデルの方が低く抑えられている。それにも拘わらず、IPCはCPモデルの方が高くなる。これは、非クリティカル・パス上の命令のRCミスがプロセッサの性能に与える悪影響は軽微であること、RCミスによる他の命令の発行妨害の回避がプロセッサの性能向上に大きく寄与していること、を示している。
なおCPモデルにおいて、クリティカル・パス上の命令にRCミスが発生する原因としては、レジスタ・キャッシュのエントリの競合と、NBCデータ予測機構の予測ミスとが考えられる。エントリの競合により発生したRCミスについては、RCミス検出機構では検出することができないため、上記測定結果では、クリティカル・パス上の命令のRCミス率「 3.0%」のうち、エントリの競合によるものが「 1.4%」、予測ミスによるものが「 1.6%」ということが分かる。
NBCデータの予測精度はRCエントリ数には殆ど依存しないが、エントリの競合の頻度はRCエントリ数に大きく依存する。そこで、そうしたRCエントリ数の影響を調べるべく、RCエントリ数を「8」、「16」、「32」、「64」と変化させたときの各モデルのIPCの測定を行っている。図28は、その測定の結果を示している。同図のグラフの縦軸は、ACモデルに対するNB、CP、ideal モデルのIPC向上率を示している。また各ベンチマークにおける3本組の縦棒は、図中左からNB、CP、ideal の各モデルのものとなっている。
同図に示されるように、CPモデルのIPC向上率は、RCエントリ数が少ない場合ほど増加する。これは、NBCデータのみをレジスタ・キャッシュに書き込むCPモデルでは、RCエントリ数が減少しても、エントリの競合はさほどには増加しないためである。RCエントリ数が減少すれば、ACモデルでは、クリティカル・パス上の命令、非クリティカル・パス上の命令の双方についてRCミス率は増加する。これに対してCPモデルでは、RCエントリ数が減少しても、クリティカル・パス上の命令のRCミス率はそれほどには増加しない。したがってRCエントリ数が少ない場合には、クリティカル・パス上の命令に対するCPモデルでのRCヒット率は、ACモデルよりも高くなると考えられる。
以上説明した本実施形態によれば、以下に列記するような効果を奏することができる。
(1)本実施形態では、クリティカル・パス上の命令に使用され、且つオペランド・バイパスでは得られないデータ(NBCデータ)であると予測されたレジスタ値のみをレジスタ・キャッシュに書き込むようにしている。こうしてレジスタ・キャッシュに書き込まれるレジスタ値の種別を制限することで、レジスタ・キャッシュの書き込み頻度が低減され、NBCデータが上書きされ難いようになる。そのため、RCミスがプロセッサの処理性能に与える悪影響の顕著なクリティカル・パス上の命令のRCミスを効果的に削減することができる。したがって、レジスタ・キャッシュの資源を有効活用しながら、プロセッサの処理性能を好適に向上することができる。
(2)本実施形態では、NBCデータと予測されなかったレジスタ値を使用する命令については、RCヒットを前提とした投機的な発行を禁止する、換言すれば、NBCデータと予測されたレジスタ値を使用する命令であることを条件に、RCヒットを前提とした投機的な発行を行うようにしている。これにより、RCミスが発生することが予め確定的な命令について、RCヒットを前提とした投機的な発行がなされなくなり、RCミスによる他の命令の発行の妨害を回避することができるようになる。
(3)本実施形態では、命令の定義したレジスタ値がNBCデータであるか否かの予測を、過去のその命令の実行時に定義したレジスタ値がNBCデータであったか否かの履歴に基づいて行うようにしている。具体的には、NBCデータであったことが確認されたレジスタ値を定義した命令の識別情報(PCの識別タグ)をNBCデータ・テーブル111に記録保持する。そして、命令のフェッチ時にNBCデータ・テーブル111を参照して、その命令の識別情報の登録の有無により、上記予測を行う。そのため、NBCデータの予測を、簡易なハードウェア構成で効果的に行うことができる。
(4)命令の定義したレジスタ値がNBCデータであるとの予測が誤りであることが確認されたときに、上記NBCデータ・テーブル111における、該当命令の識別情報を削除するようにしている。そのため、プログラム実行中における命令間のデータ依存関係の変化に好適に対応することができる。
本実施形態は、次のように変形して実施することもできる。
・上記実施形態では、RC検出機構を設けることで、使用するレジスタ値がNBCデータと予測された命令以外は、RCヒットを前提とした投機的な発行を禁止することで、RCミスによって他の命令の発行が妨害されることを回避するようにしていた。もっとも、こうしたRC検出機構を設けずとも、NBCデータとなると予測されたレジスタ値のみをレジスタ・キャッシュに書き込むこととすれば、プロセッサの処理性能により顕著な悪影響を与えるクリティカル・パス上の命令のRCミスの発生を削減することはできる。よってこうしたクリティカル・パス上の命令のRCミスの削減のみで十分なプロセッサの処理性能を確保することができるのであれば、RC検出機構を割愛するようにしても良い。
・上記実施形態では、過去の命令の実行時にその命令の定義したレジスタ値がNBCデータであったか否かの履歴に基づいてNBCデータの予測を行うようにしていたが、これ以外の手法でそうした予測が可能であれば、そうした予測手法を採用するようにしても良い。例えばレジスタ値がNBCデータとなる命令のコミット時までの挙動に、そうでない命令とは異なる特定のパターンが見られるのであれば、そうした命令の挙動に基づいてNBCデータの予測するようにすることもできる。
・上記実施形態では、NBCデータとなると予測されるレジスタ値のみをレジスタ・キャッシュに書き込むようにしていたが、クリティカル・パス上の命令に使用されると予測されるレジスタ値のみをレジスタ・キャッシュに書き込むようにしても良い。この場合、オペランド・バイパスで得られるレジスタ値も含めて、クリティカル・パス上の命令に使用されるレジスタ値のすべてがレジスタ・キャッシュに書き込むため、書き込みをNBCデータに限定した場合よりは、レジスタ・キャッシュの書き込み頻度は増加する。それでも、非クリティカル・パス上の命令に使用されるレジスタ値についてのレジスタ・キャッシュの書き込みは禁止されるため、クリティカル・パス上の命令のRCミスはある程度は削減されるようになる。
物理レジスタ番号の割り当てが(a)ランダムな順で行われた場合、(b)ラウンド・ロビンにソートされた順で行われた場合のそれぞれにおけるダイレクト・マップ方式のレジスタ・ファイルの動作態様の一例を示す模式図。 本発明の第1実施形態のプロセッサについてその構成を模式的に示すブロック図。 同実施形態のプロセッサに搭載されるMSBの動作態様の一例を示す模式図。 同MSBのハードウェア量を削減した改良構成についてその動作態様の一例を示す模式図。 (a)〜(c)巻き戻し機構の無いMSBについてその分岐予測ミス発生時の動作態様を各示す模式図。 (a)〜(c)巻き戻し機構を追加したMSBについてその分岐予測ミス発生時の動作態様を各示す模式図。 複数命令発行対応型MSBの構成を模式的に示すブロック図。 同MSBにおけるFIFOの物理レジスタ番号の格納態様の一例を示す図。 同MSBの動作態様の一例について(a)はFIFOの初期状態を、(b)〜(g)各サイクルにおけるMSBの動作状態をそれぞれ示す模式図。 同MSBのリード回路の詳細な回路構成を示すブロック図。 同MSBについてその各FIFOのリード・フラグの動作回路を(a)FIFO番号順に接続した場合、(b)配線長を考慮して接続した場合のそれぞれにおけるリード・フラグの接続態様をそれぞれ示す図。 同MSBのサプライ回路の詳細な回路構成を示すブロック図。 先頭ポインタ及びデコーダを多重化した構成について(a)そのサプライ回路の回路構成、及び(b)デコーダ内部の回路構成をそれぞれ示すブロック図。 同MSBのバックアップ・レジスタの詳細な回路構成を示すブロック図。 レジスタ管理方式の異なる複数のプロセッサのモデルにおけるRCエントリ数とRCミス率との関係を示すグラフ。 MSBモデル及びMSB−rモデルにおけるRCエントリ数と分岐予測ミス時に無効化されたRCエントリの数との関係を示すグラフ。 レジスタ管理方式の異なる複数のプロセッサのモデルにおけるRCエントリ数とIPC向上率との関係を示すグラフ。 プロセッサ構成の異なる複数のMSBモデルにおけるRCエントリ数とIPC向上率との関係を示すグラフ。 クリティカル・パスの説明に用いるプログラムの一例についてそのデータ・フロー構造を示すグラフ。 (a)従来のレジスタ管理方式、及び(b)本発明の第2実施形態でのレジスタ管理方式のそれぞれにおける、図19のプログラムの実行態様をそれぞれ示すタイミングチャート。 本発明の第2実施形態のプロセッサの模式的な構成を示すブロック図。 同実施形態のプロセッサに採用されるRDIテーブルの構成を模式的に示すブロック図。 同実施形態のプロセッサに採用されるNBCデータ・テーブルの構成を模式的に示すブロック図。 図25に示すNBCデータ予測機構の更新動作の説明に用いられる命令列についてその(a)データ・フロー・グラフと(b)各命令の内容を一覧して示す表とを併せ示す図。 (a)〜(c)NBCデータ予測機構の動作態様の一例を各示すブロック図。 プログラムの実行中の命令間のデータ依存関係の変化に対応するための修正を加えたマップ表の構成を模式的に示すブロック図。 レジスタ管理方式の異なる複数のプロセッサのモデルにおける各プログラムの実行時におけるIPC向上率を示すグラフ。 上記各モデルにおけるRCエントリ数とIPC向上率との関係を示すグラフ。 階層型レジスタ・ファイルを備えるプロセッサでの実行ユニットでの命令の実行に係るデータパスの構成を模式的に示すブロック図。
符号の説明
11,101…フェッチ・ユニット、12,102…デコード・ユニット、13,103…命令ウィンドウ、14,15,104,105,151,152…実行ユニット、105…リオーダ・バッファ、16,106,155…メイン・レジスタ・ファイル、17,107,154…レジスタ・キャッシュ、18,108…マップ表、20…MSB(剰余整列バッファ:Modulo Sorting Buffer )、30…リード回路、31…パイプライン・レジスタ、32(32A〜32D)…先頭ポインタ、33…サプライ回路、34…バックアップ・レジスタ、35…ローテーション・バス、36…サプライ・バス、40,55…メモリ・セル、41,42,51,57,58…パス・トランジスタ、43…ANDゲート、44…マルチプレクサ、45,52…検出回路、50(50A〜50D)…デコーダ、56…出力バス、109…CP予測機構、110…RDIテーブル、111…NBCデータ・テーブル、150…階層型レジスタ・ファイル、153…結果バス。

Claims (25)

  1. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
    前記レジスタ・キャッシュのインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するインデクス決定手段と、
    命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に前記物理レジスタ番号を割り当てる物理レジスタ番号設定手段と、
    を備えることを特徴とするプロセッサ。
  2. 前記物理レジスタ番号設定手段は、前記インデクスがラウンド・ロビンとなるように未使用の前記物理レジスタ番号を整列させるとともに、その整列の順に前記物理レジスタ番号の割り当てを行う
    請求項1に記載のプロセッサ。
  3. 前記物理レジスタ番号設定手段は、
    それぞれ前記インデクスを同一とする未使用の物理レジスタ番号が格納される、前記レジスタ・キャッシュのエントリ数と同数のバッファと、
    レジスタ・リネーミング中の命令に割り当てられる前記物理レジスタ番号を読み出す前記バッファを、命令のフェッチ順に切り替える切替手段と、
    を備える
    ことを特徴とする請求項1に記載のプロセッサ。
  4. 前記インデクス決定手段は、前記レジスタ・キャッシュのエントリ数で前記物理レジスタ番号を除算したときの剰余を前記インデクスとして決定する
    請求項1〜3のいずれか1項に記載のプロセッサ。
  5. 命令の分岐予測を行って予測した分岐先の命令を投機実行するとともに、
    分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる前記物理レジスタ番号のインデクスの値の順序を巻き戻す巻き戻し手段を備える
    ことを特徴とする請求項1〜4のいずれか1項に記載のプロセッサ。
  6. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
    命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用されるデータとなるか否かを予測する予測手段と、
    前記階層型レジスタへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、
    を備えることを特徴とするプロセッサ。
  7. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
    命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測する予測手段と、
    前記階層型レジスタ・ファイルへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、
    を備えることを特徴とするプロセッサ。
  8. 前記予測手段は、定義したレジスタ値が前記データであったか否かの履歴を命令毎に記録保持するテーブルを備え、そのテーブルに保持された履歴に基づいて前記予測を行う
    請求項6または7に記載のプロセッサ。
  9. 前記予測手段は、前記データであったレジスタ値を定義した命令の識別情報を記録保持するテーブルを有し、そのテーブルにおける命令の識別情報の有無に基づき前記予測を行う
    請求項6または7に記載のプロセッサ。
  10. 前記テーブルは、命令のプログラム・カウンタの値を構成するビット列の一部をインデクスとするエントリに同ビット列の残りの部分を前記識別情報として記録保持するように構成されてなる
    請求項9に記載のプロセッサ。
  11. 命令の実行結果に基づいて前記予測手段の予測結果の是非を判定し、レジスタ値が前記データであるとの予測の誤りが判明したときに、該当レジスタ値を定義した命令の前記識別情報の登録を削除する
    請求項9または10に記載のプロセッサ。
  12. 請求項6〜11のいずれか1項に記載のプロセッサにおいて、
    前記予測手段によって前記データでないと予測されたレジスタ値を使用する命令に対して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止しつつ、命令の発行を行う命令発行手段を備える
    ことを特徴とするプロセッサ。
  13. 請求項6〜11のいずれか1項に記載のプロセッサにおいて、
    前記予測手段によって前記データであると予測されたレジスタ値を使用する命令に限定して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う命令発行手段を更に備える
    ことを特徴とするプロセッサ。
  14. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
    前記レジスタ・キャッシュのアクセスに係るインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、
    命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する前記物理レジスタ番号の割り当てを行うようにした
    ことを特徴とするプロセッサのデータ処理方法。
  15. 前記物理レジスタ番号の割り当ては、
    前記インデクスがラウンド・ロビンとなるように未使用の前記物理レジスタ番号を整列させる工程と、
    レジスタ・リネーミング中の命令に対してその整列順に前記物理レジスタ番号の割り当てを行う工程と、
    を通じて行われる
    請求項14に記載のプロセッサのデータ処理方法。
  16. 前記物理レジスタ番号の割り当ては、
    前記レジスタ・キャッシュのエントリ数と同数のバッファのそれぞれに、前記インデクスを同一とする未使用の物理レジスタ番号を分別して格納する工程と、
    前記バッファを順次切り替えながら前記物理レジスタ番号を順次読み出す工程と、
    レジスタ・リネーミング中の命令に対してその読み出された前記物理レジスタ番号を同命令のフェッチ順に割り当てる工程と、
    を通じて行われる
    請求項14に記載のプロセッサのデータ処理方法。
  17. 前記インデクスとして、前記レジスタ・キャッシュのエントリ数で前記物理レジスタ番号を除算したときの剰余を用いる
    請求項14〜16のいずれか1項に記載のプロセッサのデータ処理方法。
  18. 命令の分岐予測を行って予測した分岐先の命令を投機実行するとともに、
    分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる前記物理レジスタ番号のインデクスの値の順序を巻き戻すようにした
    ことを特徴とする請求項14〜17のいずれか1項に記載のプロセッサのデータ処理方法。
  19. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
    命令の定義するレジスタ値がクリティカル・パス上の命令に使用されるデータとなるか否かの予測を行うとともに、
    前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、前記データとなると予測されたことを条件として同レジスタ値を前記レジスタ・キャッシュに書き込むようにした
    ことを特徴とするプロセッサのデータ処理方法。
  20. メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
    命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測するとともに、
    前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、そのレジスタ値が前記データとなると予測されたことを条件として前記レジスタ・キャッシュに書き込むようにした
    ことを特徴とするプロセッサのデータ処理方法。
  21. 命令の定義したレジスタ値が前記条件に該当するデータであったか否かを命令毎に履歴として記録する工程と、
    今回もその履歴と同じ結果となるとして前記データとなるか否かを予測する工程と、
    を通じて前記予測を行う
    請求項19または20に記載のプロセッサのデータ処理方法。
  22. 前記条件に該当するデータとなったレジスタ値を定義した命令の識別情報を記録する工程と、
    レジスタ値を定義した命令の前記識別情報が既に記録されていれば、そのレジスタ値は前記データとなり、記録されていなければ、そのレジスタ値は前記データとならないと予測する工程と、
    を通じて前記予測を行う
    請求項19または20に記載のプロセッサのデータ処理方法。
  23. 命令の実行結果に基づいて前記予測の結果の是非を判定し、レジスタ値が前記データとなるとの予測結果の誤りが判明したときに、該当レジスタ値を定義した命令の前記識別情報の記録を削除する
    ことを特徴とする請求項22に記載のプロセッサのデータ処理方法。
  24. 請求項19〜23のいずれか1項に記載のプロセッサのデータ処理方法において、
    命令の発行に際して、使用するレジスタ値が前記データでないと予測された命令に対しては、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止する
    ことを特徴とするプロセッサのデータ処理方法。
  25. 請求項19〜23のいずれか1項に記載のプロセッサのデータ処理方法において、
    命令の発行に際して、使用するレジスタ値が前記データであると予測されたことを条件として、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う
    ことを特徴とするプロセッサのデータ処理方法。
JP2006129652A 2006-05-08 2006-05-08 プロセッサ及びそのデータ処理方法 Pending JP2007304663A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2006129652A JP2007304663A (ja) 2006-05-08 2006-05-08 プロセッサ及びそのデータ処理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006129652A JP2007304663A (ja) 2006-05-08 2006-05-08 プロセッサ及びそのデータ処理方法

Publications (1)

Publication Number Publication Date
JP2007304663A true JP2007304663A (ja) 2007-11-22

Family

ID=38838567

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006129652A Pending JP2007304663A (ja) 2006-05-08 2006-05-08 プロセッサ及びそのデータ処理方法

Country Status (1)

Country Link
JP (1) JP2007304663A (ja)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102857443A (zh) * 2012-08-17 2013-01-02 华为技术有限公司 一种数据写入的方法、装置及系统
US8607211B2 (en) 2011-10-03 2013-12-10 International Business Machines Corporation Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8615745B2 (en) 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8677050B2 (en) 2010-11-12 2014-03-18 International Business Machines Corporation System, method and computer program product for extending a cache using processor registers
US8756591B2 (en) 2011-10-03 2014-06-17 International Business Machines Corporation Generating compiled code that indicates register liveness
US9286072B2 (en) 2011-10-03 2016-03-15 International Business Machines Corporation Using register last use infomation to perform decode-time computer instruction optimization
US9329869B2 (en) 2011-10-03 2016-05-03 International Business Machines Corporation Prefix computer instruction for compatibily extending instruction functionality
US9483267B2 (en) 2011-10-03 2016-11-01 International Business Machines Corporation Exploiting an architected last-use operand indication in a system operand resource pool
US9697002B2 (en) 2011-10-03 2017-07-04 International Business Machines Corporation Computer instructions for activating and deactivating operands
US10061588B2 (en) 2011-10-03 2018-08-28 International Business Machines Corporation Tracking operand liveness information in a computer system and performing function based on the liveness information
CN116627501A (zh) * 2023-07-19 2023-08-22 北京开源芯片研究院 物理寄存器的管理方法、装置、电子设备及可读存储介质

Cited By (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8677050B2 (en) 2010-11-12 2014-03-18 International Business Machines Corporation System, method and computer program product for extending a cache using processor registers
US9286072B2 (en) 2011-10-03 2016-03-15 International Business Machines Corporation Using register last use infomation to perform decode-time computer instruction optimization
US8607211B2 (en) 2011-10-03 2013-12-10 International Business Machines Corporation Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US9311095B2 (en) 2011-10-03 2016-04-12 International Business Machines Corporation Using register last use information to perform decode time computer instruction optimization
US8615746B2 (en) 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US9329869B2 (en) 2011-10-03 2016-05-03 International Business Machines Corporation Prefix computer instruction for compatibily extending instruction functionality
US8756591B2 (en) 2011-10-03 2014-06-17 International Business Machines Corporation Generating compiled code that indicates register liveness
US10078515B2 (en) 2011-10-03 2018-09-18 International Business Machines Corporation Tracking operand liveness information in a computer system and performing function based on the liveness information
US9483267B2 (en) 2011-10-03 2016-11-01 International Business Machines Corporation Exploiting an architected last-use operand indication in a system operand resource pool
US8615745B2 (en) 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8612959B2 (en) 2011-10-03 2013-12-17 International Business Machines Corporation Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US10061588B2 (en) 2011-10-03 2018-08-28 International Business Machines Corporation Tracking operand liveness information in a computer system and performing function based on the liveness information
US9690583B2 (en) 2011-10-03 2017-06-27 International Business Machines Corporation Exploiting an architected list-use operand indication in a computer system operand resource pool
US9697002B2 (en) 2011-10-03 2017-07-04 International Business Machines Corporation Computer instructions for activating and deactivating operands
CN102857443A (zh) * 2012-08-17 2013-01-02 华为技术有限公司 一种数据写入的方法、装置及系统
CN102857443B (zh) * 2012-08-17 2014-12-24 华为技术有限公司 一种数据写入的方法、装置及系统
CN116627501A (zh) * 2023-07-19 2023-08-22 北京开源芯片研究院 物理寄存器的管理方法、装置、电子设备及可读存储介质
CN116627501B (zh) * 2023-07-19 2023-11-10 北京开源芯片研究院 物理寄存器的管理方法、装置、电子设备及可读存储介质

Similar Documents

Publication Publication Date Title
JP2007304663A (ja) プロセッサ及びそのデータ処理方法
US7568087B2 (en) Partial load/store forward prediction
JP5357017B2 (ja) 高速で安価なストア−ロード競合スケジューリング及び転送機構
JP6143306B2 (ja) アウトオブオーダー型マイクロプロセッサにおけるオペランド・ストア比較ハザードの予測及び回避
US7730283B2 (en) Simple load and store disambiguation and scheduling at predecode
US5944815A (en) Microprocessor configured to execute a prefetch instruction including an access count field defining an expected number of access
US6351796B1 (en) Methods and apparatus for increasing the efficiency of a higher level cache by selectively performing writes to the higher level cache
US7418552B2 (en) Memory disambiguation for large instruction windows
US11416253B2 (en) Multiple-table branch target buffer
US20080086622A1 (en) Replay reduction for power saving
US5930832A (en) Apparatus to guarantee TLB inclusion for store operations
KR20040014673A (ko) 2개 레벨의 분기 예측 캐시를 갖는 분기 예측
US8171240B1 (en) Misalignment predictor
US20070288694A1 (en) Data processing system, processor and method of data processing having controllable store gather windows
US20030182536A1 (en) Instruction issuing device and instruction issuing method
US20210011729A1 (en) Managing Commit Order for an External Instruction Relative to Queued Instructions
JP2002163150A (ja) プロセッサ
US11507379B2 (en) Managing load and store instructions for memory barrier handling
US6282629B1 (en) Pipelined processor for performing parallel instruction recording and register assigning
CN115437694A (zh) 微处理器、适用于微处理器的方法以及数据处理系统
TW202219744A (zh) 微處理器和分支預測控制方法
WO2000008551A1 (en) Software directed target address cache and target address register
TWI786691B (zh) 微處理器和分支處理方法
EP1005675A1 (en) A data memory unit configured to store data in one clock cycle and method for operating same