(57)【特許請求の範囲】
【請求項１】
演算処理部と、
前記演算処理部が発行するメモリに対するメモリリクエストの制御を行う第１の制御部とを有し、
前記第１の制御部は、
前記メモリリクエストにエントリを割り当てて前記メモリリクエストに係る処理を制御し、前記メモリからの応答があるまで前記エントリを使用するミスアクセス制御部と、
入力されたメモリリクエストがキャッシュヒットするか否かのキャッシュヒット判定をし、キャッシュミスの判定の場合前記入力されたメモリリクエストについて通常メモリリクエストを前記ミスアクセス制御部に発行する制御パイプラインとを有し、
前記制御パイプラインは、前記キャッシュヒット判定する前に前記入力されたメモリリクエストについて投機的メモリリクエストを前記ミスアクセス制御部に発行し、前記投機的メモリリクエストを発行済で前記キャッシュヒット判定がミス判定の場合に前記通常メモリリクエストを追加発行せず、前記キャッシュヒット判定がヒット判定の場合に前記発行した投機的メモリリクエストをキャンセルし、前記ミスアクセス制御部における前記キャンセルされた投機的メモリリクエストの使用エントリ数の増大に応じて、前記投機的メモリリクエストに割り当てられる前記エントリの数をより抑制する投機的リクエスト制御部を有する、演算処理装置。
【請求項２】
前記投機的リクエスト制御部は、前記キャンセルされた投機的メモリリクエストの使用エントリ数の増大に応じて、前記投機的メモリリクエストに割り当てられるエントリ数を減じる、請求項１に記載の演算処理装置。
【請求項３】
前記投機的リクエスト制御部は、前記ミスアクセス制御部のエントリの使用数が、第１設定数から前記キャンセルされた投機的メモリリクエストの使用エントリ数を減じた第１の上限数以上の場合、前記投機的メモリリクエストの発行を禁止する、請求項２に記載の演算処理装置。
【請求項４】
前記第１設定数は、前記エントリの総数である、請求項３に記載の演算処理装置。
【請求項５】
前記第１設定数は、前記エントリの総数より小さい数である、請求項３に記載の演算処理装置。
【請求項６】
前記投機的リクエスト制御部は、前記ミスアクセス制御部のエントリの使用数が、前記キャンセルされた投機的メモリリクエストの使用エントリ数に係数を乗じた数を第１設定数から減じた第１の上限数以上の場合、前記投機的メモリリクエストの発行を禁止する、請求項２に記載の演算処理装置。
【請求項７】
前記第１の制御部は、さらに、キャッシュに登録されたキャッシュラインを前記メモリに書き戻すリプレース処理を制御するリプレースバッファを有し、
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数とリプレースバッファのエントリの使用数の和が第２設定数以上の場合、前記投機的メモリリクエストの発行を禁止する、請求項３または６に記載の演算処理装置。
【請求項８】
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数が前記エントリの総数より小さい第３設定値以上の場合、前記投機的メモリリクエストの発行を禁止する、請求項３または６に記載の演算処理装置。
【請求項９】
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数が前記エントリの総数に達した場合、前記投機的メモリリクエストの発行を禁止する、請求項３または６に記載の演算処理装置。
【請求項１０】
演算処理部と、
前記演算処理部が発行するメモリに対するメモリリクエストの制御を行う第１の制御部とを有し、
前記第１の制御部は、前記メモリリクエストにエントリを割り当てて前記メモリリクエストに係る処理を制御し、前記メモリからの応答があるまで前記エントリを使用するミスアクセス制御部と、入力されたメモリリクエストを前記ミスアクセス制御部に発行する制御パイプラインとを有し、
前記制御パイプラインは、
入力されたメモリリクエストがキャッシュヒットするか否かのキャッシュヒット判定をし、
キャッシュミスの判定の場合前記入力されたメモリリクエストについて通常メモリリクエストを前記ミスアクセス制御部に発行し、
前記キャッシュヒット判定する前に前記入力されたメモリリクエストについて投機的メモリリクエストを前記ミスアクセス制御部に発行し、
前記投機的メモリリクエストを発行済で前記キャッシュヒット判定がミス判定の場合に前記通常メモリリクエストを追加発行せず、
前記キャッシュヒット判定がヒット判定の場合に前記発行した投機的メモリリクエストをキャンセルし、
前記ミスアクセス制御部における前記キャンセルされた投機的メモリリクエストの使用エントリ数の増大に応じて、前記投機的メモリリクエストに割り当てられる前記エントリの数をより抑制する、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置（CPUチップ、マイクロプロセッサ、以下単にプロセッサと称する）は、メモリアクセス性能を向上するため複数のレベルのキャッシュを有する。プロセッサは、複数の演算処理部（CPUコア、以下コアと称する）を有し、コアが第１レベルのキャッシュ（L1キャッシュ）をプライベートキャッシュとして占有して利用する。さらに、プロセッサは、複数のコアが共有する上位レベルのキャッシュを有する。
【０００３】
また、プロセッサは、キャッシュのうちメインメモリに最も近いレベルのキャッシュ（Last Level Cache: LLC,以下LLCと称する）を複数または単数有し、さらに、LLCの外側にキャッシュ間のコヒーレンシを維持するためのコヒーレンシ制御部を有する場合もある。
【０００４】
LLCやコヒーレンシ制御部は、リクエストが投入される制御パイプラインと、リクエストに対応する処理を実行するリクエスト処理ユニットを有する。リクエスト処理ユニットは、入力（投入）されたリクエストがキャッシュミスした場合にメモリに対するアクセスを処理するミスアクセス制御部を有する。
【０００５】
一方、制御パイプラインは、入力されたリクエストのアドレスがキャッシュヒットするか否かのタグ判定、入力されたリクエストが既に処理中のリクエストのアドレスと競合するかの判定、リクエストに対する処理内容の判定、処理ユニットの回路資源が獲得可能か否かの資源判定などを行い、適切なリクエストについてミスアクセス制御部にメモリリクエストの処理を依頼する。したがって、適切なリクエストについてのミスアクセス制御部へのメモリリクエストの依頼は、制御パイプラインでの判定処理の後に行われるので、メモリリクエストの処理開始が遅くなり、レイテンシが長くなる場合がある。
【０００６】
そこで、制御パイプラインにリクエストが入力されると、タグ判定を行う前に、そのリクエストについて投機的なメモリリクエストを行うことで、レイテンシを削減することが考えられる。投機的なメモリリクエストについては、以下の特許文献に記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００６−５３８５７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、投機的なメモリリクエストを発行すると、タグ判定でキャッシュヒットした場合投機的メモリリクエストは失敗となり、ミスアクセス制御部内のエントリが無駄に消費される。そのため、次々に投機的メモリリクエストを発行した場合、キャッシュミスが頻発すればミスアクセス制御部のエントリが有効に使用されることになるが、一方で、キャッシュヒットが頻発すれば失敗した投機リクエストのために多くのエントリが無駄に消費されることになる。
【０００９】
そこで、本開示の第1の側面の目的は、投機的なメモリリクエストの発行を適切に制御してミスアクセス制御部内のエントリの使用効率を向上させた演算処理装置及び演算処理装置の制御方法を提供することにある。
【課題を解決するための手段】
【００１０】
本開示の第１の側面は、演算処理部と、前記演算処理部が発行するメモリに対するメモリリクエストの制御を行う第１の制御部とを有し、
前記第１の制御部は、前記メモリリクエストにエントリを割り当てて前記メモリリクエストに係る処理を制御するミスアクセス制御部と、入力されたメモリリクエストがキャッシュヒットするか否かのキャッシュヒット判定をし、キャッシュミスの判定の場合前記入力されたメモリリクエストについて通常メモリリクエストを前記ミスアクセス制御部に発行する制御パイプラインとを有し、
前記制御パイプラインは、前記キャッシュヒット判定する前に前記入力されたメモリリクエストについて投機的メモリリクエストを前記ミスアクセス制御部に発行し、前記キャッシュヒット判定がヒット判定の場合に前記発行した投機的メモリリクエストをキャンセルし、前記キャンセルされた投機的メモリリクエストのエントリ数の増大に応じて、前記投機的メモリリクエストの発行をより抑制する投機的リクエスト制御部を有する、演算処理装置である。
【発明の効果】
【００１１】
第１の側面によれば、投機的なメモリリクエストの発行を適切に制御してミスアクセス制御部内のエントリの使用効率が向上する。
【図面の簡単な説明】
【００１２】
【図１】本実施の形態におけるプロセッサ（ＣＰＵチップ）の構成例を示す図である。
【図２】プロセッサ内の１つのクラスタとそれに対応する構成だけを抽出して示す図である。
【図３】コヒーレンシ制御部の構成例を示す図である。
【図４】コヒーレンシ制御パイプラインの構成例を示す図である。
【図５】メモリリクエストの動作シーケンス例を示す図である。
【図６】メモリリクエストの動作シーケンス例を示す図である。
【図７】投機リクエストが成功した場合の動作シーケンスを示す図である。
【図８】投機リクエストが失敗した場合の動作シーケンスを示す図である。
【図９】タグミスにより投機リクエスト、投機アクセスに失敗がない場合のエントリ使用状態の遷移を示す図である。
【図１０】タグミスにより投機リクエスト、投機アクセスに失敗がない場合のエントリ使用状態の遷移を示す図である。
【図１１】タグヒットにより投機リクエスト、投機アクセスの失敗が多く発生する場合のエントリ使用状態の推移を示す図である。
【図１２】投機リクエストの発行条件を使用中のエントリ数がある上限値以下と設定した状態例を示す図である。
【図１３】本実施の形態における投機リクエストの発行数を適切に制御する方法を説明する図である。
【図１４】本実施の形態におけるコヒーレンシ制御部CHR内の主にコヒーレンシ制御パイプライン１２とミスアクセス制御部１４との間の関係を示す図である。
【図１５】本実施の形態における投機リクエスト制御部１２４の構成例を示す図である。
【図１６】ミスアクセス制御部の一部の構成例を示す図である。
【図１７】第１の実施の形態における投機リクエスト制御部の構成の変形例を示す図である。
【図１８】第２の実施の形態におけるキャッシュの構成を示す図である。
【発明を実施するための形態】
【００１３】
図１は、本実施の形態におけるプロセッサ（ＣＰＵチップ）の構成例を示す図である。プロセッサ１は、命令をデコードして演算処理を発行する命令制御部（図示せず）と演算処理回路（図示せず）と第１レベル（L1）データキャッシュL1D及びL1命令キャッシュL1Iと、第２レベル（L2）キャッシュとをそれぞれ有するCPUコア（コア）CORE_0−CORE_nを有する。
【００１４】
さらに、プロセッサ１は、複数のコアCORE_0−CORE_nが複数のグループ（またはクラスタCLS）に分けられ、各グループに対応して設けられた複数の最上位レベルキャッシュ（LLC）LLC_0−LLC_3を有する。各LLCは、各グループ内の複数のコアにより共有される。各LLCは、通常のキャッシュと同様に、タグメモリとデータメモリを有し、タグメモリには、自分のデータメモリのキャッシュラインに関するタグデータ（有効ビット、アドレス、状態など）を記憶する。
【００１５】
また、プロセッサ１は、複数のLLC間のコヒーレンシを維持する制御を行うコヒーレンシ制御部CHR_0−CHR_3と、メモリMEMへのアクセスを制御するメモリコントローラMC_0−MC_3を有する。
【００１６】
各コヒーレンシ制御部は、後で詳述するとおり、LLCのタグのコピーと、各LLCや他のCPU及びIOデバイスからのメモリリクエストを受け付けるリクエストポートと、各リクエストに対してキャッシュコヒーレンシを維持するための各種処理を実行するミスアクセス制御部、オーダー制御部、リプレースバッファなどの処理ユニットを有する。
【００１７】
４つのメモリMEM_0−MEM_3は、アドレスインターリーブされている。例えば、前メモリの物理アドレスがPA[k-1:0]とｋビットの場合、４つのメモリの物理アドレスは次の通りになる。
MEM_0はPA[m:n]=00
MEM_0はPA[m:n]=01
MEM_0はPA[m:n]=10
MEM_0はPA[m:n]=11
ここで、ｍ、ｎはｋより小さく０より大きい自然数（０＜ｎ＜ｍ＜ｋ）である。
【００１８】
コヒーレンシ制御部CHR_0−CHR_3は、LLCのタグのコピーを有する。各コヒーレンシ制御部のLLCタグコピーは、上記のアドレスインターリーブに対応して、４つのメモリMEM_0−MEM_3それぞれの物理アドレスに対応するLLCのキャッシュラインのタグデータを記憶する。
【００１９】
４つのLLCそれぞれは４つのコヒーレンシ制御部CHR_0−CHR_3に接続され、各LLCはキャッシュミスした場合のメモリアクセスを要求するメモリリクエストを、メモリリクエストのアドレスに対応するコヒーレンシ制御部に発行する。逆に、各コヒーレンシ制御部は入力されたメモリリクエストに必要な処理の要求をオーダーとしてメモリ側とは逆方向の下位レベル方向の４つのLLCに発行する。
【００２０】
また、４つのコヒーレンシ制御部CHRそれぞれは、メモリアクセスのリクエストやキャッシュのデータのメモリへの書き戻しのリクエストを、メモリ側と同じ上位レベル方向にあり、各コヒーレンシ制御部と対応するメモリコントローラMCに発行する。
【００２１】
そして、プロセッサ１は、他のCPUと通信するためのルータRTと、IOデバイスと通信するためのIO制御部IOを有する。
【００２２】
図２は、プロセッサ内の１つのクラスタとそれに対応する構成だけを抽出して示す図である。図１の複数のコアCORE_0−CORE_nは、４つのクラスタ（コア群）CLSに分けられる。したがって、図１には、４つのクラスタに対応して４つのLLC（LLC_0−LLC_3）が設けられている。
【００２３】
一方、図２に示した１つのクラスタCLSは、複数のコアCORE_0−CORE_kを有する。そして、そのクラスタCLSの複数のコアは、１つのLLC（LLC_0）を共有する。但し、１つのクラスタCLSは４つのメモリMEM_0−MEM_3全てに対してメモリアクセスして、共有するLLC(LLC_0)に読み出したデータを登録することができる。
【００２４】
図１で説明したとおり、４つのコヒーレンシ制御部CHR_0−CHR_3は、アドレスインターリーブされた４つのメモリMEM_0−MEM_3と、それに対応する４つのメモリコントローラMC_0−MC_3とに対応し、それぞれ接続される。
【００２５】
したがって、１つのLLC（LLC_0）は、全てのコヒーレンシ制御部CHR_0−CHR_3にメモリリクエストを発行可能であり、メモリリクエストのアドレスに対応したコヒーレンシ制御部にメモリリクエストを発行する。
【００２６】
図１、図２において、プロセッサ１の動作例について簡単に説明する。いずれかのコアがメモリMEM内のデータを読み出すロード命令を実行してコア内のL2キャッシュでキャッシュミスすると、L2キャッシュが、キャッシュミスに対応してメモリのデータを読み出すメモリリクエストをLLCに発行する。さらに、LLCがメモリリクエストについてキャッシュミスすると、リクエストのアドレスに対応するコヒーレンシ制御部CHRにメモリリクエストを発行する。
【００２７】
コヒーレンシ制御部は、LLCタグコピーを検索して、残りのLLCがそのアドレスのデータを保持しているか否かをチェックする。ここでキャッシュヒットすれば、コヒーレンシ制御部は、データを保持しているLLCに対して、保持しているデータをメモリリクエストの要求元のLLCに転送するようオーダーを発行する。一方、キャッシュミスすれば、コヒーレンシ制御部は、メモリコントローラMCにメモリへのアクセスを要求するメモリリクエストを発行する。そして、メモリからのデータ応答があれば、コヒーレンシ制御部は、メモリリクエストの要求元のLLCにデータ応答する。
【００２８】
さらに、コヒーレンシ制御部は、コアが前述のロード命令を実行した場合や、ストア命令を実行してキャッシュへの書き込みが発生した場合に、ＭＥＳＩプロトコルに基づく種々の処理の要求を、より上位レベルのメモリコントローラMCにはリクエストとして、より下位レベルのLLCにはオーダーとして発行する。リクエストとオーダーはいずれもある処理の要求であるが、処理の要求先によりリクエストとオーダーを区別して呼ぶこととする。また、より上位レベルとはメモリ階層に近づく方向を、より下位レベルとは下位レベルのキャッシュやコアに近づく方向を意味する。
【００２９】
［アドレスに対するリクエストについて］
キャッシュL2,LLCとコヒーレンシ制御部CHRは、いずれもメモリ空間のアドレスに対するリクエストを受け付け、各リクエストに対応する処理の実行を制御する。ここで、メモリ空間のアドレスは、（１）図１、２に示したメインメモリMEMのアドレスでありキャッシュ可能なアドレス（chacheable address）と、（２）システム用のブートROMやSRAM等のメモリや周辺デバイスのレジスタなどの非キャッシュ可能（キャッシュ不能）なアドレス（Non-chacheable address）とを含む。ただし、非キャッシュ可能なアドレスには、メインメモリMEM内の一部のアドレスが含まれる場合もある。
【００３０】
したがって、メモリ空間内のあるアドレスに対するリクエスト（読み出しまたは読み出し）は、（１）上記のキャッシュ可能なアドレスに対するリクエストと、（２）非キャッシュ可能なアドレスに対するリクエストが含まれる。そして、キャッシュ可能なアドレスに対するリクエストは、（１−１）自分のCPU（ローカルCPU）内のL2キャッシュやLLCなどのキャッシュでのキャッシュミス、つまり、コヒーレンシ制御部より下位レベルでのキャッシュミスにより発行されたリクエストと、（１−２）IOデバイス（例えばDMA（Dynamic Memory Access））や他のCPU（リモートCPU）が発行したリクエストなどが含まれる。
【００３１】
［コヒーレンシ制御部］
本実施の形態は、コヒーレンシ制御部での投機リクエストと、LLCなどのキャッシュでの投機リクエストのいずれにも適用できる。そこで、以下の説明では、コヒーレンシ制御部を例にして投機リクエストについて説明する。
【００３２】
図３は、コヒーレンシ制御部の構成例を示す図である。LLCやL2キャッシュを含むキャッシュも、コヒーレンシ制御部と類似する構成を有する。以下はコヒーレンシ制御部の構成例について説明する。
【００３３】
コヒーレンシ制御部CHRは、下位レベルのキャッシュやコア（前述のクラスタCLS）からのリクエストを受け付けるリクエストポートRP_0−RP_3を有する。コヒーレンシ制御部にとって下位レベルのキャッシュはLLCである。図１の例では、４つのLLCが設けられおり、それぞれの要求元のLLCに対応して４つのリクエストポートRP_0−RP_3が設けられている。各リクエストポートRPは、複数のエントリを有し、同じ要求元から複数のリクエストを複数のエントリに受け付ける。
【００３４】
さらに、コヒーレンシ制御部は、IOデバイスからのIOリクエストを受け付けるリクエストポートRP_4と、他のCPUからのリモートリクエストを受け付けるリクエストポートRP_5と、メモリリクエストに対するメモリコントローラからの応答を受け付けるリクエストポートRP_6などを有する。この点、コヒーレンシ制御部と異なり、キャッシュは、上位レベルからのオーダーを受け付けるリクエストポートと、上位レベルからのメモリ応答を受け付けるリクエストポートを有する。
【００３５】
さらに、コヒーレンシ制御部は、４つのリクエストポートRP_0−RP_3のいずれかを選択するコアまたはキャッシュ間調停回路１０と、その選択されたリクエストポートと他のリクエストポートRP_4−RP_6のいずれかを優先度に基づいて選択するプライオリティ調停回路１１を有する。
【００３６】
そして、コヒーレンシ制御部は、選択されたリクエストポートのエントリのリクエストが投入（入力）されるコヒーレンシ制御パイプライン１２と、入力されたリクエストに対応する種々の処理を行う処理ユニット20_1、20_2を有する。ここで、図中、処理ユニットは、２つの部分20_1と20_2に分割して示されるが、内部処理のステージに対応して２つの部分に分けて表示されるだけであり、処理ユニット20_1,20_2で１つの処理ユニットを構成する。また、処理ユニットは個々の処理毎に一連のパイプラインで構成される。
【００３７】
コヒーレンシ制御部の処理ユニット20は、例えば、LLCのタグメモリのコピー13_1、13_2と、ミスアクセス制御部14_1、14_2と、オーダー制御部15_1、15_2と、リプレースバッファ16_1、16_2とを有する。この点、キャッシュは、自らのデータメモリとそのタグメモリを有する。
【００３８】
コヒーレンシ制御パイプライン12は、LLCのタグメモリのコピー13をリクエストのアドレスで検索し、リクエストが求めるキャッシュラインを他のLLCが保持していないかをチェックする。さらに、リクエストに対するメモリコントローラMCからの応答がリクエストポートRP_6から入力され、その応答に対応してLLCのタグメモリを更新する場合、LLCのタグメモリのコピー13も更新処理される。
【００３９】
ミスアクセス制御部14は、LLCでのキャッシュミスに基づくメモリリクエストのアドレス、またはIOデバイスやリモートCPUからのリクエストのアドレスが、LLCのタグメモリのコピー13でキャッシュミスになった場合、メモリコントローラを経由してメモリリクエストを発行する。または、上記のローカルからのリクエストがキャッシュミスになった場合、他のCPUのメモリ宛てにリモートリクエストを発行する。いずれもメモリシステムに対するメモリ系のリクエストである。ミスアクセス制御部は、メモリシステムにリクエストを発行すると、メモリシステムからデータ応答を受信するまでの間、後続の同一アドレスのリクエストを受け付けないよう排他制御を行う。
【００４０】
オーダー制御部15は、下位レベルのコアやキャッシュに対する要求をオーダーとして発行する。例えば、下位レベルからのリクエストのアドレスがLLCのタグメモリのコピー13でキャッシュヒットした場合、ヒットしたデータを所持するLLCに対してデータ転送のオーダーを発行する。あるいは、下位レベルのコアやキャッシュ間のコヒーレンシを維持するために、あるコアがデータをストアする場合、他のコアがキャッシュに所持しているデータをMESIプロトコルなどに従いキャッシュ無効化するオーダーを発行する。これらの場合、オーダー制御部は、キャッシュ無効化が完了するまで、後続の同一アドレス要求に対するリクエストを受理しないよう排他制御を行う。
【００４１】
リプレースバッファ16は、下位レベルのキャッシュから追い出されるデータをメモリに書き戻すライトバックをメモリコントローラに発行する。また、コヒーレンシを保つために、一連の書き込みが完了するまでの間、後続の同一アドレスのリクエストを受理しないよう排他制御を行う。
【００４２】
ミスアクセス制御部14、オーダー制御部15、リプレースバッファ16は、それぞれの処理の依頼を受け付ける受付エントリ（一種のレジスタ）を有する。受付エントリには受け付けたリクエストの情報（リクエストIDやリクエストアドレスを含む）が格納される。処理ユニット内の各処理部がそのリクエストに対応する処理を開始すると、同じアドレスに対する新たな処理を受け付けないように制御される。また、受付エントリの数は有限であり、受付エントリに空きがなければ、新たな処理を受け付けることができない。これらの制御は、コヒーレンシ制御パイプライン12が実行する。
【００４３】
図３中の投機リクエストバリッド信号SPC_REQ_VALについては、後述する実施の形態で説明する。
【００４４】
図４は、コヒーレンシ制御パイプラインの構成例を示す図である。コヒーレンシ制御パイプライン12は、あるアドレスに対するリクエストについて、処理ユニット20が処理実行可能か否かを判定し、リクエストの処理が実行不可の場合そのリクエストをアボートし、処理実行可能の場合処理ユニット20にリクエストに対応する処理を発行する。処理実行可能か否かとは、リクエストのアドレスが処理中のアドレスと競合しないか否か、処理部の受付エントリなどの回路資源が獲得可能か否かなどである。アドレスが競合せず回路資源が獲得可能であれば、リクエストに対応する処理を実行可能となる。処理が発行されたリクエストはリクエストポートから削除され、一方、アボートされたリクエストはリクエストポートに残されて、再度コヒーレンシ制御パイプラインに入力（投入）される。
【００４５】
コヒーレンシ制御パイプライン12は、アドレス／TAGチェック部121と、処理判定部122と、資源判定部123とを有する。コヒーレンシ制御パイプラインにはリクエストの情報（リクエスト有効ビットR_valid、リクエスト要求元ID(core_id)、リクエストエントリID（entry_id）、リクエストアドレスR_id）が入力され流れていく。
【００４６】
具体的な動作について説明すると、アドレス／タグチェック部121は、入力されたリクエストについてLLCのタグメモリコピー13_1にキャッシュ判定を依頼する (12A) と共に、ミスアクセス制御部14_1とオーダー制御部15_1とリプレースバッファ16_1に、入力リクエストのアドレスと処理ユニット２０内の各部14,15,16が処理中のアドレス（排他アドレス）と一致するか否かのチェックを依頼する（12A）。処理中のアドレスは前述の受付エントリに保持されている。そして、アドレス／タグチェック部は、LLCタグメモリコピーのキャッシュ判定結果（12B）と、ミスアクセス制御部とオーダー制御部とリプレースバッファそれぞれの排他アドレスと一致するかの否かのチェック結果（12B）を取得する。排他アドレスと一致する場合は処理実行不可能であるので、アドレス／タグチェック部121は第１のアボート信号Ab1を出力する。
【００４７】
さらに、処理判定部122は、メモリリクエストに必要な処理を判定する。例えば、処理判定部122は、キャッシュヒットすれば下位のLLCに保持しているデータをメモリリクエストを発行したLLCに転送するようオーダー12Dを発行し、キャッシュミスすれば上位のメモリコントローラや他のCPUにメモリリクエスト12Dを発行する。メモリリクエストの発行は、図中示されるとおり、ミスアクセス制御部に対するリクエストバリッド信号MSC_REQ_VALの出力により行われる。
【００４８】
そして、資源判定部123が、判定された処理に対応するミスアクセス制御部14_2、オーダー制御部15_2、リプレースバッファ16_2のいずれかで、処理に必要な回路資源を獲得できるか否かの判定を行う。処理に必要な回路資源の例は、前述の受付エントリなどである。資源判定部は、回路資源の獲得ができない場合は処理実行不可能であるので、第２のアボート信号Ab2を出力する。また、その他何らかの理由でパイプラインストールが発生する場合も実行不可能であるので、図示しないアボート信号が出力される。
【００４９】
コヒーレンシ制御パイプラインは、論理和ゲートORにより全てのアボート信号Ab1,Ab2を論理和演算したアボートフラグABORT(12C)を出力する。このアボートフラグABORTが「１」の場合リクエストがアボートされたことを意味し、リクエストに対応する処理は実行されず、リクエストは元のアクセスポートに差し戻される。
【００５０】
コヒーレンシ制御パイプライン12は、処理実行可能の場合、処理ユニット20_2に処理判定部122が判定した処理12Dを発行する。発行する処理12Dは、例えば、タグメモリコピー13_2への更新処理、ミスアクセス制御部14_2へのメモリアクセス処理、オーダー制御部15_2へのオーダー発行処理、リプレースバッファ16_2へのライトバックリクエストなどである。
【００５１】
上記の資源管理において、処理のための資源獲得に失敗すると、投入されたリクエストはアボートされ、アボートフラグABORT付きのリクエスト情報12Cがリクエストポートにフィードバックされ、リクエストが差し戻される。そして、差し戻されたリクエストは、リクエストポート内の他のリクエストの後に再度パイプラインに入力される。具体的には、リクエストポートRPは、リクエスト要求元IDとリクエストエントリIDが一致しアボートフラグABORTが「０」の場合、リクエストポート内にエントリされているリクエストを無効化（削除）する。
【００５２】
以上のとおり、コヒーレンシ制御パイプラインは、あるアドレスに対するリクエストをパイプライン処理し、処理ユニット20内で処理中のアドレスを処理部内の受付エントリ等の回路資源に記録し、同じアドレスに対して不整合のないようにリクエストの発行を制御する。
【００５３】
図４中の、投機リクエスト制御部１２４については、後述する実施の形態において説明する。
【００５４】
［メモリリクエストの動作と投機リクエスト］
図５は、メモリリクエストの動作シーケンス例を示す図である。図５の例では、コヒーレンシ制御パイプライン１２が入力されたメモリリクエストのアドレスについてタグコピーをチェックした結果タグミスした例である。つまり、あるLLCがキャッシュミスしたキャッシュブロックを他のLLCも所持していないときの動作である。
【００５５】
まず、あるLLCがキャッシュミスしてコヒーレンシ制御部のリクエストポートにメモリリクエストを発行し、コヒーレンシ制御パイプライン１２にメモリリクエストが入力される（S10）。これに応答して、コヒーレンシ制御パイプライン１２は、LLCタグコピーをチェックし、TAGミスし（S11_1）、ミスアクセス制御部１４にメモリリクエストを発行する（S12）。この時点で、コヒーレンシ制御パイプライン１２は、入力されたメモリリクエストについて既に実行中の処理とアドレスの競合がなく、ミスアクセス制御部１４内の回路資源、例えば入力エントリ（一種のレジスタ）を獲得できたことを確認済みである。
【００５６】
したがって、ミスアクセス制御部１４は、発行されたメモリリクエストをエントリに登録する（S13）。そして、ミスアクセス制御部は、メモリリクエストをメモリコントローラMCに発行し（S14）、メモリコントローラはメモリMEMにメモリリクエストを発行する（S15）。
【００５７】
やがて、メモリMEMがメモリリクエストに対して読み出しデータなどのメモリ応答をメモリコントローラMCに返信し（S16）、さらにメモリコントローラがメモリ応答をミスアクセス制御部１４に返信する（S17）。これに応答して、ミスアクセス制御部１４は、登録されていたエントリを開放し（S18）、コヒーレンシ制御パイプラインにメモリ応答を返信し（S19）、さらに、コヒーレンシ制御パイプラインは要求元のLLCにメモリ応答を返信する（S20）。
【００５８】
コヒーレンシ制御部CHRではなくLLCの場合も、上記と同様の動作である。
【００５９】
図６は、メモリリクエストの動作シーケンス例を示す図である。図６の例は、コヒーレンシ制御パイプライン１２が、入力されたメモリアクセスのアドレスについてLLCタグコピーをチェックした結果タグヒット（キャッシュヒット）した例である。つまり、あるLLCがキャッシュミスしたキャッシュブロックを他のLLCが所持中のときの動作である。
【００６０】
まず、あるLLCがキャッシュミスしてコヒーレンシ制御部のリクエストポートにメモリリクエストを発行し、コヒーレンシ制御パイプライン１２にメモリリクエストが入力される（S10）。これに応答して、コヒーレンシ制御パイプライン１２は、LLCタグコピーをチェックし、TAGヒットし（S11_2）、オーダー制御部１５を介して、キャッシュブロックを所持しているLLCにそのキャッシュブロックを要求元のLLCに転送するよう転送オーダーを発行する（S31）。
【００６１】
コヒーレンシ制御部CHRではなくLLCの場合は、LLCのキャッシュ制御パイプラインがキャッシュに所持しているキャッシュブロックをキャッシュ応答でメモリリクエスト要求元の下位レベルのキャッシュに返信する。
【００６２】
［本実施の形態］
図５、図６のメモリアクセスの動作によれば、LLC間でキャッシュの共有が多く発生している場合、LLCタグコピーを参照してタグヒットし、メモリリクエストのアドレスのデータ（キャッシュブロック）を所持しているLLCに転送オーダーを発行するので、メモリへのアクセスを行う必要はない。しかも、LLCタグコピーを参照しないとデータを所持しているLLCを知ることができないので、LLCタグコピーの参照動作は無駄な動作ではない。
【００６３】
一方、どのLLCもメモリリクエストのアドレスのデータを所持していない場合、ミスアクセス制御部がメモリコントローラにメモリリクエストを発行することになるが、LLCタグコピーを参照する時間だけメモリからデータを取得するまでの時間が長くなる。また、LLCタグコピーの参照をしなくてもミスアクセス制御部はメモリリクエストを発行できる。そのため、コヒーレンシ制御パイプラインは、LLCタグコピーの参照（タグチェック）を行う前にメモリへのアクセス動作を投機的に開始してもよい。タグミスが発生する場合、LLCタグコピーの参照結果を取得するまでの時間を節約できるので、投機的なメモリアクセスはメモリからデータを取得するまでの時間を短くできる。
【００６４】
本実施の形態によると、図３に示したコヒーレンシ制御パイプラインは、コヒーレンシ制御パイプライン１２のパイプラインの先頭ステージからミスアクセス制御部14_2に投機リクエストバリッド信号MSC_SPC_REQ_VALを出力する構成を有する。つまり、パイプラインに投入されたメモリリクエストがメモリへのアクセスを必要とする可能性がある場合、コヒーレンシ制御パイプラインは、LLCタグコピーの参照を行う前に、ミスアクセス制御部14_2に投機リクエストを要求し、ミスアクセス制御部に投機的メモリアクセスをメモリコントローラMCに発行させる。
【００６５】
通常、コヒーレンシ制御パイプラインは、LLCタグコピーの参照結果がタグミスの場合に、ミスアクセス制御部の回路資源（エントリなど）が獲得できれば、パイプライン１２の後方のステージでミスアクセス制御部に対してメモリリクエストを発行する。したがって、パイプライン１２の前方のステージで発行される投機アクセスは、パイプライン１２のステージをバイパスするメモリアクセス要求である。
【００６６】
本実施の形態によると、図４に示したコヒーレンシ制御パイプライン１２は、投機リクエストの発行を制御する投機リクエスト制御部１２４を有する。投機リクエスト制御部１２４は、入力されたメモリリクエストに投機リクエストを発行する必要性があるか否かの判定と、メモリリクエストのアドレスが処理ユニット２０で処理中のリクエストのアドレスと競合しないか否かの判定と、ミスアクセス制御部１４に投機リクエストを登録できる回路資源、つまり入力エントリの空きがあるか否かの判定を行い、いずれの判定も真であれば、LLCタグの参照結果が得られる前に、ミスアクセス制御部１４に投機リクエストを発行する。
【００６７】
但し、投機リクエストはLLCタグの参照結果に基づいて発行されていないので、LLCタグの参照でタグヒットすると、投機リクエストは無駄なリクエストになり、投機リクエストが登録されたエントリはキャンセル対象になり、ミスアクセス制御部内のエントリが無駄に使用される。また、コヒーレンシ制御パイプラインでメモリリクエストがアボートする場合も投機リクエストはキャンセル対象になる。そこで、本実施の形態では、コヒーレンシ制御パイプラインは、投機リクエストの発行を適切に行いエントリの無駄な使用による弊害を抑制する。
【００６８】
図７は、投機リクエストが成功した場合の動作シーケンスを示す図である。まず、あるLLCがキャッシュミスしてメモリリクエストがコヒーレンシ制御部のリクエストポートに受け付けられ、そのメモリリクエストがコヒーレンシ制御パイプライン１２に入力される（S10）。これに応答して、コヒーレンシ制御パイプライン１２は、投機リクエストをミスアクセス制御部１４に発行する（S21）。
【００６９】
ミスアクセス制御部１４は、複数のメモリリクエストを処理できるよう複数の入力エントリを有している。したがって、コヒーレンシ制御パイプライン１２は、投機リクエストを発行するとき、あらかじめ空きエントリを確保している。
【００７０】
ミスアクセス制御部１４は、投機リクエストを空きエントリに登録し（S22）、投機アクセスをメモリコントローラMCに発行する（S23）。この時点では、投機リクエストが登録されたエントリの使用状態は未確定である。投機アクセスが処理されている間に、コヒーレンシ制御パイプライン１２は、LLCタグコピーをチェックし、TAGミスし（S11_1）、ミスアクセス制御部１４に投機成功応答を出力する（S11_3）。この投機成功により、ミスアクセス制御部内のエントリの使用状態は確定状態に遷移する（S25）。コヒーレンシ制御パイプライン１２は、投機成功を出力するとき、入力されたメモリリクエストについて既に実行中の処理とアドレスの競合がないことも確認済みである。
【００７１】
ミスアクセス制御部１４が投機アクセスを発行すると（S23）、メモリコントローラはメモリMEMにメモリリクエストを発行する（S24）。やがて、メモリMEMがメモリリクエストに対して読み出しデータなどのメモリ応答をメモリコントローラMCに返信し（S26）、さらにメモリコントローラがメモリ応答をミスアクセス制御部１４に返信する（S27）。これに応答して、ミスアクセス制御部１４は、登録されていたエントリを開放し（S28）、コヒーレンシ制御パイプラインにメモリ応答を返信し（S29）、さらに、コヒーレンシ制御パイプラインは要求元のLLCにメモリ応答を返信する（S30）。
【００７２】
図８は、投機リクエストが失敗した場合の動作シーケンスを示す図である。まず、あるLLCがキャッシュミスしてメモリリクエストがコヒーレンシ制御部のリクエストポートに受け付けられ、そのメモリリクエストがコヒーレンシ制御パイプライン１２に入力される（S10）。これに応答して、コヒーレンシ制御パイプライン１２は、投機リクエストをミスアクセス制御部１４に発行する（S21）。さらに、ミスアクセス制御部１４は、投機リクエストをエントリに登録し（S22）、投機アクセスをメモリコントローラに発行し、メモリリクエストがメモリMEMに発行される（２４）。ここまでは、図７と同様である。
【００７３】
図８において、コヒーレンシ制御パイプライン１２は、LLCタグコピーを参照しタグヒットを検出し（S11_2）、それに応答して、投機失敗応答をミスアクセス制御部１４に送信する（S11_4）。また、オーダー制御部１５を介してデータを所持するLLCに転送オーダーを発行する（S31）。これにより、ミスアクセス制御部のエントリの使用状態はキャンセル状態に確定する（S25）。ミスアクセス制御部は、既に投機アクセスを発行済みであるため、キャンセル状態のエントリを保持しておく。
【００７４】
やがて、メモリMEMとメモリコントローラMCは、メモリ応答を返信するが（S26,S27）、ミスアクセス制御部１４は、メモリ応答に対応するエントリがキャンセル状態であるため、コヒーレンシ制御パイプライン１２に対してキャンセル完了応答を返信し（S32）、エントリを開放する（S28）。
【００７５】
ミスアクセス制御部がキャンセル状態のエントリを保持するため、後続の他のメモリリクエストがエントリを使用できなくなることが発生し、エントリの有効利用ができなくなる場合がある。メモリの応答時間はプロセッサのクロックに対して非常に低速であり、１つのメモリリクエストの応答が戻るまで数百サイクルの時間を要する。その間、ミスアクセス制御部のキャンセル状態のエントリを他のメモリリクエストが使用できなくなるので、投機リクエスト失敗によるエントリ（回路資源）の占有は大きな損失になる。
【００７６】
次に、ミスアクセス制御部の入力エントリの使用状態の遷移例を説明する。ミスアクセス制御部１４は、複数のメモリリクエストの処理を制御可能にするため、複数の入力エントリ（レジスタ）を有する。このエントリには、発行されたメモリリクエストの命令コード、アドレス、リクエストID、使用状態（キャンセル状態か否か）などの情報が格納される。そして、ミスアクセス制御部は、メモリリクエストに対するメモリ応答を受信するまでエントリを保持し、後続のメモリリクエストとアドレスが競合しないか否かの判定、受信したメモリ応答をコヒーレンシ制御パイプラインに転送すべきかまたはキャンセル応答で返信すべきかの判定などに利用する。
【００７７】
図９、図１０は、タグミスにより投機リクエスト、投機アクセスに失敗がない場合のエントリ使用状態の遷移を示す図である。ミスアクセス制御部のエントリ数は３２個とする。図中、空きエントリはメモリリクエストが登録されていないエントリである。確定エントリは、投機リクエストが登録され投機成功したエントリ、またはタグミス判定後に発行される通常リクエストが登録されたエントリである。キャンセルエントリは、投機リクエストが登録され投機失敗したエントリである。さらに、未確定エントリは、投機リクエストが登録され投機成功または失敗が未だ決着していないエントリである。
【００７８】
図９の初期状態S1では、どのエントリも使用されておらず全て未使用状態であり、空きエントリである。状態S2では、特定のLLCがキャッシュミスしメモリリクエストを発行し、コヒーレンシ制御パイプラインが投機リクエストをミスアクセス制御部に発行し、投機リクエストが受け付けられた未確定エントリが発生している。
【００７９】
状態S3では、その後複数の投機リクエストが発行され、複数の未確定エントリが発生している。いくつの投機リクエストが未確定エントリとなりうるかについては、ミスアクセス制御部のパイプラインの長さに依存する。ここでは、最大５個の投機リクエストが未確定エントリとして存在できると仮定する。
【００８０】
状態S4では、最初に発行した投機リクエストについて、LLCタグコピーの参照が完了し、タグミスとなりいずれのLLCもデータを所持していなかったため、投機リクエスト（投機アクセス）が成功となり、最初の未確定エントリが確定エントリに変更している。
【００８１】
図１０の状態S5では、その後も全ての投機リクエストについてタグミスとなり、確定エントリになっている。状態S5_1-S5_4のようにタグミスばかり発生する状況では、ミスアクセス制御部の全てのエントリを投機リクエストに使用させてもエントリが無駄にならず、投機的リクエストの発行が好ましい状況である。
【００８２】
図１１は、タグヒットにより投機リクエスト、投機アクセスの失敗が多く発生する場合のエントリ使用状態の推移を示す図である。状態S6では、３２個のエントリのうち２８個がキャンセルエントリに変化している。このような状態になると、３２個全てのエントリが使用中であり、その後パイプラインに入力されたメモリリクエストは投機リクエストを発行できない。さらに、入力されたメモリリクエストは、LLCタグコピーの参照によりタグミスしてミスアクセス制御部へのメモリリクエストの発行が必要になっても、エントリが全て使用状態であるため、ミスアクセス制御部に発行できない。その結果、入力されたメモリリクエストは、コヒーレンシ制御パイプラインでアボートされて、リクエストポートに差し戻され、ミスアクセス制御部のエントリが空くまで、リクエストポートからの入力とアボートを繰り返すことになる。
【００８３】
そこで、投機リクエスト（投機アクセス）の失敗によるペナルティを回避する方法として、投機リクエストの発行条件を、使用中のエントリ数が総エントリ数より小さい上限値以下であることに設定し、投機リクエストが全てエントリを無駄に使用することがないようにする。つまり、タグミスにより発行が必要になったメモリリクエストが使用できる空きエントリを確保するようにする。
【００８４】
図１２は、投機リクエストの発行条件を使用中のエントリ数がある上限値以下と設定した状態例を示す図である。図１２の例では、投機リクエストの発行条件として、使用中のエントリ数の上限値が２４個以下に設定されている。状態S7_1では、２４個の使用中エントリが投機リクエスト成功になることで確定エントリになり、したがってキャンセルエントリ数はゼロである。この場合、さらに投機リクエストがエントリを使用しても、キャンセルエントリによる無駄が発生する可能性が低い。しかし、その後の投機リクエストは使用エントリ数の上限値により発行が制限されて、投機リクエストによるレイテンシ削減効果が限定的になる。したがって、このような状態S7_1では、上限値が低すぎて、上限値を設けることはエントリの使用効率の低下を招く。
【００８５】
一方、状態S7_2では、２４個の使用中エントリのほとんどがキャンセルエントリに変更されている。そのため、発行が必要なメモリリクエストが使用できる空きエントリが、総エントリ数３２個から上限値２４個を減じた８個に止まっている。したがって、キャンセルエントリ数が多いにもかかわらず上限値が２４個と高すぎて、発行が必要なメモリリクエストの使用に供される空きエントリ数が少なくなっている。但し、上限値を低く設定すると、逆に、投機リクエストの発行機会を奪うことになり好ましくない。
【００８６】
図１３は、本実施の形態における投機リクエストの発行数を適切に制御する方法を説明する図である。本実施の形態では、コヒーレンシ制御パイプラインが、投機リクエストを発行できる条件である使用エントリ数の上限値を、キャンセルリクエストの数に応じて適切な値に制御する。例えば、キャンセルリクエストの数が少なければ上限値をより高く設定し、キャンセルリクエストの数が多くなれば上限値をより低く設定する。その結果、キャンセルリクエスト数が少なければ空きエントリ数も少なくして投機リクエストの発行機会を多くし、キャンセルリクエスト数が多ければ空きエントリ数を多くして投機リクエストの発行機会をより少なく抑制する。
【００８７】
図１３中、状態S8_1は、キャンセルエントリの数が０の例である。このような場合、投機リクエストを発行できる条件である使用エントリ数の上限値UPLを、総エントリ数E_MAXと等しい 値CF1に設定する。つまり、使用エントリ数が総エントリ数E_MAXに達するまで、投機リクエストの発行を許容する。
【００８８】
一方、状態S8_2は、キャンセルエントリの数CNCL_CUNTが７個と増えてきている。このような場合、総エントリ数E_MAX（＝CF1）よりキャンセルエントリ数CNCL_CUNTだけ少ない数（３２−７＝２５）まで投機リクエストの発行を許容する。つまり、上限値UPLを総エントリ数E_MAX（＝CF1）からキャンセルエントリ数CNCL_CUNTを減じた数に設定する。
【００８９】
さらに、状態S8_3は、キャンセルエントリの数CNCL_CUNTがさらに１０個に増えている。この場合も、上限値UPLを総エントリ数E_MAX（＝CF1）からキャンセルエントリ数CNCL_CUNTを減じた数に設定するすると、上限値UPLは３２−１０＝２２個となり、状態S8_2よりも低く設定される。
【００９０】
上記のように投機リクエストコヒーレンシ制御パイプラインは、上限値をキャンセルエントリの数が増えればより低い値に、減ればより高い値に制御し、ミスアクセス制御部の使用中エントリ数が上限値UPLに達するまで投機リクエストの発行を許可し、使用中エントリが上限値UPL以上になると、投機リクエストの発行を禁止する。
【００９１】
さらに、上記の値CF1を総エントリ数E_MAXより所定数低い値にするようにしても良い。このようにすることで、キャンセルエントリ数CNCL_CUNTが０であっても、投機リクエストが全てのエントリを使用する状態にならないようにすることができる。これにより、タグコピー参照によるチェック後に発行が必要になるメモリアクセスがエントリを使用できるようになる。
【００９２】
［第１の実施の形態］
本実施の形態によると、図３に示したコヒーレンシ制御部の構成に示すとおり、コヒーレンシ制御パイプライン１２は、パイプラインの先頭から投機リクエストバリッド信号MSC_REQ_VALをミスアクセス制御部14_2に発行可能な構成を有する。
【００９３】
また、図４に示したコヒーレンシ制御パイプライン１２には、投機リクエスト制御部１２４が設けられる。投機リクエスト制御部１２４は、メモリリクエストがミスアクセス制御部による処理を必要とする可能性があることを示す投機可能フラグSPC_READYが真の場合、使用中エントリ数をカウントするエントリ使用数カウンタUSE_CUNTのカウント値と、キャンセル数をカウントするキャンセルエントリ数カウンタCNCL_CUNTのカウント値とに基づいて、投機リクエストの発行を通知する投機リクエストバリッド信号SPC_REQ_VALを生成し、ミスアクセス制御部に出力する。これにより、LLCタグコピーを参照するアドレス・タグチェック部１２１のステージの判定結果より前に、投機リクエストを有効にする投機リクエストバリッド信号SPC＿REQ_VALにより、メモリリクエストREQ_inが投機的にミスアクセス制御部に発行される。
【００９４】
また、投機リクエスト制御部１２４は、タグヒット・ミス信号TAG_H/Mやアボート信号ABORTに応じて、投機リクエストキャンセル信号MSC_SPC_CANCLを生成し、ミスアクセス制御部に出力する。さらに、投機リクエスト制御部１２４は、ミスアクセス制御部から確定エントリを開放したことを通知するリリースバリッド信号MSC_RLS_VALに応答して、エントリ使用数カウンタUSE_CUNTを減じ、さらに、キャンセルエントリを開放したことを通知するキャンセルエントリリリースバリッド信号MSC_CNCL_RLS_VALに応答して、キャンセルエントリ数カウンタCNCL_CUNTのカウント値を減じる。
【００９５】
コヒーレンシ制御パイプライン１２が管理するエントリ使用数カウンタUSE_CUNTは、前述の通り、投機リクエストを発行するか、または投機リクエストを発行していないメモリリクエストを、タグコピー参照によりタグミス判定後の通常のタイミングで発行するとき加算される。また、エントリ使用数カウンタUSE_CUNTは、メモリ応答を受信し、ミスアクセス制御部がエントリを開放したとき減算される。
【００９６】
キャンセルエントリ数カウンタCNCL_CUNTは、前述の通り、投機リクエストについてタグコピー参照によりタグヒット判定されたときや、他の要因で投機リクエストされたメモリリクエストがアボートされたとき加算される。コヒーレンシ制御パイプライン１２は、投機リクエストのメモリリクエストがキャンセルとなったことを、前述の投機リクエストキャンセル信号MSC_SPC_CANCLでミスアクセス制御部に通知し、これにより、ミスアクセス制御部のエントリ内に投機キャンセルフラグSPC_CANCLE_FLGとして保持される（図１４参照）。
【００９７】
一方、ミスアクセス制御部は、メモリシステムからメモリ応答が返り、メモリ応答に対応するエントリが投機キャンセルフラグを保持している場合、エントリの開放と共に、前述のキャンセルエントリリリースバリッド信号MSC_CNCL_RLS_VALにより、キャッシュ制御パイプラインに対してキャンセルエントリ数カウンタCNCL_CUNTの減算を指示する。このときミスアクセス制御部はリリースバリッド信号MSC_RLS_VALも出力する。
【００９８】
したがって、キャンセルエントリ数カウンタCNCL_CUNTの値は、投機リクエストが失敗しメモリから応答があるまでの間、開放待ちになっているエントリの数を示している。
【００９９】
図１４は、本実施の形態におけるコヒーレンシ制御部CHR内の主にコヒーレンシ制御パイプライン１２とミスアクセス制御部１４との間の関係を示す図である。リクエストポートRP_0−RP_3は、下位レベルのキャッシュそれぞれから発行されるリクエストをエントリする。各リクエストポートは、複数のエントリ（図１４では４エントリ）を有する。各リクエストポートの複数のエントリは、セレクタにより選択され、調停回路１０、１１によりさらに選別され、コヒーレンシ制御パイプライン１２に入力される。
【０１００】
リクエストポートは、下位レベルのキャッシュからリクエストを受信したとき、リクエストに含まれる命令コードやアドレスに基づいて、ミスアクセス制御部にメモリリクエストを発行する可能性があるか否かを判定し、可能性がある場合各エントリの投機可能フラグSPC_READYを「１」に設定するようにしてもよい。
【０１０１】
このときに、命令コードやアドレスを確認することで、LLCタグコピーを引かなくてもリクエストがミスアクセス制御部に発行されないことが自明であるリクエストには、投機可能フラグSPC_REDYを「０」に設定するようにしてもよい。たとえば、リクエストのアドレスが非キャッシュ可能アドレス空間の場合、メモリアクセスが発行されることはない。したがって、投機リクエストをミスアクセス制御部に発行する必要はない。
【０１０２】
上記の投機可能フラグSPC_READYは、リクエストポートのリクエストが初めてコヒーレンシ制御パイプラインに入力されるときだけ投機リクエストを発行させ、２回目以降の入力時には投機リクエストを発行させない制御に利用することもできる。すなわち、投機リクエストがオーダー制御部での処理中のオーダーとアドレスが競合してアボートした場合、そのリクエストはリクエストポートに差し戻される。このときに投機可能フラグSPC_READYを「０」に変更する制御を行えば、上記の制御が可能になる。
【０１０３】
この制御により、パイプラインに再度入力されたときに、再び投機リクエストを発行することで、同じリクエストに対して複数の投機リクエストが発行されることを抑止できる。パイプラインでアボートすると投機リクエストはキャンセルされることに加えて、アドレスの競合による排他制御により、処理中のリクエストやオーダーが処理完了してロック状態が解除されるまで複数回アボートを繰り返すことが多い。したがって、一度アボートしたリクエストがパイプラインに再度入力されるたびに投機リクエストを発行すると、無駄なキャンセルエントリでミスアクセス制御部内のエントリが埋め尽くされること起こり、エントリの使用効率の低下を招く。
【０１０４】
調停回路１０，１１により選択されたリクエストは、コヒーレンシ制御パイプライン１２に入力される。そして、投機リクエスト制御部１２４では、投機ビジー生成回路１２５が、エントリ使用数カウンタ値USE_CUNTとキャンセルエントリ数カウンタ値CNCL_CUNTに基づいて、投機リクエストの発行が許可されるか否かを判定して投機ビジー信号MSC_SPC_BUSYを生成する。さらに、投機リクエスト発行回路１２６が投機ビジー信号と投機可能フラグSPC_READYとに基づいて、投機リクエストが有効であることを示す投機リクエストバリッド信号SPC_REQ_VALを生成し、ミスアクセス制御部１４に出力する。投機ビジー生成回路と投機リクエスト発行回路の具体例については後述する。
【０１０５】
投機リクエスト制御部１２４は、LLCタグコピーの参照によるキャッシュ判定がタグヒットになり、または投機リクエストのメモリリクエストが他の要因でアボートされると、投機リクエストキャンセル信号MSC_SPC_CANCELを生成し、ミスアクセス制御部１４に出力し、投機リクエストが失敗したことを通知（投機キャンセル通知）する。具体的には、制御パイプライン１２は、投機キャンセル通知として、通常バリッド信号MSC_REQ_VAL=1、投機リクエストキャンセル信号MSC_SPC_CANCEL=1をミスアクセス制御部１４に送信する。
【０１０６】
一方、コヒーレンシ制御パイプライン１２は、キャッシュ判定がタグミスになり投機リクエストが成功した場合には、通常リクエストバリッド信号MSC_REQ_VALをミスアクセス制御部１４に出力し、投機リクエストが成功したことを通知する。具体的には、制御パイプライン１２は、上記の投機リクエスト成功通知として、通常バリッド信号MSC_REQ_VAL=1、投機リクエストキャンセル信号MSC_SPC_CANCEL=0をミスアクセス制御部１４に送信する。
【０１０７】
また、コヒーレンシ制御パイプライン１２は、投機リクエストが発行されなかったメモリリクエストが、LLCタグコピーの参照によりタグミスし、他の要因でアボートされないと、ミスアクセス制御部内のエントリの使用数がエントリ総数未満であれば、通常のメモリリクエストを有効にする通常リクエストバリッド信号MSC_REQ_VALをミスアクセス制御部１４に出力して、通常のメモリリクエストを通知する。具体的には、制御パイプライン１２は、通常のメモリリクエストの通知として、通常バリッド信号MSC_REQ_VAL=1、投機リクエストキャンセル信号MSC_SPC_CANCEL=0をミスアクセス制御部１４に送信する。
【０１０８】
上記のMSC_REQ_VAL=1とMSC＿SPC_CANCEL=1の組み合わせ信号は、ミスアクセス制御部１４によりエントリの新規獲得要求として受信される。但し、ミスアクセス制御部１４は、投機リクエスト対象のエントリには投機済みフラグSPC_DONE（図示せず）を保持している。そこで、ミスアクセス制御部１４は、MSC_REQ_VAL=1とMSC＿SPC_CANCEL=1の組み合わせ信号を受信した場合、SPC_DONE=1なら投機成功通知と判定して、メモリコントローラにメモリリクエストを発行しない。一方、SPC_DONE=0なら新規のメモリリクエストと判定してエントリ登録しメモリコントローラにメモリリクエストを発行する。
【０１０９】
図１４に示されるとおり、コヒーレンシ制御パイプライン１２に入力するリクエストの情報は、バス１７によりミスアクセス制御部１４に通知されている。そして、上記の投機リクエストバリッド信号SPC_REQ_VALが有効状態「１」になると、ミスアクセス制御部は、そのリクエストの情報をエントリに登録する。同様に、投機リクエストが発行されていないリクエストについて上記の通常リクエストバリッド信号MSC_REQ_VALが有効状態「１」になると、ミスアクセス制御部は、そのリクエスト情報をエントリに登録する。
【０１１０】
一方、上記の投機リクエストキャンセル信号MSC_SPC_CANCELが発生すると、ミスアクセス制御部は、そのリクエストを登録するエントリの投機キャンセルフラグSPC_CANCL_FLGを「１」に立てる。これにより、そのエントリがキャンセルエントリであることが示される。
【０１１１】
図１５は、本実施の形態における投機リクエスト制御部１２４の構成例を示す図である。図１４で示したとおり、投機リクエスト制御部１２４は、投機ビジー生成回路１２５と投機リクエスト発行回路１２６を有する。
【０１１２】
投機リクエスト制御部１２４は、エントリ使用数カウンタUSE_CUNTとキャンセルエントリ数カウンタCNCL_CUNTのカウント値から、現在のミスアクセス制御部内のエントリの使用状況を判断し、投機リクエストの発行が許容されるか禁止されるかの判断を行う投機ビジー生成回路１２５を有する。さらに、入力されたリクエストの投機可能フラグSPC_READYが投機可能「１」の場合に、投機リクエストの発行が許容される場合は、投機リクエストバリッド信号SPC_REQ_VALを有効状態「１」にする投機リクエスト発行回路１２６を有する。
【０１１３】
投機ビジー生成回路１２５は、全エントリが使用中であることを示す全エントリ使用中信号MSC_FULLと、エントリ使用数及びキャンセルエントリ数に基づく第１の投機ビジー信号MSC_BUSY_SPC_CANとの論理和により、投機ビジー信号MSC_SPC_BUSYを生成する。投機ビジー信号MSC_SPC_BUSYが「１」になると投機リクエストの発行が禁止され、「０」になると許可される。
【０１１４】
図中の論理回路１２７が、エントリ使用数カウンタUSE_CUNTのカウント値が総エントリ数E_MAX以上の場合に、全エントリ使用中信号MSC_FULLを「１」（発行禁止）にする。また、論理回路１２８が、エントリ使用数カウンタUSE_CUNTのカウント値が、第１の設定値CF1（例えば総エントリ数E_MAXまたはそれより小さい数）からキャンセルエントリ数カウンタCNCL_CUNTのカウント値を減じた数以上の場合に、第１の投機ビジー信号MSC_BUSY_SPC_CANを「１」（発行禁止）にする。
【０１１５】
したがって、第１の実施の形態では、エントリ使用数が総エントリ数以上になる場合か、またはエントリ使用数が第１の設定値CF1からキャンセルエントリ数を減じた数以上になる場合に、投機リクエストの発行が抑止、つまり禁止される。一方、エントリ使用数が総エントリ数未満であり、且つエントリ使用数が第１の設定値CF1からキャンセルエントリ数を減じた上限値未満の場合に、投機リクエストの発行が許可される。具体的には、以下の論理演算式で投機リクエストの発行を抑止する、発行を許可することが判定される。
投機リクエストの発行抑止＝（E_MAX≦USE_CUNT）OR｛（CF1-CNCL_CUNT）≦USE_CUNT｝
投機リクエストの発行許可＝（E_MAX＞USE_CUNT）AND｛（CF1-CNCL_CUNT）＞USE_CUNT｝
【０１１６】
投機リクエストの発行抑止の第１の条件（E_MAX≦USE_CUNT）は、そもそも全エントリが使用状態であることを示す。また、第２の条件｛（CF1-CNCL_CUNT）≦USE_CUNT｝は、図１３で説明したエントリ使用数が上限値UPL（＝CF1-CNCL_CUNT）以上なら投機リクエストの発行が抑止されることと同じである。
【０１１７】
第１に、第１の設定値CF1が総エントリ数E_MAXと等しく設定されている場合は、キャンセルエントリ数が０の場合に投機リクエストはエントリ使用数が総エントリ数E_MAXになるまで発行される。第２に、第１の設定値CF1が総エントリ数より小さく設定されている場合（CF1=E_MAX-α）、キャンセルエントリ数にかかわらずα個の空きエントリが確保され、通常のメモリリクエストのために使用可能になる。第３に、上限値UPLをキャンセルエントリ数に係数Kを乗じて第１の設定値CF1（総エントリ数E＿MAXまたはE_MAX-α）から減じることで、例えば係数K=2に設定するとキャンセルエントリ数の２倍の空きエントリ（または２倍の空きエントリ＋α）が確保され、通常のメモリリクエストの為に使用可能になる。すなわち、第２の条件は以下のように修正される。
（CF1−K*CNCL_CUNT）≦USE_CUNT
【０１１８】
さらに、投機リクエスト発行回路１２６は、入力されたリクエストの投機可能フラグSPC_READYと投機ビジー信号MSC_SPC_BUSYの反転値との論理積により、投機リクエストバリッド信号SPC_REQ_VALを生成する。つまり、入力されたリクエストの投機可能フラグSPC_READYが「１」であり、投機ビジー信号MSC_SPC_BUSYが「０」（発行許可）の場合に、投機リクエストバリッド信号SPC_REQ_VALが「１」にされ、投機リクエストが発行される。
【０１１９】
論理回路１２９は、投機リクエストキャンセル信号MSC_SPC_CANCELを生成する論理回路である。論理回路１２９は、投機リクエストバリッド信号SPC_REQ_VALが「１」であり（投機リクエストが発行済み）、タグ判定がタグヒットまたはアボートされた場合に、投機リクエストキャンセル信号MSC_SPC_CANCELを「１」にする。
【０１２０】
図１５には、コヒーレンシ制御パイプライン１２内の処理判定回路１２２による通常のリクエストバリッド信号MSC_REQ_VALを生成する論理回路が示される。処理判定回路内の論理回路は、タグヒット・ミス信号TAG_H/Mがタグミスによる「０」であり、パイプラインにてアボートされないことによるアボート信号ABORTが「０」の場合に、通常のリクエストバリッド信号MSC_REQ_VALを「１」にする。
【０１２１】
但し、この論理回路は、投機リクエストがされずにタグミスした時には、TAG_H/MとABORTが「０」に加えてエントリ使用数が総エントリ数以上を示す全エントリ使用中信号MSC_FULLが「０」の場合に、MSC_REQ_VAL=1を発行し、投機リクエストがされてタグミス（投機リクエスト成功）の時には、TAG_H/MとABORTが「０」の場合に、MSC_REQ_VAL=1を発行する。
【０１２２】
図１６は、ミスアクセス制御部の一部の構成例を示す図である。ミスアクセス制御部１４は、発行されたメモリリクエストを登録するエントリMSC_ENTRYを３２個有する。さらに、ミスアクセス制御部１４は、コヒーレンシ制御パイプライン１２が発行した投機リクエストキャンセル信号MSC_SPC_CANCELに応答して、投機リクエストキャンセル信号に対応するエントリ内の投機キャンセルフラグSPC_CANCEL_FLGを「１」に変更する。また、メモリシステムに発行したメモリリクエストに対するメモリ応答の受信に応答して、メモリ応答に対応するエントリを開放するとともにエントリリリースバリッド信号MSC_RLS_VALをコヒーレンシ制御パイプライン１２に発行する。また、メモリ応答の受信に応答して、対応するエントリの投機キャンセルフラグSPC_CANCEL_FLGが「１」の場合に、キャンセルエントリリリースバリッド信号MSC_CNCL_RLS_VALをコヒーレンシ制御パイプライン１２に発行する。
【０１２３】
図１５に戻り、コヒーレンシ制御パイプライン内のエントリ使用数カウンタとキャンセルエントリ数カウンタの加算と減算の制御について説明する。まず、エントリ使用数カウンタUSE_CUNTは、投機リクエストバリッド信号SPC_REQ_VALが「１」にされて投機リクエストが発行されるときに加算され、通常のリクエストバリッド信号MSC_REQ_VALが「１」にされて通常のリクエストが発行されるときも加算される。また、エントリ使用数カウンタは、エントリリリースバリッド信号MSC_RLS_VALが「１」のときに減算される。
【０１２４】
一方、キャンセルエントリ数カウンタCNCL_CUNTは、投機リクエストキャンセル信号MSC_SPC_CANCELが「１」のときに加算され、投機リクエストキャンセル信号MSC_SPC_CANCELが「１」且つキャンセルエントリリリースバリッド信号MSC_CNCL_RLS_VALが「１」の時に減算される。
【０１２５】
［第１の実施の形態の変形例］
図１７は、第１の実施の形態における投機リクエスト制御部の構成の変形例を示す図である。図１５の構成例と比較すると、図１７の投機ビジー生成回路１２５は、全エントリ使用中信号MSC_FULLと第１の投機ビジー信号MSC_BUSY_SPC_CANに加えて、第２の投機ビジー信号MSC_BUSY_SPC_MEMと第３の投機ビジー信号MSC_BUSY_SPC_ACCELの論理和により投機ビジー信号MSC_SPC_BUSYを生成する。さらに、図１７の投機リクエスト制御部は、リプレースバッファエントリ使用数カウンタRPB_CUNTと、論理回路１３０，１３１を有する。
【０１２６】
図１４に示されたリプレースバッファ１６は、LLCからのライトバック処理を行う回路であり、ミスアクセス制御部と同様に、リクエストを受け付けるエントリRPB_ENTRYを複数有する。そして、リプレースバッファ１６は、ライトバック要求RPB_REQ_VALをエントリに受け付けると、メモリコントローラMCを介してメモリMEMにキャッシュブロックのデータをライトバックする。そして、メモリコントローラからライトバック完了応答を受信すると、リプレースバッファは、リリースバリッド信号RPB_RLS_VALをコヒーレンシ制御パイプラインに送信する。
【０１２７】
図１７に示される通り、コヒーレンシ制御パイプラインは、リプレースバッファのエントリ使用数カウンタRPB_CUNTでリプレースバッファ内のエントリの使用数を管理する。すなわち、リプレースバッファのエントリ使用数カウンタRPB_CUNTを、ライトバック要求RPB_REQ_VALが「１」になると加算し、リプレースバッファのリリースバリッド信号RPB_RLS_VALが「１」になると減算する。
【０１２８】
図１７の第２の投機ビジー信号MSC_BUSY_SPC_MEMは、論理回路１３０により生成される。論理回路１３０は、ミスアクセス制御部内のエントリ使用数カウンタUSE_CUNTの値とリプレースバッファのエントリ使用数カウンタRPB_CUNTの値の和が、第２の設定値CF2以上になると、第２の投機ビジー信号MSC_BUSY_SPC_MEMを「１」にする。第２の設定値CF2は、ミスアクセス制御部の総エントリ数とリプレースバッファの総エントリ数の合計値より小さい任意の値に設定される。
【０１２９】
すなわち、メモリMEMへのアクセスを伴うメモリリクエストを発行するのは、ミスアクセス制御部と、キャッシュメモリのダーティデータをライトバックするリプレースバッファである。したがって、両方からのメモリアクセス数が第２の設定値CF2以上になると、メモリリクエストの発行数が増大してメモリの負荷が増大していることを意味する。このような状況下で投機リクエストを発行すると、キャンセルされるリクエストがメモリアクセスを実行することで、無効なメモリアクセスがメモリ帯域を使用することになり、メモリの実効的なスループットを低下させる。また、メモリの負荷が高いときは、メモリコントローラのリクエストキューにメモリアクセスが滞留するため、投機リクエストによるレイテンシ削減効果は望めない。
【０１３０】
そこで、投機ビジー生成回路１２５は、CF2≦USE_CUNT＋RPB_CUNTが満たされる場合に「１」になる第２の投機ビジー信号MSC_BUSY_SPC_MEMにより、投機ビジー信号MSC_SPC_BUSYを「１」（発行禁止）にする。これにより、投機リクエスト制御部は、メモリMEMにメモリアクセスが殺到している状況下で、投機リクエストの発行を抑止することができる。
【０１３１】
図１７の第３の投機ビジー信号MSC_BUSY_SPC_ACCELは、論理回路１３１により生成される。論理回路１３１は、ミスアクセス制御部内のエントリ使用数カウンタUSE_CUNTの値が、第３の設定値CF3以上になると、第３の投機ビジー信号MSC_BUSY_SPC_ACCELを「１」にする。第３の設定値CF3は、例えばミスアクセス制御部の総エントリ数より小さい任意の値に設定される。
【０１３２】
すなわち、第３の設定値CF3を適宜減少させることで、投機リクエストの発行の抑制を加速化（アクセル）させることができ、逆に適宜増大させることで、投機リクエストの発行の抑制を弱めることができる。
【０１３３】
［第２の実施の形態］
図１８は、第２の実施の形態におけるキャッシュの構成を示す図である。このキャッシュCACHEは、例えば、図１におけるLLC（最上位レベルのキャッシュ）であり、またラストレベルではなくそれより下位レベルのキャッシュでもよい。前述の通り、本実施の形態の投機リクエストをキャンセルエントリ数に応じて抑制する制御は、第１の実施の形態のコヒーレンシ制御部以外に、メモリリクエストを発行するキャッシュにも適用できる。そこで、第２の実施の形態では、投機リクエストの抑制制御がキャッシュに適用される。
【０１３４】
図３の第１の実施の形態におけるコヒーレンシ制御部は、複数のLLCとメモリ階層との間に設けられ、LLCでのキャッシュミスに対して発行されたメモリアクセスを入力し、LLCのタグコピーをチェックし、キャッシュヒットすればデータを所持しているLLCに転送オーダーを発行し、キャッシュミスすればメモリ階層にメモリリクエストを発行する。したがって、図３のコヒーレンシ制御部は、複数の下位レベルからのリクエストを受け付けてメモリ階層に対する制御を行う制御パイプラインと、リクエストに対応する処理を実行する処理ユニットを有する構成において、ミスアクセス制御部にメモリリクエストを投機的に発行する。
【０１３５】
図１８のキャッシュCACHEは、図３のコヒーレンシ制御部と同様の上記の構成を有する。ただし、キャッシュは、コヒーレンシ制御部と異なり、キャッシュメモリのタグメモリ18とデータメモリ19を有する。つまり、キャッシュは、タグメモリのコピーではなくタグメモリ18の原本を有することと、データメモリ19を有することで、コヒーレンシ制御部と異なる。また、キャッシュは、上位レベル（上位レベルのキャッシュやコヒーレンシ制御部）からオーダーを受け付けるリクエストポートRP_12と、上位レベルからメモリ応答を受け付けるリクエストポートRP_13を有することでも、コヒーレンシ制御部と異なる。
【０１３６】
一方、キャッシュは、コヒーレンシ制御部と同様に、リクエストポートRPと、コア／キャッシュ間調停回路10と、プライオリティ調停回路11と、キャッシュ制御パイプライン120を有し、さらに、ミスアクセス制御部14、オーダー制御部15、リプレースバッファ16などの処理ユニット20を有する。但し、ミスアクセス制御部は上位レベル（上位レベルのキャッシュやコヒーレンシ制御部）にメモリリクエストを発行する。図３のコヒーレンシ制御部のミスアクセス制御部は、上位レベルのメモリ階層にメモリリクエストを発行するとともにリモート（他のCPU）にもリクエストを発行している。
【０１３７】
したがって、図１８のキャッシュも、コヒーレンシ制御部と同様に、キャッシュ制御パイプライン120が、タグを参照してヒットするか否か判定し、ミスする場合にミスアクセス制御部にメモリリクエストを発行する。したがって、図８のキャッシュも、タグ判定する前に投機リクエストを発行することでレイテンシを改善することが期待できる一方で、ヒットしてキャンセルリクエストが増大するというコヒーレンシ制御部と共通の課題を有する。
【０１３８】
そこで、図１８のキャッシュは、投機リクエストのキャンセルによるエントリの使用効率が低下することを抑制するために、キャッシュ制御パイプラインが投機リクエストの発行をキャンセル数に応じて抑制する。
【０１３９】
キャッシュ制御パイプライン120の構成は、図４、図１４、図１５などと同様の投機リクエスト制御部を有する。
【０１４０】
以上のとおり、本実施の形態によれば、投機リクエストがキャンセルされたエントリ数に応じて、投機リクエストの発行をより抑制するようにすることで、投機リクエストを受け付けるミスアクセス制御部内のエントリの使用効率を向上させることができる。本実施の形態は、コヒーレンシ制御部やキャッシュ（LLCまたはそれ以外のレベルのキャッシュ）に適用される。
【０１４１】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１４２】
（付記１）
演算処理部と、
前記演算処理部が発行するメモリに対するメモリリクエストの制御を行う第１の制御部とを有し、
前記第１の制御部は、
前記メモリリクエストにエントリを割り当てて前記メモリリクエストに係る処理を制御するミスアクセス制御部と、
入力されたメモリリクエストがキャッシュヒットするか否かのキャッシュヒット判定をし、キャッシュミスの判定の場合前記入力されたメモリリクエストについて通常メモリリクエストを前記ミスアクセス制御部に発行する制御パイプラインとを有し、
前記制御パイプラインは、前記キャッシュヒット判定する前に前記入力されたメモリリクエストについて投機的メモリリクエストを前記ミスアクセス制御部に発行し、前記キャッシュヒット判定がヒット判定の場合に前記発行した投機的メモリリクエストをキャンセルし、前記キャンセルされた投機的メモリリクエストのエントリ数の増大に応じて、前記投機的メモリリクエストの発行をより抑制する投機的リクエスト制御部を有する、演算処理装置。
【０１４３】
（付記２）
前記投機的リクエスト制御部は、前記キャンセルされた投機的メモリリクエストのエントリ数の増大に応じて、前記投機的メモリリクエストに割り当てられるエントリ数を減じる、付記１に記載の演算処理装置。
【０１４４】
(付記３)
前記投機的リクエスト制御部は、前記ミスアクセス制御部のエントリの使用数が、第１設定数から前記キャンセルされる投機的メモリリクエストのエントリ数を減じた第１の上限数以上の場合、前記投機的メモリリクエストの発行を禁止する、付記２に記載の演算処理装置。
【０１４５】
(付記４)
前記第１設定数は、前記エントリの総数である、付記３に記載の演算処理装置。
【０１４６】
(付記５)
前記第１設定数は、前記エントリの総数より小さい数である、付記３に記載の演算処理装置。
【０１４７】
(付記６)
前記投機的リクエスト制御部は、前記ミスアクセス制御部のエントリの使用数が、前記キャンセルされる投機的メモリリクエストのエントリ数に係数を乗じた数を第１設定数から減じた第１の上限数以上の場合、前記投機的メモリリクエストの発行を禁止する、付記２に記載の演算処理装置。
【０１４８】
(付記７)
前記第１の制御部は、さらに、キャッシュに登録されたキャッシュラインを前記メモリに書き戻すリプレース処理を制御するリプレースバッファを有し、
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数とリプレースバッファのエントリの使用数の和が第２設定数以上の場合、前記投機的メモリリクエストの発行を禁止する、付記３または６に記載の演算処理装置。
【０１４９】
(付記８)
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数が総数より小さい第３設定値以上の場合、前記投機的メモリリクエストの発行を禁止する、付記３または６に記載の演算処理装置。
【０１５０】
（付記９）
前記投機的リクエスト制御部は、さらに、前記ミスアクセス制御部のエントリの使用数が総数以上の場合、前記投機的メモリリクエストの発行を禁止する、付記３または６に記載の演算処理装置。
【０１５１】
（付記１０）
前記制御パイプラインは、前記ミスアクセス制御部のエントリの使用数が総数以上の場合、前記通常メモリリクエストの発行を禁止する、付記３または６に記載の演算処理装置。
【０１５２】
（付記１１）
さらに、前記演算処理部が発行する前記メモリリクエストを処理するキャッシュと、
前記キャッシュのコヒーレンシを制御するコヒーレンシ制御部を有し、
前記コヒーレンシ制御部は、前記第1の制御部を有し、前記キャッシュヒット判定を前記キャッシュのタグの写しを参照して行う、付記１に記載の演算処理装置。
【０１５３】
（付記１２）
さらに、前記演算処理部が発行する前記メモリリクエストを処理するキャッシュを有し、
前記キャッシュは、前記第1の制御部を有し、前記キャッシュヒット判定を前記キャッシュのタグを参照して行う、付記１に記載の演算処理装置。
【０１５４】
（付記１３）
演算処理部と、
前記演算処理部が発行するメモリに対するメモリリクエストの制御を行う第１の制御部とを有し、
前記第１の制御部は、前記メモリリクエストにエントリを割り当てて前記メモリリクエストに係る処理を制御するミスアクセス制御部と、入力されたメモリリクエストを前記ミスアクセス制御部に発行する制御パイプラインとを有し、
前記制御パイプラインは、
入力されたメモリリクエストがキャッシュヒットするか否かのキャッシュヒット判定をし、
キャッシュミスの判定の場合前記入力されたメモリリクエストについて通常メモリリクエストを前記ミスアクセス制御部に発行し、
前記キャッシュヒット判定する前に前記入力されたメモリリクエストについて投機的メモリリクエストを前記ミスアクセス制御部に発行し、
前記キャッシュヒット判定がヒット判定の場合に前記発行した投機的メモリリクエストをキャンセルし、
前記キャンセルされた投機的メモリリクエストのエントリ数の増大に応じて、前記投機的メモリリクエストの発行をより抑制する、演算処理装置の制御方法。
【符号の説明】
【０１５５】
１：CPUチップ、演算処理装置、マイクロプロセッサ、プロセッサ
CORE：CPUコア、コア、演算処理部
L1D, L1I：L1キャッシュ（データメモリ、インストラクションメモリ）
LLC：Last Level Cache、最上位レベルキャッシュ
CHR：コヒーレンシ制御部
RP：リクエストポート
１０：コア／キャッシュ間調停回路
１１：プライオリティ調整回路
２０：処理ユニット
１８：LLC-TAG、LLC-DATA
１３：LLC-TAG-COPY
１４：ミスアクセス制御部
１５：オーダー制御部
１６：リプレース制御部
１７：バス
１２：コヒーレンシ制御パイプライン
１２０：キャッシュ制御パイプライン
１２１：アドレス・TAGチェック部
１２２：処理判定部
１２３：資源判定部
Abort, 12E：強制アボート信号
Ab1,Ab2：通常アボート信号（排他アドレスアボート、資源非獲得アボート）
SPC_READY：投機可能フラグ
MSC_SPC_BUSY：投機ビジー信号
MSC_REQ_VAL：通常リクエストバリッド信号
SPC_REQ_VAL：投機リクエストバリッド信号
MSC_SPC_CANCEL：投機リクエストキャンセル信号
MSC_RLS_VAL：通常エントリリリースバリッド信号
MSC_CNCL_RLS_VAL：キャンセルエントリリリースバリッド信号
MSC_FULL：全エントリ使用中信号
MSC_BUSY_SPC_CAN：第1の投機ビジー信号（キャンセル数に基づく投機ビジー信号）
MSC_BUSY_SPC_MEM：第２の投機ビジー信号（メモリアクセス数に基づく投機ビジー信号）
MSC_BUSY_SPC_ACCEL：第３の投機ビジー信号（投機リクエスト抑制アクセル信号）
USE_CUNT：ミスアクセス制御部のエントリ使用数カウンタ
CNCL_CUNT：ミスアクセス制御部のキャンセルエントリ数カウンタ
RPB_CUNT：リプレースバッファのエントリ使用数カウンタ
１２４：投機リクエスト制御部
１２５：投機ビジー生成回路
１２６：投機リクエスト発行回路
【図１】
0006687845.tif 000002
【図２】
0006687845.tif 000003
【図３】
0006687845.tif 000004
【図４】
0006687845.tif 000005
【図５】
0006687845.tif 000006
【図６】
0006687845.tif 000007
【図７】
0006687845.tif 000008
【図８】
0006687845.tif 000009
【図９】
0006687845.tif 000010
【図１０】
0006687845.tif 000011
【図１１】
0006687845.tif 000012
【図１２】
0006687845.tif 000013
【図１３】
0006687845.tif 000014
【図１４】
0006687845.tif 000015
【図１５】
0006687845.tif 000016
【図１６】
0006687845.tif 000017
【図１７】
0006687845.tif 000018
【図１８】
0006687845.tif 000019