(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024046499
(43)【公開日】2024-04-03
(54)【発明の名称】演算処理装置及び演算処理方法
(51)【国際特許分類】
G06F 12/0862 20160101AFI20240327BHJP
G06F 9/345 20180101ALI20240327BHJP
G06F 9/38 20180101ALI20240327BHJP
【FI】
G06F12/0862 105
G06F9/345 S
G06F9/38 350Y
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022151924
(22)【出願日】2022-09-22
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】上窪 勇貴
【テーマコード(参考)】
5B013
5B033
5B205
【Fターム(参考)】
5B013CC20
5B033DA00
5B033DB06
5B033DB09
5B205JJ13
5B205NN92
5B205VV02
(57)【要約】
【課題】演算性能を向上させる演算処理装置及び演算処理方法を提供する。
【解決手段】ステート管理部134は、所定のプログラムカウンタで示される2つのメモリアクセス命令のそれぞれの要求アドレスを基にストライド幅を算出し、所定のプログラムカウンタで示される複数のメモリアクセス命令の要求アドレス及び算出したストライド幅を基にストライドアクセスの発生を検出する。プリフェッチ要求生成部133は、ステート管理部134によりストライドアクセスが検出された場合、ストライド幅に基づくプリフェッチ要求を発行する。
【選択図】
図2
【特許請求の範囲】
【請求項1】
所定のプログラムカウンタで示される2つのメモリアクセス命令のそれぞれの要求アドレスを基にストライド幅を算出し、前記所定のプログラムカウンタで示される複数のメモリアクセス命令の要求アドレス及び算出した前記ストライド幅を基にストライドアクセスの発生を検出する管理部と、
前記管理部により前記ストライドアクセスが検出された場合、前記ストライド幅に基づくプリフェッチ要求を発行するプリフェッチ要求生成部と
を備えたことを特徴とする演算処理装置。
【請求項2】
プリフェッチキューと、
前記所定のプログラムカウンタで示される第1メモリアクセス命令でキャッシュミスが発生し、且つ、前記所定のプログラムカウンタの情報を含む所定エントリが前記プリフェッチキューに存在しない場合、前記所定のプログラムカウンタの情報を含む前記所定エントリを前記プリフェッチキューに登録する監視部とをさらに備え、
前記管理部は、前記第1メモリアクセス命令の要求アドレス及び前記所定エントリの後続の前記所定のプログラムカウンタで示される複数の第2メモリアクセス命令のそれぞれの要求アドレスを基に前記ストライド幅を算出して前記所定エントリに登録し、且つ、前記第2メモリアクセス命令の前記要求アドレスに前記ストライド幅を加算して算出した予測アドレスを前記所定エントリに登録し、前記第2メモリアクセス命令の後続の前記所定のプログラムカウンタで示される複数の第3メモリアクセス命令のそれぞれの要求アドレスに前記ストライド幅を加算して算出した値で前記予測アドレスを順次更新し、前記第3メモリアクセス命令のそれぞれの要求アドレスと前記所定エントリに登録された前記予測アドレスとを比較してストライドアクセスの発生を検出する
ことを特徴とする請求項1に記載の演算処理装置。
【請求項3】
前記管理部は、前記第3メモリアクセス命令の要求アドレスと前記所定エントリに登録された前記予測アドレスとが一致する場合に信頼度カウンタを増加させ、且つ、前記第3メモリアクセス命令の要求アドレスと前記所定エントリに登録された前記予測アドレスとが一致しない場合に信頼度カウンタを減少させ、前記信頼度カウンタが上限値を超えた場合に前記所定エントリに登録された前記ストライド幅による前記ストライドアクセスを検出することを特徴とする請求項2に記載の演算処理装置。
【請求項4】
前記プリフェッチ要求生成部は、前記管理部により前記ストライドアクセスの発生が検出された場合、前記所定のプログラムカウンタで示されるメモリアクセス命令の要求アドレスに前記ストライド幅を所定数倍した値を加算したアドレスでプリフェッチ要求を発行することを特徴とする請求項1に記載の演算処理装置。
【請求項5】
前記監視部は、前記プリフェッチキューに前記所定エントリを登録する空きが存在しない場合、前記プリフェッチキューに格納された複数のエントリから1つエントリを選択して無効にして、前記所定エントリを登録することを特徴とする請求項2に記載の演算処理装置。
【請求項6】
前記監視部は、前記プリフェッチキューに格納された各前記エントリのそれぞれに含まれるプログラムカウンタで示されるメモリアクセス命令の発行頻度を基に、無効にするエントリを選択することを特徴とする請求項5に記載の演算処理装置。
【請求項7】
所定のプログラムカウンタで示される2つのメモリアクセス命令のそれぞれの要求アドレスを基にストライド幅を算出し、
前記所定のプログラムカウンタで示される複数のメモリアクセス命令の要求アドレス及び算出した前記ストライド幅を基にストライドアクセスの発生を検出し、
前記ストライドアクセスを検出した場合、前記ストライド幅に基づくプリフェッチ要求を発行する
処理を演算処理装置が実行することを特徴とする演算処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、演算処理装置及び演算処理方法に関する。
【背景技術】
【0002】
コンピュータはCPU(Central Processing Unit)コアと主記憶装置との間に複数階層のキャッシュメモリを有し、主記憶装置や下位階層キャッシュメモリへのアクセスレイテンシ隠蔽やスループット不足の改善を図っている。さらに、近年CPUにおけるコアの高速化やメニーコア化が進んでおり、キャッシュメモリのヒット率向上やキャッシュミスレイテンシの隠蔽が重要となっている。
【0003】
キャッシュメモリのヒット率向上やキャッシュミスレイテンシの隠蔽のための方法の1つとして、近い将来の使用が予測されるデータを予めキャッシュメモリに読み込んでおくことでキャッシュミスの発生を減らすプリフェッチ手法の導入が進んでいる。プリフェッチの実現方法としては、ソフトウェアプリフェッチと呼ばれるソフトウェアによる手法とハードウェアプリフェッチと呼ばれるハードウェアによる手法とがある。
【0004】
従来、ハードウェアプリフェッチ手法としては、ストリームプリフェッチと呼ばれる手法やストライドプリフェッチと呼ばれる手法が多く採用されている。ストリームプリフェッチは、キャッシュライン単位での連続アクセスであるストリームアクセスに対するプリフェッチを行うハードウェアプリフェッチ手法である。ストライドプリフェッチは、一定間隔での定型ストライドアクセスに対するプリフェッチを行うハードウェアプリフェッチ手法である。
【0005】
ここで、アクセスA1、アクセスA2、・・・といったロード命令やストア命令などのメモリアクセス命令が、追番の順にメインメモリの所定の位置にアクセスする場合で説明する。例えば、アクセスA1、アクセスA2、・・・がキャッシュライン(Cache Line)単位で連続アクセスする場合、CPUは、ストリームプリフェッチで対応することが可能である。例えば、CPUは、アクセスA1、アクセスA2、アクセスA3でアクセスしたキャッシュメモリアドレスからストリームアクセスであることを検出する。そして、CPUは、アクセスA3のキャッシュメモリアドレスの次のキャッシュラインにアクセスが来ることを予測し、アクセスA4がアクセスする領域をプリフェッチによって予めキャッシュメモリに読み込んでおく。その結果、アクセスA4の命令実行時にはキャッシュメモリにすでにデータが登録されているため、CPUは、キャッシュミスの発生を抑えることができ演算性能が向上する。
【0006】
一方、アクセスA1、アクセスA2、・・・がキャッシュラインを一定間隔でアクセスする場合、CPUは、ストライドプリフェッチで対応することが可能である。例えば、CPUは、アクセスA1、アクセスA2、アクセスA3のアクセスしたキャッシュメモリアドレス(アドレス)から1個跳びでアクセスしていることを検出する。そして、CPUは、アクセスA3の次も1個跳びでアクセスが発生すると予測して、アクセスA4がアクセスする領域をプリフェッチによって予めキャッシュメモリに読み込んでおく。この場合も、アクセスA4の命令実行時にはキャッシュメモリにすでにデータが登録されているため、CPUは、キャッシュミスの発生を抑えることができ演算性能が向上する。この一定間隔のキャッシュラインの幅を、ストライド幅と呼ぶ。
【0007】
ここで、ストライドアクセスには単一ストライドと複数ストライドに分けることができる。単一ストライドは、常に一定のストライド幅でアクセスが発生する場合である。これに対して、複数ストライドは、複数のストライド幅が混在するようにアクセスが発生する場合である。複数ストライドは、例えば、第1のストライド幅でのアクセスが一定回数発生した後に、異なる第2のストライド幅でのアクセスが発生するような場合である。ただし、複数ストライドであっても、キャッシュラインサイズ内のストライド幅とキャッシュラインサイズを超えるストライド幅との2種類の混在のような場合は、キャッシュライン単位では単一ストライドと見ることも可能である。
【0008】
このようなプリフェッチの技術として、前後のアドレスの差分によりストライド幅を決定し、メモリアクセス毎にストライド幅の数をカウントし、カウンタが上限値以上となった場合にプリフェッチを行う技術が提案されている。また、ストライド幅が所定のレンジに含まれるか否かによりカウンタを増減させ、カウンタの値を基にストライド幅を計算してプリフェッチを行う技術が提案されている。
【先行技術文献】
【特許文献】
【0009】
【特許文献1】特表2006-510082号公報
【特許文献2】特表2013-539117号公報
【発明の概要】
【発明が解決しようとする課題】
【0010】
しかしながら、従来のストライドプリフェッチが対象とするストライドアクセスは、単一ストライドである。従来のストライドプリフェッチでは、複数ストライドと単一ストライドとのアクセスパターンの区別は行われず、複数ストライドのアクセスに対しても単一ストライドのプリフェッチを起動してしまう。複数ストライドに対して単一ストライドのプリフェッチを起動してしまうと、誤ったアドレスでプリフェッチが行われる場合がある。その場合、不要なデータをキャッシュに格納することによるキャッシュ汚染やメモリバンド幅の圧迫が原因となり、CPUの性能低下を引き起こすおそれがある。
【0011】
例えば、多くのストライド幅が128バイトであるため、従来技術では128バイトでプリフェッチを起動することが多い。しかし、ストライド幅が192バイトなど他のストライド幅に変化するとプリフェッチ先のアドレスが、不適切なデータを指してしまい、誤ったプリフェッチが発生する。これは、キャッシュライン単位では単一ストライドと見ることも可能な複数ストライドであっても同様である。
【0012】
また、ストライド幅の数をカウントが上限値以上となった場合にプリフェッチを行う技術では、ストライド幅の変化に十分に追従できず、誤ったプリフェッチが発生するおそれがある。また、ストライド幅が所定のレンジに含まれるか否かにより増減させたカウンタを基にストライド幅を計算してプリフェッチを行う技術では、確実なストライド幅の決定が難しく、誤ったプリフェッチが発生するおそれがある。したがって、いずれの技術を用いても、CPUの演算性能を向上させることは困難である。
【0013】
開示の技術は、上記に鑑みてなされたものであって、演算性能を向上させる演算処理装置及び演算処理方法を提供することを目的とする。
【課題を解決するための手段】
【0014】
本願の開示する演算処理装置及び演算処理方法の一つの態様において、管理部は、所定のプログラムカウンタで示される2つのメモリアクセス命令のそれぞれの要求アドレスを基にストライド幅を算出し、前記所定のプログラムカウンタで示される複数のメモリアクセス命令の要求アドレス及び算出した前記ストライド幅を基にストライドアクセスの発生を検出する。プリフェッチ要求生成部は、前記管理部により前記ストライドアクセスが検出された場合、前記ストライド幅に基づくプリフェッチ要求を発行する。
【発明の効果】
【0015】
1つの側面では、本発明は、演算性能を向上させることができる。
【図面の簡単な説明】
【0016】
【
図1】
図1は、情報処理装置の全体構成を示す概略図である。
【
図2】
図2は、実施例に係るCPUの詳細を示すブロック図である。
【
図3】
図3は、実施例1に係るプリフェッチキューに格納されるエントリのフォーマットの一例を示す図である。
【
図4】
図4は、プリフェッチキューのエントリのステートを管理するステートマシンを示す図である。
【
図5】
図5は、ステート遷移時に各エントリで更新される情報の一覧を示す図である。
【
図6】
図6は、単一ストライドの場合のエントリの遷移の一例を示す図である。
【
図7】
図7は、単一ストライドの場合のアクセス及びプリフェッチの一例を示す図である。
【
図8】
図8は、複数ストライドの場合のエントリの遷移の一例を示す図である。
【
図9】
図9は、複数ストライドの場合のアクセスの一例を示す図である。
【
図10】
図10は、複数ストライドであるがキャッシュライン単位で見て単一ストライドとなる場合のエントリの遷移の一例を示す図である。
【
図11】
図11は、複数ストライドであるがキャッシュライン単位で見て単一ストライドとなる場合のアクセス及びプリフェッチの一例を示す図である。
【
図12】
図12は、実施例1に係るCPUによるプリフェッチ処理のフローチャートである。
【
図13】
図13は、ステート管理部によるステート更新処理のフローチャートである。
【
図14】
図14は、ステート#2におけるステート更新処理実行のフローチャートである。
【
図15】
図15は、ステート#3におけるステート更新処理実行のフローチャートである。
【
図16】
図16は、ステート#4におけるステート更新処理実行のフローチャートである。
【
図17】
図17は、実施例2に係るプリフェッチキューに格納されるエントリのフォーマットの一例を示す図である。
【
図18】
図18は、リプレース制御のためのステートマシンの一例を示す図である。
【
図19】
図19は、実施例2に係るCPUによるプリフェッチ処理のフローチャートである。
【発明を実施するための形態】
【0017】
以下に、本願の開示する演算処理装置及び演算処理方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理方法が限定されるものではない。
【実施例0018】
図1は、情報処理装置の全体構成を示す概略図である。
図1に示すように、情報処理装置1は、演算部11、L1キャッシュ12、下位キャッシュ13、メインメモリ14、補助記憶装置15、表示装置16及び入力装置17を有する。演算部11は、L1キャッシュ12、下位キャッシュ13、メインメモリ14、補助記憶装置15、表示装置16及び入力装置17のそれぞれとバスで接続される。演算部11、L1キャッシュ12及び下位キャッシュ13は、例えば、演算処理装置であるCPU10に搭載される。
【0019】
演算部11は、例えば、CPU(Central Processing Unit)コアである。演算部11は、補助記憶装置15に格納された各種プログラムなどを読み出してメインメモリ14に展開して、L1キャッシュ12、下位キャッシュ13及びメインメモリ14に格納されたデータを用いて演算を実行する。
【0020】
L1キャッシュ12は、動作速度が速く且つ下位キャッシュ13と比べて容量の小さいキャッシュメモリであり、演算部11によるデータアクセス時に最初に読み込まれるキャッシュメモリである。L1キャッシュ12は、例えば、SRAM(Static Random Access Memory)である。
【0021】
下位キャッシュ13は、動作速度が速く且つ一般的にL1キャッシュ12よりも容量の大きいキャッシュメモリであり、演算部11によるデータアクセス時に、L1キャッシュ12でキャッシュミスが発生した場合に次に読み込まれるキャッシュメモリである。下位キャッシュ13は、L2キャッシュやL3キャッシュである。下位キャッシュ13も、例えば、SRAMである。
【0022】
ここで、下位キャッシュ13の階層の数は特に制限はない。例えば、情報処理装置1は、キャッシュの階層として2つの階層や、4つ以上の階層を有してもよい。
【0023】
メインメモリ14は、L1キャッシュ12及び下位キャッシュ13に比べて動作速度が遅く且つ大容量の主記憶装置である。メインメモリ14は、演算部11が演算に用いるデータが格納される。メインメモリ14は、L1キャッシュ12及び下位キャッシュ13のいずれにもアクセス対象のデータが存在しない場合に演算部11からのアクセスを受ける。メインメモリ14は、例えば、DRAM(Dynamic Random Access Memory)である。
【0024】
補助記憶装置15は、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)などである。補助記憶装置15には、OS(Operating System)や演算を行うための各種プログラムが格納される。
【0025】
表示装置16は、例えば、モニタやディスプレイなどである。表示装置16は、演算部11による演算結果の利用者への提示などを行う。入力装置17は、例えば、キーボードやマウスなどである。利用者は、表示装置16に表示された画面を参照しつつ、入力装置17を用いて情報処理装置1へのデータや命令の入力を行う。表示装置16及び入力装置17は、1つのハードウェアとして構成されてもよい。
【0026】
図2は、実施例に係るCPUの詳細を示すブロック図である。CPU10は、演算部11が有する命令発行部101、L1キャッシュ制御部102、ストライドプリフェッチ制御部103、L1キャッシュ12及び下位キャッシュ13を有する。
【0027】
命令発行部101は、演算部11による演算等に応じてリード命令などのメモリアクセス命令をL1キャッシュ制御部102へ発行する。また、命令発行部101は、メモリアクセス命令の要求アドレス及びプログラムカウンタをストライドプリフェッチ制御部103に通知する。
【0028】
L1キャッシュ制御部102は、メモリアクセス命令を命令発行部101から受信する。そして、L1キャッシュ制御部102は、ストライドプリフェッチ制御部103が有するプリフェッチキュー131にデータが存在しなかった旨を通知するPC(Program Counter)ミスの通知をパターン監視部132から受ける。そして、L1キャッシュ制御部102は、メモリアクセス命令で指定されたデータがL1キャッシュ12に格納されているか否かを判定する。以下では、メモリアクセス命令で指定されたデータがL1キャッシュ12に格納されていない場合を、L1キャッシュミスと呼ぶ。逆に、メモリアクセス命令で指定されたデータがL1キャッシュ12に格納されていた場合を、L1キャッシュヒットと呼ぶ。
【0029】
L1キャッシュヒットの場合、L1キャッシュ制御部102は、メモリアクセス命令で指定されたデータをL1キャッシュ12から取得して演算部11へ出力する。また、L1キャッシュ制御部102は、L1キャッシュヒットをパターン監視部132に通知する。
【0030】
これに対して、L1キャッシュミスの場合、L1キャッシュ制御部102は、メモリアクセス命令で指定されたデータの取得要求を下位キャッシュ13へ出力する。その後、L1キャッシュ制御部102は、メモリアクセス命令で指定されたデータを下位キャッシュ13から取得して、演算部11へ出力するとともにL1キャッシュ12に格納する。また、L1キャッシュ制御部102は、L1キャッシュミスをパターン監視部132に通知する。
【0031】
ストライドプリフェッチ制御部103は、プリフェッチキュー131、パターン監視部132、プリフェッチ要求生成部133及びステート管理部134を有する。
【0032】
プリフェッチキュー131は、例えば、N+1個のエントリを有する。
図3は、実施例1に係るプリフェッチキューに格納されるエントリのフォーマットの一例を示す図である。プリフェッチキュー131の各エントリには、フォーマット201に示すように、プログラムカウンタ、ステート情報、ストライド情報、信頼度カウンタ及びアドレス情報が登録される。
【0033】
プログラムカウンタは、プリフェッチキュー131に格納されたプリフェッチしたデータに対するメモリアクセス命令のプログラムカウンタを表す。ステート情報は、プリフェッチキュー131におけるエントリがどの状態であるかを示すステートの情報である。本実施例では、ステートには、ステート#1~#4の5つの状態が存在する。ステート#0は、無効状態すなわち空きエントリであることを表す。ステート#1は、初期登録状態を表す。ステート#2は、ストライド幅登録状態を表す。ステート#3は、前回アクセスでアドレスがヒットした状態を表す。ステート#4は、前回アクセスでアドレスミスした状態を表す。信頼度カウンタは、ストライドアクセスの信頼性を示す情報である。
【0034】
図2に戻って説明を続ける。パターン監視部132は、命令発行部101からのメモリアクセス命令の発行時に、メモリアクセス命令の要求アドレス及びプログラムカウンタの通知を命令発行部101から受ける。そして、パターン監視部132は、メモリアクセス命令のプログラムカウンタでプリフェッチキュー131を検索する。以下では、この検索において、一致するプログラムカウンタを有するエントリがプリフェッチキュー131に登録されている場合を、「PC(Program Counter)ヒット」と呼ぶ。逆に、一致するプログラムカウンタを有するエントリがプリフェッチキュー131に登録されていない場合を、「PCミス」と呼ぶ。
【0035】
PCヒットの場合、パターン監視部132は、PCヒットの通知とともに、エントリのプログラムカウンタの値をステート管理部134に通知する。
【0036】
PCミスの場合、パターン監視部132は、PCミスをパターン監視部132に通知する。その後、L1キャッシュミスの場合、パターン監視部132は、L1キャッシュミスの通知をL1キャッシュ制御部102から受ける。そして、パターン監視部132は、プリフェッチキュー131に新たなエントリを格納する空きがあるか否かを判定する。
【0037】
プリフェッチキュー131に空きがあれば、パターン監視部132は、L1キャッシュミスが発生したメモリアクセス命令についての新たに登録するエントリのステート情報をステート#1とする。また、パターン監視部132は、新たに登録するエントリのプログラムカウンタをメモリアクセス命令のプログラムカウンタとする。また、パターン監視部132は、メモリアクセス命令の要求アドレスを予測アドレスとして新たに登録するエントリのアドレス情報に登録する。ここで、ステート#1ではストライド幅情報は無効なので、パターン監視部132は、予め決められた初期値など任意の値をストライド幅情報として登録する。そして、パターン監視部132は、以上の内容で新たなエントリをプリフェッチキュー131に登録する。
【0038】
これに対して、プリフェッチキュー131に空きがなければ、パターン監視部132は、プリフェッチキュー131での格納時間が最も長いエントリを検索して削除する。その後、パターン監視部132は、プリフェッチキュー131に空きがある場合と同様の手順で、L1キャッシュミスが発生したメモリアクセス命令に対応するエントリをプリフェッチキュー131に登録する。このパターン監視部132が、「監視部」の一例にあたる。また、パターン監視部132により新たに登録されたエントリに対応するメモリアクセス命令が、「第1メモリアクセス命令」の一例にあたる。また、このパターン監視部132により新たに登録されたエントリが、「所定エントリ」の一例にあたる。
【0039】
このように、所定のプログラムカウンタで示される第1メモリアクセス命令でキャッシュミスが発生し、且つ、所定のプログラムカウンタの情報を含む所定エントリがプリフェッチキュー131に存在しない場合に、パターン監視部132は、以下の処理を行う。すなわち、パターン監視部132は、所定のプログラムカウンタの情報を含む所定エントリをプリフェッチキュー131に登録する。
【0040】
図4は、プリフェッチキューのエントリのステートを管理するステートマシンを示す図である。キャッシュミスが発生しなければ新たにエントリが増えないため、パターン監視部132は、その時点のプリフェッチキュー131におけるエントリの状態を保持する(ステップS1)。
【0041】
これに対して、キャッシュミスが発生した場合、パターン監視部132は、キャッシュミスが発生したメモリアクセス命令のプログラムカウンタの値が登録されたエントリをプリフェッチキュー131に新たに登録して、ステート情報をステート#1とする。すなわち、パターン監視部132は、ステート#0であったエントリをステート#1に遷移させる(ステップS2)。
【0042】
図2に戻って説明を続ける。ステート管理部134は、PCヒットの通知及びPCヒットしたエントリのプログラカウンタの値をパターン監視部132から受ける。そして、ステート管理部134は、PCヒットしたプリフェッチキュー131のエントリのステート情報及び信頼度カウンタの値をステートマシンにしたがって更新する。このステート管理部134が、「管理部」の一例にあたる。
【0043】
以下に、
図4を参照して、ステート情報の更新処理を説明する。ここでは、PCヒットが発生し、ステート管理部134がプログラムカウンタの値をパターン監視部132から取得したエントリを、「対象エントリ」と呼ぶ。また、以下では、エントリのステート情報がステート#1~#4であることを、単にエントリがステート#1~#4であると言う場合がある。ステート管理部134は、対象エントリの、ステート情報、ストライド幅情報、信頼度カウンタの値及びアドレス情報をプリフェッチキュー131から取得する。
【0044】
対象エントリがステート#1の場合、ステート管理部134は、対象エントリのステート情報をステート#2に変更し、対象エントリをステート#1からステート#2に遷移させる。また、ステート管理部134は、PCヒットしたメモリアクセス命令の要求アドレスからエントリに登録してある予測アドレスを減算し、計算結果を前回アクセスからのストライド幅として対象エントリのストライド幅情報に登録する。さらに、ステート管理部134は、要求アドレスと算出したストライド幅とを加算して予測アドレスを算出し、算出した予測アドレスを対象エントリのアドレス情報に登録する(ステップS3)。このアドレス情報に格納された予測アドレスは、次に来る同一のプログラムカウンタを有するメモリアクセス命令の要求アドレスを予測した値である。
【0045】
対象エントリがステート#2~#4のいずれかの場合、アドレス情報には次に発行される同一のプログラムカウンタの予測アドレスが登録されている。そこで、対象エントリがステート#2~#4のいずれかの場合、ステート管理部134は、要求アドレスとエントリに登録された予測アドレスとが一致するか否かを判定するアドレスヒット判定を行う。要求アドレスとエントリに登録された予測アドレスとが一致する場合を、「アドレスヒット」と呼ぶ。逆に、要求アドレスとエントリに登録された予測アドレスとが一致しない場合を、「アドレスミス」と呼ぶ。
【0046】
対象エントリがステート#2の場合にアドレスヒットすると、ステート管理部134は、対象エントリをステート#3に遷移させる。また、ステート管理部134は、信頼度カウンタを3にセットする(ステップS4)。
【0047】
これに対して、対象エントリがステート#2の場合にアドレスミスすると、ステート管理部134は、対象エントリをステート#4に遷移させる。さらに、ステート管理部134は、信頼度カウンタを1にセットする(ステップS5)。
【0048】
また、ステート管理部134は、アドレスヒット及びアドレスミスのいずれの場合にも、要求アドレスにストライド幅を加算して予測アドレスを算出し、算出した予測アドレスを対象エントリのアドレス情報に登録する。
【0049】
対象エントリがステート#3の場合にアドレスヒットすると、ステート管理部134は、対象エントリのステート情報をステート#3に維持したまま、信頼度カウンタを1つインクリメントする(ステップS6)。
【0050】
これに対して、対象エントリがステート#3の場合にアドレスミスすると、ステート管理部134は、対象エントリの信頼度カウンタの値が予め決められた上限値に達しているか否かを判定する。対象エントリの信頼度カウンタの値が上限に達していない場合、ステート管理部134は、信頼度カウンタを1にセットする。これに対して、対象エントリの信頼度カウンタの値が上限に達している場合、ステート管理部134は、対象エントリのステート情報をステート#4に維持したまま、信頼度カウンタを1つデクリメントする。そして、ステート管理部134は、対象エントリをステート#4に遷移させる(ステップS7)。
【0051】
対象エントリがステート#4の場合にアドレスヒットすると、ステート管理部134は、対象エントリをステート#3に遷移させる。さらに、ステート管理部134は、対象エントリの信頼度カウンタを1つインクリメントする(ステップS8)。
【0052】
これに対して、対象エントリがステート#4の場合にアドレスミスすると、ステート管理部134は、対象エントリのステート情報を維持したまま、対象エントリの信頼度カウンタを1つデクリメントする(ステップS9)。そして、ステート管理部134は、信頼度カウンタの値が0であるか否かを判定する。信頼度カウンタの値が0でなければ、ステート管理部134は、対象エントリのその時点の状態を維持する。これに対して、信頼度カウンタの値が0であれば、ステート管理部134は、対象エントリをステート#0に遷移させて無効状態にする(ステップS10)。
【0053】
対象エントリが、「所定エントリ」の一例にあたる。また、対象エントリがプリフェッチキュー131に登録されてからステート#3に遷移までの、対象エントリに登録されたプログラムカウンタを有するメモリアクセス命令が、「第2メモリアクセス命令」の一例にあたる。また、ステート#3に遷移した後の対象エントリ登録されたプログラムカウンタを有するメモリアクセス命令が、「第3メモリアクセス命令」の一例にあたる。すなわち、ステート管理部134は、第1メモリアクセス命令の要求アドレス及び所定エントリの後続の所定のプログラムカウンタで示される複数の第2メモリアクセス命令のそれぞれの要求アドレスを基にストライド幅を算出して所定エントリに登録する。且つ、ステート管理部134は、第2メモリアクセス命令の要求アドレスにストライド幅を加算して算出した予測アドレスを所定エントリに登録する。さらに、ステート管理部134は、第2メモリアクセス命令の後続の所定のプログラムカウンタで示される複数の第3メモリアクセス命令のそれぞれの要求アドレスにストライド幅を加算して算出した値で予測アドレスを順次更新する。そして、ステート管理部134は、第3メモリアクセス命令のそれぞれの要求アドレスと所定エントリに登録された予測アドレスとを比較してストライドアクセスの発生を検出する。
【0054】
図5は、ステート遷移時に各エントリで更新される情報の一覧を示す図である。次に、
図5の表202を参照して、ステート遷移時の各エントリの更新される信頼度カウンタ以外の情報をまとめて説明する。
図5の表202では、信頼度カウンタの値は省略した。
【0055】
対象エントリをステート#0からステート#1に遷移させる場合、パターン監視部132は、対象エントリのプログラムカウンタとしてメモリアクセス命令のプログラムカウンタを登録する。また、パターン監視部132は、メモリアクセス命令の要求アドレスを予測アドレスとして登録する。この場合、パターン監視部132は、ストライド幅には適当な値を登録してよい。
【0056】
対象エントリをステート#1からステート#2に遷移させる場合、ステート管理部134は、プログラムカウンタの値を保持させる。そして、ステート#1の場合のアドレス情報には前回の要求アドレスが予測アドレスとして格納されているので、ステート管理部134は、要求アドレスから予測アドレスを減算してストライド幅を算出する。また、ステート管理部134は、要求アドレスにストライド幅を加算して予測アドレスを算出してアドレス情報として登録して更新する。
【0057】
対象エントリをステート#4からステート#0に遷移させる場合、及び、ステート#0から遷移させない場合は、パターン監視部132及びステート管理部134は、エントリの信頼度カウンタ以外の情報の更新は行わない。
【0058】
上述したステートの遷移以外の場合、ステート管理部134は、プログラムカウンタの値を保持させる。また、ステート管理部134は、ストライド幅情報を維持する。また、ステート管理部134は、要求アドレスにストライド幅を加算して予測アドレスを算出してアドレス情報として登録して更新する。
【0059】
図2に戻って説明を続ける。対象エントリのステート情報の更新後、ステート管理部134は、対象エントリについて下位キャッシュ13に対するプリフェッチ要求の発行条件を満たしているか否かを判定する。プリフェッチ要求の発行条件を満たす場合、ステート管理部134は、ストライド幅情報で示されるストライド幅でストライドアクセスが実行されると推測する。プリフェッチ要求の発行条件を満たすと判定した場合、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に依頼する。この際、ステート管理部134は、プリフェッチ要求の発行条件を満たしたエントリのプログラムカウンタの値をプリフェッチ要求生成部133に出力する。
【0060】
ここで、プリフェッチ要求の発行条件は、対象エントリがアドレスヒットし、ステート#3であり、且つ、信頼度カウンタの値が閾値を超えた場合である。信頼度カウンタの値の閾値は、大きければストライドアクセスの判定精度が向上するが、プリフェッチの起動が遅くなる。すなわち、信頼度カウンタの値の閾値は、ストライドアクセスの判定精度とプリフェッチの起動とのバランスを考慮して、運用に合わせて設定されることが好ましい。閾値が例えば6の場合、ステート管理部134は、ステート#1でのアドレスヒット時に信頼度カウンタを3にセットする。そして、その後4回連続で同じストライド幅のアクセスがあると、ステート管理部134は、信頼度カウンタを6として、プリフェッチ要求の発行条件を満たすと判定する。すなわち、ステート管理部134は、そのストライド幅でストライドアクセスが行われていると判定する。
【0061】
プリフェッチ要求生成部133は、プリフェッチ要求の発行依頼をプリフェッチ要求の発行条件を満たしたエントリのプログラムカウンタの値とともにステート管理部134から受ける。次に、プリフェッチ要求生成部133は、取得したプログラムカウンタの値を有するエントリからストライド幅情報を取得する。そして、プリフェッチ要求生成部133は、キャッシュミスしたメモリアクセス命令の要求アドレスに取得したストライド幅を所定数倍した値を加算して算出したアドレスでプリフェッチ要求を下位キャッシュ20に発行する。ここで、所定数は、任意の整数値であり、例えば、プリフェッチ要求を出したアドレスに対するメモリアクセス命令が命令発行部101から発行される前に、L1キャッシュ12にデータ登録できる値が設定される。
【0062】
図6は、単一ストライドの場合のエントリの遷移の一例を示す図である。次に、
図6を参照して、単一ストライドの場合のエントリの遷移の具体例を説明する。ここでは、ストライド幅として切りの良い数字である100を使用し、また、キャッシュラインサイズは50として説明する。
図6では、単一ストライドアクセスが行われ、アドレスは0を先頭にストライド幅が100のメモリアクセス命令が連続する。また、プログラムカウンタは例として1000のメモリアクセス命令であるとする。さらに、プリフェッチを発行する信頼度カウンタの上限値は6とする。
図6の各欄における矢印は矢印の下から先への情報の更新を表す。
【0063】
命令発行部101は、0のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プリフェッチキュー131にエントリを初期登録する。そして、パターン監視部132は、エントリのステート情報をステート#1に設定し、プログラムカウンタに1000を登録し、アドレス情報として0を登録する(ステップS11)。
【0064】
次に、命令発行部101は、100のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プログラムカウンタが1000のエントリのPCヒットを検出する。そして、ステート管理部134は、要求アドレスである100からアドレス情報に格納された0を減算して、ストライド幅を100と求める。次に、ステート管理部134は、求めたストライド幅をストライド幅情報として登録し、要求アドレスである100にストライド幅である100を加えた値である200を予測アドレスとしてアドレス情報に登録する。さらに、ステート管理部134は、ステート情報をステート#1からステート#2に変更する(ステップS12)。
【0065】
次に、命令発行部101は、200のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが一致するアドレスヒットであるため、ステート管理部134は、ステート情報をステート#2からステート#3へ変更する。さらに、ステート管理部134は、信頼度カウンタを3に設定する。また、ステート管理部134は、要求アドレスである200にストライド幅である100を加えた値である300を予測アドレスとしてアドレス情報に登録する(ステップS13)。
【0066】
次に、命令発行部101は、300のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである300にストライド幅である100を加えた値である400を予測アドレスとしてアドレス情報に登録する(ステップS14)。
【0067】
次に、命令発行部101から発行される400のアドレス番号へのメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである400にストライド幅である100を加えた値である500を予測アドレスとしてアドレス情報に登録する(ステップS15)。
【0068】
次に、命令発行部101から発行される500のアドレス番号へのメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである500にストライド幅である100を加えた値である600を予測アドレスとしてアドレス情報に登録する。さらに、信頼度カウンタが6以上となり、ステート管理部134は、プリフェッチ要求の発行条件を満たしたと判定する。そして、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に依頼する。プリフェッチ要求生成部133は、ストライド幅である100に所定数であるNを乗算した値を要求アドレスである500に加算した500+100×Nのアドレス番号を有するアドレスでプリフェッチを実行する(ステップS16)。
【0069】
次に、命令発行部101から発行される600のアドレス番号へのメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである600にストライド幅である100を加えた値である700を予測アドレスとしてアドレス情報に登録する。さらに、信頼度カウンタが6以上であるので、ステート管理部134は、プリフェッチ要求の発行条件を満たしたと判定する。そして、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に依頼する。プリフェッチ要求生成部133は、600+100×Nのアドレス番号を有するアドレスでプリフェッチを実行する(ステップS17)。
【0070】
図7は、単一ストライドの場合のアクセス及びプリフェッチの一例を示す図である。ここでは、プリフェッチの際に用いる所定数Nが2の場合で説明する。
【0071】
図7に示すように、単一ストライドの場合、ストライド幅が100のアクセスが繰り返される。そのため、ステート管理部134は、信頼度カウンタをメモリアクセス命令毎に増加させる。その後、信頼度カウンタが上限に達すると、ステート管理部134は、ストライド幅を100として要求アドレスに100×2を加算したアドレス番号を有するアドレスに対してプリフェッチを実行させる。この場合、単一ストライドであるので、プリフェッチが成功する。
【0072】
図8は、複数ストライドの場合のエントリの遷移の一例を示す図である。次に、
図8を参照して、複数ストライドの場合のエントリの遷移の具体例を説明する。ここでは、ストライド幅として切りの良い数字である100及び2000を使用し、また、キャッシュラインサイズは50として説明する。
図8では、複数ストライドアクセスが行われ、命令発行部101は、アドレスは0を先頭にストライド幅が100のメモリアクセス命令を3回続けて発行した後、ストライド幅が2000のメモリアクセス命令を1回挟む命令発行を繰り返す。また、プログラムカウンタは例として1000のメモリアクセス命令であるとする。さらに、プリフェッチを発行する信頼度カウンタの上限値は6とする。
図8の各欄における矢印は矢印の下から先への情報の更新を表す。
【0073】
命令発行部101は、0のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プリフェッチキュー131にエントリを初期登録する。そして、パターン監視部132は、エントリのステート情報をステート#1に設定し、プログラムカウンタに1000を登録し、アドレス情報として0を登録する(ステップS21)。
【0074】
次に、命令発行部101は、100のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プログラムカウンタが1000のエントリのPCヒットを検出する。そして、ステート管理部134は、要求アドレスである100からアドレス情報に格納された0を減算して、ストライド幅を100と求める。次に、ステート管理部134は、求めたストライド幅をストライド幅情報として登録し、要求アドレスである100にストライド幅である100を加えた値である200を予測アドレスとしてアドレス情報に登録する。さらに、ステート管理部134は、ステート情報をステート#1からステート#2に変更する(ステップS22)。
【0075】
次に、命令発行部101は、200のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが一致するアドレスヒットであるため、ステート管理部134は、ステート情報をステート#2からステート#3へ変更する。さらに、ステート管理部134は、信頼度カウンタを3に設定する。また、ステート管理部134は、要求アドレスである200にストライド幅である100を加えた値である300を予測アドレスとしてアドレス情報に登録する(ステップ23)。
【0076】
次に、命令発行部101は、300のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである300にストライド幅である100を加えた値である400を予測アドレスとしてアドレス情報に登録する(ステップS24)。
【0077】
次に、命令発行部101は、2300のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが不一致となりアドレスミスであるため、ステート管理部134は、ステート情報をステート#3からステート#4へ変更する。また、信頼度カウンタの値が4であり上限値に達していないため、ステート管理部134は、信頼度カウンタを1に変更する。さらに、ステート管理部134は、要求アドレスである2300にストライド幅である100を加えた値である2400を予測アドレスとしてアドレス情報に登録する(ステップS25)。
【0078】
次に、命令発行部101は、2400のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが一致するアドレスヒットであるため、ステート管理部134は、ステート情報をステート#4からステート#3へ変更する。さらに、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである2400にストライド幅である100を加えた値である2500を予測アドレスとしてアドレス情報に登録する(ステップS26)。
【0079】
次に、命令発行部101から発行される2500のアドレス番号へのメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである2500にストライド幅である100を加えた値である2600を予測アドレスとしてアドレス情報に登録する(ステップS27)。
【0080】
次に、命令発行部101から発行される2600のアドレス番号へのメモリアクセス要求でもアドレスヒットするため、ステート管理部134は、信頼度カウンタをインクリメントする。この場合、ステート管理部134は、エントリに対してステート情報及びストライド幅情報を維持させる。また、ステート管理部134は、要求アドレスである2600にストライド幅である100を加えた値である2700を予測アドレスとしてアドレス情報に登録する(ステップS28)。
【0081】
次に、命令発行部101は、4600のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが不一致となりアドレスミスであるため、ステート管理部134は、ステート情報をステート#3からステート#4へ変更する。さらに、信頼度カウンタの値が4であり上限値に達していないため、ステート管理部134は、信頼度カウンタを1に変更する。さらに、ステート管理部134は、要求アドレスである4600にストライド幅である100を加えた値である4700を予測アドレスとしてアドレス情報に登録する(ステップS29)。
【0082】
このように、ステート管理部134は、信頼度カウンタが上限値に達しないことから単一ストライドではないと判断でき、誤ったプリフェッチの発行を抑制することができる。
【0083】
図9は、複数ストライドの場合のアクセスの一例を示す図である。
図9に示すように、複数ストライドの場合、ストライド幅が100のアクセスが繰り返されるうちは、ステート管理部134は、信頼度カウンタをメモリアクセス命令毎に増加させる。しかし、信頼度カウンタが上限に達するまでに、ストライド幅が2000のアクセスが発生するため、アドレスミスが発生し、ステート管理部134は、信頼度カウンタの値を減らす。そのため、信頼度カウンタは上限に達せず、ステート管理部134は、誤ったプリフェッチを回避できる。
【0084】
図10は、複数ストライドであるがキャッシュライン単位で見て単一ストライドとなる場合のエントリの遷移の一例を示す図である。次に、
図10を参照して、複数ストライドの場合のエントリの遷移の具体例を説明する。ここでは、ストライド幅として8及び68を使用し、また、キャッシュラインサイズは50として説明する。
図10では、複数ストライドアクセスが行われ、命令発行部101は、アドレスは0を先頭にストライド幅が8のメモリアクセス命令を3回続けて発行した後、ストライド幅が68のメモリアクセス命令を1回挟む命令発行を繰り返す。すなわち、命令発行部101は、ストライド幅単位で見るとストライド幅が100のメモリアクセス命令の発行を繰り返すといえる。また、プログラムカウンタは例として1000のメモリアクセス命令であるとする。さらに、プリフェッチを発行する信頼度カウンタの上限値は6とする。
図10の各欄における矢印は矢印の元から先への情報の更新を表す。
【0085】
命令発行部101は、0のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プリフェッチキュー131にエントリを初期登録する。そして、パターン監視部132は、エントリのステート情報をステート#1に設定し、プログラムカウンタに1000を登録し、アドレス情報として0を登録する(ステップS31)。
【0086】
次に、命令発行部101は、8、16、32のアドレス番号を有するアドレスへのメモリアクセス要求を順次発行する。8、16、32のアドレス番号を有するアドレスへのアクセスはアドレス番号が0のアドレスへのアクセスと同一キャッシュラインへのアクセスである。以下では、前のメモリアクセス要求に対して後のメモリアクセス要求が同一のキャッシュラインのアクセスあることを、単に「同一キャッシュラインへのアクセス」と呼ぶ。パターン監視部132は、プリフェッチキュー131に格納されたステート情報、アドレス情報及びストライド幅情報を基に、同一キャッシュラインへのアクセスか否かを判定する。例えば、8、16、32のアドレス番号を有するアドレスへのメモリアクセス要求では、パターン監視部132は、ステート#1であり且つストライド幅が登録前であることを確認する。さらに、パターン監視部132は、アソレス情報に格納されたアドレスと要求アドレスとを比較して、同一キャッシュラインへのアクセスであると判定する。同一キャッシュラインへのアクセスの場合、ステート管理部134は、エントリの情報の更新を行わない(ステップS32~S34)。
【0087】
次に、命令発行部101は、100のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プログラムカウンタが1000のエントリのPCヒットを検出する。そして、ステート管理部134は、要求アドレスである100からアドレス情報に格納された0を減算して、ストライド幅を100と求める。次に、ステート管理部134は、求めたストライド幅をストライド幅情報として登録し、要求アドレスである100にストライド幅である100を加えた値である200を予測アドレスとしてアドレス情報に登録する。さらに、ステート管理部134は、ステート情報をステート#1からステート#2に変更する(ステップS35)。
【0088】
次に、命令発行部101は、108、116、132のアドレス番号を有するアドレスへのメモリアクセス要求を順次発行する。108、116、132のアドレス番号を有するアドレスへのアクセスはアドレス番号が100のアドレスへのアクセスと同一キャッシュラインへのアクセスである。パターン監視部132は、プリフェッチキュー131に格納されたステート情報、アドレス情報及びストライド幅情報を基に、同一キャッシュラインへのアクセスか否かを判定する。例えば、108、116、132のアドレス番号を有するアドレスへのメモリアクセス要求では、パターン監視部132は、ステート#2でありストライド幅が登録済みであることを確認する。そして、パターン監視部132は、アソレス情報に格納されたアドレスからストライド幅を減算したアドレスと要求アドレスとを比較して、同一キャッシュラインへのアクセスであると判定する。同一キャッシュラインへのアクセスの場合、ステート管理部134は、エントリの情報の更新を行わない(ステップS36~S38)。
【0089】
次に、命令発行部101は、200のアドレス番号を有するアドレスへのメモリアクセス要求を発行する。L1キャッシュミスが発生すると、パターン監視部132は、プログラムカウンタが1000のエントリのPCヒットを検出する。このメモリアクセス要求では、プログラムカウンタが1000であるエントリに登録された予測アドレスと要求アドレスとが一致するアドレスヒットであるため、ステート管理部134は、ステート情報をステート#2からステート#3へ変更する。さらに、ステート管理部134は、信頼度カウンタを3に設定する。また、ステート管理部134は、要求アドレスである200にストライド幅である100を加えた値である300を予測アドレスとしてアドレス情報に登録する(ステップ39)。
【0090】
以降、ステート管理部134は、同様の動きを繰り返す。
図10に示されたステートマシンの動作は、プリフェッチキュー131のエントリの情報を更新しないキャッシュラインより小さなストライド幅のアクセスを除けば
図6と同じステートマシンの動きと同じとなる。そのため、
図6の場合と同様に信頼度カウンタは6に達するため、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に行わせる。
【0091】
図11は、複数ストライドであるがキャッシュライン単位で見て単一ストライドとなる場合のアクセス及びプリフェッチの一例を示す図である。ここでは、プリフェッチの際に用いる所定数Nが2の場合で説明する。
【0092】
図11に示すように、ストライド幅が8の場合には同一キャッシュラインへのアクセスとなる。そして、ストライド幅が66に変化して異なるキャッシュラインへのアクセスが発生する毎に、ステート管理部134は、信頼度カウンタを上昇させる。その後、信頼度カウンタが上限に達すると、ステート管理部134は、ストライド幅を100として要求アドレスに100×2を加算したアドレス番号を有するアドレスに対してプリフェッチを実行させる。このように、複数ストライドであるがキャッシュライン単位で見て単一ストライドとなる場合は、ステート管理部134は、単一ストライドとみなせるストライド幅でプリフェッチを実行する。
【0093】
図12は、実施例1に係るCPUによるプリフェッチ処理のフローチャートである。次に、
図12を参照して、実施例1に係るCPU10によるプリフェッチ処理の流れを説明する。
【0094】
命令発行部101は、メモリアクセス命令を発行する(ステップS101)。
【0095】
パターン監視部132は、プリフェッチキュー131にメモリアクセス要求のプログラムカウンタの値が登録されたエントリが存在するか否か、すなわち、PCヒットかPCミスかを判定する(ステップS102)。
【0096】
PCヒットの場合(ステップS102:肯定)、パターン監視部132は、PCヒットと共にPCヒットしたプログラムカウンタの情報をステート管理部134に通知する。以下では、PCヒットしたプログラムカウンタが登録されたエントリを対象エントリと呼ぶ。ステート管理部134は、通知を受けて、対象エントリのステート更新処理を実行する(ステップS103)。
【0097】
その後、ステート管理部134は、対象エントリがプリフェッチ要求の発行条件を満たすか否かを判定する(ステップS104)。対象エントリがプリフェッチ要求の発行条件を満たさない場合(ステップS104:否定)、CPU10は、今回のプリフェッチ処理を終了する。
【0098】
これに対して、対象エントリがプリフェッチ要求の発行条件を満たした場合(ステップS104:肯定)、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に依頼する。プリフェッチ要求生成部133は、依頼を受けて、プリフェッチ要求を生成して、生成したプリフェッチ要求を下位キャッシュ20へ発行する(ステップS105)。
【0099】
一方、PCミスの場合(ステップS102:否定)、パターン監視部132は、L1キャッシュ制御部102にPCミスを通知する。L1キャッシュ制御部102は、通知を受けて、メモリアクセス要求の要求アドレスで指定されたデータがL1キャッシュ12に格納されているか否か、すなわち、L1キャッシュヒットかL1キャッシュミスかを判定する(ステップS106)。L1キャッシュヒットの場合(ステップS106:否定)、CPU10は、今回のプリフェッチ処理を終了する。
【0100】
これに対して、L1キャッシュミスの場合(ステップS106:肯定)、パターン監視部132は、L1キャッシュミスの通知をL1キャッシュ制御部102から受けて、プリフェッチキュー131のエントリに空きがあるか否かを判定する(ステップS107)。プリフェッチキュー131のエントリに空きがある場合(ステップS107:肯定)、パターン監視部132は、ステップS109へ進む。
【0101】
プリフェッチキュー131のエントリに空きがない場合(ステップS107:否定)、パターン監視部132は、プリフェッチキュー131の中で最も格納時間が長いエントリを無効にする(ステップS108)。その後、パターン監視部132は、ステップS109へ進む。
【0102】
そして、パターン監視部132は、対象エントリのステートをステート#0からステート#1に遷移させる(ステップS109)。
【0103】
次に、パターン監視部132は、メモリアクセス命令のプログラムカウンタをプリフェッチキュー131の新たなエントリに登録する(ステップS110)。
【0104】
さらに、パターン監視部132は、メモリアクセス命令の要求アドレスを予測アドレスとして、新たに登録したエントリのアドレス情報に登録する(ステップS111)。
【0105】
図13は、ステート管理部によるステート更新処理のフローチャートである。
図13に示したフローは、
図12におけるステップS103で実行される処理の一例にあたる。
【0106】
パターン監視部132は、メモリアクセス要求が同一キャッシュラインへのアクセスか否かを判定する(ステップS120)。同一キャッシュラインへのアクセスの場合(ステップS120:肯定)、ステート更新処理は終了する。
【0107】
これに対して、同一キャッシュラインへのアクセスでない場合(ステップS120:否定)、ステート管理部134は、対象エントリがステート#1か否かを判定する(ステップS121)。
【0108】
対象エントリがステート#1の場合(ステップS121:肯定)、ステート管理部134は、対象ステートをステート#1からステート#2に遷移させる(ステップS122)。
【0109】
次に、ステート管理部134は、メモリアクセス命令の要求アドレスから対象エントリのアドレス情報に格納された予測アドレスを減算して、ストライド幅を算出する(ステップS123)。
【0110】
次に、ステート管理部134は、算出したストライド幅で対象エントリのストライド幅情報を登録して更新する(ステップS124)。
【0111】
次に、ステート管理部134は、メモリアクセス命令の要求アドレスにストライド幅を加算して予測アドレスを算出する。そして、ステート管理部134は、算出した予測アドレスを対象エントリのアドレス情報に登録して更新する(ステップS125)。
【0112】
一方、対象エントリがステート#1でない場合(ステップS121:否定)、ステート管理部134は、対象エントリがステート#2か否かを判定する(ステップS126)。対象エントリがステート#2の場合(ステップS126:肯定)、ステート管理部134は、ステート#2におけるステート更新処理を実行する(ステップS127)。
【0113】
これに対して、対象エントリがステート#2でない場合(ステップS126:否定)、ステート管理部134は、対象エントリがステート#3か否かを判定する(ステップS128)。対象エントリがステート#3の場合(ステップS128:肯定)、ステート管理部134は、ステート#3におけるステート更新処理を実行する(ステップS129)。
【0114】
これに対して、対象エントリがステート#3でない場合(ステップS128:否定)、ステート管理部134は、対象エントリがステート#4であると判定する。そして、ステート管理部134は、ステート#4におけるステート更新処理を実行する(ステップS130)。
【0115】
図14は、ステート#2におけるステート更新処理のフローチャートである。
図14に示したフローは、
図13におけるステップS127で実行される処理の一例にあたる。
【0116】
ステート管理部134は、メモリアクセス命令の要求アドレスとプリフェッチキュー131における対象エントリに登録された予測アドレスとが一致してアドレスヒットしたか否かを判定する(ステップS141)。
【0117】
アドレスヒットした場合(ステップS141:肯定)、ステート管理部134は、対象エントリをステート#2からステート#3に遷移させる(ステップS142)。
【0118】
次に、ステート管理部134は、対象エントリの信頼度カウンタを3に設定する(ステップS143)。その後、ステート管理部134は、ステップS146へ進む。
【0119】
これに対して、アドレスミスした場合(ステップS141:否定)、ステート管理部134は、対象エントリをステート#2からステート#4へ遷移させる(ステップS144)。
【0120】
次に、ステート管理部134は、対象エントリの信頼度カウンタを1に設定する(ステップS145)。その後、ステート管理部134は、ステップS146へ進む。
【0121】
そして、ステート管理部134は、要求アドレスに対象エントリに登録されたストライド幅を加算した値をアドレス情報に登録して更新する(ステップS146)。
【0122】
図15は、ステート#3におけるステート更新処理のフローチャートである。
図15に示したフローは、
図13におけるステップS129で実行される処理の一例にあたる。
【0123】
ステート管理部134は、メモリアクセス命令の要求アドレスとプリフェッチキュー131における対象エントリに登録された予測アドレスとが一致してアドレスヒットしたか否かを判定する(ステップS151)。
【0124】
アドレスヒットした場合(ステップS151:肯定)、ステート管理部134は、対象エントリの信頼度カウンタを1つインクリメントする(ステップS152)。その後、ステート管理部134は、ステップS157へ進む。
【0125】
これに対して、アドレスミスした場合(ステップS151:否定)、ステート管理部134は、対象エントリをステート#3からステート#4に遷移させる(ステップS153)。
【0126】
次に、ステート管理部134は、信頼度カウンタが上限値に達しているか否かを判定する(ステップS154)。
【0127】
信頼度カウンタが上限値に達している場合(ステップS154:肯定)、ステート管理部134は、対象エントリの信頼度カウンタを1つデクリメントする(ステップS155)。その後、ステート管理部134は、ステップS157へ進む。
【0128】
これに対して、信頼度カウンタが上限値に達していない場合(ステップS154:否定)、ステート管理部134は、対象エントリの信頼度カウンタを1に設定する(ステップS156)。その後、ステート管理部134は、ステップS157へ進む。
【0129】
そして、ステート管理部134は、要求アドレスに対象エントリに登録されたストライド幅を加算した値をアドレス情報に登録して更新する(ステップS157)。
【0130】
図16は、ステート#4におけるステート更新処理のフローチャートである。
図16に示したフローは、
図13におけるステップS130で実行される処理の一例にあたる。
【0131】
ステート管理部134は、メモリアクセス命令の要求アドレスとプリフェッチキュー131における対象エントリに登録された予測アドレスとが一致してアドレスヒットしたか否かを判定する(ステップS161)。
【0132】
アドレスヒットした場合(ステップS161:肯定)、ステート管理部134は、対象エントリをステート#4からステート#3に遷移させる(ステップS162)。
【0133】
次に、ステート管理部134は、対象エントリの信頼度カウンタを1つインクリメントする(ステップS163)。その後、ステート管理部134は、ステップS166へ進む。
【0134】
これに対して、アドレスミスした場合(ステップS161:否定)、ステート管理部134は、対象エントリの信頼度カウンタを1つデクリメントする(ステップS164)。
【0135】
次に、ステート管理部134は、信頼度カウンタが0か否かを判定する(ステップS165)。信頼度カウンタが0でない場合(ステップS165:否定)、ステート管理部134は、ステップS166へ進む。
【0136】
そして、ステート管理部134は、要求アドレスに対象エントリに登録されたストライド幅を加算した値をアドレス情報に登録して更新する(ステップS166)。
【0137】
これに対して、信頼度カウンタが0の場合(ステップS165:肯定)、ステート管理部134は、対象エントリをステート#4からステート#0に遷移させる(ステップS167)。これにより、対象エントリは、無効となる。
【0138】
以上に説明したように、本実施例に係る演算処理装置は、ステートマシンを用いてプリフェッチキューに格納されたプリフェッチ対象の候補となるエントリを管理し、ストライド幅に応じて信頼度を変化させ信頼度が一定値に達した場合に、プリフェッチを行う。これにより、本実施例に係る演算処理装置は、単一ストライドと複数ストライドとでアクセスパターンを区別して、単一ストライドの場合にストライドプリフェッチを実行する。これにより、複数ストライドの場合に発生する誤ったアドレスでのプリフェッチを抑制することができ、演算性能を向上させることが可能となる。
【0139】
また、複数ストライドであってもキャッシュライン単位で見て単一ストライドとなる場合、本実施例に係る演算処理装置は、単一ストライドとみなせるストライド幅でプリフェッチを実行する。これにより、誤ったアドレスでのプリフェッチを抑制しつつ、プリフェッチを行う頻度を向上させることができ、より演算性能を向上させることが可能となる。
リプレースステート情報は、エントリのリプレース、すなわち、エントリを削除して無効状態にするための制御に用いるエントリの状態を示す情報である。リプレースステートには、リプレースステート#R0~#R3が存在する。リプレースステート#R0は、そのエントリが無効の状態を表す。すなわち、特定のエントリがリプレースステート#R0に遷移すると、その特定のエントリが無効にされたことになる。
PCヒットせず且つL1キャッシュミスが発生した場合、パターン監視部132は、プリフェッチキュー131のエントリに空きがあるか否かを判定する。エントリに空きあれば、パターン監視部132は、L1キャッシュミスが発生したメモリアクセス命令についての新たに登録するエントリのステート情報をステート#1とする。この時、パターン監視部132は、新たに登録するエントリのリプレースステート情報をリプレースステート#R2とする。また、パターン監視部132は、新たに登録するエントリのプログラムカウンタをメモリアクセス命令のプログラムカウンタとする。また、パターン監視部132は、メモリアクセス命令の要求アドレスを予測アドレスとして新たに登録するエントリのアドレス情報に登録する。ここで、ステート#1ではストライド幅情報は無効なので、パターン監視部132は、予め決められた初期値など任意の値をストライド幅情報とする。そして、パターン監視部132は、以上の内容で新たなエントリをプリフェッチキュー131に登録する。
これに対して、プリフェッチキュー131のエントリに空きがない場合、パターン監視部132は、以下の2つの条件のいずれかを満たしたエントリをリプレース対象として選択する。第1の条件は、ステート#4であり且つ信頼度カウンタが信頼度閾値以下であるエントリを選択するといった条件である。パターン監視部132は、信頼度閾値を例えば2に設定することができる。第1の条件は、定期的にアドレスミスが発生するアクセスはストライドプリフェッチに使用されないため、エントリから追い出したいといったことを理由とする条件である。定期的にアドレスミスが発生するアクセスは、信頼度カウンタが定期的に信頼度閾値以下になるため、パターン監視部132は、そのアクセスに対するエントリをリプレース対象として選択できる。
第2の条件は、リプレース制御のためのステートマシンにおいてリプレースステート#R0にされたエントリが無効とされる条件である。すなわち、パターン監視部132は、エントリに空きがない状態で第1の条件を満たすエントリが無い場合、リプレース制御のためのステートマシンにおいてデクリメントイベントを発生させる。デクリメントイベントとは、全エントリのリプレースステートを1つ若番のリプレースステートに遷移させるイベントである。デクリメントイベントが何度か繰り返されると、エントリの中でリプレースステート#R0となるエントリが発生するので、パターン監視部132は、第2の条件に応じてエントリを無効にすることができる。ここで、パターン監視部132は、あるエントリのリプレースステート情報をリプレースステート#R0とした場合、そのエントリのステート情報もステート#0に更新する。
PCヒットした場合、リプレースステート#R0のエントリは発生しないため、パターン監視部132は、第1の条件を用いてリプレース対象とするエントリを選択する。そして、PCミスとなると信頼度カウンタが更新されなくなるため第1の条件を満たすエントリが存在しなくなる可能性があるが、PCヒットが途絶えることでいずれかのエントリがリプレースステート#R0になり第2の条件を満たす状態となる。
パターン監視部132は、PCヒットが発生すると、その対象エントリのリプレースステート情報をリプレースステート#R3に更新する。さらに、パターン監視部132は、あるエントリのステート情報をステート#0とした場合、そのエントリのリプレースステート情報もリプレースステート#R0に更新する。
受信したメモリアクセス命令についてPCミスが発生し且つL1キャッシュミスが発生した場合、パターン監視部132は、そのメモリアクセス命令のプログラムカウンタを有するエントリを新規登録する。そして、パターン監視部132は、新たに登録したエントリのステート情報をステート#1に設定するとともに、リプレースステート情報をリプレースステート#R2に設定する初期登録を行う(ステップS201)。
また、パターン監視部132は、受信したメモリアクセス命令についてPCミスが発生し且つL1キャッシュミスが発生しエントリを新規登録する場合、以下の処理を実行する。すなわち、パターン監視部132は、プリフェッチキュー131にエントリの空きが無く且つ第1の条件を満たすエントリも存在しない場合デクリメントイベントを発生させる(ステップS202、S203、S204)。これにより、エントリを無効にできる可能性が有り、エントリを無効にした場合、パターン監視部132は、メモリアクセス命令についてのエントリを新たに登録することができる。
また、パターン監視部132は、PCヒットが発生した場合、対象エントリがリプレースステート#R1及び#R2のいずれであっても、リプレースステート#R3に遷移させる(ステップS205、S206)。
パターン監視部132は、プリフェッチキュー131にメモリアクセス要求のプログラムカウンタの値が登録されたエントリが存在するか否か、すなわち、PCヒットかPCミスかを判定する(ステップS212)。
また、パターン監視部132は、PCヒットと共にPCヒットしたプログラムカウンタの情報をステート管理部134に通知する。以下では、PCヒットしたプログラムカウンタが登録されたエントリを対象エントリと呼ぶ。ステート管理部134は、通知を受けて、対象エントリのステート更新処理を実行する(ステップS214)。
その後、ステート管理部134は、対象エントリがプリフェッチ要求の発行条件を満たすか否かを判定する(ステップS215)。対象エントリがプリフェッチ要求の発行条件を満たさない場合(ステップS215:否定)、CPU10は、今回のプリフェッチ処理を終了する。
これに対して、対象エントリがプリフェッチ要求の発行条件を満たした場合(ステップS215:肯定)、ステート管理部134は、プリフェッチ要求の発行をプリフェッチ要求生成部133に依頼する。プリフェッチ要求生成部133は、依頼を受けて、プリフェッチ要求を生成して、生成したプリフェッチ要求を下位キャッシュ20へ発行する(ステップS216)。
一方、PCミスの場合(ステップS212:否定)、パターン監視部132は、L1キャッシュ制御部102にPCミスを通知する。L1キャッシュ制御部102は、通知を受けて、メモリアクセス要求の要求アドレスで指定されたデータがL1キャッシュ12に格納されているか否か、すなわち、L1キャッシュヒットかL1キャッシュミスかを判定する(ステップS217)。L1キャッシュヒットの場合(ステップS217:否定)、CPU10は、今回のプリフェッチ処理を終了する。
これに対して、L1キャッシュミスの場合(ステップS217:肯定)、パターン監視部132は、L1キャッシュミスの通知をL1キャッシュ制御部102から受けて、プリフェッチキュー131のエントリに空きがあるか否かを判定する(ステップS218)。
プリフェッチキュー131のエントリに空きがある場合(ステップS218:肯定)、パターン監視部132は、新たなエントリをプリフェッチキュー131に登録してステートをステート#0からステート#1に遷移させる(ステップS219)。
次に、パターン監視部132は、新たに登録したエントリのリプレースステート情報をリプレースステート#R0からリプレースステート#R2に遷移させる(ステップS220)。
さらに、パターン監視部132は、メモリアクセス命令の要求アドレスを予測アドレスとして、新たに登録したエントリのアドレス情報に登録する(ステップS222)。
一方、プリフェッチキュー131のエントリに空きがない場合(ステップS218:否定)、パターン監視部132は、全てのエントリのリプレースステート情報を1つデクリメントするデクリメントイベントを実行する(ステップS223)。
その後、パターン監視部132は、デクリメントイベントによりリプレースステート#R0となり無効となったエントリが発生したか否かを判定する(ステップS224)。
無効なエントリが発生した場合(ステップS224:肯定)、パターン監視部132は、ステップS219へ戻る。これに対して、無効なエントリが発生しなかった場合(ステップS224:否定)、パターン監視部132は、今回のプリフェッチ処理を終了する。
以上に説明したように、本実施例に係る演算処理装置は、プリフェッチ制御に用いるステートと信頼度カウンタとに基づく第1の条件及びリプレース制御に用いるステートに基づく第2の条件を用いてリプレースするエントリをプリフェッチキューから選択する。演算処理装置は、第1の条件により、定期的にアドレスミスが発生しストライドプリフェッチに使用されないエントリを無効にすることができる。また、演算処理装置は、第2の条件により、第1の条件が満たされない場合に、PCヒットが発生しない期間が長くストライドプリフェッチに使用される確率が低いエントリを無効にすることができる。
したがって、本実施例に係る演算処理装置は、ストライドプリフェッチに使用される可能性が低いエントリから無効にすることができ、ストライドプリフェッチを実行する確率を向上させることができる。これにより、演算処理装置の演算性能を向上させることが可能となる。
以上に説明したプリフェッチ機構を有する演算処理装置は、一般的なコンピュータで用いることができ、例えば、サーバやHPC(High Performance Computing)に用いられるコンピュータに搭載可能である。特に、この演算処理装置によるプリフェッチは、データセンター向けコンピュータなどのストライドアクセスが多い処理や、関数で繰り返し処理が行われる場合や、配列を含むループ処理等で有効である。