以下の実施例1では、図1を用いて、情報処理システムの一例を説明する。図1は、実施例1に係る情報処理システムを説明するための図である。図1に示す例では、情報処理システム1は、クライアント端末2、クアイアント端末2a、LAN(Local Area Network)スイッチ3、管理端末4、LANスイッチ5、2重のグローバルクロスバ6、複数のノード10〜10mを有する。また、グローバルクロスバ6は、サービスプロセッサ7を有する。
本実施例において、ノードは1つの独立したOS(Operating System)が走行する単位であり、OSが走行する為に最低限必要な装置を含む。後に詳細に述べるが、それらは1つ以上のCPU、メモリ、HDD(Hard Disk Drive)またはHDDに代わる外部記憶装置を有する。ノードは物理的に単一の装置であっても良いし、ケーブル等の装置間接続機能によって接続されて物理的に複数の装置で構成されていても良い。
各ノード10〜10mは、サービス用LANによってLANスイッチ3および各クライアント端末2、2aと接続されている。また、各ノード10〜10mは、内部LANによってLANスイッチ5と接続されている。また、各ノード10〜10mは、管理LANを介して管理端末4と接続されている。また、各ノード10〜10mは、2重のグローバルクロスバ6と接続されており、インターコネクトを介して、相互に接続されている。
各クライアント端末2、2aは、サービス用LANを介して各ノード10〜10mからサービスを取得する。なお、図1では図示を省略したが、情報処理システム1は、任意の数のクライアント端末を他にも有してもよい。
ノード10は、サービスプロセッサ11、CPU12、ローカルXB(クロスバ)16を有する。また、他のノード10a〜10mは、ノード10と同様に、サービスプロセッサ、CPU、ローカルXBを有する。なお、以下の説明では、各ノード10a〜10mは、ノード10と同様の機能を発揮するものとして、説明を省略する。
サービスプロセッサ11は、管理LANを介して管理端末4と接続されており、各ノード10の電源管理等の管理制御を実行する。なお、グローバルクロスバ6が有するサービスプロセッサ7は、サービスプロセッサ11のマスタとして動作し、全体の管理制御を行う。ここで、各サービスプロセッサ7、11が実行する管理制御の例としては、電源管理、リセット、動作モードの変更、ノードの追加や削除の設定、エラーログの収集、縮退動作制御等である。
また、ノード10〜10mは、それぞれ独立してOS(Operating System)を実行する。また、図1では省略したが、ノード10は、CPU12以外にも複数のCPUを有し、各CPUは、ローカルXB16を介して、グローバルクロスバ6と接続されている。
また、ノード10のCPUは、メモリアクセスのリクエストであるメモリアクセス要求をローカルXB16に出力することで、他のノードにメモリアクセス要求を転送する。そして、ノード10のCPUは、メモリアクセス要求を取得すると、自身が自身と接続されたメモリに対してアクセスを行う際と同様にメモリアクセスを実行する。すなわち、情報処理システム1には、NUMA(Non-Uniform Memory Access)の技術が適用されており、各ノード10〜10mが、それぞれのメモリを共用して処理を実行する。
次に、図2を用いて、ノード10の機能構成について説明する。図2は、実施例1に係るノードの機能構成を説明するための図である。図2に示す例では、ノード10は、サービスプロセッサ11、複数のCPU12〜15、ローカルXB16、複数のメモリ17〜24、PCIe(Peripheral Component Interconnect Express)スイッチ25を有する。また、ノード10は、サービス用LANと接続するためのLANアダプタ26、管理用LANと接続するためのLANアダプタ27、SAS(Serial Attached SCSI)28、HDD(Hard Disk Drive)29を有する。
また、メモリ17およびメモリ18は、CPU13と接続されており、CPU13によるメモリアクセスを受付ける記憶装置である。また、メモリ19およびメモリ20は、CPU12と接続されており、CPU12によるメモリアクセスを受付ける記憶装置である。また、メモリ21およびメモリ22は、CPU14と接続されており、CPU14によるメモリアクセスを受付ける記憶装置である。
また、メモリ23およびメモリ24は、CPU15と接続されており、CPU15によるメモリアクセスを受付ける記憶装置である。なお、図2に示す例では、ノード10は、HDD29を有しているが、実施例はこれに限定されるものではなく、SAN(Storage Area Network)等の技術を適用し、ノード10の外部に設置してもよい。
サービスプロセッサ11は、ノード10の管理制御を実行する。具体的には、サービスプロセッサ11は、処理を実行するプロセッサとFPGA(Field-Programmable Gate Array)を有し、管理端末4から管理用LANを介して、管理制御の実行命令を受付ける。そして、サービスプロセッサ11は、管理端末4から受付けた実行命令に従って、各種管理制御を実行する。
PCIeスイッチ25は、各CPU12〜15からPCIeスロットを介して接続されるI/O装置等へのアクセスを制御するスイッチである。また、LANアダプタ26は、サービス用LANとノード10とを接続するLANアダプタである。また、LANアダプタ27は、管理用LANとノード10とを接続するLANアダプタである。また、SAS28は、PCIeスロットに搭載されたLANやSAS用のアダプタであり、HDD29と各CPU12〜15との接続を中継する。
次に、各CPU12〜15について説明する。各CPU12〜15は、それぞれキャッシュメモリ12a〜15aを有する。また、各CPU12〜15は、相互に接続されており、メモリアクセス要求や応答を相互に送受信することができる。以下、CPU12について説明する。なお、CPU12は、他のCPU13〜15と相互に接続されている。なお、CPU13〜15は、CPU12と同様の機能を発揮するものとして説明を省略する。
CPU12は、メモリ19またはメモリ20が記憶するデータをキャッシュするキャッシュメモリ12aを有し、キャッシュしたデータを用いて、演算処理を実行する。また、CPU12は、メモリ19およびメモリ20に対してメモリアクセスを行うメモリインターフェースの機能を有する。また、CPU12は、PCIeスイッチ25を介して、HDD29や内部LAN、管理用LAN等を用いたアクセスを制御するPCIeインターフェース機能を有する。
ここで、CPU12が有するキャッシュメモリ12aは、複数のキャッシュラインを有する。そして、CPU12は、アプリケーション35が指定した期間内にデータの更新を行った場合には、更新したデータが記憶されたキャッシュラインに、データを更新した旨を示すセクタフラグを格納する。そして、CPU12は、アプリケーション35が指定した期間が終了した場合には、キャッシュメモリ12aの各キャッシュラインのうち、セクタフラグが格納されたキャッシュラインのデータをメモリ17〜24に書き出すフラッシュ処理を実行する。
また、CPU12は、ローカルXB16、グローバルクロスバ6を介して、他のノード10a〜10mが有するCPUとインターコネクトで接続され、相互にメモリアクセスの要求等を送受信するインターコネクトルータ機能を有する。このようなCPU12は、例えば、実行するプロセスにより、メモリ19、または、メモリ20に対するメモリアクセス要求が発行された場合には、以下の処理を実行する。すなわち、CPU12は、メモリ19、または、メモリ20にアクセスし、アクセス対象となるデータをキャッシュする。
また、CPU12は、実行するプロセスにより、メモリ19、メモリ20以外のメモリに対するメモリアクセス要求が発行された場合には、メモリアクセス対象となるメモリと接続されたCPUを識別し、識別したCPUに対してメモリアクセス要求を送信する。詳細には、CPU12は、アクセス対象となるメモリアドレスと、メモリアドレスが示す記憶領域にアクセスするCPUを一意に示す情報とを対応付けたノードマップを有する。
そして、CPU12は、プロセスがメモリアクセス要求を発行した場合には、ノードマップを参照し、メモリアクセスの対象となるメモリアドレスに対応付けられたCPUを識別する。その後、CPU12は、識別したCPUを宛先とするパケットを生成し、生成したパケットにメモリアクセス要求を格納して、CPU12〜15の相互接続、又はローカルXB16に出力する。ローカルXB16に出力された場合には、ローカルXB16は、グローバルクロスバ6を介して、パケットを宛先となるCPUに送信する。
ここで、CPU12は、上述した処理に加えて、以下の処理を実行する。まず、CPU12は、メモリ19およびメモリ20の各記憶領域のうち、他のノードと共有する記憶領域に、メモリトークンと呼ばれる値を予め設定する。そして、CPU12は、メモリ19またはメモリ20に対してメモリアクセス要求を発行するCPUに対し、アクセスを許可する記憶領域を通知するとともに、通知した記憶領域に対応するメモリトークンをアクセストークンとして通知する。
また、CPU12は、自身がメモリアクセス要求を送信するノードから、アクセストークンをあらかじめ取得し、取得したアクセストークンを保持する。そして、CPU12は、メモリアクセス要求を発行する場合には、メモリアクセス要求とともに、保持したアクセストークンをパケットに格納して送信する。
また、CPU12は、他のノードのCPUからメモリアクセス要求を受信した場合は、メモリアクセス要求とともに受信したアクセストークンが、アクセス対象となる記憶領域に対応するメモリトークンと一致するか否かを判別する。そして、CPU12は、アクセストークンとメモリトークンとが一致する場合には、メモリアクセスを実行し、アクセストークンとメモリトークンとが一致しない場合には、メモリアクセスの実行を拒否する。
なお、CPU12は、メモリ19、および、メモリ20に対するメモリアクセスを実行する場合には、メモリ19、または、メモリ20からキャッシュされたデータのコヒーレンシを保持する処理を実行する。例えば、CPU12は、メモリ19、または、メモリ20からデータをキャッシュしたCPUに対してスヌープを送信し、キャッシュされたデータのライトバックを実行する。
ローカルXB16は、ノード10が有するCPU12〜15と、他のノード10a〜10mが有するCPUとの間でやり取りされるパケットを、指定相手先に転送するためのスイッチである。例えば、ローカルXB16は、CPU12が、CPU12aを宛先として発行したパケットを、グローバルクロスバ6を介して、ノード10aが有するCPU12aに送信する。
メモリ17〜メモリ24は、OSやアプリケーションが利用するデータを記憶するメモリであり、例えば、DIMM(Dual In-Line Memory Module)である。また、メモリ17〜24は、同一のメモリアドレス空間にマッピングされている。
また、メモリ17〜24は、同一ノード内のCPU12〜15のみがアクセス可能な領域、すなわち、自身を有するノード専用の領域であるローカル領域を有する。また、メモリ17〜24は、情報処理システム1が有する任意のCPUがアクセス可能な領域、すなわち、全てのノードが利用可能な共有メモリ領域を有する。また、メモリ17〜メモリ24の共有メモリ領域は、複数のセグメントに分割される。そして、各セグメントは、メモリトークンによるアクセス制御が行われるプロテクト領域、又は、メモリトークンによるアクセス制御を行わないノンプロテクト領域となる。
ここで、図3、図4を用いて、各メモリ17〜24にマッピングされるメモリアドレスについて説明する。図3は、実施例1に係るメモリの割当を説明するための図である。例えば、情報処理システム1は、各ノードが有する2つのメモリのうち、一方のメモリをローカル領域のみのメモリとし、他方のメモリを共用メモリ領域のみのメモリとする。すなわち、図3中(a)に示すように、メモリ17、メモリ19、メモリ21、メモリ23をノード専用のメモリとし、図3中(b)に示すように、メモリ18、メモリ20、メモリ22、メモリ24を共用するメモリとする。
図4は、実施例1に係る情報処理システムが各メモリにマッピングするメモリマップを説明するための図である。なお、図4には、全部で128テラバイトのメモリアドレス空間が準備され、そのうちローカル領域に64テラバイトが割当てられ、共有メモリ領域に64テラバイトが割当てられる例について示す。
例えば、情報処理システム1は、ノード10〜10mが有するメモリのうち、ローカル領域として用いる範囲に「0」から「246−1」までのメモリアドレスを割当てる。また、情報処理システム1は、ノード10〜10mが有するメモリのうち、共有メモリ領域として用いる範囲に、「246」から「247−1」までのメモリアドレスを割当てる。
すなわち、図3および図4に示す例では、情報処理システム1は、図3中(a)に示すメモリ17、メモリ19、メモリ21、メモリ23に対して、図4中(c)に示す範囲のメモリアドレスをマッピングする。また、情報処理システム1は、図3中(b)に示すメモリ18、メモリ20、メモリ22、メモリ24に対して、図4中(d)に示す範囲のメモリアドレスをマッピングする。なお、図4中の「247」から「248−1」までのアドレスは、UC(Uncacheable)領域として用いられるアドレスの範囲であり、例えば、HDD29等のI/O装置が用いるI/O空間として用いられるアドレスの範囲である。
このように、情報処理システム1は、各ノード10〜10mが有するメモリに対して、単一のメモリアドレス空間をマッピングする。このため、任意のCPUが任意のノードの共有メモリ領域に対して直接アクセスできる。なお、図4に示すメモリマップはあくまで一例であり、任意の割当を行うこととしても良い。
すなわち、メモリマップ上のメモリアドレスの全てがメモリに割当てられている必要はなく、メモリホールが存在しても良い。また、情報処理システム1が有する各ノードにOSが利用するローカル領域が存在し、かつ、1つ以上のノードに共有メモリ領域が存在するように、メモリマップを設定すればよい。
なお、情報処理システム1は、1つのノード内に含まれるメモリ(例えば、メモリ17とメモリ18)に対して連続するメモリアドレスをマップした場合は、制御資源を削減することができる。また、情報処理システム1は、少なくとも、セグメント領域のアライメントをそろえることができるようにメモリアドレスの割り当てを行う。
次に、図5を用いて、各ノードのメモリに対して割当てられる共有メモリ領域について説明する。図5は、実施例1に係る情報処理システムが割当てる共有メモリ領域を説明するための図である。なお、図5に示す例では、情報処理システム1がノード#0〜#nを有し、各ノード#0〜#nに対して共有メモリ領域を振り分ける例について説明する。
例えば、図5中(e)に示すように、情報処理システム1は、64テラバイトのローカル領域と、64テラバイトのメモリ領域とを、各ノード#0〜#nに対して割当てる。詳細には、情報処理システム1は、図5中(f)に示すように、64テラバイトの共有メモリ領域を、各ノード#0〜#nに対して均等に振り分ける。
ここで、各ノード#0〜#nは、振り分けられた共有メモリ領域を、プロテクト領域とノンプロテクト領域とに分ける。ここで、プロテクト領域とは、他のノードからメモリアクセス要求を受信した際に、アクセストークンとメモリトークンとが一致するか否かを判別することで、アクセス保護を行う領域である。また、ノンプロテクト領域とは、他のノードから自由にメモリアクセスを行うことができる領域である。
例えば、図5中(g)に示すように、ノード#1は、自身に割当てられた共有メモリ領域のうち、最大で4テラバイトをプロテクト領域、または、ノンプロテクト領域とすることができる。また、図5中(h)に示すように、ノード#1は、共有メモリ領域をセグメント#0〜#2047までの2ギガバイトのセグメントに分割する。そして、ノード#1は、図5中(i)に示すように、セグメントごとにメモリトークンを設定する。
また、図5に示す例では、ノード#1は、セグメント#0〜#2をプロテクト領域とし、メモリトークンを設定する。なお、メモリトークンは、例えば、13ビットの値である。また、図5に示す例では、ノード#1は、セグメント#3〜#2047をノンプロテクト領域とし、メモリトークンとして、「all0」を設定する。すなわち、各ノード#0〜#nは、ノンプロテクト領域に対してアクセスを行う場合には、図5中(j)に示すように、「all0」のアクセストークンを用いることで、アクセスを行うことができる。
また、ノード#mも、自身の共有メモリ領域をセグメント#0〜#2047に分割し、各セグメント#0〜#2047にメモリトークンを設定する。なお、ノード#mが自身の各セグメント#0〜#2047に対して設定したメモリトークンは、図5中(j)に示すように、ノード#1がアクセストークンとして用いることとなる。このため、ノード#1は、ノード#mの共有メモリ領域にアクセスする場合には、ノード#mが設定したメモリトークンを取得し、取得したメモリトークンをアクセストークンとして用いることで、ノード#mの共有メモリ領域にアクセスを行う。
次に、図6を用いて、各CPU12〜15のハードウェアと各CPU12〜15が実行するソフトウェアとの関係について説明する。図6は、実施例1に係る情報処理システムにおけるハードウェアとソフトウェアとの関係を説明するための図である。なお、図6に示す例では、CPU12が有するハードウェアをハードウェア30とし、CPU13が有するハードウェアをハードウェア30aとした。また、図6に示す例では、CPU14が有するハードウェアをハードウェア30bとし、CPU15が有するハードウェアをハードウェア30cとした。
例えば、CPU12は、ハードウェア30を有し、CPU12専用のローカルなメモリ17および共有メモリ18、20、22、24にアクセスする。また、CPU12は、ハードウェア30上で、ハイパーバイザ31、オペレーティングシステム32、ドライバ33、ミドルウェア34を動作させる。また、CPU12は、ミドルウェア34上に、各CPU12〜15が協調して動作させるアプリケーション35を実行する。
また、他のCPU13〜15は、CPU12と同様に、ハードウェア30a〜30cを有し、ハイパーバイザ31a〜31c、オペレーティングシステム32a〜32c、ドライバ33a〜33c、ミドルウェア34a〜34cを動作させる。
次に、図7を用いて、CPU12が実行するアプリケーションとミドルウェアとの動作について説明する。図7は、実施例1に係るアプリケーションとミドルウェアとの動作を説明するための図である。例えば、アプリケーション35は、図7中の区間Aにおいて、アドレス1に格納されたデータを読み込むロード要求(LD:Lord)を発行するとともに、ロードしたデータをアドレス2に格納するセット要求(ST:Set)を発行する。すると、図7では省略したが、ミドルウェア34は、アプリケーション35が発行したロード要求とセット要求とをハードウェア30に伝達し、処理を実行させる。
次に、アプリケーション35は、記録開始をミドルウェア34に通知し、区間Aから区間Bへの移行をミドルウェア34に通知する。すると、ミドルウェア34は、区間Bへ移行したことを示すセクタモードの設定を行う。すなわち、ミドルウェア34は、アプリケーション35が指定した期間内である旨を示す設定を行う。
次に、アプリケーション35は、データのバックアップを行うため、アドレス3に格納されたデータのロード要求と、アドレス4に格納されたデータのストア要求とを発行する。このような場合には、ミドルウェア34は、発行されたロード要求とストア要求とをハードウェア30に実行させるとともに、ストア要求の対象となるアドレス4のキャッシュラインにセクタフラグを設定する。
その後、アプリケーション35は、記録終了を示すSYNCをミドルウェア34に発行する。すると、ミドルウェア34は、区間Bが終了したものとし、セクタモードを解除する。そして、ミドルウェア34は、セクタフラッシュ要求をハードウェア30に発行する。ここで、セクタフラッシュ要求とは、セクタフラグが設定されたキャッシュラインの書き戻し要求である。すなわち、ミドルウェア34は、区間Bにおいてストア要求の対象となったアドレス4のデータのみをメモリ17〜24に書き戻すよう、ハードウェア30に要求する。その後、ミドルウェア34は、通常の処理を行う。
なお、区間Aと区間Bは、例えば、ASI(Address Space Identifier)レジスタライト等を用いて、スタティックなモードで切り換えることが可能である。また、モードの切り換えは、アプリケーション35からの指定で行う事が可能であり、コンテキストスイッチが発生した際には、状態の保存やリストアが行われる対象となる。
例えば、CPU12が実行中のアプリケーションAがセクタモードを区間Bに変更した後に、アプリケーションBへのコンテキストスイッチが発生すると、アプリケーションAのセクタモードが区間Aであることが保持される。そして、CPU12が実行するアプリケーションがアプリケーションBからアプリケーションAに変わる場合には、コンテキストスイッチが発生し、再度区間がBに移行する。
なお、セクタフラッシュが実行させるとセクタフラグが設定されたキャッシュラインのステートは、インバリッド(Invalid)となる。このため、図7に示す例では、ミドルウェア34がセクタフラッシュ要求を発行した後に、アドレス4に対するロード要求等が発行されると、キャッシュミスが発生することとなる。
次に、図8を用いて、実施例1に係るCPU12が実行するアプリケーション35と、CPU12のハードウェア30が実行する処理について説明する。図8は、実施例1に係るCPUが実行する処理を説明するための図である。なお、図8に示す例では、キャッシュ12aがメモリ17に格納されたデータをキャッシュする例について記載した。
図8に示す例では、ハードウェア30は、現在の処理が区間Aの処理であるか区間Bの処理であるかを区別するために、セクタモードレジスタを有する。例えば、セクタモードレジスタは、CPU12が有するASIレジスタの1つであり、値が「0」である場合には、現在の処理が区間Aの処理であることを示し、値が「1」である場合には、現在の処理が区間Bの処理であることを示す。
また、図8に示す例では、キャッシュ12aには、複数のキャッシュラインが存在し、各キャッシュラインには、エントリ、セクタ、ステート、アドレス、データが格納される。ここで、エントリとは、各キャッシュラインを識別するための情報であり、セクタとは、アプリケーション35が指示する期間内に更新が行われたか否かを示すセクタフラグである。
また、ステートとは、データの状態を示す情報であり、例えば、MESIプロトコル(イリノイプロトコル)に基づくキャッシュラインの状態を示す情報を格納する。詳細には、状態データに「M:Modify」が格納されている場合には、同じキャッシュラインに格納されたデータを排他的にキャッシュしており、かつ、キャッシュしたデータがプロセッサコア4aによって最新の状態に更新されていることを示す。
また、状態データに「E:Exclusive」が格納されている場合には、同じキャッシュラインに格納されたデータを排他的にキャッシュしており、かつ、キャッシュしたデータがプロセッサコア4aによって更新されていない状態を示す。また、状態データに「S:Shared」が格納されている場合には、他のキャッシュメモリ5b、5cが同一の共有データをキャッシュしていることを示す。また、状態データに「I:Invalid」が格納されている場合には、同一キャッシュラインのデータが無効であることを示す。
また、アドレスとは、キャッシュ元のデータが格納されているメモリ17のメモリアドレスを示す。また、データとは、キャッシュ対象となるデータである。また、図8に示す例では、ハードウェア30は、各キャッシュラインのセクタの値に応じてメモリ17への書き戻しを行うセクタフラッシュ制御ステートマシンを有する。具体的には、セクタフラッシュ制御ステートマシンとは、アプリケーション35からの要求に応じて、区間Bにおいて更新があったキャッシュラインのデータのみをメモリ17に書き戻す。
以下、アプリケーション35とハードウェア30の動作について説明する。例えば、アプリケーション35は、図8中(k)に示すように、データ「xx」をアドレス「100」に格納するセット要求を発行する。すると、ハードウェア30は、キャッシュ12aが有するエントリ「5」のキャッシュラインに、アドレス「100」のデータ「aa」が格納されていると判別し、エントリ「5」のキャッシュラインのデータを「aa」から「xx」に書き換える。
また、ハードウェア30は、データの更新を行ったため、ステートを「E」から「M」に変更する。ここで、ハードウェア30は、セクタモードレジスタの値が「0」であるため、エントリ「5」のキャッシュラインのデータについて、セクタの値を「0」のままにする。
次に、アプリケーション35は、セクタモードレジスタ(SctRg:Sector Mode Register)に「1」を格納するセット要求を発行する。すなわち、アプリケーション35は、区間Aから区間Bへの移行を要求する。すると、ハードウェア30は、セクタモードレジスタに「1」を格納する。
次に、アプリケーション35は、図8中(l)に示すように、データ「yy」をアドレス「200」に格納するセット要求を発行する。すると、ハードウェア30は、エントリ「50」のキャッシュラインに、アドレス「200」のデータ「bb」が格納されていると判別し、エントリ「50」のキャッシュラインのデータを「bb」から「yy」に書き換え、ステートを「E」から「M」に変更する。
さらに、ハードウェア30は、セクタモードレジスタの値が「1」であるため、エントリ「50」のキャッシュラインにセクタフラグ「1」を格納する。つまり、ハードウェア30は、アプリケーション35が指定した区間内において、エントリ「50」のキャッシュラインのデータが更新された旨を示すセクタフラグを設定する。
続いて、アプリケーション35は、セクタモードレジスタに「0」を格納するセット要求を発行する。すなわち、アプリケーション35は、区間Bから区間Aへの移行を要求する。すると、ハードウェア30は、セクタモードレジスタに「0」を格納する。その後、アプリケーション35は、図8中(m)に示すように、セクタフラッシュ制御ステートマシーン(Sctq)に「1」を格納する要求を発行することで、キャッシュフラッシュの実行を要求する。図8中(n)に示すように、ハードウェア30は、各キャッシュラインを検査し、セクタに「1」が格納されたエントリを検索する。
すると、ハードウェア30は、図8中(o)に示すように、エントリ「50」のセクタが「1」であると判別する。この結果、ハードウェア30は、図8中(p)に示すように、エントリ「50」のキャッシュラインのデータ「yy」をメモリ17に書き戻す。すなわち、ハードウェア30は、区間Bにおいて更新されたデータのみをメモリ17に書き戻す。そして、ハードウェア30は、エントリ「50」のキャッシュラインのセクタを「0」に変更するとともに、ステートを「I」に変更する。
このように、ハードウェア30は、キャッシュ12aが有する複数のキャッシュラインのうち、アプリケーション35から指示された期間内、すなわち区間Bにおいて更新したデータが格納されたキャッシュラインにセクタフラグ「1」を設定する。そして、ハードウェア30は、アプリケーション35から指示された期間が終了し、アプリケーション35からキャッシュフラッシュの要求を受付けた場合には、セクタフラグが「1」のキャッシュラインに格納されたデータのみをメモリ17に書き戻す。
このため、アプリケーション35は、メモリ17に書き戻すべきデータのストア要求を発行するたびに、アドレスを指定したフラッシュ要求を発行せずともよい。すなわち、アプリケーション35は、メモリ17に書き戻すべきデータのストア要求が生じる区間を指定し、その後フラッシュ要求を発行するだけでよい。このため、ハードウェア30を有するCPU12は、アプリケーション35のプログラムにおける修正量を抑えることができる。
また、CPU12は、キャッシュメモリ12aが有する各キャッシュラインのうち、セクタフラグが「1」のキャッシュラインに格納されたデータのみをメモリ17に書き戻すので、キャッシュフラッシュの処理時間を短縮することができる。また、CPU12は、セクタフラグが「1」のキャッシュラインに格納されたデータのみをメモリ17に書き戻すので、不要なキャッシュフラッシュの量を抑える結果、キャッシュフラッシュに伴う性能劣化を最小限に抑えることができる。
図9は、実施例1に係るCPUのキャッシュフラッシュの効果を説明するための図である。図9中(x)に示すように、従来のCPUは、更新されたデータがキャッシュしたデータの一部のみであっても、全キャッシュデータをメモリに書き戻すので、キャッシュフラッシュの処理時間を増大させ、システム全体の性能を劣化させた。
しかし、図9中(y)に示すように、CPU12は、セクタフラグを用いて、キャッシュ12aに格納されたデータのうち、メモリ12〜24に書き戻すべきデータのみを検出し、検出したデータのみをメモリ17〜24に書き戻す。この結果、CPU12は、キャッシュフラッシュの処理時間を短縮するとともに、情報処理システム1の性能劣化を防ぐことができる。
また、図10は、実施例1に係るCPUの効果を説明するための図である。図10に示すように、従来の情報処理システムが実行するアプリケーションでは、メインプログラムSyncをミドルウェアに発行する。なお、ミドルウェアは、このSyncに対してNOP(No Operation)である。次に、メインプログラムは、複数のサブプログラムを呼び出し、各サブプログラムがストア要求をミドルウェアに発行する。その後、メインプログラムがフラッシュ要求をミドルウェアに発行する。すると、ミドルウェアは、DMA(Direct Memory Access)を用いた他ノードへのコピーを行う。
一方、同様のアプリケーション35を情報処理システム1が実行した場合には、アプリケーション35がSyncを発行すると、ミドルウェア34は、CPU12にSyncを伝達する。この結果、CPU12は、アプリケーションが指定する期間、すなわち、フラッシュセクタ期間が開始したと判別する。次に、メインプログラムは、サブプログラムを呼び出し、サブプログラムは、それぞれストア要求を発行する。次に、メインプログラムは、フラッシュ要求を発行する。すると、CPU12は、フラッシュセクタ期間中にストア要求により更新されたデータのフラッシュを実行する。
このため、CPU12は、従来の情報処理システムが実行するアプリケーションと共通のアプリケーションを用いた際にも、キャッシュメモリ12aから各メモリ17、18にデータの書き戻しを行う事ができる。この結果、CPU12は、アプリケーションに対して、メモリへの書き戻しを行うためのフラッシュ要求を追加する修正の量を削減することができる。
[実施例1の効果]
上述したように、CPU12は、複数のキャッシュラインを有し、データを一時的に保持するキャッシュメモリ12aを有する。また、CPU12は、アプリケーション35が指示した期間内にデータが更新されたか否かを示すセクタフラグをキャッシュラインごとに有する。そして、CPU12は、キャッシュメモリ12aが有するキャッシュラインのうち、セクタフラグが、アプリケーション35が指示した期間内にデータが更新された旨を示すキャッシュラインのデータをメモリ17〜24に書き戻す。
このため、CPU12は、アプリケーション35のプログラムの修正を抑えることができる。また、CPU12は、データの書き戻しの処理時間を短縮するとともに、情報処理システム1の性能劣化を防ぐことができる。
実施例5では、複数のコア、L1(Level 1)キャッシュ、およびL2(Level 2)キャッシュを有し、各キャッシュラインごとのセクタフラグと、各コアごとに概要セクタフラグを有するCPUについて説明する。
図17は、実施例5に係るCPUの機能構成を説明するための図である。CPU12gは、実施例1の同様の機能を有する情報処理システム1cが有するCPUであり、CPU12、CPU12b、CPU12d、CPU12fと同様に、情報処理システム1dが有するノードに設置された複数のCPUの1つである。なお、図17には、実施例5に係るCPU12gの機能構成を示した。
図17に示す例では、CPU12gは、ローカルXB16、メモリ17、メモリ18、PCIeスイッチ25と接続されている。また、CPU12gは、複数のコア40〜40b、セクタID(Identification)生成部41〜41b、L1キャッシュタグ42〜42b、L1キャッシュ43〜43b、TLB(Translation Lookaside Buffer)44〜44bを有する。
また、CPU12gは、L2キャッシュアクセスコントローラ45、L2キャッシュタグ46、L2キャッシュ47、L2キャッシュ概要セクタフラグ48、アドレスマップ49、非キャッシュリクエストステートマシン50を有する。また、CPU12gは、設定レジスタ群51、フラッシュ制御部52、PCI制御部53、ディレクトリ制御部54、スヌープ制御部55、リクエスト制御部56を有する。
なお、コア40a、コア40bについては、コア40と同様の機能を発揮し、セクタID生成部41a、セクタID生成部41bについては、セクタID生成部41と同様の機能を発揮するものとして、以下の説明を省略する。また、L1キャッシュタグ42a、L1キャッシュタグ42bは、L1キャッシュタグ42と同様の機能を発揮し、L1キャッシュ43a、L1キャッシュ43bは、L1キャッシュ43と同様の機能を発揮するものとして、以下の説明を省略する。また、TLB44a、TLB44bは、TLB44と同様の機能を発揮するものとして、以下の説明を省略する。
コア40は、L1キャッシュ43に格納されたデータを用いて、演算処理を実行する演算装置である。セクタID生成部41は、コア40が出力する命令コードとレジスタの設定情報とに応じて、セクタIDを生成し、生成したIDをL1キャッシュタグ42に出力する。ここで、セクタIDとは、コア40が実行するアプリケーションが指示した期間内に更新が行われたか否かを示す情報である。
L1キャッシュタグ42は、L1キャッシュ43のタグデータであり、L1キャッシュ43の各キャッシュラインに格納されたデータのアドレス、ステート、リプレース要のLRU(Least Recently Used)情報、セクタIDを記憶する。
L1キャッシュ43は、高速にアクセス可能なキャッシュメモリであり、メモリ17、メモリ18、L2キャッシュ47に格納されたデータの一部をキャッシュする。なお、L1キャッシュ43は、コア40専用の1次キャッシュである。例えば、L1キャッシュ43は、命令用の領域とデータ用の領域とにそれぞれ64キロバイトの容量を有する。また、TLB44は、変換テーブルを用いて、コア40が出力する仮想アドレスを物理アドレスに変換する。
ここで、図18、図19を用いて、L1キャッシュタグ42およびL1キャッシュ43について説明する。図18は、L1キャッシュタグを説明するための図である。図18に示す例では、L1キャッシュタグ42は、仮想アドレスのインデックス、すなわち、「00_0000_0」〜「11_1111_1」までの下位7ビットをインデックスとする。また、L1キャッシュタグ42は、各インデックスについて、命令をキャッシュする領域のタグデータ(IF)と、データをキャッシュする領域のタグデータ(OP:Operand)とを記憶する。
また、L1キャッシュタグ42は、各インデックスごとにウェイ0〜ウェイ3までのタグデータを記憶する。また、L1キャッシュタグは、タグデータとして、Val、2ビットのステート[1:0]、2ビットのセクタID[1:0]、論理アドレスの上位33ビットであるLA[46:14]、チェックビットであるCB(Check bit)[7:0]を記憶する。なお、以下の説明では、ステート「00」は、I(Invalid)を示し、ステート「01」はS(Share)を示し、ステート「10」はE(Exclusive)を示し、ステート「11」はM(Modify)を示すものとする。
次に、図19を用いて、L1キャッシュ43について説明する。図19は、L1キャッシュを説明するための図である。図19に示す例では、L1キャッシュ43は、L1キャッシュタグ42と同様に、命令をキャッシュする領域と、データをキャッシュする領域とを有する。また、L1キャッシュ43が有する各キャッシュラインには、論理アドレスのインデックスと対応付けられており、それぞれウェイ「0」〜「3」までの4つのウェイを有する。また、各キャッシュラインの各ウェイには、128バイトのデータと16バイトのチェックビットとが格納される。
次に、図20を用いて、コア40、セクタID生成部41、L1キャッシュタグ42、L1キャッシュ43、TLB44が実行する処理の詳細な例を説明する。図20は、実施例5に係るセクタID生成部が実行する処理を説明するための図である。図20に示す例では、セクタID生成部41は、ASIレジスタ41c、セクタID選択制御部41d、セクタID選択部41eを有する。
また、図20に示す例では、ASIレジスタ41cは、HPV(Hypervisor)の特権命令でアクセスするセクタイネーブルとフラッシュイネーブルとを記憶する。また、ASIレジスタ41cは、コア40が実行するアプリケーションが指定する期間の開始および終了を示すスフラッシュセクタモードを記憶する。
コア40は、セクタフラグを設定する場合には、セクタイネーブルに「1」を格納し、セクラフラグを設定しない場合には、セクタイネーブルに「0」を格納する。また、コア40は、セクタフラッシュの機能を有効にする場合には、フラッシュイネーブルに「1」を格納し、セクタフラッシュの機能を無効にする場合には、フラッシュイネーブルに「0」を格納する。また、コア40は、セクタフラッシュを実行させる場合には、フラッシュセクタモードに「1」を格納し、他の場合には、フラッシュセクタモードに「0」を格納する。
なお、フラッシュセクタモードは、コア40が実行するアプリケーションがアクセス可能なレジスタに格納される。また、ASIレジスタ41cは、あらかじめ定められた2ビットのセクタIDを記憶する。詳細には、ASIレジスタ41cは、セクタIDとしてID0を示す「00」、ID1を示す「01」、FL(Flash)を示す「11」、Def(Default)を示す「00」を記憶する。
例えば、コア40は、ASIレジスタ41cに対して、ASIレジスタの読み出し、または格納を要求するコマンドを発行する(ASI Reg R/W command)。このコマンドには、読み出し、または格納の対象となる10ビットのアドレス(Address[11:2])、4ビットのバイトイネーブル(Byte Enable[3:0])が格納される。
また、コア40は、ASIレジスタ41cに対してデータの格納を要求する場合には、格納対象となる32ビットのデータを出力する(ASI Reg Write Data[31:0])。一方、ASIレジスタ41cは、コア40からのリクエスト内容が読み出しである場合には、読み出した32ビットのデータをコア40に出力する(ASI Reg Read Data[31:0])。
また、コア40は、Request val、Request ID、Code、Logic Address、Sector Sel、Store DataをフィールドとするL1キャッシュリクエストをフィールドとするL1キャッシュリクエストを発行する。具体的には、コア40は、L1キャッシュリクエストをL1キャッシュアクセスコントローラ57と、セクタID選択制御部41dとに発行する。
ここで、Request val(Request Value)とは、リクエストであることを示す情報であり、Request IDとは、リクエストを識別するための8ビットの識別子である。また、Codeとは、リクエストの内容を示す情報であり、データの格納を示すStore、データの読み出しを示すLoad等の情報である。また、Logic Addressとは、リクエストの対象となる41ビットの仮想アドレスである。
また、Sector Selとは、セクタID生成部41に対して生成を要求するセクタIDを示す情報であり、例えば、「ID0」、または「ID1」が格納される。また、Store Dataとは、データの格納を要求するリクエストに付加される情報であり、L1キャッシュ43に格納する128バイトのデータである。
また、コア40は、非キャッシュリクエストステートマシン50に対し、NC(Non coherency)空間へのリード要求、またはライト要求であるNCリクエストを発行する。詳細には、コア40は、「Req val」、「Request ID」、「Code」、「Logic Address(LA)」、「Byte Enable(BE)」、「Store Data」をフィールドとするNCリクエストを発行する。
ここで、「Req val」は、リクエスト信号であることを示す情報であり、「Request ID」は、リクエストを識別する8ビットの情報である。また、「Code」は、リクエストの内容を示す情報であり、データの格納を示す「Store」、データの読み出しを示す「Load」等が格納される。
また、「Logic Address」は、リクエストの対象となる48ビットの仮想アドレスである。また、「Byte Enable」とは、イネーブルを示す129ビットの情報である。また、「Store Data」とは、リクエストの種別が「Store」である際に格納する128バイトのデータである。
ASIレジスタ41cは、セクタイネーブル、フラッシュイネーブル、フラッシュセクタモードの値をセクタID選択制御部41dに出力する。また、ASIレジスタ41cは、セクタIDをそれぞれセクタID選択部41eに出力する。セクタID選択制御部41dは、コア40が発行したL1キャッシュリクエストを取得し、L1キャッシュリクエストのSector Selの値を取得する。また、セクタID選択制御部41dは、ASIレジスタ41cから、セクタイネーブル、フラッシュイネーブル、フラッシュセクタモードの値を取得する。
そして、セクタID選択制御部41dは、セクタイネーブルの値が「0」である場合には、セクタID選択部41eにDef(00)を選択するよう指示する。また、セクタID選択制御部41dは、セクタイネーブル、フラッシュイネーブル、フラッシュセクタモードの値が全て「1」であり、かつ、L1キャッシュリクエストの内容がデータの格納(Store)である場合には、FL(11)を出力するよう指示する。つまり、セクタID選択制御部41dは、アプリケーションが指定した期間内に更新したデータについては、セクタID「11」を出力するよう指示する。
また、セクタID選択制御部41dは、セクタイネーブル、フラッシュイネーブル、フラッシュセクタモードが「1」でL1キャッシュリクエストの内容がデータの格納ではない場合には、以下の処理を行う。また、セクタID選択制御部41dは、セクタイネーブルが「1」で、フラッシュイネーブル、フラッシュセクタモードのいずれか、または両方が「0」である場合も同様の処理を行う。
すなわち、セクタID選択制御部41dは、L1キャッシュリクエストのSector Selの値を識別する。そして、セクタID選択制御部41dは、Sector Selの値が「ID1」である場合は、ID1を選択するようセレクタ選択部41eに指示し、Sector Selの値が「ID0」である場合は、ID0を選択するようセレクタ選択部41eに指示する。
セクタID選択部41eは、ASIレジスタ41cから、各セクタIDを取得する。そして、セクタID選択部41eは、セクタID選択制御部41dから通知されたセクタIDをL1キャッシュアクセスコントローラ57に出力する。
L1キャッシュアクセスコントローラ57は、コア40からL1キャッシュリクエストを取得する。そして、L1キャッシュアクセスコントローラ57は、L1キャッシュリクエストがデータの読み出しを要求する場合は、L1キャッシュタグ42を用いて、L1キャッシュ43からのデータ読み出しを行う。
また、L1キャッシュアクセスコントローラ57は、読み出しの対象となるデータがL1キャッシュ43に格納されておらず、キャッシュミスが発生した場合には、以下の処理を行う。すなわち、L1キャッシュアクセスコントローラ57は、L1キャッシュ−L2キャッシュアクセスバスを介して、L2キャッシュアクセスコントローラ45にデータのリクエストを送信する。
なお、L1キャッシュアクセスコントローラ57は、L2キャッシュアクセスコントローラ45にデータのリクエストを送信する場合は、TLB44を用いて、論理アドレスを物理アドレスに変換する。そして、L1キャッシュアクセスコントローラ57は、変換後の物理アドレスをL2キャッシュアクセスコントローラ45に送信する。
すると、L1キャッシュアクセスコントローラ57は、L2キャッシュアクセスコントローラ45からデータとともに、セクタIDを取得する。そして、L1キャッシュアクセスコントローラ57は、取得したデータL1キャッシュ43に格納するとともに、取得したセクタIDを変更することなくL1キャッシュタグ42に格納する。
その後、L1キャッシュアクセスコントローラ57は、L1キャッシュ43から読み出し対象となるデータを検索する。すると、キャッシュヒットが発生するので、L1キャッシュアクセスコントローラ57は、データを取得し、取得したデータをL1キャッシュレスポンスとしてコア40に送信する。ここで、L1キャッシュレスポンスには、レスポンスを示す「Req val」と、読み出しを要求したリクエストの「Request ID」と、読み出した128バイトのデータである「Read Data」がフィールドとして含まれる。
また、L1キャッシュアクセスコントローラ57は、L1キャッシュリクエストがデータの格納を要求する場合は、セクタID生成部41からセクタIDを取得する。そして、L1キャッシュアクセスコントローラ57は、データをL1キャッシュ43に格納するとともに、L1キャッシュタグ42に、セクタID生成部41から取得したセクタIDを格納する。
また、L1キャッシュアクセスコントローラ57は、L1キャッシュ43に格納されたデータのリプレースを行う場合には、L1キャッシュ43に格納されたデータとともに、タグデータに含まれるセクタIDをL2キャッシュアクセスコントローラ45に送信する。また、L1キャッシュアクセスコントローラ57は、L1キャッシュ43に格納されたデータが更新され、セクタIDが変更となった場合は、変更後のセクタIDをL2キャッシュアクセスコントローラ45に送信する。
また、L1キャッシュアクセスコントローラ57は、後述するフラッシュ制御部52がフラッシュを実行する場合も同様に、L1キャッシュ43に格納されたデータとともに、タグデータに含まれるセクタIDをL2キャッシュアクセスコントローラ45に送信する。すると、L2キャッシュアクセスコントローラ45は、L1キャッシュアクセスコントローラ57から取得したセクタIDをL2キャッシュタグ46に格納し、データをL2キャッシュ47に格納する。
このように、L1キャッシュアクセスコントローラ57は、アプリケーションが指定する区間内に更新されたデータについては、アプリケーションが指定する区間内に更新されたことを示すセクタID「11」をタグデータとしてL1キャッシュタグ42に格納する。そして、L1キャッシュアクセスコントローラ57は、リプレースやフラッシュが実行される場合は、アプリケーションが指定する区間内に更新されたことを示すセクタID「11」をデータとともにL2キャッシュアクセスコントローラ45に送信する。
なお、L1キャッシュアクセスコントローラ57は、L1キャッシュリクエストが読み出しのリクエストであると判別すると、L1キャッシュタグ42に、読み出しのリクエストであるRead Reqを発行する。ここで、Read Reqには、読み出しのリクエストである旨を示すValと、読み出し対象の論理アドレスLA[46:7]が格納される。
また、L1キャッシュアクセスコントローラ57は、L1キャッシュリクエストが格納のリクエストであると判別すると、以下の処理を実行する。すなわち、L1キャッシュアクセスコントローラ57は、格納のリクエストであるWriteを発行する。ここで、Writeには、書込み対象となるデータ、セクタID生成部41から受信したセクタID、ウェイID、命令データであるかデータであるかの情報が格納される。
また、L1キャッシュアクセスコントローラ57は、L1キャッシュ−L2キャッシュ間のリクエストおよびレスポンスを発行することで、L2キャッシュアクセスコントローラ45とセクタIDおよびデータの要求や送信を行う。
L1キャッシュタグ42は、L1キャッシュアクセスコントローラからRead Reqを受信すると、取得した論理アドレスの下位7ビットと一致するインデックスのタグデータに、取得した論理アドレスの上位33ビットが格納されているか否かを判別する。そして、L1キャッシュタグ42は、取得した論理アドレスの上位33ビットが格納されているタグデータが存在する場合は、キャッシュヒットしたと判別する。一方、L1キャッシュタグ42は、取得した論理アドレスの上位33ビットが格納されているグデータが存在しない場合は、キャッシュミスしたと判別する。
そして、L1キャッシュタグ42は、L1キャッシュアクセスコントローラ57に応答であるRead Rep(Read Response)を発行する。ここで、Read Repには、キャッシュヒットしたか否かの情報、命令データであるかデータであるかの情報、ウェイID、セクタIDが含まれる。また、L1キャッシュタグ42は、キャッシュヒットした場合には、L1キャッシュ43に読み出し要求を発行し、L1キャッシュ43に読み出し対象となるデータをL1キャッシュアクセスコントローラ57に出力させる。
また、L1キャッシュタグ42は、L1キャッシュアクセスコントローラ57から書込み要求であるWriteを受信する。すると、L1キャッシュタグ42は、書込み要求に格納されたセクタIDを書込み要求のウェイIDが示すウェイにウェイタグデータを格納するとともに、L1キャッシュ43にデータを格納する。
なお、L1キャッシュタグ42は、書込み要求の対象となる仮想アドレスのデータを記憶している場合には、タグデータのステートを変更するとともに、タグデータのセクタIDをL1キャッシュアクセスコントローラ57から取得するセクタIDに変更する。すなわち、L1キャッシュタグ42は、コア40が実行するアプリケーションが指定した期間内に更新された旨を示すセクタIDをタグデータに記憶する。
また、非キャッシュリクエストステートマシン50は、UC領域に対するアクセスを制御し、コア40からNCリクエストを受信すると、PCIe等を介した処理等を実行する。例えば、非キャッシュリクエストステートマシン50は、各コア40〜40bがHDD29等のI/O装置に対する読出しや格納のNCリクエストを取得した場合には、取得したNCリクエストをPCI制御部53に発行する。そして、非キャッシュリクエストステートマシン50は、PCI制御部53からリクエストの応答を取得した場合には、取得した応答をNCレスポンスとしてコア40〜40bに送信する。
図17に戻って、L2キャッシュアクセスコントローラ45は、L2キャッシュタグ46やL2キャッシュ47のアクセスコントローラであり、L2キャッシュタグ46やL2キャッシュ47にアクセスするためのパイプラインである。なお、L2キャッシュアクセスコントローラ45は、L1キャッシュアクセスコントローラ57と同様の処理を行う事で、L2キャッシュ47に格納されたデータの制御を行う。また、L2キャッシュアクセスコントローラ45は、同一アドレスをシリアライズ処理する機能を有する。
L2キャッシュタグ46は、L2キャッシュ47のタグデータであり、L2キャッシュタグ42と同様の情報を記憶する。また、L2キャッシュ47は、各コア40〜40bが共用する2次キャッシュメモリである。また、L2キャッシュ47は、複数のキャッシュラインを有し、各キャッシュラインは、複数のグループに組み分けられている。
L2キャッシュ概要セクタフラグ48は、各コア40〜40bが実行するアプリケーションが指定した期間内に更新したデータが各グループのキャッシュラインに格納されているか否かを判別するフラグをコアごとに有する。すなわち、L2キャッシュ概要セクタフラグ48は、実施例3に係る概要セクタフラグ12eと同様のフラグである。
ここで、図21を用いて、L2キャッシュタグ46、L2キャッシュ47、L2キャッシュ概要セクタフラグ48の関係について説明する。図21は、L2キャッシュタグとL2キャッシュとL2キャッシュ概要セクタフラグを説明するための図である。図21に示すように、L2キャッシュ概要セクタフラグ48は、概要セクタフラグ12eと同様に、アプリケーションが指定した期間内に更新したデータがキャッシュラインの各グループに存在するか否かを示すフラグを各コア40〜40bごとに有する。
具体的には、L2キャッシュ概要セクタフラグ48には、L2キャッシュ47が有する各キャッシュラインを「0」〜「63」までのグループに分け、各グループについて、以下のフラグが格納される。すなわち、L2キャッシュ概要セクタフラグ48には、各コア40〜40bが実行するアプリケーションが指定する期間内に更新したデータが、キャッシュラインの各グループに存在するか否かを、各コア40〜40bごとに示すフラグが格納される。
また、図21に示す例では、L2キャッシュタグ46およびL2キャッシュ47は、物理アドレスの下位13ビットであるインデックスと対応付けられた複数のキャッシュラインを有する。なお、図21に示す例では、インデックスの値を10進数で記載した。また、L2キャッシュタグ46およびL2キャッシュ47は、各キャッシュラインごとにウェイID「0」〜「15」までのウェイを有する。
また、L2キャッシュタグ46には、L1キャッシュタグ42と同様に、各キャッシュラインの各ウェイに、タグデータとして、Val、ステート、アドレスの上位27ビット、セクタID、CBが格納される。また、L2キャッシュ47には、L1キャッシュ43と同様に、各キャッシュラインの各ウェイに対して、128バイトのデータと16バイトのデータが格納される。
図17に戻って、アドレスマップ49は、リクエスト対象となる物理アドレスと、物理アドレスが示す記憶領域にアクセスするCPUの識別子とを対応付けて記憶し、物理アドレスをCPUの識別子に変換する。つまり、アドレスマップ49は、CPU12gが他のCPUと接続されたメモリにアクセスするリクエストを発行すると、アクセス対象の物理アドレスからリクエストの送信先となるCPUの識別子を判別する。そして、アドレスマップ49は、リクエスト制御部56に、リクエストの送信先となるCPUの識別子を通知する。
設定レジスタ群51は、CPU12gの各種設定を行う複数のレジスタである。フラッシュ制御部52は、コア40〜40bからの命令により、L2キャッシュ47に対するキャッシュフラッシュを行う。すなわち、フラッシュ制御部52は、L2キャッシュ47が記憶するデータをメモリ17、18に書き戻す処理を行う。また、フラッシュ制御部52は、書き戻すデータがCPU12g以外のCPUがアクセスするメモリからキャッシュしたデータである場合には、元のメモリに対して書き戻しを行う。
PCI制御部53は、CPU接続のPCIexpressに対するルートコンプレックスである。ディレクトリ制御部54は、NUMAの技術を用いたメモリアクセスを制御する。また、ディレクトリ制御部54は、DMA(Direct Memory Access)等のメモリリクストを取得すると、メモリ17、メモリ18に格納されたディレクトリ情報を用いて、キャッシュコヒーレンシを維持する処理を実行する。例えば、ディレクトリ制御部54は、スヌープ制御部55を用いて、他のCPUにスヌープを発行したり、他のCPUが発行したスヌープに対する応答等を実行する。
スヌープ制御部55は、ローカルXB16を介して、CPU12g以外のCPUからのスヌープを受付けると、L2キャッシュ47を検査し、検査結果を応答として返信する。また、スヌープ制御部55は、ディレクトリ制御部54からスヌープの発行を要求された場合は、スヌープをCPU12g以外のCPUに対して送信する。例えば、スヌープ制御部55は、L2キャッシュ47に格納されたスヌープ対象のデータのステートが「M」であった場合には、キャッシュデータをスヌープの応答として送信する。
リクエスト制御部56は、L2キャッシュ47のキャッシュミスが発生した際に、他のCPUへのリクエスト発行から、他のCPUからの応答受信までの管理を行う。例えば、リクエスト制御部56は、物理アドレスをアドレスマップ49に出力し、リクエストの送信先となるCPUの識別子を取得する。そして、リクエスト制御部56は、取得した識別子を宛先として、リクエストをローカルXB16に出力する。
また、リクエスト制御部56は、リクエストの対象となるアドレス等を保持する複数のエントリを有する。そして、リクエスト制御部56は、コア40〜40bから、処理中の物理アドレスに対してリクエストが発行された場合には、後段のリクエストを待機させるため、エントリに格納する。そして、リクエスト制御部56は、エントリに格納したリクエストを発行する場合には、リクエストを格納したエントリの識別子をリクエストに付加して出力する。
ローカルXB16は、インターコネクト用のルータであり、CPUの識別子に対応した宛先へ、リクエストを送信する。また、ローカルXB16は、送信するリクエストのパケット化やCRC(Cyclic Redundancy Check)の付加等を行う。
次に、図22を用いて、L2キャッシュアクセスコントローラ45が送受信する信号の一例について説明する。図22は、実施例5に係るL2キャッシュアクセスコントローラが送受信する信号を説明するための図である。例えば、図22に示す例では、L2キャッシュアクセスコントローラ45は、L1キャッシュアクセスコントローラ57からL1キャッシュ−L2キャッシュ間のリクエストを受信する。
すると、L2キャッシュアクセスコントローラ45は、L2キャッシュリードリクエストをL2キャッシュタグ46に発行し、L2キャッシュタグ46からL2キャッシュリードレスポンスを受信する。そして、L2キャッシュアクセスコントローラ45は、L2キャッシュリードレスポンスにキャッシュヒットした旨が含まれる場合は、L2キャッシュ47からリードデータを取得するとともに、L2キャッシュタグ46からセクタIDを取得する。その後、L2キャッシュアクセスコントローラ45は、取得したリードデータとセクタIDとをL1キャッシュアクセスコントローラ57にレスポンスとして出力する。
また、L2キャッシュアクセスコントローラ45は、L2キャッシュリードレスポンスにキャッシュミスした旨が含まれる場合は、リクエスト制御部56にリクエストの発行を要求する。すると、リクエスト制御部56は、リクエストを発行し、リクエストの対象となるデータを取得する。
例えば、リクエスト制御部56は、ディレクトリ制御部54を解してメモリ17、18からデータを取得する。また、例えば、リクエスト制御部56は、ローカルXB16を介してCPU12g以外のCPUへリクエストを発行し、CPU12g以外のCPUと接続されたメモリの共有領域からデータを取得する。そして、リクエスト制御部56は、取得したデータをL2キャッシュアクセスコントローラ45に出力する。
また、L2キャッシュアクセスコントローラ45は、リクエスト制御部56からデータを取得すると、L2キャッシュライトリクエストをL2キャッシュタグ46に発行し、ライトデータをL2キャッシュ47に送信する。すなわち、L2キャッシュアクセスコントローラ45は、新たなデータをL2キャッシュ47に格納する。
なお、L2キャッシュアクセスコントローラ45は、L1キャッシュのリプレースが発生し、L1キャッシュから吐き出されたデータを取得すると、L2キャッシュタグ46にL2キャッシュライトリクエストを発行し、吐き出されたデータの更新を行う。また、L2キャッシュアクセスコントローラ45は、L1キャッシュから吐き出されたデータとともにセクタIDを受信し、受信したセクタIDをL2キャッシュタグ46に格納する。
また、L2キャッシュアクセスコントローラ45は、データをL2キャッシュ47に格納する場合には、以下の処理を行う。すなわち、L2キャッシュアクセスコントローラ45は、格納するデータのセクタIDに応じて、概要セクタフラグをL2キャッシュ概要セクタフラグ48に格納する。
詳細には、L2キャッシュアクセスコントローラ47は、セクタIDが「11」である場合には、データを格納するキャッシュラインを含むグループに更新したデータが存在する旨を示す概要セクタフラグ「1」をL2キャッシュ概要セクタフラグ48に格納する。
なお、L2キャッシュアクセスコントローラ47は、概要セクタフラグを格納する際に、任意の方法で、データを更新したアプリケーションを実行するコアを識別し、識別したコアの概要セクタフラグを格納する。例えば、L2キャッシュアクセスコントローラ47は、リクエストIDを用いて、データを更新したアプリケーションを実行するコアを識別することとしてもよい。また、L2キャッシュアクセスコントローラ47は、LRU59に格納されたLRUを用いて、リプレースの対象となるキャッシュラインを選択する。
非キャッシュリクエストステートマシン50は、コア40〜40bが発行したフラッシュ要求を取得すると、フラッシュ制御部52にフラッシュの実行を指示する。すると、フラッシュ制御部52は、L2キャッシュ概要セクタフラグ48から概要セクタフラグを取得し、概要セクタフラグに応じたキャッシュラインに対するフラッシュ要求をL2キャッシュアクセスコントローラ45に発行する。
つまり、フラッシュ制御部52は、L2キャッシュ概要セクタフラグ48が有する各フラグのうち、フラッシュ要求を発行したコアの概要セクタフラグを検査し、フラグ「1」が格納されたグループを検索する。そして、フラッシュ制御部52は、フラグ「1」を検出したグループのキャッシュラインに対するフラッシュ要求を順次L2キャッシュアクセスコントローラ45に発行する。なお、フラッシュ制御部52は、フラッシュ要求の発行が終了すると、フラッシュ要求の対象となるキャッシュラインのグループ、および、フラッシュ要求を発行したコア等に応じて、L2キャッシュ概要セクタフラグ48のリセットを行う。
一方、L2キャッシュアクセスコントローラ45は、フラッシュ制御部52からのフラッシュ要求に応じて、L2キャッシュ47のキャッシュフラッシュを行う。具体的には、L2キャッシュアクセスコントローラ45は、フラッシュ要求の対象となるキャッシュラインのタグデータを検査し、セクタIDが「11」であり、ステートが「M」であるエントリを各ウェイから検索する。そして、L2キャッシュアクセスコントローラは、セクタIDが「11」であり、ステートが「M」であるエントリを検出すると、検出したエントリに対するフラッシュを実行する。
詳細には、L2キャッシュアクセスコントローラ45は、セクタIDが「11」でステートが「M」のエントリのデータをL2キャッシュ47から取得し、ステートを「I」に更新する。そして、L2キャッシュアクセスコントローラ45は、取得したデータをディレクトリ制御部54へ送信し、メモリ17、18、または、他のCPUと接続されたメモリへの書き戻しを要求する。
なお、ディレクトリ制御部54は、CPU12gと接続するメモリ17、18以外のメモリにデータの書き戻しを行う場合には、リクエスト制御部56と同様にアドレスマップ49を用いてデータの書き戻し先のメモリと接続されたCPUを識別する。そして、ディレクトリ制御部54は、ローカルXB16を介して、識別したCPUにデータを送信する。
なお、ディレクトリ制御部54は、ディレクトリ情報に基づいて、スヌープの発行をスヌープ制御部55に要求し、L2キャッシュアクセスコントローラ45や、他のCPUにスヌープを発行させる。L2キャッシュアクセスコントローラ45は、スヌープ制御部55が発行したスヌープ、または、リクエスト制御部56が他のCPUから受信したスヌープを取得すると、L2キャッシュ47に格納されたデータの出力等を行う。
ここで、非キャッシュリクエストステートマシン50は、コア40〜40bからの要求に応じて、セクタ最大値レジスタ58に、フラッシュの対象となるウェイ数の最大値を設定する。詳細には、非キャッシュリクエストステートマシン50は、セクタIDの値ごとに、各キャッシュラインのウェイに登録可能なタグデータの数をセクタ最大値レジスタ58に設置する。
そして、L2キャッシュアクセスコントローラ45は、登録可能なデータの数を超えて、新たなデータを格納する場合には、格納するデータのセクタIDの値に応じて、リプレースを行う。例えば、L2キャッシュアクセスコントローラ45は、新たに格納するデータのセクタIDが「11」である場合には、セクタID「01」またはセクタID「10」のデータをリプレースする。また、L2キャッシュアクセスコントローラ45は、新たに格納するデータのセクタIDが「01」である場合には、セクタIDが「01」またはセクタIDが「00」のデータをリプレースする。
例えば、コア40〜40b、セクタID生成部41〜41b、TLB44〜44b、L2キャッシュアクセスコントローラ45、L2キャッシュ概要セクタフラグ48、非キャッシュリクエストステートマシンとは、電子回路である。また、例えば、フラッシュ制御部52、PCI制御部53、ディレクトリ制御部54、スヌープ制御部55、リクエスト制御部56、L1キャッシュアクセスコントローラ57、とは、電子回路である。ここで、電子回路の例として、ASIC(Application Specific Integrated Circuit)やFPGA (Field Programmable Gate Array)などの集積回路、またはCPU(Central Processing Unit)やMPU(Micro Processing Unit)などを適用する。
また、L1キャッシュタグ42〜42b、L1キャッシュ43〜43b、L2キャッシュタグ46、L2キャッシュ47、LRU59とは、RAM(Random Access Memory)、フラッシュメモリ(flash memory)などの半導体メモリ素子などの記憶装置である。また、設定レジスタ群51、セクタ最大値レジスタ58とは、レジスタである。
次に、図23を用いて、セクタID生成部41がL1キャッシュタグ42に格納するセクタIDを生成する処理の流れについて説明する。図23は、L1キャッシュタグに格納するセクタIDを生成する処理の流れを説明するためのフローチャートである。
例えば、セクタID生成部41は、セクタイネーブルが「1」であるか否かを判別する(ステップS101)。そして、セクタID生成部41は、セクタイネーブルが「1」ではない場合には(ステップS101否定)、すなわち、セクタフラグを用いたフラッシュを行わない場合には、セクタIDを「00」に設定し(ステップS102)、処理を終了する。一方、セクタID生成部41は、セクタイネーブルが「1」である場合には(ステップS101肯定)、フラッシュイネーブルが「1」であるか否かを判別する(ステップS103)。
そして、セクタID生成部41は、フラッシュイネーブルが「1」ではない場合には(ステップS103否定)、セクタセレクタが「1」であるか否かを判別する(ステップS104)。そして、セクタID生成部41は、セクタセレクタが「1」ではない場合には(ステップS104否定)、セクタIDを「00」に設定し(ステップS105)、処理を終了する。また、セクタID生成部41は、セクタセレクタが「1」である場合には(ステップS104肯定)、セクタIDを「01」に設定し(ステップS106)、処理を終了する。
また、セクタID生成部41は、フラッシュイネーブルが「1」であると判別した場合には(ステップS103肯定)、フラッシュセクタモードが「1」であるか否かを判別する(ステップS107)。そして、セクタID生成部41は、フラッシュセクタモードが「1」である場合には(ステップS107肯定)、L1キャッシュリクエストのCodeが「Store」であるか否かを判別する(ステップS108)。
また、セクタID生成部41は、Codeが「Store」である場合には(ステップS108肯定)、セクタIDを「11」に設定し(ステップS109)、処理を終了する。一方、セクタID生成部41は、フラッシュセクタモードが「1」ではない場合(ステップS107否定)、および、Codeが「Store」ではない場合(ステップS108否定)は、ステップS104を実行する。
次に、図24を用いて、L1キャッシュアクセスコントローラ57がL1キャッシュタグ42のセクタIDを登録/更新する処理の流れを説明する。図24は、L1キャッシュのセクタIDを登録/更新する処理の流れを説明するためのフローチャートである。例えば、L1キャッシュアクセスコントローラ57は、L1キャッシュタグ42を用いてL1キャッシュの検索を行い、L1キャッシュヒットしたか否かを判別する(ステップS201)。
そして、L1キャッシュアクセスコントローラ57は、L1キャッシュヒットしたと判別した場合は(ステップS201肯定)、ヒットしたエントリのセクタIDを読み込む(ステップS202)。次に、L1キャッシュアクセスコントローラ57は、読み取ったセクタIDが「11」であるか否かを判別する(ステップS203)。そして、L1キャッシュアクセスコントローラ57は、セクタIDが「11」である場合は(ステップS203肯定)、読み取ったセクタIDを「11」に更新し(ステップS204)、処理を終了する。
一方、L1キャッシュアクセスコントローラ57は、読み取ったセクタIDが「11」ではない場合は(ステップS203否定)、セクタID生成部41が生成した生成セクタIDが「11」であるか否かを判別する(ステップS205)。そして、L1キャッシュアクセスコントローラ57は、生成セクタIDが「11」である場合は(ステップS205肯定)、L2キャッシュアクセスコントローラ45にセクタIDの変更リクエストを送信する(ステップS206)。
また、L1キャッシュアクセスコントローラ57は、変更リクエスト完了通知をL2キャッシュアクセスコントローラ45から受信すると(ステップS207)、セクタIDを「11」に更新し(ステップS204)、処理を終了する。また、L1キャッシュアクセスコントローラ57は、生成セクタIDが「11」ではない場合は(ステップS205否定)、生成セクタIDが「00」であるか否かを判別する(ステップS208)。
また、L1キャッシュアクセスコントローラ57は、生成セクタIDが「00」である場合には(ステップS208肯定)、生成セクタIDが読み取ったセクタIDと一致するか否かを判別する(ステップS209)。そして、L1キャッシュアクセスコントローラ57は、生成セクタIDが読み取ったセクタIDと一致する場合は(ステップS209肯定)、セクタIDを「00」に更新し(ステップS210)、処理を終了する。
また、L1キャッシュアクセスコントローラ57は、生成セクタIDが読み取ったセクタIDと一致しない場合は(ステップS209否定)、L2キャッシュアクセスコントローラ45にセクタIDの変更リクエストを送信する(ステップS211)。また、L1キャッシュアクセスコントローラ57は、変更リクエスト完了通知をL2キャッシュアクセスコントローラ45から受信すると(ステップS212)、セクタIDを「00」に更新し(ステップS210)、処理を終了する。
また、L1キャッシュアクセスコントローラ57は、生成セクタIDが「00」ではない場合には(ステップS208否定)、生成セクタIDが読み取ったセクタIDと一致するか否かを判別する(ステップS213)。そして、L1キャッシュアクセスコントローラ57は、生成セクタIDが読み取ったセクタIDと一致する場合は(ステップS213肯定)、セクタIDを「01」に更新し(ステップS214)、処理を終了する。
また、L1キャッシュアクセスコントローラ57は、生成セクタIDが読み取ったセクタIDと一致しない場合は(ステップS213否定)、L2キャッシュアクセスコントローラ45にセクタIDの変更リクエストを送信する(ステップS215)。また、L1キャッシュアクセスコントローラ57は、変更リクエスト完了通知をL2キャッシュアクセスコントローラ45から受信すると(ステップS216)、セクタIDを「01」に更新し(ステップS214)、処理を終了する。
また、L1キャッシュアクセスコントローラ57は、L1キャッシュヒットしなかった場合は(ステップS201否定)、L2キャッシュアクセスコントローラ45に補充リクエストを発行する(ステップS217)。次に、L1キャッシュアクセスコントローラ57は、レスポンスに含まれるセクタIDを取得する(ステップS218)。そして、L1キャッシュアクセスコントローラ57は、レスポンスから取得したセクタIDが「00」であるか否かを判別する(ステップS219)。
ここで、L1キャッシュアクセスコントローラ57は、レスポンスから取得したセクタIDが「00」である場合は(ステップS219肯定)、セクタID「00」を登録し(ステップS220)、処理を終了する。また、L1キャッシュアクセスコントローラ57は、レスポンスから取得したセクタIDが「00」ではない場合は(ステップS219否定)、レスポンスから取得したセクタIDが「01」であるか否かを判別する(ステップS221)。
そして、L1キャッシュアクセスコントローラ57は、レスポンスから取得したセクタIDが「01」である場合は(ステップS221肯定)、セクタID「01」を登録し(ステップS222)、処理を終了する。また、L1キャッシュアクセスコントローラ57は、レスポンスから取得したセクタIDが「01」ではない場合は(ステップS221否定)、セクタID「11」を登録し(ステップS223)、処理を終了する。すなわち、L1キャッシュアクセスコントローラ57は、L2キャッシュアクセスコントローラ45から受信したセクタIDをそのまま登録する。
L1キャッシュアクセスコントローラ57は、図23に示す処理を実行することでアプリケーションが実行する期間内に更新されたデータか否かを示すセクタIDを生成し、図24に示す処理を実行することで、セクタIDを登録する。この結果、L1キャッシュアクセスコントローラ57は、図25に示すように、L1キャッシュタグ42に登録したセクタIDを遷移させる。
図25は、L1キャッシュタグに登録したセクタIDの遷移を説明するための図である。図25に示す例では、不定(empty)であったセクタIDに、セクタID「00」、「01」、「11」のいずれかを登録することで、セクタIDは、「00」、「01」、「11」に遷移する。また、キャッシュのリプレースを行った場合やステートをインバリッドに変更した場合には、各セクタIDの値は不定となる。
また、セクタID「00」やセクタID「01」は、更新するセクタIDの値に応じて、セクタID「00」、「01」、「11」のいずれかに遷移する。しかし、セクタIDの値が「11」となった場合には、リプレースやインバリッド以外で、セクタIDの値が遷移することはない。このため、CPU12gは、一度セクタIDが「11」となったデータを必ずフラッシュできる。
次に、図26を用いて、L2キャッシュにおけるセクタIDの登録を行う処理の流れについて説明する。図26は、L2キャッシュにおけるセクタIDを登録する処理の流れを説明するためのフローチャートである。
例えば、L2キャッシュアクセスコントローラ45は、L2キャッシュタグ46を用いてL2キャッシュの検索を行い、L2キャッシュヒットしたか否かを判別する(ステップS301)。そして、L2キャッシュアクセスコントローラ45は、L2キャッシュヒットしたと判別した場合は(ステップS301肯定)、ヒットしたエントリのセクタIDを読み込む(ステップS302)。
次に、L2キャッシュアクセスコントローラ45は、読み取ったセクタIDが「00」または「11」であるか否かを判別する(ステップS303)。そして、L2キャッシュアクセスコントローラ45は、セクタIDが「00」、または、セクタIDが「01」である場合は(ステップS304)、セクタIDが「00」であるか否かを判別する(ステップS304)。
そして、L2キャッシュアクセスコントローラ45は、セクタIDが「00」である場合は(ステップS304肯定)、読み取ったセクタIDを「00」に更新する(ステップS305)。一方、L2キャッシュアクセスコントローラ45は、セクタIDが「00」ではない場合は(ステップS304否定)、セクタIDが「01」であるか否かを判別する(ステップS306)。そして、L2キャッシュアクセスコントローラ45は、セクタIDが「01」である場合は(ステップS306肯定)、読み取ったセクタIDを「01」に更新する(ステップS307)。
一方、L2キャッシュアクセスコントローラ45は、セクタIDが「01」ではない場合は(ステップS306否定)、読み取ったセクタIDを「11」に更新する(ステップS308)。また、L2キャッシュアクセスコントローラ45は、読み取ったセクタIDが「00」または「01」ではない場合は(ステップS303否定)、読み取ったセクタIDを「11」に更新する(ステップS308)。
また、L2キャッシュアクセスコントローラ45は、L2キャッシュヒットしなかった場合は(ステップS301否定)、検索対象となるデータのホームアドレスがCPU12gのアドレスであるか否かを判別する(ステップS309)。そして、L2キャッシュアクセスコントローラ45は、検索対象となるデータのホームアドレスがCPU12gのアドレスである場合は(ステップS309肯定)、ディレクトリ制御部54にデータ補充リクエストを発行する(ステップS310)。
一方、L2キャッシュアクセスコントローラ45は、検索対象となるデータのホームアドレスがCPU12gのアドレスではない場合は(ステップS309否定)、他のCPUにデータ補充リクエストを発行する(ステップS311)。次に、L2キャッシュアクセスコントローラ45は、データ補充のレスポンスを受信すると(ステップS312)、データとともに受信するセクタIDが「00」であるか否かを判別する(ステップS313)。
そして、L2キャッシュアクセスコントローラ45は、受信したセクタIDが「00」である場合は(ステップS313肯定)、セクタIDを「00」に更新し(ステップS314)、処理を終了する。一方、L2キャッシュアクセスコントローラ45は、受信したセクタIDが「00」ではない場合は(ステップS313否定)、受信したセクタIDが「01」であるか否かを判別する(ステップS315)。
そして、L2キャッシュアクセスコントローラ45は、受信したセクタIDが「01」である場合は(ステップS315肯定)、セクタIDを「01」に更新する(ステップS316)。また、L2キャッシュアクセスコントローラ45は、受信したセクタIDが「01」ではない場合は(ステップS315否定)、セクタIDを「11」に更新する(ステップS317)。
その後、L2キャッシュアクセスコントローラ45は、セクタIDを更新した場合は(ステップS305、S307、S308、S314、S316、S317)、以下の処理を実行する。すなわち、L2キャッシュアクセスコントローラ45は、レスポンスとして更新後のセクタIDをL1キャッシュアクセスコントローラ57に応答し(ステップS318)、処理を終了する。
なお、CPU12gは、実施例1に係るCPU12と同様の機能を発揮する。このため、CPU12gは、自身に接続するメモリ17、18の一部を共有メモリ域とし、共有メモリ域のみをフラッシュの対象としても良い。そこで、図26に示したL2キャッシュアクセスコントローラ45の処理のバリエーションとして、共有メモリ域のみをフラッシュの対象とする際に、L2キャッシュアクセスコントローラ45が実行する処理の流れについて説明する。
図27は、共有メモリ域のみをフラッシュ対象とする処理の流れを説明するためのフローチャートである。なお、図27に示す各処理のうち、ステップS301〜ステップS318については、図26に示すステップS301〜ステップS318と同様の処理を実行するものとして、説明を省略する。
例えば、L2キャッシュアクセスコントローラ45は、キャッシュヒットしたエントリのセクタIDが「01」ではなかった場合には(ステップS306否定)、以下の処理を実行する。すなわち、L2キャッシュアクセスコントローラ45は、キャッシュヒットしたエントリのデータが、CPU12gが存在するノード以外のノードからキャッシュしたデータであるか否かを判別する(ステップS319)。
そして、L2キャッシュアクセスコントローラ45は、キャッシュヒットしたデータが他ノードのデータではない場合は(ステップS319否定)、セクタIDを「00」に更新する(ステップS305)。一方、L2キャッシュアクセスコントローラ45は、キャッシュヒットしたデータが他ノードのデータである場合には(ステップS319肯定)、セクタIDを「11」に更新する(ステップS308)。
また、L2キャッシュアクセスコントローラ45は、補充データのセクタIDが「01」ではない場合は(ステップS315否定)、他ノードからキャッシュしたデータであるか否かを判別する(ステップS320)。そして、L2キャッシュアクセスコントローラ45は、他ノードからキャッシュしたデータではないと判別した場合は(ステップS320否定)、セクタIDを「00」に更新する(ステップS314)。また、L2キャッシュアクセスコントローラ45は、他ノードからキャッシュしたデータであると判別した場合は(ステップS320肯定)、セクタIDを「11」に更新する(ステップS317)。
このように、L2キャッシュアクセスコントローラ45は、他ノードからキャッシュしたデータのみをフラッシュの対象とし、CPU12gが存在するノード(以下、自ノードとする)からキャッシュしたデータについてはフラッシュの対象としない。つまり、情報処理システム1dが、CPU12gが自ノードからキャッシュしたデータをフラッシュしたとしても、自ノードが故障した場合は、フラッシュしたデータを用いたリカバリを行えない。そこで、CPU12gは、他ノードからキャッシュしたデータのみをフラッシュの対象とすることで、より効率的なフラッシュ処理を行うことができる。
次に、図28を用いて、フラッシュ対象のウェイに上限がある際にセクタIDを登録する処理の流れについて説明する。図28は、フラッシュ対象のウェイに上限がある際にセクタIDを登録する処理の流れを説明するためのフローチャートである。
なお、図28に示す例では、セクタIDが「00」のデータを登録可能な数をMAX00と記載し、セクタIDが「01」のデータを登録可能な数をMAX01と記載し、セクタIDが「11」のデータを登録可能な数をMAX11と記載した。また、図28に示す例では、現在登録されているセクタIDが「00」のデータの数をNUM00と記載し、現在登録されているセクタIDが「01」のデータの数をNUM01と記載し、現在登録されているセクタIDが「11」のデータの数をNUM11と記載した。なお、MAX01およびMAX11は、セクタ最大値レジスタ58が記憶する値である。
例えば、L2キャッシュアクセスコントローラ45は、格納対象のデータのセクタIDが「11」であるか否かを判別する(ステップS401)。そして、L2キャッシュアクセスコントローラ45は、セクタIDが「11」である場合は(ステップS401肯定)、MAX11の数がNUM11と同じであるか否かを判別する(ステップS402)。
そして、L2キャッシュアクセスコントローラ45は、MAX11の数がNUM11と同じである場合には(ステップS402肯定)、セクタIDが「11」のウェイのいずれかにデータを登録し(ステップS403)、処理を終了する。また、L2キャッシュアクセスコントローラ45は、MAX11の数がNUM11と同じではない場合は(ステップS402否定)、ウェイが満杯であるか否かを判別する(ステップS404)。
次に、L2キャッシュアクセスコントローラ45は、ウェイが満杯である場合は(ステップS404肯定)、MAX00がNUM00以下であるか否かを判別する(ステップS405)。そして、L2キャッシュアクセスコントローラ45は、MAX00がNUM00以下である場合は(ステップS405肯定)、現在のセクタIDが「00」のウェイのいずれかにデータを登録し(ステップS406)、処理を終了する。
一方、L2キャッシュアクセスコントローラ45は、MAX00がNUM00より多い場合は(ステップS405否定)、現在のセクタIDが「01」のウェイのいずれかにデータを登録し(ステップS407)、処理を終了する。また、L2キャッシュアクセスコントローラ45は、ウェイが満杯ではない場合は(ステップS404否定)、空いているウェイにデータを登録し(ステップS408)、処理を終了する。
また、L2キャッシュアクセスコントローラ45は、セクタIDが「11」ではない場合は(ステップS401否定)、ウェイが満杯か否かを判別する(ステップS409)。そして、L2キャッシュアクセスコントローラ45は、ウェイが満杯ではない場合は(ステップS409否定)、空いているウェイにデータを登録し(ステップS408)、処理を終了する。
また、L2キャッシュアクセスコントローラ45は、ウェイが満杯である場合は(ステップS409肯定)、セクタIDが「01」であるか否かを判別する(ステップS410)。そして、L2キャッシュアクセスコントローラ45は、セクタIDが「01」である場合は(ステップS410肯定)、MAX01がNUM01以下であるか否かを判別する(ステップS411)。
そして、L2キャッシュアクセスコントローラ45は、MAX01がNUM01以下である場合は(ステップS411肯定)、現在のセクタIDが「01」のウェイのいずれかにデータを登録し(ステップS412)、処理を終了する。一方、L2キャッシュアクセスコントローラ45は、MAX01がNUM01より多い場合は(ステップS411否定)、現在のセクタIDが「00」のウェイのいずれかにデータを登録し(ステップS413)、処理を終了する。
また、L2キャッシュアクセスコントローラ45は、セクタIDが「01」ではない場合は(ステップS410否定)、MAX00がNUM00以下であるか否かを判別する(ステップS414)。そして、L2キャッシュアクセスコントローラ45は、MAX00がNUM00以下である場合は(ステップS414肯定)、現在のセクタIDが「00」のウェイのいずれかにデータを登録し(ステップS413)、処理を終了する。一方、L2キャッシュアクセスコントローラ45は、MAX00がNUM00より多い場合は(ステップS414否定)、現在のセクタIDが「01」のウェイのいずれかにデータを登録し(ステップS415)、処理を終了する。
このように、L2キャッシュアクセスコントローラ45は、セクタIDが「11」のデータについて、登録可能なウェイの最大数を設定し、ウェイの最大数を超える場合には、リプレースを実行する。また、L2キャッシュアクセスコントローラ45は、ウェイの空きが無い場合は、上限値を超えているセクタIDのデータについてリプレースを行う。
なお、L2キャッシュアクセスコントローラ45は、フラッシュ対象のデータについては、積極的にリプレースを実行することで、メモリに書き戻してもよい。そこで、以下の説明では、図29を用いて、L2キャッシュアクセスコントローラ45が実行する処理のバリエーションについて説明する。
図29は、フラッシュ対象のウェイに上限がある際の処理のバリエーションを説明するためのフローチャートである。なお、図29に示すステップS401〜ステップS415の処理については、図28に示すステップS401〜ステップS415の処理と同様の処理であるものし、説明を省略する。
例えば、L2キャッシュアクセスコントローラ45は、ウェイが満杯であると判別した場合は(ステップS409肯定)、セクタIDが「11」の登録が存在するか否かを判別する(ステップS416)。そして、L2キャッシュアクセスコントローラ45は、セクタID「11」の登録が存在する場合は(ステップS416肯定)、セクタIDが「11」のウェイのいずれかにデータを登録する(ステップS417)。
すなわち、L2キャッシュアクセスコントローラ45は、セクタIDが「11」のウェイのいずれかをリプレースし、メモリ17、18への書き出しを行う。一方、L2キャッシュアクセスコントローラ45は、セクタIDが「11」の登録が存在しない場合は(ステップS416否定)、セクタIDが「01」であるかを判別する(ステップS410)。
図30は、L2キャッシュのセクタIDの遷移を説明するための第1の図である。また、図31は、L2キャッシュのセクタIDの遷移を説明するための第2の図である。L2キャッシュアクセスコントローラ45は、図28、図29に示す処理を実行することで、セクタIDを登録することで、図30、若しくは図31に示すように、L2キャッシュタグ46に登録したセクタIDを遷移させる。なお、図30に示す例では、ライトバックを行う際に対象データのタグのステートを「M」から「I」に示す際のセクタIDの遷移について記載した。また、図31に示す例では、ライトバックを行う際に対象データのタグのステートを「M」から「E」に変更する際のセクタIDの遷移について記載した。
図30に示す例では、L2キャッシュアクセスコントローラ45は、リプレースもしくはインバリッドするまでセクタID「11」を他の値に遷移させない。一方、図31に示す例では、L2キャッシュアクセスコントローラ45は、ステートを「M」から「E」に変更するキャッシュダウングレードを行う場合がある。このため、L2キャッシュアクセスコントローラ45は、キャッシュダウングレードを行う場合には、セクタID「11」をセクタID「00」に遷移させる場合がある。
すなわち、図30、および図31に示すようにセクタIDの値を遷移させることで、L2キャッシュアクセスコントローラ45は、メモリとキャッシュのコヒーレンシの保持が保障されるまで、セクタID「11」を保持する。このため、CPU12gは、フラッシュを適切に行うことができる。
次に、図32を用いて、L2キャッシュアクセスコントローラ45がL2キャッシュ概要セクタフラグ48を設定する処理の流れについて説明する。図32は、L2キャッシュ概要セクタフラグを設定する処理の流れを説明するためのフローチャートである。例えば、L2キャッシュアクセスコントローラ45は、格納するデータのセクタIDが「11」であるか否かを判別する(ステップS501)。
そして、L2キャッシュアクセスコントローラ45は、セクタIDが「11」である場合には(ステップS501肯定)、L2フラッシュ概要セクタフラグ48の読み込みを行う(ステップS502)。詳細には、L2キャッシュアクセスコントローラ45は、データ格納を要求したコアのL2キャッシュ概要セクタフラグ48のうち、データを格納するキャッシュラインのグループのフラグを読み込む。
そして、L2キャッシュアクセスコントローラ45は、読み込んだフラグが「1」であるか否かを判別する(ステップS503)。そして、L2キャッシュアクセスコントローラ45は、読み込んだフラグが「1」ではない場合は(ステップS503否定)、L2キャッシュ概要セクタフラグ48にフラグ「1」をセットし(ステップS504)、処理を終了する。
なお、L2キャッシュアクセスコントローラ45は、セクタIDが「11」ではない場合や(ステップS501否定)、読み込んだフラグが「1」である場合は(ステップS503否定)、そのまま処理を終了する。
次に、図33を用いて、CPU12gがフラッシュを実行する処理の流れについて説明する。図33は、フラッシュを実行する処理の流れを説明するためのフローチャートである。なお、図33に示す例では、L2キャッシュ概要セクタフラグ48のうち、CPU12gが参照するエントリを「i」と記載した。また、図33に示す例では、フラッシュ対象となるキャッシュラインのインデックスを「j」と記載した。また、図33に示す例では、L2キャッシュ47の各キャッシュラインは、128本ごとに、グループ「0」からグループ「63」に組み分けられているものとする。
例えば、図33に示す例では、フラッシュ制御部52は、いずれかのコア40〜40bが実行するアプリケーションがフラッシュ要求を発行したことを契機として(ステップS601)、フラッシュ処理を実行する。まず、フラッシュ制御部52は、「i=0」とする(ステップS602)。
次に、フラッシュ制御部52は、L2キャッシュ概要セクタフラグ48のうち、フラッシュ要求を発行したコアの概要セクタフラグから、「i」番目のエントリを読み出す(ステップS603)。そして、フラッシュ制御部52は、読み出した概要セクタフラグが「1」であるか否か判別し(ステップS604)、読み出した概要セクタフラグが「1」である場合は(ステップS604肯定)、読み出した概要セクタフラグを「0」にリセットする(ステップS605)。
次に、フラッシュ制御部52は、「j=0」とし(ステップS606)、L2キャッシュのインデックス(i,j)に対するフラッシュ要求を発行する(ステップS607)。すなわち、フラッシュ制御部52は、「i」グループに所属する「j」番目のキャッシュラインに対するフラッシュ要求を発行する。すると、L2キャッシュアクセスコントローラ45は、インデックス(i,j)の全ウェイのセクタIDを検査し(ステップS608)、セクタIDが「11」で、ステートが「M」のエントリが存在するか否かを判別する(ステップS609)。
そして、L2キャッシュアクセスコントローラ45は、セクタIDが「11」で、ステートが「M」のエントリを検出すると(ステップS609肯定)、検出したエントリの最若番のウェイのデータをL2キャッシュ47からフラッシュする(ステップS610)。その後、L2キャッシュアクセスコントローラ45は、セクタIDが「11」で、ステートが「M」のエントリがまだ存在するか判別する(ステップS611)。
次に、フラッシュ制御部52は、L2キャッシュアクセスコントローラ45がセクタIDが「11」で、ステートが「M」のエントリがもう存在しないと判別した場合は(ステップS611否定)、「j」の値が「127」であるか否かを判別する(ステップS612)。そして、フラッシュ制御部52は、「j」の値が「127」ではない場合は(ステップS612否定)、jの値を1インクリメントし(ステップS613)、ステップS607の処理を実行する。
一方、フラッシュ制御部52は、jの値が「127」である場合は(ステップS612肯定)、iの値が「63」であるか否かを判別する(ステップS614)。そして、フラッシュ制御部52は、iの値が「63」である場合は(ステップS614肯定)、そのまま処理を終了する。また、フラッシュ制御部52は、「i」の値が「63」ではない場合は(ステップS614否定)、「i」の値を1インクリメントし(ステップS615)、ステップS604の処理を実行する。また、フラッシュ制御部52は、読み出した概要セクタフラグが「1」ではない場合は(ステップS604)、ステップS614の処理を実行する。
次に、図34〜36を用いて、CPU12gが実行するソフトウェアとハードウェアとの動作について説明する。まず、図34を用いて、キャッシュミスが発生した際のソフトウェアとハードウェアの動作について説明する。図34は、ストア時にキャッシュミスが発生した際のソフトウェアとハードウェアの動作を説明するためのシーケンス図である。
まず、アプリケーション35は、Sync Startを発行する(ステップS701)。すると、アプリケーションが示す期間であるセクタフラッシュモードがONとなる(ステップS702)。次に、アプリケーション35は、Storeを発行する(ステップS703)。すると、L1キャッシュ43にはデータが入っていないので、キャッシュミスが発生する(ステップS704)。このため、L1キャッシュアクセスコントローラ57がデータの補充要求であるRead Exを発行する(ステップS705)。この際、L1キャッシュアクセスコントローラ57は、セクタIDは「11」と指定する。
すると、メモリ17〜24からのリードが行われ(ステップS706)、リードデータが出力されるとともに(ステップS707)、L2キャッシュ47にデータがキャッシュされる(ステップS708)。なお、リードデータは、L1キャッシュ43にステートを「M」、セクタIDを「11」として格納される(ステップS709)。続いて、アプリケーション35がSync endを発行する(ステップS710)。すると、セクタフラッシュモードがOFFとなる(ステップS711)。
続いて、フラッシュ制御部52により、セクタフラッシュが実行され(ステップS712)、各キャッシュラインにフラッシュ要求が発行される(ステップS713)。すると、ステップS708にてキャッシュしたデータのステートが「E」でセクタIDが「11」であるため、フラッシュの対象としてヒットする(ステップS714)。この結果、L2キャッシュアクセスコントローラ45からステート「M」でヒットした旨とライトバック要求とが発行される(ステップS715)。
すると、L1キャッシュ43のデータのステートが「I」に変更される(ステップS716)。続いて、L2キャッシュアクセスコントローラ57は、ライトバックを実行し(ステップS717)、L2キャッシュのステートを「I」に変更する(ステップS718)。また、フラッシュ制御部52は、セクタフラッシュが完了すると(ステップS719)、完了応答をアプリケーション35に発行する。
次に、図35を用いて、ストア時にキャッシュヒットした際のソフトウェアとハードウェアとの動作の流れについて説明する。図35は、ストア時にキャッシュヒットした際のソフトウェアとハードウェアの動作を説明するためのシーケンス図である。図35に示す例では、L1キャッシュ43には、ステートが「E」でセクタIDが「00」のデータがキャッシュされている(ステップS801)。
コア40が実行するアプリケーション35は、Sync Startを発行する(ステップS802)。すると、セクタフラッシュモードがONになる(ステップS803)。続いて、アプリケーション35は、Storeを発行する(ステップS804)。
すると、L1キャッシュアクセスコントローラ57は、Storeの対象が、L1キャッシュ43にてヒットするので(ステップS805)、L2キャッシュ47にセクタIDを「11」に変更するよう通知する(ステップS806)。ここで、L2キャッシュ47には、L1キャッシュ43と同様に、ステートが「E」でセクタIDが「00」のデータがキャッシュされている(ステップS807)。このため、L2キャッシュアクセスコントローラ45は、ステートが「E」のデータについて、セクタIDを「11」に変更し(ステップS808)、変更完了通知を発行する(ステップS809)。
続いて、L1キャッシュアクセスコントローラ57は、L1キャッシュ43に格納されたデータのステートを「M」とし、セクタIDを「11」とする(ステップS810)。続いて、アプリケーション35がSync endを発行する(ステップS811)。すると、セクタフラッシュモードがOFFになる(ステップS812)。
その後、フラッシュ制御部52は、セクタフラッシュを実行し(ステップS813)、L2キャッシュ47の各キャッシュラインについてフラッシュを行う(ステップS814)。すると、ステートが「E」でセクタIDが「11」のキャッシュがヒットする(ステップS815)。この結果、L2キャッシュアクセスコントローラ45は、ステート「M」がヒットした応答とライトバック要求とを発行する(ステップS816)。
すると、L1キャッシュアクセスコントローラ57は、キャッシュヒットしたデータのステートを「M」から「I」に変更する(ステップS817)。続いて、L2キャッシュアクセスコントローラ45も、キャッシュヒットしたデータのステートを「M」から「I」に変更し(ステップS818)、その後、メモリ17〜24にライトバックする(ステップS819)。また、フラッシュ制御部52は、セクタフラッシュ実行後に、セクタフラッシュが完了した旨の応答をアプリケーション35に発行する(ステップS820)。
次に、図36を用いて、コンテキストスイッチが発生した際のソフトウェアとハードウェアとの動作の流れについて説明する。図36は、コンテキストスイッチが発生した際のソフトウェアとハードウェアの動作を説明するためのシーケンス図である。図36に示す例では、L1キャッシュ43には、ステートが「E」でセクタIDが「00」のデータがL1キャッシュ43とL2キャッシュ47とに格納されている(ステップS901、ステップS902)。
コア40が実行するアプリケーション35は、Sync Startを発行する(ステップS903)。すると、セクタフラッシュモードがONになる(ステップS904)。続いて、アプリケーション35は、Storeを発行する(ステップS905)。
すると、L1キャッシュアクセスコントローラ57は、Storeの対象が、L1キャッシュ43にてヒットするので(ステップS906)、L2キャッシュ47にセクタIDを「11」に変更するよう通知する。このため、L2キャッシュアクセスコントローラ45は、ステートが「E」のデータについて、セクタIDを「11」に変更し(ステップS907)、変更完了通知を発行する(ステップS908)。また、L1キャッシュアクセスコントローラ57は、ステート「M」のデータのセクタIDを「11」に変更する(ステップS909)。
ここで、割り込み命令が発行される(ステップS910)、ドライバ33は、コンテキストスイッチを実行し、レジスタの値をメモリ17、19、21、23に格納するコンテキストストアを実行する(ステップS911)。また、ドライバ33は、コンテキストストアが発生した場合にはセクタフラッシュモードのOFFを待たずに、セクタフラッシュを要求するので、フラッシュ制御部52は、セクタフラッシュを実行する(ステップS912)。また、フラッシュ制御部52は、セクタIDが「11」のデータを含むキャッシュラインについてフラッシュを行い(ステップS913)、セクタIDが「11」のデータがヒットする(ステップS914)。
この結果、L2キャッシュアクセスコントローラ45は、ステート「M」がヒットした応答とライトバック要求とを発行する(ステップS915)。すると、L1キャッシュアクセスコントローラ57は、キャッシュヒットしたデータのステートを「M」から「I」に変更し(ステップS916)、メモリ17〜24にライトバックを行う(ステップS917)。また、L2キャッシュアクセスコントローラ45は、キャッシュヒットしたデータのステートを「M」から「I」に変更する(ステップS918)。
また、フラッシュ制御部52は、セクタフラッシュ実行後に、セクタフラッシュが完了した旨の応答をアプリケーション35に発行する(ステップS919)。するとオペレーティングシステム32は、アプリケーション2を呼び出し(ステップS920)、割り込みが発生する(ステップS921)。すると、ドライバ33は、コンテキストロードを実行する(ステップS922)。
続いて、アプリケーション35がSync endを発行すると(ステップS923)、セクタフラッシュモードがOFFとなる(ステップS924)。そして、フラッシュ制御部52が、セクタフラッシュを実行し(ステップS925)、その後、フラッシュを発行する(ステップS926)。その後、フラッシュ制御部52は、セクタフラッシュ完了通知を発行する(ステップS927)。
[実施例5の効果]
上述したように、CPU12gは、アプリケーション35が指定した期間内に更新したデータにセクタID「11」を付して記憶する。そして、CPU12gは、アプリケーション35が指定した期間が終了すると、セクタIDが「11」のデータのみをL2キャッシュ43からメモリ17〜24に書き戻すフラッシュを実行する。
このため、CPU12は、アプリケーション35のプログラムの修正を抑えることができる。また、CPU12は、データの書き戻しの処理時間を短縮するとともに、情報処理システム1の性能劣化を防ぐことができる。
また、CPU12gは、各コア40〜40bごとに、アプリケーション35が指定した期間内にデータが更新されたか否かを示すL2キャッシュ概要セクタフラグを複数のキャッシュラインごとに有する。そして、CPU12gは、フラッシュ要求が発行されると、フラッシュ要求を発行したコアごとに、L2キャッシュ概要セクタフラグが「1」であるグループのキャッシュラインを検査する。
その後、CPU12gは、検査したキャッシュラインのうち、セクタIDが「11」のデータをメモリ17〜24に書き戻す。このため、CPU12gは、キャッシュメモリ12aが有する全てのキャッシュラインを検査せずとも、アプリケーション35が指定した期間内に更新されたデータをメモリ17〜24に書き戻すことができる。また、CPU12gは、複数のコアを有する場合にも、効率良くフラッシュを実行することができる。
また、CPU12gは、コンテキストスイッチが発生した場合には、アプリケーションが指定した期間が終了する前にフラッシュを実行し、アプリケーションが指定した期間が終了した後に、再度フラッシュを実行する。このため、CPU12gは、コンテキストスイッチ機能を有し、各コア40〜40bが実行するアプリケーションがその都度変わる場合にも、効率よくフラッシュを実行できる。