(57)【要約】【課題】キャッシュラインの状態に応じてプリフェッチを効果的に実行する。【解決手段】プリフェッチ命令またはロード命令を含むプログラムと、データとを主記憶３から読み込んで実行するプロセッサ１は、プログラムを実行する演算コアと、主記憶３上のデータを所定のデータ格納単位毎に格納する２次キャッシュ１４と、演算コアからのプリフェッチの要求に基づいて、主記憶３から２次キャッシュ１４へデータを先読みするプリフェッチユニット１３と、を備え、プリフェッチユニット１３は、２次キャッシュ１４のデータ格納単位の位置毎に記憶状態を保持する領域と、プリフェッチの要求を予約する領域とを備えた２次キャッシュ管理テーブル１３１と、このテーブル１３１の記憶状態に基づいて、予約したプリフェッチの要求または演算コア１０からのプリフェッチの要求を２次キャッシュ１４へ指令するプリフェッチ制御部１３２と、を有する。【選択図】図１
2008059057.tif 000002
【特許請求の範囲】
【請求項１】
プリフェッチ命令またはロード命令を含むプログラムと、前記プログラムで用いるデータとを格納する主記憶と、
前記主記憶から前記プログラムとデータを読み込んで実行するプロセッサと、を備えた計算システムにおいて、
前記プロセッサは、
前記プログラムを実行する演算コアと、
前記主記憶上のデータを所定のデータ格納単位毎に格納する共有キャッシュと、
前記演算コアからのプリフェッチの要求に基づいて、前記主記憶から共有キャッシュへデータを先読みするプリフェッチユニットと、を備え、
前記プリフェッチユニットは、
前記共有キャッシュのデータ格納単位の位置毎に記憶状態を保持する領域と、前記プリフェッチの要求を予約する領域とを備えた共有キャッシュ管理情報と、
前記共有キャッシュの記憶状態に基づいて、前記予約したプリフェッチの要求または前記演算コアからのプリフェッチの要求を前記共有キャッシュへ指令するプリフェッチ制御部と、
を有することを特徴とする計算機システム。
【請求項２】
前記プリフェッチ制御部は、
前記演算コアからのプリフェッチの要求があったときに、前記共有キャッシュ管理情報のデータ格納単位に空きがなければ、前記演算コアからのプリフェッチの要求を前記共有キャッシュ管理情報に予約し、前記共有キャッシュ管理情報のデータ格納単位に空きがあれば、前記プリフェッチの要求を前記共有キャッシュに指令することを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、を含み、
前記共有キャッシュは、
前記アドレスに対応するデータ格納単位の位置毎に、主記憶のデータと前記回数を格納するデータ格納領域と、
前記プリフェッチ制御部から指令されたプリフェッチの要求に基づいて、前記主記憶から前記アドレスのデータを読み込んで、前記アドレスに対応する位置のデータ格納単位へ前記データを格納する共有キャッシュ制御部と、を有し、
前記共有キャッシュ制御部は、
前記プリフェッチ制御部から指令されたプリフェッチの要求に含まれる前記回数を、前記読み込んだデータに対応付けて前記データ格納領域に格納することを特徴とする請求項１に記載の計算機システム。
【請求項４】
前記演算コアは、
前記ロード命令を実行したときには、前記共有キャッシュ制御部に対して当該ロード命令に含まれるアドレスの読み出しを指令し、
前記共有キャッシュ制御部は、
前記ロード命令に含まれるアドレスのデータを前記共有キャッシュのデータ格納領域に格納している場合には、当該データを前記演算コアに転送し、前記データ格納領域のデータに対応する前記回数を減算する読み出し部と、
前記回数が所定の値となったときには、前記データ格納領域のデータをキャッシュアウトする更新部と、
を有することを特徴とする請求項３に記載の計算機システム。
【請求項５】
前記共有キャッシュ制御部は、
前記更新部が前記キャッシュアウトを行ったときには、前記キャッシュアウトしたデータ格納単位の位置を前記プリフェッチ制御部に通知し、
前記プリフェッチ制御部は、
前記通知された前記データ格納単位の位置に対応する共有キャッシュ管理情報を、前記予約したプリフェッチの要求で更新し、当該プリフェッチの要求を前記共有キャッシュ制御部に指令することを特徴とする請求項４に記載の計算機システム。
【請求項６】
前記演算コアは、
前記プログラムを読み込んで第２の演算ユニットに命令を分配する第１の演算ユニットと、
前記第１の演算ユニットから分配された命令を実行する第２の演算コアと、を有し、
前記第１の演算ユニットは、プリフェッチ命令を実行したときには前記プリフェッチ制御部へプリフェッチの要求を指令し、
前記第２の演算ユニットは、前記ロード命令を実行したときには前記共有キャッシュ制御部へデータの読み込みを指令することを特徴とする請求項３に記載の計算機システム。
【請求項７】
前記演算コアが読み込む回数は、前記第１の演算ユニットまたは第２の演算ユニットのうち、前記データを読み込む演算コアの数であることを特徴とする請求項３に記載の計算機システム。
【請求項８】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、前記回数の使用を許可するフラグとを含み、
前記共有キャッシュ制御部は、
前記プリフェッチ制御部から指令されたプリフェッチの要求に含まれる前記回数と前記フラグを、前記読み込んだデータに対応付けて前記データ格納領域に格納し、
前記読み出し部は、
前記ロード命令に含まれるアドレスのデータを前記共有キャッシュのデータ格納領域に格納している場合には、当該データを前記演算コアに転送し、前記フラグが所定の値のときにはデータ格納領域のデータに対応する前記回数を減算することを特徴とする請求項４に記載の計算機システム。
【請求項９】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、当該データを含むデータ格納単位の終端のアドレスと、を含み、
前記共有キャッシュ管理情報は、
前記共有キャッシュのデータ格納単位の位置毎に、前記アドレスと前記終端のアドレスを格納し、
前記プリフェッチ制御部は、
前記演算コアからのプリフェッチの要求があったときに、前記共有キャッシュ管理情報のデータ格納単位に空きがなく、かつ、前記共有キャッシュ管理情報の終端のアドレスが、前記アドレスよりも大きい場合には、前記共有キャッシュ制御部に対して当該アドレスに対応するデータ格納単位の位置に対応する前記回数を、前記プリフェッチの要求に含まれる回数で更新するように指令することを特徴とする請求項３に記載の計算機システム。
【請求項１０】
主記憶と共有キャッシュを備えて、プリフェッチ命令またはロード命令を含むプログラムとデータを読み込んで実行するプロセッサの制御方法であって、
前記プロセッサの演算コアが、前記プリフェッチ命令を実行して前記プロセッサのプリフェッチユニットへプリフェッチの要求を指令する処理と、
前記プリフェッチユニットが、前記共有キャッシュのデータ格納単位の位置毎に記憶状態を保持する領域と前記プリフェッチの要求を予約する領域とを含む共有キャッシュ管理情報から、前記演算コアからのプリフェッチの要求に対応するデータ格納単位の位置で記憶状態を参照する処理と、
前記プリフェッチユニットが共有キャッシュの記憶状態に基づいて、前記プリフェッチの要求を予約するか否かを判定する処理と、
前記判定結果が予約の場合には、前記プリフェッチの要求を前記共有キャッシュ管理情報に登録し、前記判定結果が予約でない場合には前記プリフェッチの要求を前記共有キャッシュへ指令する処理と、
を含むことを特徴とするプロセッサの制御方法。
【請求項１１】
前記プリフェッチの要求を予約するか否かを判定する処理は、
前記演算コアからのプリフェッチの要求があったときに、前記共有キャッシュ管理情報のデータ格納単位に空きがなければ、前記演算コアからのプリフェッチの要求を前記共有キャッシュ管理情報に予約することを判定し、前記共有キャッシュ管理情報のデータ格納単位に空きがあれば、前記プリフェッチの要求を前記共有キャッシュに指令する判定を行うことを特徴とする請求項１０に記載のプロセッサの制御方法。
【請求項１２】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、を含み、
前記共有キャッシュが、前記プリフェッチユニットから指令されたプリフェッチの要求に基づいて、前記主記憶から前記アドレスのデータを読み込んで、前記共有キャッシュの前記アドレスに対応する位置のデータ格納単位毎に予め設定されたデータ格納領域へ前記データを格納する処理と、
前記共有キャッシュが、前記プリフェッチユニットから指令されたプリフェッチの要求に含まれる前記回数を、前記読み込んだデータに対応付けて前記データ格納領域に格納する処理と、
をさらに含むことを特徴とする請求項１０に記載のプロセッサの制御方法。
【請求項１３】
前記演算コアが、前記ロード命令を実行したときには、前記共有キャッシュに対して当該ロード命令に含まれるアドレスの読み出しを指令する処理と、
前記共有キャッシュは、前記演算コアから指令されたロード命令に含まれるアドレスのデータを前記共有キャッシュのデータ格納領域に格納している場合には、当該データを前記演算コアに転送し、前記データ格納領域のデータに対応する前記回数を減算する処理と、
前記回数が所定の値となったときには、前記共有キャッシュが前記データ格納領域のデータをキャッシュアウトする処理と、
をさらに含むことを特徴とする請求項１２に記載のプロセッサの制御方法。
【請求項１４】
前記共有キャッシュが、前記キャッシュアウトを行ったときに、前記キャッシュアウトしたデータ格納単位の位置を前記プリフェッチユニットに通知する処理と、
前記プリフェッチユニットが、前記通知された前記データ格納単位の位置に対応する前記共有キャッシュ管理情報を、前記予約したプリフェッチの要求で更新し、当該プリフェッチの要求を前記共有キャッシュに指令する処理と、
をさらに含むことを特徴とする請求項１３に記載のプロセッサの制御方法。
【請求項１５】
前記演算コアは、
前記プログラムを読み込んで第２の演算ユニットに命令を分配する第１の演算ユニットと、
前記第１の演算ユニットから分配された命令を実行する第２の演算コアと、を含み、
前記第１の演算ユニットが、プリフェッチ命令を実行したときには前記プリフェッチユニットへプリフェッチの要求を指令する処理と、
前記第２の演算ユニットが、前記ロード命令を実行したときには前記共有キャッシュへデータの読み込みを指令する処理と、
をさらに含むことを特徴とする請求項１２に記載のプロセッサの制御方法。
【請求項１６】
前記演算コアが読み込む回数は、前記第１の演算ユニットまたは第２の演算ユニットのうち、前記データを読み込む演算コアの数であることを特徴とする請求項１２に記載のプロセッサの制御方法。
【請求項１７】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、前記回数の使用を許可するフラグとを含み、
前記共有キャッシュが、前記プリフェッチユニットから指令されたプリフェッチの要求に含まれる前記回数と前記フラグを、前記読み込んだデータに対応付けて前記データ格納領域に格納する処理と、
前記共有キャッシュが、前記ロード命令に含まれるアドレスのデータを前記共有キャッシュのデータ格納領域に格納している場合には、当該データを前記演算コアに転送し、前記フラグが所定の値のときにはデータ格納領域のデータに対応する前記回数を減算する処理と、
をさらに含むことを特徴とする請求項１３に記載のプロセッサの制御方法。
【請求項１８】
前記プリフェッチ命令は、
前記主記憶上のデータのアドレスと、当該データを前記演算コアが読み込む回数と、当該データを含むデータ格納単位の終端のアドレスと、を含み、
前記プリフェッチユニットが、前記共有キャッシュ管理情報のデータ格納単位の位置毎に、前記アドレスと前記終端のアドレスを格納する処理と、
前記プリフェッチユニットが、前記演算コアからのプリフェッチの要求があったときに、前記共有キャッシュ管理情報のデータ格納単位に空きがなく、かつ、前記共有キャッシュ管理情報の終端のアドレスが、前記アドレスよりも大きい場合には、前記共有キャッシュに対して当該アドレスに対応するデータ格納単位の位置に対応する前記回数を、前記プリフェッチの要求に含まれる回数で更新するように指令することを特徴とする請求項１２に記載のプロセッサの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサのキャッシュ制御に関し、特に、キャッシュへデータの先読みを行うプリフェッチ機能を備えたプロセッサに関し、また、複数の演算コアを有するマルチコアプロセッサのプリフェッチ機能に関する。
【背景技術】
【０００２】
近年、半導体製造技術の進歩による素子の微細化により、膨大な数のトランジスタを集積することが可能となっている。この進歩によってプロセッサ（ＣＰＵ）の高周波数化が進んで、演算処理能力は飛躍的に向上した。一方、データやプログラムを格納する主記憶についても、半導体の微細化によりデータの転送速度や記憶容量が向上した。
【０００３】
しかし、プロセッサの処理能力の向上に比して、主記憶のデータ転送速度は低いため、プロセッサの演算コア側にキャッシュメモリ（以下、キャッシュ）を設けたプロセッサが広く普及している。キャッシュはプロセッサと同等の速度動作するため主記憶に比して高速なデータ転送を行うことができるが、プロセッサのダイサイズやコストの関係から主記憶に比して小さい容量で構成される。一方、主記憶は、プロセッサに接続されたフロントサイドバスやメモリバスの動作速度に依存するためキャッシュのデータ転送速度に比して遙かに遅いが、大容量で構成することができる。
【０００４】
一般的には、プロセッサの演算コアがデータを読み込む場合、まず、キャッシュにアクセスしてヒットすればキャッシュから必要なデータを高速に読み込むことができる。一方、キャッシュにない場合にはキャッシュミスとなって、主記憶から必要なデータを読み込むことになる。
【０００５】
キャッシュミスとなって必要なデータをプロセッサの演算コアに読み込むまでは、上述のように主記憶のデータ転送速度が極めて低いため、多大な時間を要することになる。このため、演算処理能力が高いプロセッサの演算コアは、データが到着するまで演算コアのパイプラインがストールしてしまい、演算処理速度が低下することになる。キャッシュミスの際には、主記憶のデータ転送速度がボトルネックとなって、プロセッサの性能を十分に発揮できないばかりか、無駄な電力を消費することにもなる。
【０００６】
そこで、近年のプロセッサでは、必要となるデータを事前にキャッシュに読み込んでおくプリフェッチ機能を備えたものが広く知られている。このプリフェッチ機能によって、これから実行する命令に必要なデータをキャッシュへ先読みしておくことで、キャッシュミスを防いでプロセッサの処理能力を発揮させようとするものである。
【０００７】
この種のプロセッサのプリフェッチ機能は、プログラム（実行コード）にプリフェッチ命令を埋め込んでおき、プロセッサはプリフェッチ命令を実行したときにプリフェッチ命令で指定されたアドレスのデータをキャッシュへ先読みしておくものが知られている。あるいは、実行コードの主記憶に対するアクセス状況から先読みを行うアドレスを決定し、ハードウェアによって先読みを行うプロセッサも知られている（例えば、特許文献１）。後者のハードウェアによりプリフェッチを実行するプロセッサでは、主記憶上のアドレスを所定の間隔でアクセスするストライドを検知して、アドレスの間隔に基づいて先読みを行うアドレスを決定し、ストライドの間隔に応じた先読みを実行するものである。
【特許文献１】特開２００６−１８４７４
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記従来例のようなプリフェッチ機能では、必ず先読みが成功してキャッシュミスを低減できたわけではない。例えば、プリフェッチを実行したときにキャッシュラインに空きがなければ、プリフェッチを行わないプロセッサでは、必要なデータをキャッシュに先読みすることができず、結局後の命令ではキャッシュミスとなってしまう。
【０００９】
あるいは、プリフェッチを実行したときにキャッシュラインに空きがなければ、ＬＲＵ（Least Recently Used）により、一番長く使われていないデータをキャッシュアウトさせ、その後先読みを行うプロセッサでは、他の命令で使用する予定であったデータをキャッシュアウトさせる場合があった。この場合、プリフェッチが成功したプログラム（またはスレッド）命令についてはキャッシュミスを抑制できるが、キャッシュアウトしたデータを利用する予定の命令では、キャッシュミスが生じて主記憶へのアクセスが発生することになる。
【００１０】
上記プリフェッチ命令の実行と、ハードウェアによるプリフェッチ機能を備えたプロセッサでは、プログラムで設定したプリフェッチ命令で先読みしたデータが、ハードウェアによるプリフェッチ機能でキャッシュアウトされる場合もあり、プログラムを作成する際には、プロセッサの挙動を考慮した上でプリフェッチ命令を挿入しなければならず、多大な労力を必要とする。
【００１１】
また、近年ではひとつのプロセッサに複数の演算コアを備えたマルチコアプロセッサが普及しつつあり、キャッシュを複数の演算コアで共有するプロセッサも知られている。キャッシュを共有するマルチコアプロセッサでは、複数の演算コアが共有キャッシュを利用するため、キャッシュラインに空きがないときにＬＲＵ方式でキャッシュアウトさせてプリフェッチを行うと、他の演算コアではキャッシュアウトしたデータをキャッシュミスする場合が発生する。
【００１２】
このように、上記従来例ではキャッシュラインに空きがない場合には、プリフェッチを行ったとしてもキャッシュミスを低減できないという問題があった。
【００１３】
さらに共有キャッシュを備えたマルチコアプロセッサでは、各コアが独立して命令を実行するため、共有キャッシュに保持するデータを的確に管理しなければ、複数の演算コアによる高い演算処理能力を発揮することができない、という問題があった。つまり、共有キャッシュのキャッシュラインに空きがないときに、第１の演算コアがプリフェッチを行って、ＬＲＵ方式でキャッシュアウトを行うと、第２の演算コアが利用する予定であったデータをキャッシュアウトされる場合があり、結局第２の演算コアはキャッシュミスとなって、主記憶からロードすることになる。したがって、第１の演算コアと第２の演算コアを有するプロセッサでは、一方の演算コアでプリフェッチが成功しても他方の演算コアでキャッシュミスを誘発する場合では、キャッシュミスにより処理速度が低下することになる。
【００１４】
さらに、上記特許文献１では、アドレスの間隔にある程度規則性のあるストライドでは、先読みが成功する場合があるが、アドレスの間隔が不規則なストライドや、アクセスするアドレスが不連続な場合では、先読みが成功しない場合があった。つまり、ソースコードレベルで、不規則なアクセスが分かっていた場合にプリフェッチ命令を挿入しても、上述のようなハードウェアによるプリフェッチ機能によって、プリフェッチ命令で先読みしておいたデータがキャッシュアウトされる場合があり、プリフェッチ命令及びプリフェッチ機能を効果的に利用することができない、という問題があった。
【００１５】
そこで本発明は、上記問題点に鑑みてなされたもので、キャッシュラインの状態に応じてプリフェッチを効果的に実行することを目的とし、さらに、マルチコアプロセッサに好適なプリフェッチを実現することを目的とする。
【課題を解決するための手段】
【００１６】
本発明は、プリフェッチ命令またはロード命令を含むプログラムと、前記プログラムで用いるデータとを格納する主記憶と、前記主記憶から前記プログラムとデータを読み込んで実行するプロセッサと、を備えた計算システムにおいて、前記プロセッサは、前記プログラムを実行する演算コアと、前記主記憶上のデータを所定のデータ格納単位毎に格納する共有キャッシュと、前記演算コアからのプリフェッチの要求に基づいて、前記主記憶から共有キャッシュへデータを先読みするプリフェッチユニットと、を備え、前記プリフェッチユニットは、前記共有キャッシュのデータ格納単位の位置毎に記憶状態を保持する領域と、前記プリフェッチの要求を予約する領域とを備えた共有キャッシュ管理情報と、前記共有キャッシュの記憶状態に基づいて、前記予約したプリフェッチの要求または前記演算コアからのプリフェッチの要求を前記共有キャッシュへ指令するプリフェッチ制御部と、を有する。
【００１７】
また、前記演算コアは、前記ロード命令を実行したときには、前記共有キャッシュ制御部に対して当該ロード命令に含まれるアドレスの読み出しを指令し、前記共有キャッシュ制御部は、前記ロード命令に含まれるアドレスのデータを前記共有キャッシュのデータ格納領域に格納している場合には、当該データを前記演算コアに転送し、前記データ格納領域のデータに対応する前記回数を減算する読み出し部と、前記回数が所定の値となったときには、前記データ格納領域のデータをキャッシュアウトする更新部と、を有する。
【００１８】
また、前記共有キャッシュ制御部は、前記更新部が前記キャッシュアウトを行ったときには、前記キャッシュアウトしたデータ格納単位の位置を前記プリフェッチ制御部に通知し、前記プリフェッチ制御部は、前記通知された前記データ格納単位の位置に対応する共有キャッシュ管理情報を、前記予約したプリフェッチの要求で更新し、当該プリフェッチの要求を前記共有キャッシュ制御部に指令する。
【発明の効果】
【００１９】
したがって、本発明は、プリフェッチ命令があったときに、共有キャッシュに空きがなければ、共有キャッシュ管理情報にプリフェッチ命令を予約しておくことで、共有キャッシュにキャッシュされている後の処理に必要となるデータをキャッシュアウトさせるのを防止でき、共有キャッシュのヒット率を向上させることができる。
【００２０】
さらに、プリフェッチ命令で共有キャッシュに読み込むデータについて演算コアが読み込む回数を予め設定しておき、演算コアが読み込む度に減算し、当該回数が所定値になるとキャッシュアウトすることにより、不要になったデータを迅速かつ的確にキャッシュアウトすることが可能となって、共有キャッシュの利用効率を向上させることが可能となる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の一実施形態を添付図面に基づいて説明する。
【００２２】
図１は、本発明を適用する計算機システムのブロック図である。計算機システムは、複数の演算コア（制御ユニットまたは演算ユニット）を含むマルチコアのプロセッサ１と、ユーザデータ３２やユーザプログラム３１を格納する主記憶（メモリ）３と、プロセッサ１とメモリ３を接続するバス２を主体に構成される。なお、バス２には図示しないストレージ装置やネットワークインターフェースを接続することができる。
【００２３】
プロセッサ１は、異なる種類の演算コアで構成されたヘテロジニアス・マルチコアプロセッサシステムの例を示す。プロセッサ１の演算コアとしては、各演算コアに命令を分配してプロセッサ１で行われる演算処理を統括する制御コアとしての制御ユニット（ＰＵ）１０と、制御ユニット１０から分配された命令を実行するアクセラレータコアとしての演算ユニット１１、１２から構成される。なお、アクセラレータコアとしての演算ユニット１１、１２は同様の構成であり、また、図１においては、２つの演算ユニット１１、１２を示したがより多数の演算ユニットを設けても良い。
【００２４】
そして、プロセッサ１には、主記憶３のユーザデータ３２（以下、単にデータとする）を一時的に格納する２次キャッシュ（Ｌ２キャッシュ）１４と、制御ユニット１０からプリフェッチの指令があったときに主記憶３のデータを２次キャッシュ１４への先読みを制御するプリフェッチユニット（ＰＦＵ）１３が設けられている。２次キャッシュ１４は、各演算コアで共有する共有キャッシュとして機能する。
【００２５】
そして、制御ユニット１０と複数の演算ユニット１１、１２と２次キャッシュ１４及びプリフェッチユニット１３は、プロセッサバス１５を介して相互に接続される。また、プロセッサバス１５は、図示しないインターフェースを介してバス２に接続され、プロセッサ１及び２次キャッシュ１４は主記憶３にアクセス可能となっている。
【００２６】
＜制御ユニット＞
次に、制御ユニット１０の構成について説明する。制御ユニット１０は、主記憶３または２次キャッシュ１４に格納されたユーザデータ３２またはユーザプログラム３１を１次キャッシュ（Ｌ１キャッシュ）１０６へ一時的に読み込んで、複数の演算ユニット１１、１２に命令の実行を割り当てる。そして、制御ユニット１０は、実行する命令がプリフェッチ命令であった場合には、プリフェッチ命令で指定されたアドレスのユーザデータ３２を、主記憶３から２次キャッシュ１４へ先読みするようにプリフェッチユニット１３に指令する。なお、制御ユニット１０自身もユーザプログラム３１を実行することができる。また、１次キャッシュ１０６は、制御ユニット１０のみが使用するローカルキャッシュとして機能する。
【００２７】
制御ユニット１０は、命令フェッチ部１０１で１次キャッシュ１０６へ読み込んでおいたユーザプログラム３１から命令（実行コード）を取得する。次に、命令デコード部１０２では命令フェッチ部１０１が取得した命令を、演算ユニット１１、１２（または制御ユニット１０自身）で実行可能な内部命令（またはマイクロオペレーション）に変換する。
【００２８】
そして、制御ユニット１０の命令分配部（Distribute）１０３は、命令デコード部１０２で変換した内部命令を演算ユニット１１、１２へ分配する。または、制御ユニット１０自身で実行する内部命令（例えば、プリフェッチ命令）の場合には、命令分配部１０３は変換した内部命令を命令キュー１０５へ投入する。
【００２９】
命令実行部１０４は、命令キュー１０５へ格納した内部命令が実行可能になると、この内部命令の実行を開始し、内部命令の実行に必要なデータを２次キャッシュ１４（または主記憶３）から１次キャッシュ１０６へ読み込む。
【００３０】
＜演算ユニット＞
次に、演算ユニット１１、１２（ＡＵ１、ＡＵ２）について説明する。なお、演算ユニット１１、１２は同一の構成であるので、演算ユニット１１についてのみ説明し、演算ユニット１２の説明を省略する。
【００３１】
演算ユニット１１は、制御ユニット１０から分配された内部命令の実行を制御する命令実行部１１１と、実行する内部命令を投入する命令キュー１１２と、演算ユニット１１のみが使用するローカルキャッシュとして機能する１次キャッシュ（ローカルキャッシュ）１１３と、を含んで構成される。
【００３２】
演算ユニット１１は、制御ユニット１０から分配された内部命令を命令キュー１０５へ投入する。命令実行部１１１は、命令キュー１０５へ投入した内部命令が実行可能になると、この内部命令の実行を開始し、内部命令の実行に必要なデータを２次キャッシュ１４（または主記憶３）から１次キャッシュ１０６へ読み込む。内部命令の実行が完了すると、演算結果を１次キャッシュ１１３または２次キャッシュ１４へ書き戻して、この内部命令の演算処理を終了し、次の内部命令の実行を開始する。上記内部命令の実行の際に、命令実行部１１１は、必要なデータが１次キャッシュ１１３になければ２次キャッシュ１４を検索する。必要なデータが１次キャッシュ１１３または２次キャッシュ１４にあればキャッシュヒットとなり、１次キャッシュ１１３及び２次キャッシュ１４に必要なデータがなければキャッシュミスとなる。キャッシュミスの場合には、上述のように、主記憶３から２次キャッシュ１４へ必要なデータを読み込むまで内部命令を実行することができないストール状態となる。
【００３３】
＜２次キャッシュの構成＞
次に、主記憶３のデータをプロセッサ１内へ一時的に格納する２次キャッシュ１４の構成について説明する。
【００３４】
２次キャッシュ１４は、複数のキャッシュラインを備えた２次キャッシュメモリ１４２と、キャッシュライン単位で２次キャッシュメモリ１４２のデータを管理する２次キャッシュ制御部１４１から構成される。
【００３５】
２次キャッシュ制御部１４１は、制御ユニット１０または演算ユニット１１、１２からのロード（読み込み）命令に基づいて２次キャッシュメモリ１４２を参照し、キャッシュヒットした場合には該当データを要求元の演算コアに転送する。一方、制御ユニット１０または演算ユニット１１、１２からのロード命令でキャッシュミスした場合には、前記従来例と同様に、２次キャッシュ制御部１４１は、要求されたアドレスのデータを主記憶３から読み込んで、２次キャッシュメモリ１４２へ格納する。
【００３６】
一方、２次キャッシュメモリ１４２へのデータの書き込みは、キャッシュメモリ１４２のキャッシュライン単位で管理を行うプリフェッチユニット１３からの命令または制御ユニット１０や演算ユニット１１、１２の命令に基づいて主記憶３のデータを該当キャッシュラインへ書き込む。
【００３７】
ここで、本発明の２次キャッシュメモリ１４２の一例について、図２を参照しながら説明する。図２は、キャッシュメモリ１４２を４ウェイ・セットアソシエイティブで構成した例を示す。なお、本実施形態では、主記憶３は所定のバイト数のブロック（またはページ）単位で管理されるものとする。
【００３８】
図２において、２次キャッシュメモリ１４２は、４つのキャッシュライン０〜３（図中ＬＩＮＥ０〜３）に分割されており、各キャッシュラインは、０〜ｎのインデックスＩＤ１４２１に区分けされる。なお、４ウェイ・セットアソシエイティブの場合には、ｎ＝４となる。インデックスＩＤ１４２１は、主記憶３のブロックを指し示すＩＤであり、主記憶３のブロックアドレスの下位ビットで表現され、タグ１４２０には主記憶３のブロックアドレスの上位ビットが格納される。なお、タグ１４２０とインデックスＩＤ１４２１の関係は、周知の手法を用いればよい。
【００３９】
各インデックスＩＤ１４２１には、主記憶３の該当領域（ブロック）を一時的に格納するデータ１４２４と、このインデックスＩＤ１４２１を共有する演算コアの数を示す共有カウント１４２２と、各演算コアの参照が所定回数（例えば、１回）のみであるか否かを示すワンタイムフラグ１４２３が設定される。なお、共有カウント１４２２の初期値は１以上に設定される。なお、データ１４２４は各キャッシュライン番号のインデックスＩＤ１４２１毎に、所定のラインサイズ（バイト数）のデータを格納する。また、データ１４２４の長さは、２次キャッシュキャッシュメモリ１４２へデータの読み書きを行うデータ格納単位となる。また、インデックスＩＤ１４２１は、タグ１４２０を用いてデータ１４２４の主記憶３上の位置を指し示す識別子である。
【００４０】
共有カウント１４２２とワンタイムフラグ１４２３の値は、ユーザプログラム３１のプリフェッチ命令に予め設定されたものであり、後述するように、プリフェッチユニット１３から送信されたプリフェッチ命令に含まれる値を格納したものである。
【００４１】
ワンタイムフラグ１４２３は、「Ｏｎ」であれば各演算コアが１回ずつ参照することを意味し、「Ｏｆｆ」であれば参照された回数で制御を行わないことを意味する。
【００４２】
共有カウント１４２２は、ワンタイムフラグ１４２３が「Ｏｎ」のときに、インデックスＩＤ１４２１のデータ１４２４を参照した回数を示し、参照される度に２次キャッシュ制御部１４１がこの共有カウント１４２２を減算する。そして、ワンタイムフラグ１４２３が「Ｏｎ」で、共有カウント１４２２が「０」になると、指定した回数の参照が行われたことになる。つまり、各演算コアが１回ずつ参照したと見なす。そして、２次キャッシュ制御部１４１は、ワンタイムフラグ１４２３が「Ｏｎ」で共有カウント１４２２が「０」のインデックスＩＤ１４２１は、次に読み込まれることはないので、キャッシュアウトすることができる。
【００４３】
なお、２次キャッシュメモリ１４２には、上記の他に、図示はしないが、アドレスの上位ビットを示すタグや、更新の有無を示すフラグが設定される。また、参照した演算コアのＩＤを格納するようにしてもよい。
【００４４】
ユーザプログラム３１に含まれるプリフェッチ命令の実行コード３１０一例を、図３に示す。図３において、プリフェッチ命令の実行コード３１０は、予め設定された命令コード３１０１と、参照する主記憶３のメモリアドレス３１０２と、ワンタイムフラグ３１０３と共有カウント３１０４（初期値は１以上）と、図２に示したキャッシュラインのインデックスＩＤ１４２１に格納されたデータ１４２４をキャッシュアウトさせる指標としてのメモリアドレス最大値（LastMemAddr）３１０５が含まれる。なお、プリフェッチ命令の各パラメータ（ワンタイムフラグ、共有カウント数やメモリアドレス）はコンパイラで設定されたものである。各インデックスＩＤ１４２１のデータ１４２４には、タグ１４２０とインデックスＩＤ１４２１が指し示す主記憶３のアドレス領域の全てを格納することができない。このため、各演算コアからの参照要求で、当該インデックスＩＤ１４２１で参照するメモリアドレスがメモリアドレス最大値３１０５を超えたときには、当該インデックスＩＤ１４２１のデータをキャッシュアウトして、参照するメモリアドレスを含む主記憶３のメモリアドレス領域をロードさせる。このとき、メモリアドレス最大値３１０５は、次に読み込みを開始する主記憶３のメモリアドレスを指し示すものである。
【００４５】
後述するように、このプリフェッチ命令の実行コード３１０を制御ユニット１０が実行すると、プリフェッチユニット１３を介して２次キャッシュ制御部１４１にプリフェッチの指令を送信する。２次キャッシュ制御部１４１は、プリフェッチの指令に応じてプリフェッチを行い、該当するインデックスＩＤ１４２１にワンタイムフラグや共有カウント数等を設定する。
【００４６】
＜プリフェッチユニットの構成＞
プリフェッチユニット１３は、２次キャッシュメモリ１４２の状態と制御ユニット１０からのプリフェッチの要求を管理するプリフェッチ制御部１３２を備える。プリフェッチ制御部１３２は、２次キャッシュメモリ１４２の記憶の状態と制御ユニット１０からのプリフェッチの要求を管理する２次キャッシュ管理テーブル１３１を管理して、２次キャッシュ制御部１４１へプリフェッチの要求を行う。そして、プリフェッチユニット１３は、制御ユニット１０からのプリフェッチの指令を受け付ける命令キュー１３３を備える。
【００４７】
プリフェッチ制御部１３２は、２次キャッシュメモリ１４２の状態の変化があると２次キャッシュ管理テーブル１３１を更新し、制御ユニット１０からプリフェッチ命令を受信すると、この命令を命令キュー１３３へ一旦格納して、２次キャッシュ管理テーブル１３１で命令キュー１３３のプリフェッチ命令が実行可能になった時点で、２次キャッシュ１４にプリフェッチを指令する。
【００４８】
図４は、プリフェッチユニット１３のプリフェッチ制御部１３２が管理する２次キャッシュ管理テーブル１３１の一例を示す。２次キャッシュ管理テーブル１３１は、インデックスＩＤ１３１１毎にキャッシュラインに対応するライン番号１３１２を有する。本実施形態では図２で示したように、２次キャッシュメモリ１４２を４ウェイ・セットアソシエイティブで構成したので、ライン番号１３１２には、キャッシュラインに対応する０〜３のエントリに加えて、実行できなかったプリフェッチ命令を格納する「処理待ち」のエントリを備える。「処理待ち」のエントリの数は、２次キャッシュメモリ１４２の大きさなどに応じて適宜決定されるもので、図４の例では、各インデックスＩＤ１３１１毎に２つの「処理待ち」のエントリを備える。
【００４９】
そして、ライン番号１３１２に対応するエントリには、図３のプリフェッチ命令の実行コード３１０で示したメモリアドレス、メモリアドレス最大値、共有カウント、ワンタイムフラグを格納するため、メモリアドレス１３１３と、メモリアドレス最大値１３１４と、共有カウント１３１５及びワンタイムフラグ１３１６が設定される。
【００５０】
ここで、「処理待ち」のエントリは、プリフェッチ命令の予約を行うもので、キャッシュラインが空いたときに、「処理待ち」のプリフェッチ命令を実行して２次キャッシュメモリ１４２にデータを格納するものである。「処理待ち」のエントリのプリフェッチ命令が実行されると、メモリアドレス１３１３〜ワンタイムフラグ１３１６までの各フィールドはクリアされる。
【００５１】
図４において、例えば、インデックスＩＤ１３１１が０でキャッシュラインが１のエントリには、アドレス＝０ｘ１０００１００のデータが格納され、メモリアドレス最大値１３１４は０ｘ２００００００であり、ワンタイムフラグ１３１６は「Ｏｎ」で、共有カウント１３１５は「３」に設定されている。つまり、制御ユニット１０と演算ユニット１１、１２の３個の演算コアがそれぞれ参照するまで当該エントリのデータは２次キャッシュメモリ１４２に保持されることを意味している。
【００５２】
プリフェッチ制御部１３２は、ワンタイムフラグ１３１６が「Ｏｎ」のエントリについてアクセスが行われる度に、共有カウント１３１５を減算する。そして、ワンタイムフラグ１３１６が「Ｏｎ」で共有カウント１３１５が「０」になると、これ以上参照されることはないので、該当するキャッシュラインはキャッシュアウト可能となる。なお、上述のように、共有カウント１３１５の初期値は１以上に設定される。
【００５３】
＜プリフェッチの動作＞
次に、制御ユニット１０でプリフェッチ命令を実行したときの各部の動作について、以下に説明する。
【００５４】
制御ユニット１０は、ユーザプログラム３１に含まれるプリフェッチ命令を実行すると、図５に示すRegister＿Prefetch命令をプリフェッチユニット１３に送信する。図５において、Register＿Prefetch命令は、予め設定された命令コード１０３１と、参照する主記憶３のメモリアドレス１０３２と、ワンタイムフラグ１０３３と共有カウント１０３４（初期値は１以上）と、図２に示したキャッシュラインのインデックスＩＤ１４２１に格納されたデータ１４２４をキャッシュアウトさせる指標としてのメモリアドレス最大値（LastMemAddr）１０３５が含まれる。なお、図示はしないが発行した命令の順序を示すＩＤを付加しても良い。
【００５５】
制御ユニット１０からプリフェッチ命令（Register＿Prefetch命令）を受信したプリフェッチユニット１３では、プリフェッチ制御部１３２で図６に示す制御を実行する。図６の処理は、プリフェッチ制御部１３２がRegister＿Prefetch命令を受信する度に実行するフローチャートである。
【００５６】
まず、ステップＳ１で制御ユニット１０からRegister＿Prefetch命令を受信すると、ステップＳ２では当該Register＿Prefetch命令が参照するアドレスに対応するインデックスＩＤ１３１１を決定し、２次キャッシュ管理テーブル１３１を参照して該当するインデックスＩＤ１３１１のキャッシュラインに空きがあるか否かを判定する。なお、参照するアドレスとインデックスＩＤ１３１１の関係は、２次キャッシュメモリ１４２のウェイ数に応じて決定される。本実施形態では４ウェイ・セットアソシエイティブであるので、主記憶３の全ブロックを４分割しておき、参照するアドレスの下位２ビットの値と各インデックスＩＤ１３１１を対応させることで、参照するアドレス（図５のメモリアドレス１０３２）に対応するインデックスＩＤ１３１１を求める。
【００５７】
そして、２次キャッシュ管理テーブル１３１から参照するアドレスに対応するインデックスＩＤ１３１１に空きがある場合にはステップＳ３の処理へ進み、空きがない場合にはステップＳ５の処理へ進む。
【００５８】
ステップＳ３では、２次キャッシュ管理テーブル１３１の該当インデックスＩＤ１３１１で空いているキャッシュラインに、受信したプリフェッチ命令の内容を書き込む。つまり、図５のメモリアドレス１０３２の値を２次キャッシュ管理テーブル１３１のメモリアドレス１３１３へ書き込み、図５のワンタイムフラグ１０３３，共有カウント１０３４，メモリアドレス最大値１０３５を２次キャッシュ管理テーブル１３１のワンタイムフラグ１３１６，共有カウント１３１５、メモリアドレス最大値１３１４へ書き込む。
【００５９】
次に、ステップＳ４では、２次キャッシュ制御部１４１に対してIssue＿Prefetch命令を発行して処理を終了する。このIssue＿Prefetch命令は、図７で示すように、Issue＿Prefetch命令を示す命令コード１３２１と、メモリアドレス１３２２と、ワンタイムフラグ１３２３及び共有カウント１３２４から構成され、プリフェッチ制御部１３２が制御ユニット１０から受信したRegister＿Prefetch命令から抽出した値を設定したものである。
【００６０】
このIssue＿Prefetch命令を受信した２次キャッシュ制御部１４１では、キャッシュラインに空きがあるので、後述するように、そのままプリフェッチ命令を実行することになる。
【００６１】
一方、該当するインデックスＩＤ１３１１にキャッシュラインの空きがない場合は、ステップＳ５で、当該Register＿Prefetch命令が参照するメモリアドレス１０３２の値と、該当インデックスＩＤ１３１１の各キャッシュライン０〜３のメモリアドレス最大値１３１４を比較して、メモリアドレス最大値１３１４よりもRegister＿Prefetch命令のメモリアドレス１０３２が大きいキャッシュラインを検索する。
【００６２】
２次キャッシュ管理テーブル１３１の該当インデックスＩＤ１３１１の各キャッシュライン０〜３のメモリアドレス最大値１３１４よりも参照するメモリアドレス１０３２の方が大きい場合にはステップＳ６へ進む。ステップＳ６では、該当インデックスＩＤ１３１１のキャッシュライン０〜３には参照するメモリアドレス１０３２のデータがなく、かつ、キャッシュライン０〜３が空いていないので、２次キャッシュ管理テーブル１３１の該当インデックスＩＤ１３１１に処理待ちとして登録する。この登録は、Register＿Prefetch命令のメモリアドレス１０３２、ワンタイムフラグ１０３３、共有カウント１０３４及びメモリアドレス最大値１０３５を、２次キャッシュ管理テーブル１３１のメモリアドレス１３１３、ワンタイムフラグ１３１６、共有カウント１３１５、メモリアドレス最大値１３１４に設定する。
【００６３】
参照するメモリアドレス１０３２のインデックスＩＤ１３１１に、メモリアドレス最大値１３１４が参照するメモリアドレス１０３２以下のキャッシュライン０〜３があれば、ステップＳ７へ進む。
【００６４】
ステップＳ７では、参照するメモリアドレス１０３２≦メモリアドレス最大値１３１４となったキャッシュラインに対して、Register＿Prefetch命令の内容のワンタイムフラグ１０３３と共有カウント１０３４を更新する。この場合、Register＿Prefetch命令に指定されたメモリアドレス１０３２が、既にキャッシュメモリ１４２にキャッシュされているので、ロードの条件（ワンタイムフラグや共有カウント）のみを更新する。
【００６５】
次に、ステップＳ８では、２次キャッシュ制御部１４１に対して、図８に示すReplace＿Prefetch命令を送信する。このRegister＿Prefetch命令は、上記図７のIssue＿Prefetch命令にキャッシュライン番号１３２５を加え、命令コード１３２１’にReplace＿Prefetch命令の値を設定したものである。Replace＿Prefetch命令を受信した２次キャッシュ制御部１４１は、２次キャッシュメモリ１４２の該当するキャッシュラインについて、共有カウント１４２２とワンタイムフラグ１４２３をReplace＿Prefetch命令の値で更新する。
【００６６】
以上のように、プリフェッチ制御部１３２は、制御ユニット１０からRegister＿Prefetch命令を受信すると、該当インデックスＩＤ１３１１に空きキャッシュラインがあれば、２次キャッシュ管理テーブル１３１の該当インデックスＩＤ１３１１のキャッシュラインをRegister＿Prefetch命令の内容に設定して、２次キャッシュ制御部１４１へIssue＿Prefetch命令を送信する。
【００６７】
一方、空きキャッシュラインがない場合では、該当インデックスＩＤ１３１１の各キャッシュラインのメモリアドレス最大値１３１４よりも参照するメモリアドレス１０３２の比較結果に応じてプリフェッチ命令を処理待ちとして登録する。
【００６８】
参照するメモリアドレス１０３２の方が各キャッシュライン０〜３のメモリアドレス最大値１３１４より大きい場合には、参照するメモリアドレス１０３２が２次キャッシュメモリ１４２にキャッシュされていないので、処理待ちとして２次キャッシュ管理テーブル１３１へ登録する。
【００６９】
一方、参照するメモリアドレス１０３２が各キャッシュライン０〜３のメモリアドレス最大値１３１４以下の場合には、当該キャッシュラインに参照するメモリアドレス１０３２が含まれているので、共有カウントとワンタイムフラグを更新するように２次キャッシュ制御部１４１へ指令する。また、２次キャッシュ管理テーブル１３１の内容も更新しておく。
【００７０】
次に、プリフェッチユニット１３からIssue＿Prefetch命令を受信したときの２次キャッシュ制御部１４１の処理について図９のフローチャートを参照しながら説明する。この処理は、プリフェッチユニット１３からIssue＿Prefetch命令を受信する度に実行されるものである。
【００７１】
ステップＳ１１では、Issue＿Prefetch命令を受信して、Ｓ１２では、Issue＿Prefetch命令のメモリアドレス１３２２のデータを、主記憶３からブロック単位で読み込む。そして、このメモリアドレス１０３２に対応する２次キャッシュメモリ１４２のインデックスＩＤ１４２１のキャッシュラインを決定し、当該キャッシュラインのデータ１４２４に主記憶３から読み込んだデータを書き込む。
【００７２】
次に、ステップＳ１３では、Issue＿Prefetch命令に指定されたワンタイムフラグ１３２３と共有カウント１３２４を、２次キャッシュメモリ１４２のワンタイムフラグ１４２３と共有カウント１４２２に書き込む。また、２次キャッシュ制御部１４１は、Issue＿Prefetch命令のメモリアドレス１３２２の値に基づいて、２次キャッシュメモリ１４２の該当インデックスＩＤ１４２１のキャッシュラインのタグ１４２０を更新する。
【００７３】
以上の処理により、空きができたキャッシュラインに新たなデータを先読みしておくことができる。
【００７４】
次に、制御ユニット１０または演算ユニット１１，１２の演算コアから２次キャッシュ１４にロード命令が発行されたときの２次キャッシュ制御部１４１の処理について、図１０を参照しながら以下に説明する。図１０は、各演算コアからロード命令を受信したときに２次キャッシュ制御部１４１が実行する処理の一例を示すフローチャートである。
【００７５】
ステップＳ２０では、２次キャッシュ制御部１４１が制御ユニット１０または演算ユニット１１，１２のいずれかの演算コアからロード命令を受信する。
【００７６】
ステップＳ２１では、受信したロード命令で指定されたアドレスのデータが２次キャッシュメモリ１４２に存在するか否かを判定する。要求されたアドレスのデータが２次キャッシュメモリ１４２に存在する場合（キャッシュヒット）はステップＳ２２の処理へ進み、存在しない場合（キャッシュミス）にはステップＳ２６の処理へ進む。
【００７７】
キャッシュヒットした場合には、ステップＳ２２で該当するキャッシュライン（図２のＬＩＮＥ０〜３）のインデックスＩＤ１４２１の共有カウント１４２２から「１」を減算する。このとき、該当インデックスＩＤ１３１１のキャッシュデータ１４２４を、ロード命令の発行元に返信する。ロード命令の発行元では、キャッシュヒットしたデータ１４２４で処理を続行する。
【００７８】
次に、ステップＳ２３では、キャッシュヒットした該当インデックスＩＤ１４２１の共有カウント１４２２が「０」で、かつワンタイムフラグ１４２３が「Ｏｎ」であるか否かを判定する。キャッシュヒットしたインデックスＩＤ１４２１の共有カウント１４２２が「０」でワンタイムフラグ１４２３が「Ｏｎ」であれば、次に当該インデックスＩＤ１４２１のキャッシュデータ１４２４を参照する命令は現時点で存在しないので、キャッシュアウトの条件を満たすことになる。キャッシュアウトの条件が成立した場合にはステップＳ２４へ進み、成立しない場合には処理を終了する。
【００７９】
ステップＳ２４では、２次キャッシュ制御部１４１が、当該インデックスＩＤ１４２１のデータ１４２４をキャッシュアウトする。このキャッシュアウトの処理は、データ１４２４が更新されていれば主記憶３の該当アドレスにこのデータ１４２４を書き戻す。そして、該当インデックスＩＤ１４２１のデータ１４２４、共有カウント１４２２、ワンタイムフラグ１４２３をキャッシュメモリ１４２からクリアする。
【００８０】
次に、ステップＳ２５では、２次キャッシュ制御部１４１がキャッシュアウトしたキャッシュラインの番号（０〜３）と、インデックスＩＤ１４２１をRequest＿Prefetch命令としてプリフェッチ制御部１３２に通知する。
【００８１】
このRequest＿Prefetch命令は、図１１で示すように、プリフェッチ制御部１３２にキャッシュラインに空きが発生したことを通知するRequest＿Prefetch命令のコード１４１０と、空きが発生したキャッシュライン番号１４１２と、インデックスＩＤ１４１１が含まれる。
【００８２】
上記Ｓ２１でキャッシュミスとなった場合には、ステップＳ２６に進んで主記憶３からロード命令で指定されたアドレスのデータをキャッシュメモリ１４２に読み込む。キャッシュメモリ１４２に読み込んだデータを格納するキャッシュラインに空きがなければ、前記従来例と同様にＬＲＵ方式やラウンドロビンなどの公知の手法により、キャッシュアウトを実施してキャッシュミスしたデータを２次キャッシュメモリ１４２へ格納する。このとき、２次キャッシュ制御部１４１は、プリフェッチ制御部１３２に対してキャッシュインしたキャッシュラインの番号と、インデックスＩＤを通知する。この通知を受けたプリフェッチ制御部１３２は、受信したインデックスＩＤとキャッシュライン番号に対応する２次キャッシュ管理テーブル１３１のエントリを更新する。このキャッシュミスの場合は、共有カウント１３１５、ワンタイムフラグ１３１６は設定できないため、ワンタイムフラグ１３１６を「Ｏｆｆ」とし、共有カウント１３１５には所定の初期値（例えば、「１」）を設定しておく。
【００８３】
以上の処理により、２次キャッシュ制御部１４１は、キャッシュヒットしたデータ１４２４のうち、ワンタイムフラグ１４２３が「Ｏｎ」で共有カウント１４２２が「０」となったエントリは、現時点で参照される予定がないのでキャッシュアウトを実施することができる。そして、２次キャッシュ制御部１４１はプリフェッチ制御部１３２に対してキャッシュラインに空きが生じたことをRequest＿Prefetch命令によって通知することができる。
【００８４】
次に、２次キャッシュ制御部１４１からRequest＿Prefetch命令を受信した場合のプリフェッチ制御部１３２の処理について図１２を参照しながら以下に説明する。図１２はプリフェッチ制御部１３２がRequest＿Prefetch命令を受信したときに実行する処理の一例を示すフローチャートである。
【００８５】
ステップＳ３０では、プリフェッチユニット１３のプリフェッチ制御部１３２が２次キャッシュ制御部１４１からRequest＿Prefetch命令を受信する。プリフェッチ制御部１３２は、Request＿Prefetch命令から空きが発生したキャッシュライン番号１４１２と、インデックスＩＤ１４１１を取得する。
【００８６】
ステップＳ３１では、プリフェッチ制御部１３２が図４に示した２次キャッシュ管理テーブル１３１を参照し、取得したインデックスＩＤ１４１１に「処理待ち」となっているプリフェッチ命令があるか否かを判定する。
【００８７】
「処理待ち」に予約されているプリフェッチ命令があればステップＳ３２へ進み、「処理待ち」のプリフェッチ命令がなければ処理を終了する。
【００８８】
ステップＳ３２では、Request＿Prefetch命令から取得したキャッシュライン番号とインデックスＩＤに対応する２次キャッシュ管理テーブル１３１のインデックスＩＤ１３１１とライン番号１３１２のエントリに、「処理待ち」のプリフェッチ命令に設定されているメモリアドレス１３１３と、メモリアドレス最大値１３１４と、共有カウント１３１５及びワンタイムフラグ１３１６を登録する。
【００８９】
次に、ステップＳ３３では、処理待ちからRequest＿Prefetch命令のキャッシュライン番号とインデックスＩＤに登録したメモリアドレス１３１３、共有カウント１３１５及びワンタイムフラグ１３１６の内容で、図７に示したIssue＿Prefetch命令を生成し、２次キャッシュ制御部１４１へ送信する。
【００９０】
このIssue＿Prefetch命令を受信した２次キャッシュ制御部１４１は、上記図９の処理を実行して、キャッシュアウトにより空きとなったキャッシュラインのインデックスＩＤ１４２１に、指定されたアドレスのデータを主記憶３から読み込んで先読みを完了する。
【００９１】
以上のように、プリフェッチユニット１３は、制御ユニット１０からプリフェッチ命令を受け付けると、２次キャッシュ管理テーブル１３１を参照してプリフェッチを要求されたアドレスのキャッシュラインのインデックスＩＤに空きがなければ、プリフェッチの要求を処理待ちのエントリに投入して、予約する。
【００９２】
２次キャッシュ制御部１４１は、演算コアからロード命令を受け付ける度に、キャッシュメモリ１４２の共有カウント１４２２を減算していき、共有カウント１４２２が「０」になり、かつ、ワンタイムフラグ１４２３が「Ｏｎ」であれば、当該キャッシュラインのインデックスＩＤ１４２１のデータ１４２４をキャッシュアウトする。そして、キャッシュアウトによって空きが生じたことをプリフェッチ制御部１３２に通知する（Request＿Prefetch命令）。
【００９３】
Request＿Prefetch命令を受信したプリフェッチ制御部は、空きが生じた２次キャッシュメモリ１４２のインデックスＩＤに対応する２次キャッシュ管理テーブル１３１を参照し、「処理待ち」のエントリに予約されたプリフェッチ命令を検索する。２次キャッシュ管理テーブル１３１の該当するインデックスＩＤ１３１１に「処理待ち」として予約されたプリフェッチ命令があれば、２次キャッシュ制御部１４１に対して「処理待ち」のプリフェッチ命令をIssue＿Prefetch命令として発行する。これにより、２次キャッシュメモリ１４２には、空きが生じたキャッシュラインに新たなデータ１４２４が先読みされる。
【００９４】
プリフェッチ制御部１３２は、２次キャッシュ管理テーブル１３１でIssue＿Prefetch命令を発行した「処理待ち」の内容を、プリフェッチ命令を発行したライン番号１３１２に移動する。
【００９５】
このように、制御ユニット１０からプリフェッチ命令があったときに、キャッシュラインに空きがなければ、「処理待ち」として予約しておくことで、前記従来例のように、２次キャッシュメモリ１４２にキャッシュされていたデータをキャッシュアウトさせるのを防止できる。
【００９６】
そして、２次キャッシュ制御部１４１では、各演算コアが読み込む回数を共有カウント１４２２として設定し、この共有カウント１４２２でキャッシュアウトを制御可能なデータにはワンタイムフラグ１４２３を「Ｏｎ」に設定しておく。そして、各演算コアからロード命令がある度に減算していくことで、共有カウント１４２２が０で、かつ、ワンタイムフラグ１４２３が「Ｏｎ」のキャッシュデータをキャッシュアウトさせることで、不要となったキャッシュデータのみをキャッシュアウトすることができる。
【００９７】
その後、プリフェッチ制御部１３２の２次キャッシュ管理テーブル１３１で「処理待ち」のエントリに予約されていたプリフェッチ命令を実行することで、２次キャッシュメモリ１４２から必要なデータがキャッシュアウトされるのを防ぎながら必要なデータを確実にキャッシュインさせることが可能となる。
【００９８】
また、２次キャッシュメモリ１４２にプリフェッチするデータの属性に、一つの演算コアが読み込む回数を共有カウント１４２２としてプリフェッチ命令から設定し、共有カウント１４２２を有効にするフラグをワンタイムフラグ１４２３としてプリフェッチ命令から設定することで、各演算コアが必要な回数だけ読み込んだ後には、即座にキャッシュアウトすることが可能となる。これにより、２次キャッシュメモリ１４２に不要となったデータが保持され続けるのを防ぐことが可能となる。
【００９９】
そして、ユーザプログラム３１にプリフェッチ命令を埋め込む際に、コンパイラやソースレベルで共有カウントとワンタイムフラグを指定しておき、このユーザプログラム３１の実行時には、プロセッサ１のプリフェッチ制御部１３２と２次キャッシュ制御部１４１で、共有カウントとワンタイムフラグによりキャッシュアウトとキャッシュインの制御を行うことができる。これにより、ユーザプログラム３１を作成する際には、前記従来例のように、プリフェッチ命令を挿入する際にプロセッサの挙動を考慮する必要がなくなって、ユーザプログラム３１の作成に要する労力を大幅に低減することが可能となる。
【０１００】
さらに、共有カウント１４２２は、プロセッサ１の演算コアが読み込むべき回数の和、換言すれば、一つのキャッシュデータを共有する演算コアの数としたので、複数の演算コアを備えたプロセッサ１が並列的に処理を行うときなどでは、一回キャッシュインしたデータのヒット率を向上させることができ、マルチコアプロセッサにおいても演算コアの処理速度の向上を図ることが可能となる。
【０１０１】
また、本発明では、前記従来例のように演算コアが読み込もうとするデータがハードウェアで提供するプリフェッチ機能でキャッシュアウトしてしまうのを抑制できるので、ストライドやアドレスが不連続なアクセスに対してプリフェッチ命令を有効に利用することが可能となって、演算処理の速度を向上させることが可能となるのである。
【０１０２】
なお、上記実施形態においてプロセッサ１をヘテロジニアス・マルチコアプロセッサで構成した例を示したが、ホモジニアス・マルチコアプロセッサに適用しても良い。
【０１０３】
また、上記実施形態において、制御ユニット１０とプリフェッチユニット１３を独立した構成としたが、図示はしないが、制御ユニット１０内にプリフェッチユニット１３を配置しても良い。
【０１０４】
また、上記実施形態において、プリフェッチユニット１３は２次キャッシュ１４を制御する例を示したが、３次キャッシュを制御するようにしても良い。
【０１０５】
また、上記実施形態においては、２次キャッシュ制御部１４１は、主記憶３からデータの先読みを行い、また、キャッシュアウトしたデータを主記憶３に書き戻す例を示したが、図示しないストレージ装置や他の計算機あるいは他の計算機と共有するメモリとの間で、データの読み込みと書き戻しを行うようにしても良い。
【産業上の利用可能性】
【０１０６】
以上のように、本発明はプリフェッチ命令を実行するプロセッサに適用することができ、特にひとつのプロセッサ内に複数の演算コアを備えたマルチコアのプロセッサに適用することができる。
【図面の簡単な説明】
【０１０７】
【図１】本発明を適用する計算機システムのブロック図。
【図２】２次キャッシュメモリの構成を示すブロック図。
【図３】ユーザプログラムに含まれるプリフェッチ命令のフォーマットの一例を示す説明図。
【図４】プリフェッチユニットで管理される２次キャッシュ管理テーブルの一例を示す説明図。
【図５】制御ユニットがプリフェッチ制御部に対して発行するRequest＿Prefetch命令のフォーマットの一例を示す説明図。
【図６】プリフェッチユニットのプリフェッチ制御部で行われる処理の一例を示すフローチャートで、制御ユニットからRequest＿Prefetch命令を受信したときに実行する処理を示す。
【図７】プリフェッチ制御部が２次キャッシュ制御部に対して発行するIssue＿Prefetch命令の一例を示す説明図。
【図８】プリフェッチ制御部が２次キャッシュ制御部に対して発行するReplace命令の一例を示す説明図。
【図９】２次キャッシュ制御部で行われる処理の一例を示し、プリフェッチ制御部からプリフェッチ命令を受信したときに実行する処理のフローチャート。
【図１０】２次キャッシュ制御部で行われる処理の一例を示し、演算コアからロード命令を受信したときに実行する処理のフローチャート。
【図１１】２次キャッシュ制御部がプリフェッチ制御部に対して発行するRequest＿Prefetch命令のフォーマットの一例を示す説明図。
【図１２】プリフェッチ制御部で行われる処理の一例を示すフローチャートで、２次キャッシュ制御部からRequest＿Prefetch命令を受信したときに実行する処理を示す。
【符号の説明】
【０１０８】
１  プロセッサ
２  バス
３  主記憶
１０  制御ユニット
１１，１２  演算ユニット
１３  プリフェッチユニット
１４  ２次キャッシュ
１３１  ２次キャッシュ管理テーブル
１３２  プリフェッチ制御部
１４１  ２次キャッシュ制御部
１４２  ２次キャッシュメモリ
１３１５  共有カウント
１３１６  ワンタイムフラグ
【図１】
2008059057.tif 000003
【図２】
2008059057.tif 000004
【図３】
2008059057.tif 000005
【図４】
2008059057.tif 000006
【図５】
2008059057.tif 000007
【図６】
2008059057.tif 000008
【図７】
2008059057.tif 000009
【図８】
2008059057.tif 000010
【図９】
2008059057.tif 000011
【図１０】
2008059057.tif 000012
【図１１】
2008059057.tif 000013
【図１２】
2008059057.tif 000014