以下の実施例1では、図1を用いて、複数のノードを有する情報処理システムの一例について説明する。図1は、実施例1に係る情報処理システムの一例を説明するための図である。図1に示す例では、情報処理システム1は、XB(クロスバスイッチ)2と複数のビルディングブロック10〜10eとを有する。XB2は、各ビルディングブロック10〜10eを相互に接続するクロスバスイッチである。また、XB2は、後述する各ビルディングブロック10〜10eが有する各サービスプロセッサのマスターとなる不図示のサービスプロセッサを有する。なお、少数のノードが接続される小規模構成の場合、XB2を介さずに、ビルディングブロック同士を直接接続しても良い。
また、ビルディングブロック10は、複数のCPU(Central Processing Unit)21〜21cと複数のメモリ22〜22cとを有する。また、他のビルディングブロック10a〜10eも、ビルディングブロック10と同様の構成を有するものとし、以下の説明を省略する。なお、図1に示す例では、CPU21b、21cおよびメモリ22b、22cについては、記載を省略した。また、各ビルディングブロック内には、不図示のI/O(Input Output)装置が設けられている。ここで、本実施例では、CPU間のキャッシュコヒーレンス制御をディレクトリ方式で実現し、データをメモリ上に持つ後述のホームCPUが該当ディレクトリを管理している。
各ビルディングブロック10〜10eは、それぞれ独立してOSを動作させる。すなわち、各CPU21〜21cは、それぞれ独立してOSを実行する。各ビルディングブロック10〜10eが実行するOSは、ビルディングブロック毎に異なるパーティションで動作する。ここで、パーティションとは、同一のOSが動作し、動作しているOSから見て1つのシステムとして動作するビルディングブロックの群を示す。
例えば、ビルディングブロック10〜10aがパーティション#Aとして動作し、ビルディングブロック10b〜10dがパーティション#Bとして動作する。このような場合には、ビルディングブロック10が動作させるOSは、ビルディングブロック10、10aが1つのシステムとして動作していると識別し、ビルディングブロック10bが動作させるOSは、ビルディングブロック10b〜10dが1つのシステムとして動作していると識別する。
次に、図2を用いて、ビルディングブロックの構成例について説明する。図2は、実施例1に係るビルディングブロックの機能構成を説明するための図である。図2に示す例では、ビルディングブロック10は、ノード20、サービスプロセッサ24、XB接続部27、27a、PCIe(Peripheral Component Interconnect Express)接続部28を有する。
ノード20は、複数のCPU21〜21cと、複数のメモリ22〜22cと、通信部23とを有する。
サービスプロセッサ24は、制御部25と、通信部26とを有する。また、図2に示す例では、各CPU21〜21cは、相互に接続されるとともに、通信部23と接続されている。また、各メモリ22〜22cは、各CPU21〜21cと接続されている。サービスプロセッサ24は、不図示のLAN(Local Area Network)などのネットワーク回線を介してサーバの管理者端末に接続され、管理者端末からの指示を受けてノードまたはビルディングブロック10内の各種設定変更などの制御を行う。
また、各CPU21〜21cは、XB接続部27またはXB接続部27aと接続されている。なお、XB接続部27、27aは、同一のXB接続部であってもよい。また、各CPU21〜21cは、PCIe接続部28と接続されている。また、通信部23は、サービスプロセッサ24が有する通信部26と接続されている。なお、制御部25、通信部26、通信部23、各CPU21〜21cは、例えば、I2C(Inter-Integrated Circuit)で接続されている。
CPU21〜21cは、アプリケーションを実行する演算処理装置である。また、各CPU21〜21cには、それぞれメモリ22〜22cが接続されている。また、各CPU21〜21cは、実行中のアプリケーションが共有メモリの割当てを要求した場合には、相互に通信を行い、アプリケーションが使用する共有メモリの割当てを行う。また、各CPU21〜21cは、各メモリ22〜22cや、他のビルディングブロック10a〜10eが有するメモリの一部を共有メモリとして利用する。
図3は、共有メモリ実体が割り当てられたノードに、他のノードがアタッチする場合のメモリマップの一例を示す図である。図3の例では、メモリ実体を所有するノード(これをホームノードと称する)に、共有メモリが割り当てられると、ホームノードはこれを一定の領域サイズに分割する。この分割単位をセグメント(segment)と称するが、セグメントに分割する事は必須ではない。他のノードが当該ホームノードが所有する共有メモリの割り当てを要求する場合、すなわちアタッチする事で、当該ホームノードの共有メモリを使用することができる。このリモートノードが使用するメモリ領域を共有メモリイメージ領域と称する。この共有メモリイメージ領域は、単独のリモートノードがアタッチしても良いし、複数のリモートノードがアタッチしても良い。
図2に戻り、各CPU21〜21cは、物理アドレスと、物理アドレスが割り振られたメモリと接続されたCPUの識別子であるCPUID(identification)とを対応付けたノードマップを有する。なお、このCPUIDはシステム1で一意に決定され、重複しない。
各CPU21〜21cは、ノードマップを用いて、他のCPUと通信を行う。例えば、CPU21は、アクセス対象となる物理アドレスと対応付けられたCPUIDが、CPU21〜21cとは異なるCPUを示す場合には、XB接続部27、またはXB接続部27a、およびXB2を介して他のノードにメモリアクセスのリクエストを送信する。また、CPU21は、自身と接続されたメモリに対するリクエストを他のノードから受信した場合には、リクエストの対象となるデータを自身と接続されたメモリ22から読出し、リクエスト元へ送信する。他のCPU21a〜21cも同様の処理を行う。
また、各CPU21〜21cは、TLB(Translation Lookaside Buffer)を用いたアドレス変換を行うとともに、TLBミスが発生した際に、トラップ処理を実行するなど、従来のCPUと同様の処理を実行する機能も有する。
また、各CPU21〜21cは、ノード間のデータ転送の異常(エラー)を検出する。ノード間のデータ転送の異常を検出する方法の一例について説明する。例えば、各CPU21〜21cは、リクエストを送信してからの時間を計測する。続いて、リクエスト(要求)を送信してからレスポンス(応答)を受信する前に、リクエストを送信してからの時間が、所定時間を超えた場合には、タイムアウトになったため、各CPU21〜21cは、ノード間のデータ転送の異常を検出する。また、各CPU21〜21cは、リクエストに対して他のノードから否定応答が返って来た場合も異常を検出する。
そして、異常を検出した場合には、各CPU21〜21cは、様々な処理を行う。例えば、異常の発生の原因となったノード(例えば、ダウンしたノード)によって、各メモリ22〜22cの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされない場合には、各CPU21〜21cは、次のような処理を行う。すなわち、各CPU21〜21cは、キャッシュの状態を示すディレクトリに、ダウンしたノードによって、各メモリ22〜22cの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされなかった異常を示す値を書き込む。また、異常を検出し、異常の発生の原因となったノードによって、各メモリ22〜22cの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされない場合には、各CPU21〜21cは、次のような処理を行うこともできる。すなわち、各CPU21〜21cは、ダウンしたノードによってキャッシュデータがライトバックされる各メモリ22〜22cの共有メモリの領域に、エラー状態を示すデータを書き込むこともできる。これらの処理により、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
また、後述のホームCPUにライトバックの要求が届かないケースでは、後述のローカルCPUがホームCPUからの後述のタイムアウトを検出することで、トランザクション失敗を認識する。この場合、ローカルCPUは、該当データを破棄する。ホームCPUが管理するディレクトリ上はローカルCPUがデータをキャッシュに持ち出した状態のままであるので、ホームCPUから「MoveOut」要求が発生する。この「MoveOut」要求は、ローカルCPUでキャッシュミスが発生するが、この「MoveOut」要求に対してエラー応答を返し、ホームCPUにあるディレクトリの状態を異常に更新、すなわち、上述したエラー状態を示すデータを書き込む。
また、エラー発生アドレスレジスタに、ダウンしたノードの共有メモリの物理アドレス(Physical Address;PA)が書き込まれた場合には、トラップ(割込み)が発生する。すなわち、エラー発生アドレスレジスタに、物理アドレスが書き込まれた場合には、各CPU21〜21cは、トラップ処理を行う。このトラップ処理では、例えば、シグナルハンドラにシグナルが送信される。
ここで、シグナルハンドラは、シグナルを受信すると起動される。シグナルハンドラによる処理では、様々な処理が行われる。例えば、シグナルハンドラによる処理では、ダウンしたノードに「共有メモリ実体」が存在する場合に、「共有メモリイメージ」をデタッチ、すなわち、ダウンしたノードが有する共有メモリの割当ての解除が行われる。また、シグナルハンドラによる処理では、他のノードがダウンしたことを検出したノードのメモリの共有メモリに対するリカバリ処理を行う。リカバリ処理の一例としては、共有メモリにライトバックされるキャッシュデータがライトバックされなかった異常を示す値を、ディレクトリからクリアする処理が挙げられる。また、リカバリ処理の他の一例としては、エラー状態を示すデータを、共有メモリからクリアする処理が挙げられる。
メモリ22〜22cは、情報処理システム1が有する全てのCPUが共用するメモリである。また、情報処理システム1においては、全てのビルディングブロック10〜10eが有するメモリに対して、各ビルディングブロック10〜10eのサービスプロセッサが、同一の物理アドレス空間にマッピングされる物理アドレスを振分ける。すなわち、情報処理システム1が有するすべてのメモリのうち、少なくとも共有メモリとして使用されるメモリには、重複しない値の物理アドレスが割当てられている。
また、メモリ22〜22cは、記憶領域の一部を、情報処理システム1が有する全てのCPUが共用する共有領域とし、他の部分を、自身にアクセスするCPU21〜21cがカーネルデータやユーザデータを格納するローカル領域、他ノードとの共有メモリを介したやり取りとは無関係なI/O装置が利用するI/O領域とする。
制御部25は、ビルディングブロック10の制御を行う。例えば、制御部25は、ビルディングブロック10の電源管理や、ビルディングブロック10内の異常の監視や制御等を実行する。また、制御部25は、他のビルディングブロック10a〜10eが有するサービスプロセッサと、不図示のネットワークによって接続されており、各ビルディングブロック10a〜10e間で連係した制御を実行する。また、制御部25は、各CPU21〜21cが実行するOSと通信を行うことができる。
また、制御部25は、通信部26と通信部23を介して、各CPU21〜21cにアクセスする。そして、制御部25は、各ビルディングブロック10〜10eが有するノードマップの更新や制御等を実行する。
なお、通信部23は、サービスプロセッサ24が有する通信部26を介して、制御部25による制御信号を各CPU21〜21cに伝達する。また、通信部26は、制御部25による制御信号をノード20が有する通信部23に伝達する。また、XB接続部27、27aは、各CPU21〜21cをXB2と接続し、各ビルディングブロック10〜10eが有するCPU間の通信を中継する。また、PCIe接続部28は、各CPU21〜21cによるI/O装置へのアクセスを中継する。
次に、図4を用いて、各CPU21〜21cが有する機能構成について説明する。図4は、実施例1に係るCPUの機能構成を説明するための図である。なお、CPU21a〜21cは、CPU21と同様の機能を有するため、説明を省略する。また、図4に示す例では、サービスプロセッサ24とCPU21とを接続する接続部23、26については、記載を省略した。
図4に示す例では、CPU21は、演算処理部30、ルータ40、メモリアクセス部41、PCIe制御部42を有する。また、演算処理部30は、演算部31、L1(Level 1)キャッシュ32、L2(Level 2)キャッシュ33、ノードマップ34、アドレス変換部35、キャッシュディレクトリ管理部36、パケット制御部37、エラー発生アドレスレジスタ96、トラップ発生部97を有する。なお、ルータ40、メモリアクセス部41、PCIe制御部42などの各部を同一のCPU21の内部に含めなくても良い。
また、パケット制御部37は、パケット生成部37a、パケット受信部37b、異常検出部37cを有する。また、PCIe制御部42は、リクエスト生成部42a、PCIeバス制御部42b、異常検出部42cを有する。
まず、演算処理部30が有するノードマップ34について説明する。ノードマップ34は、物理アドレスと、物理アドレスが示す記憶領域を有するメモリと接続されたCPUのCPUIDとが対応付けて登録されるテーブルである。以下、ノードマップ34に登録される情報の例を、図面を用いて説明する。
図5は、実施例1に係るノードマップのデータ構成の一例を説明するための図である。図5に示す例では、ノードマップ34は、「アドレス」、「バリッド」、「ノードID」、「CPUID」の各項目の登録内容を対応付けたエントリを有する。ここで、各エントリの「アドレス」の項目には、連続する複数の物理アドレスを含むアドレス域を示す情報が格納される。
例えば、情報処理システム1は、全てのメモリに対して振り分けた物理アドレス空間を均等な大きさのアドレス域に分割し、各アドレス域に#0、#1、#2等の識別子を付与する。そして、情報処理システム1は、各アドレス域を示す識別子を、ノードマップ34が有する各エントリの「アドレス」に登録する。図5の例は、1番目のエントリの「アドレス」の項目に、#0の識別子が登録された場合を示す。また、図5の例は、2番目のエントリの「アドレス」の項目に、#1の識別子が登録された場合を示す。また、図5の例は、3番目のエントリの「アドレス」の項目に、#2の識別子が登録された場合を示す。
また、各エントリの「バリッド」の項目には、物理アドレスが示す記憶領域にアクセスすることができるか否かを示すバリッドビットが登録される。例えば、物理アドレスが示す記憶領域が、各CPUで共有される共有領域である場合には、アクセスを行う事ができる旨のバリッドビット(例えば「1」)が登録される。図5の例は、1番目のエントリの「バリッド」の項目に、バリッドビット「1」が登録された場合を示す。また、図5の例は、2番目のエントリの「バリッド」の項目に、バリッドビット「1」が登録された場合を示す。また、図5の例は、3番目のエントリの「バリッド」の項目に、物理アドレスが示す記憶領域にアクセスすることができないことを示すバリッドビット「0」が登録された場合を示す。
また、各エントリの「ノードID」の項目には、物理アドレスが振り分けられたメモリが存在するノードを示す識別子が登録される。図5の例は、1番目のエントリの「ノードID」の項目に、ノードを示す識別子「1」が登録された場合を示す。また、図5の例は、2番目のエントリの「ノードID」の項目に、ノードを示す識別子「1」が登録された場合を示す。
また、各エントリの「CPUID」の項目には、物理アドレスが振り分けられたメモリと接続されたCPUを示す識別子が登録される。すなわち、ノードマップ34は、アクセス対象となる物理アドレスが、どのCPUと接続されたメモリの物理アドレスであるかを示す。図5の例は、1番目のエントリの「CPUID」の項目に、CPUを示す識別子「4」が登録された場合を示す。また、図5の例は、2番目のエントリの「CPUID」の項目に、CPUを示す識別子「5」が登録された場合を示す。
なお、ノードマップ34には、アクセス対象となる物理アドレスがどのCPUと接続された物理アドレスであるかを示すことができれば、本実施例以外の任意の形式で情報を登録することとしてよい。
図4に戻って、演算部31は、演算処理を実行し、OS(Operating System)やアプリケーションを実行する演算装置のコアである。また、演算部31は、データのリード(読み込み)や、ライト(書き込み)を行う場合には、リード対象またはライト対象となるデータが格納された記憶領域の論理アドレス(Virtual Address;VA)をアドレス変換部35に出力する。
L1キャッシュ32は、演算部31で頻繁に利用されるデータを一時的に記憶するキャッシュメモリである。L2キャッシュ33は、L1キャッシュ32と同様に、頻繁に利用されるデータを一時的に記憶するが、L1キャッシュ32よりも記憶容量が大きく、データを読み書きする速度が低速なキャッシュメモリである。ここで、ディレクトリ情報は、キャッシュディレクトリ管理部36に記憶されており、メモリ22の各記憶領域に記憶されたデータをキャッシュしたCPUや、キャッシュされたデータの更新状況を示す情報である。なお、以下の説明では、「ディレクトリ情報」を単に「ディレクトリ」と表記する場合がある。このディレクトリによるキャッシュメモリ管理方法は、ccNUMA(Cache Coherent Non-Uniform Memory)システムでよく利用される技術であるが、ccNUMA技術、ディレクトリ技術の両方とも公知の技術であるので、ここでは詳しく説明しない。また、図4ではディレクトリ36aはキャッシュディレクトリ管理部36に内蔵されているが、メモリ22の記憶領域の一部にディレクトリ情報を記録する事も可能である。
アドレス変換部35は、TLB35aを有する。TLB35aには、論理アドレスと物理アドレスとを対応付けたエントリが登録される。アドレス変換部35は、TLB35aを用いて、演算部31が出力した論理アドレスを物理アドレスに変換する。例えば、アドレス変換部35は、演算部31から取得した論理アドレスに対応する物理アドレスをTLB35aから検索し、検索した結果、物理アドレスが得られた場合には、得られた物理アドレスをキャッシュディレクトリ管理部36に出力する。なお、アドレス変換部35は、TLBミスが発生した場合は、トラップ処理を実行する。ここで、OSなどのシステムソフトウェアは、TLBミスした物理アドレスと論理アドレスの組をTLB35aに登録する。ただし、かかる組の登録が禁止された物理アドレスについては、TLBミスが発生した場合であっても、OSなどのシステムソフトウェアにより、物理アドレスと論理アドレスとの組がTLB35aに登録されない。
ここで、OSやアドレス変換部35などは、演算部31が実行するアプリケーションから共有メモリへの割当てを要求された場合には、次のような処理を実行する。すなわち、TLBミスが発生した場合、OSなどのシステムソフトウェアなどは、エントリをTLB35aに登録する。また、TLBミスが発生しない場合には、既にエントリがTLB35aに登録済みであるので、アドレス変換部35は、論理アドレスから物理アドレスへの変換を行う。
また、アドレス変換部35やOSは、アプリケーションやOSからローカル領域の割当を要求された場合は、次のような処理を実行する。すなわち、TLBミスが発生した場合、OSなどのシステムソフトウェアは、CPU21専用のローカル領域にアクセスするための論理アドレスと、ローカル領域に割当てられる範囲の物理アドレスとを対応付けたエントリをTLB35aに登録する。
また、OSなどは、異常が発生したノードの共有メモリの物理アドレスを含むエントリをTLB35aから削除する。
キャッシュディレクトリ管理部36は、ディレクトリ36aを有する。キャッシュディレクトリ管理部36は、キャッシュデータおよびディレクトリの管理を行う。キャッシュディレクトリ管理部36は、アドレス変換部35から、演算部31が出力した論理アドレスを変換した物理アドレスを取得する。
そして、キャッシュディレクトリ管理部36は、アドレス変換部35から物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、ディレクトリ36aを用いて、取得した物理アドレスに格納されたデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされているか否かを判定する。
そして、キャッシュディレクトリ管理部36は、取得した物理アドレスに格納されたデータがキャッシュされていると判定した場合には、キャッシュされているデータを演算部31に出力する。また、キャッシュディレクトリ管理部36は、取得した物理アドレスに格納されたデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされていない場合は、次のような処理を実行する。まず、キャッシュディレクトリ管理部36は、ノードマップ34を参照し、取得した物理アドレスを含む範囲のエントリを識別する。そして、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDであるか否かを判定する。その後、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDである場合は、メモリアクセス部41に、物理アドレスを出力する。
また、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDではない場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDとノードIDとを取得する。そして、キャッシュディレクトリ管理部36は、パケット制御部37に対して、取得したCPUIDと物理アドレスとを出力する。
また、キャッシュディレクトリ管理部36は、出力した物理アドレスが示す記憶領域に格納されているデータをメモリアクセス部41やパケット制御部37から取得した場合には、取得したデータをL1キャッシュ32およびL2キャッシュ33に格納する。そして、キャッシュディレクトリ管理部36は、L1キャッシュ32にキャッシュさせたデータを演算部31に出力する。
また、キャッシュディレクトリ管理部36は、パケット制御部37から物理アドレスを取得した場合、すなわち、他のCPUやI/O装置からのメモリアクセスのリクエストの対象となる物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、ノードマップ34を参照して、取得した物理アドレスがローカル領域に振り分けられた物理アドレスであるか否かを判定する。
取得した物理アドレスがローカル領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部36は、パケット制御部37に対して、リクエスト元に否定応答(アクセスエラー)を送信するように指示する。
また、取得した物理アドレスが共有領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部36は、取得した物理アドレスが示す記憶領域に記憶されたデータを取得し、取得したデータをパケット制御部37に出力し、リクエスト元へ送信するよう指示する。
また、キャッシュディレクトリ管理部36は、ディレクトリ方式を用いて、キャッシュしたデータのコヒーレンシを保持する処理を合わせて実行する。例えば、キャッシュディレクトリ管理部36は、メモリ22に格納されたデータをリクエスト送信元のCPUに送信させる場合には、当該データがリクエスト送信元のCPU以外の他のCPUがキャッシュしているか否かを判定する。
そして、キャッシュディレクトリ管理部36は、リクエストの対象となるデータを他のCPUがキャッシュしていない場合は、L1キャッシュ32、L2キャッシュ33、メモリ22からリクエストの対象となるデータを取得する。その後、キャッシュディレクトリ管理部36は、取得したデータをパケット制御部37に出力する。
一方、キャッシュディレクトリ管理部36は、リクエストの対象となるデータを他のCPUがキャッシュしている場合は、イリノイプロトコル等の手法を用いて、キャッシュコヒーレンスを保持するための処理を実行する。例えば、キャッシュディレクトリ管理部36は、キャッシュされたデータの状態がMESI(Modified/Exclusive/Shared/Invalid)のいずれであるかを判定する。
そして、キャッシュディレクトリ管理部36は、判定結果に応じて、他のCPUが有するキャッシュディレクトリ管理部とコヒーレンシを保持するためのリクエストやオーダー(命令)の送受信を行い、キャッシュされたデータの状態に応じた処理を実行する。ここで、「Modified」とは、いずれか1つのCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されている状態を示す。なお、キャッシュされたデータの状態が「Modified」である場合には、ライトバックを実行する必要がある。
また、「Exclusive」とは、いずれか1つのCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていない状態を示す。また、「Shared」とは、複数のCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていないことを示す。また、「Invalid」とは、キャッシュのステータスが登録されていないことを示す。
詳細な例を挙げると、キャッシュディレクトリ管理部36は、ステータスがM(Modified)であるデータをキャッシュしたCPUに対してライトバックを指示するオーダーを送信するようパケット生成部37aに指示する。そして、キャッシュディレクトリ管理部36は、データのステータスを更新し、更新後のステータスに応じた処理を実行する。なお、キャッシュディレクトリ管理部36が送受信するリクエストやオーダーの種別については、後述する。
また、キャッシュディレクトリ管理部36は、ノード間のデータ転送の異常が検出された場合に、異常の発生の原因となったノードによって、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされないときには、次の処理を行う。すなわち、キャッシュディレクトリ管理部36は、ダウンしたノードによって、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常を示す値をディレクトリ36aの所定の領域に書き込む。
図6は、ディレクトリのデータ構成の一例を説明するための図である。図6に示すように、ディレクトリ36aは、0ビット目から3ビット目までの4ビットの「UE」の項目を有する。また、ディレクトリ36aは、4ビット目から66ビット目までの63ビットの「PRC」の項目を有する。また、ディレクトリ36aは、67ビット目から68ビット目までの2ビットの「CKBIT」の項目を有する。「CKBIT」の項目には、キャッシュの状態をコード化したデータが登録される。「PRC」の項目には、キャッシュを保持しているCPUの位置をビットマップで表したデータが登録される。「UE」の項目には、ディレクトリの異常と異常の原因を表したデータが登録される。
ここで、図6の例に示すディレクトリ36aをキャッシュディレクトリ管理部36が有する場合について説明する。この場合に、異常が検出され、異常の発生の原因となったノードによって、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされないときには、キャッシュディレクトリ管理部36は、次の処理を行う。すなわち、キャッシュディレクトリ管理部36は、ダウンしたノードによって、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常と、原因とを示す4ビット以下の値をディレクトリ36aの「UE」の項目に書き込む。これにより、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
また、キャッシュディレクトリ管理部36は、ノード間のデータ転送の異常が検出され、異常の発生の原因となったノードによって、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされない場合には、次の処理を行うこともできる。すなわち、キャッシュディレクトリ管理部36は、ダウンしたノードによってキャッシュデータがライトバックされるメモリ22の共有メモリの領域に、エラー状態を示すデータを書き込むこともできる。ここで、共有メモリの領域に書き込まれるエラー状態を示すデータの一例について説明する。例えば、メモリ22に記憶されるデータに、所定のビット数ごとに、ECC(Error Check and Correct)データが含まれている場合に、ECCの生成多項式によっては、2ビット以上の誤り訂正をおこなうことができる。この場合に、他のエラーと比較して発生の可能性の低いn(n≧2)ビット以上のエラーを示す特定の値のシンドロームを、共有メモリの領域に書き込まれるエラー状態を示すデータとすることができる。また、データ本体に書き込んだ場合に、シンドロームが特定の値となるような値を、共有メモリの領域に書き込まれるエラー状態を示すデータとすることができる。これにより、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
また、キャッシュディレクトリ管理部36は、メモリ22の共有メモリに対するリカバリ処理を行う。リカバリ処理の一例としては、共有メモリにライトバックされるキャッシュデータがライトバックされなかった異常を示す値を、ディレクトリ36aからクリアする処理が挙げられる。また、リカバリ処理の他の一例としては、エラー状態を示すデータを、共有メモリからクリアする処理が挙げられる。このリカバリ処理は、後述する通り、OSやアプリケーションソフトウェアの指示により行われる。
パケット生成部37aは、キャッシュディレクトリ管理部36から物理アドレスと、CPUIDとを取得した場合には、取得した物理アドレスと、CPUIDとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。そして、パケット生成部37aは、生成したパケットをルータ40に送信する。
図7は、実施例1に係るCPUが送信するパケットを説明するための図である。図7に示す例では、パケット生成部37aは、CPUIDと、物理アドレスと、リクエストの内容を示すデータとを含むリクエストを生成し、生成したリクエストをルータ40に出力する。このような場合には、ルータ40は、パケット生成部37aが生成したリクエストを、XB接続部27を介してXB2に出力する。すると、XB2は、リクエストに含まれるCPUIDが示すCPUへとリクエストを転送する。
なお、パケット生成部37aは、キャッシュディレクトリ管理部36からコヒーレンシを保持するためのリクエストやオーダーの発行の指示を受付けた場合には、指示されたリクエストやオーダーを生成する。そして、パケット生成部37aは、生成したリクエストやオーダーをルータ40、XB接続部27、XB2を介して、指示されたCPUに送信する。また、パケット生成部37aは、I/O装置からデータを取得する場合は、I/Oに対するアクセス要求をルータ40に出力する。
また、パケット生成部37aは、リクエストを送信すると、リクエストを送信したことを示すデータを異常検出部37cに出力する。このデータには、送信したリクエストの種類、アクセス対象のメモリの物理アドレスなどリクエストに関する情報が含まれている。
パケット受信部37bは、XB2、XB接続部27、ルータ40を介して、他のCPUや自ノード以外の他のI/O装置が出力したパケットを受信すると、受信したパケットに含まれる物理アドレスを取得する。そして、パケット受信部37bは、取得した物理アドレスをキャッシュディレクトリ管理部36に出力する。また、パケット受信部37bは、他のCPUが送信したデータを受信した場合には、受信したデータをキャッシュディレクトリ管理部36に出力する。
また、パケット受信部37bは、コヒーレンシを保持するためのリクエストやオーダーを受信した場合には、受信したリクエストやオーダーをキャッシュディレクトリ管理部36に出力する。また、パケット受信部37bは、I/O装置に対するアクセス要求の応答やデータをルータ40から受信した場合は、受信した応答やデータをキャッシュディレクトリ管理部36に出力する。このような場合には、キャッシュディレクトリ管理部36は、例えば、取得したデータをメモリアクセス部41に出力し、メモリ22に格納される処理を行う。
また、パケット受信部37bは、パケット生成部37aにより送信されたリクエストに対応するレスポンスを受信すると、レスポンスを受信したことを示すデータを異常検出部37cに出力する。このデータには、受信したレスポンスの種類などレスポンスに関する情報が含まれている。
異常検出部37cは、ポインタ80、タイマ81、送信パケット82、PA83、リクエスト84、検出部85を有する。
異常検出部37cは、パケット生成部37aからリクエストを送信したことを示すデータを受信するたびに、時間を計測するためのタイマ81を起動させる。また、異常検出部37cは、パケット受信部37bからレスポンスを受信したことを示すデータを受信するたびに、タイマ81を起動させる。また、異常検出部37cは、パケット生成部37aからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストに含まれるアクセス対象のメモリの物理アドレスをPA83に記憶させる。また、異常検出部37cは、パケット生成部37aからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストをリクエスト84に記憶させる。
また、異常検出部37cは、パケット生成部37aからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストの識別子を送信パケット82に登録する。
また、異常検出部37cは、パケット受信部37bからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストに含まれるアクセス対象のメモリの物理アドレスをPA83から削除する。また、異常検出部37cは、パケット受信部37bからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストをリクエスト84から削除する。また、異常検出部37cは、パケット受信部37bからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストの識別子を送信パケット82から削除する。図8は、送信パケットの一例を示す図である。例えば、レスポンスが返ってきていないリクエストの数がN個である場合には、図8の例に示す送信パケット82には、パケット1管理用エントリからパケットN管理用エントリまでの各エントリに、N個のリクエストの識別子のそれぞれが登録される。
また、ポインタ80は、送信パケット82に登録された各識別子が示す各リクエストのうち、送信時刻が最も古いリクエストを指す。例えば、図8の例では、ポインタ80は、パケット1管理用エントリに登録された識別子が示すリクエストを指す。
検出部85は、タイマ81の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、検出部85は、ポインタ80が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード20と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、検出部85は、ポインタ80が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをPA83から取得し、取得した物理アドレスを、エラー発生アドレスレジスタ96に書き込む。
トラップ発生部97は、エラー発生アドレスレジスタ96に物理アドレスが書き込まれると、トラップを発生する。なお、リクエスト/オーダが「データのメモリへのストア(格納)」、または「キャッシュのリプレイスによるライトバック」の場合はトラップを発生させず、上述した異常を示すデータの書き込みのみ行い、データのCPUへのロード時に異常を検出することとしても良い。ここで、上述した「異常を示すデータの書き込み」とは、異常と、原因とを示す4ビット以下の値をディレクトリ36aの「UE」の項目に書き込むことや、メモリ22の共有メモリの領域に、エラー状態を示すデータを書き込むことを指す。
このように、異常検出部37cでは、1つのタイマで時間を計測するので、リクエストごとにタイマを設ける場合と比較して、レスポンスが返ってきていないリクエストの数が複数の場合には、少ない数のタイマで時間を計測することができる。
なお、異常検出部37cの構成は、上述した構成に限られない。例えば、異常検出部37cの送信パケット82には、リクエストの識別子に加えて、リクエストの送信時刻の差(インターバル)を登録し、タイマ81がインターバルを加味して再起動を行うようにしてもよい。
図9は、異常検出部の他の構成の一例を示す図である。図9の例では、送信パケット82に、上述したパケットK(Kは自然数)管理用エントリに加え、あるリクエストが送信されてから、他のリクエストが送信されるまでの時間が登録される。ここで、リクエスト1が送信されてから100ns後に、リクエスト2が送信され、リクエスト1が送信されてから300ns後に、リクエスト3が送信された場合について説明する。この場合、リクエスト1〜3のそれぞれの識別子が、パケット1管理用エントリ〜パケット3管理用エントリに登録される。このとき、リクエスト1を基準とすると、インターバル1には0ns、インターバル2には、100ns、インターバル3には、300nsが登録される。ここで、リクエスト1に対応するレスポンスをパケット受信部37bが受信したため、ポインタ80が指すリクエストがリクエスト1からリクエスト2に切り替わったとする。このとき、タイマ81は、再起動するが、時間の初期値が0nsではなく、リクエスト2に対応するインターバル100nsから時間の計測を開始する。また、ポインタ80が指すリクエストがリクエスト2からリクエスト3に切り替わった場合には、同様に、タイマ81は、リクエスト3に対応するインターバル300nsから時間の計測を開始する。なお、すべての送出済みリクエストに対してレスポンスを受信した場合は、次に送出するリクエストのインターバルは再び0nsとなる。
このように、他の例の異常検出部37cでは、1つのタイマ81で時間を計測するので、より少ない数のタイマで精度良く時間を計測することができる。また、他の例の異常検出部37cでは、タイマ81が、リクエストごとにインターバルを考慮して時間を計測するので、より精度の高い時間を計測することができる。
なお、異常検出部37cでは、ポインタ80を設けず、リクエストごとにタイマを設けて、各タイマが、リクエストの送信されてからの時間を計測することもできる。
ルータ40は、パケット制御部37が有するパケット生成部37aが出力したパケットを受信した場合には、受信したリクエストをXB接続部27に出力する。また、ルータ40は、XB接続部27を介して、他のCPUが送信したパケットやデータをパケット受信部37bに出力する。また、ルータ40は、パケット制御部37がI/O装置等に対して出力したパケットをPCIe制御部42に出力する。また、ルータ40は、I/O装置からのリクエスト等をPCIe制御部42から受信した場合には、受信したリクエスト等をパケット制御部37に出力する。また、ルータ40は、I/O装置からのリクエストをPCIe制御部42から受信した場合には、受信したリクエストをXB接続部27に出力する。また、ルータ40は、XB接続部27を介して、I/O装置へのレスポンスを受信した場合には、受信したレスポンスをPCIe制御部42bに出力する。
メモリアクセス部41は、いわゆるMAC(Memory Access Controller)であり、メモリ22に対するアクセスの制御を行う。例えば、メモリアクセス部41は、キャッシュディレクトリ管理部36から物理アドレスを受信した場合には、受信した物理アドレスが示すメモリ22の領域に格納されたデータを取得し、取得したデータをキャッシュディレクトリ管理部36に出力する。なお、メモリアクセス部41は、メモリーミラー機能を用いて、共有領域を冗長化してもよい。
リクエスト生成部42aは、ルータ40を介してI/O装置に対するアクセス要求を取得した場合には、アクセス要求の対象となるI/O装置に送信するリクエストを生成し、生成したリクエストをPCIeバス制御部42bに出力する。また、リクエスト生成部42aは、I/O装置から物理アドレスと、CPUIDとを取得した場合には、取得した物理アドレスと、CPUIDとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、I/O装置が他のCPUに接続されたメモリをリードするためのリクエストが挙げられる。また、リクエスト生成部42aは、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得した場合には、取得した物理アドレスと、CPUIDと、書き込みデータとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、I/O装置が他のCPUに接続されたメモリにデータをライトするためのリクエストが挙げられる。そして、リクエスト生成部42aは、生成したパケットをルータ40に送信する。
また、リクエスト生成部42aは、エラー発生アドレスレジスタ98、トラップ発生部99を有する。
PCIeバス制御部42bは、リクエスト生成部42aが生成したリクエストを取得した場合には、PCIe接続部28を介して、I/O装置にリクエストを送信する。また、PCIeバス制御部42bは、PCIe接続部28を介して、I/O装置から物理アドレスと、CPUIDとを取得した場合には、リクエスト生成部42aに、取得した物理アドレスと、CPUIDとを送信する。また、PCIeバス制御部42bは、PCIe接続部28を介して、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得した場合には、リクエスト生成部42aに、取得した物理アドレスと、CPUIDと、書き込みデータとを送信する。
また、PCIeバス制御部42bは、I/O装置が他のCPUに接続されたメモリをリードするためのリクエストに対応するレスポンスが、リクエストが送信されてから所定時間以内に受信しないため、異常が検出された場合には、次のような処理を行う。すなわち、PCIeバス制御部42bは、「poisoned TLP」パケットをPCIe接続部28に送信する。この場合、PCIe接続部28は、「poisoned TLP」パケットを受信すると、受信した「poisoned TLP」パケットをI/O装置へ送信する。これにより、I/O装置では、異常が発生していることを検出することができる。また、PCIe接続部28は、異常が発生していることを検出すると、デバイスドライバソフトに異常が発生したことを通知するので、リカバリ処理が行われる。リカバリ処理の一例としては、LANに異常が発生した場合には、処理中の送受信データを一旦破棄し、LANチップの状態を初期化し、初期化後は、通常通りにデータの送受信を行う処理が挙げられる。
図10を参照して、「poisoned TLP」について説明する。図10は、「TLP header」のデータ構成の一例を示す図である。「poisoned TLP」とは、「PCI express」の仕様によって規定されているパケットである。図10の例に示す「TLP header」のEPビットがオンである場合に、「poisoned TLP」であると認識される。
図11は、「poisoned TLP」パケットを受信したPCIe制御部の動作の具体例を説明するための図である。図11の例は、PCIe制御部42が「Root Complex」に対応し、PCIe接続部28が「PCI express」カードに対応する場合のデバイスドライバの階層構造を示す。この一例では、「PCI express」カードとしてSASの「PCI express」カードが搭載されている場合を示している。「PCI express」のバス上の「poisoned TLP」の発生などのイベントの検出やバス上での対処は、「PCI express」カードの種別に関わらず共通である。そのため、かかるイベントの検出やバス上での対処は、SASデバイスドライバなどの個別のデバイスドライバでは行われず、「Root Complex」ドライバで行われる。
一方、バスで何らかのイベント、例えば、エラー系のイベントが発生した場合、エラーが発生したバス上で動作していたSASデバイスドライバ側で、SASデバイスドライバ固有の回復処理が行われる場合が多い。ここで、SASデバイスドライバ固有の回復処理の一例としては、処理中の送信処理の終了処理またはリトライなどが挙げられる。「poisoned TLP」が発生した場合、「Root Complex」ドライバは、エラー事象の刈り取り(詳細情報のリード、ステータスビットのクリアなど)を行った後に、バス上のSASデバイスドライバにエラーの発生を通知する。この通知により、SASデバイスドライバは、SASデバイスドライバ固有のリカバリ処理を開始する。なお、SASデバイスドライバにエラーの発生を通知せず、I/O装置を使用しているアプリケーションプロセスにエラーの発生を通知し、アプリケーションプロセスからI/O装置の再起動処理を行うようにしてもよい。
また、PCIeバス制御部42bは、I/O装置が他のCPUに接続されたメモリにデータをライトするためのリクエストに対応するレスポンスが、リクエストが送信されてから所定時間以内に受信しないため、異常が検出された場合には、次のような処理を行う。すなわち、PCIeバス制御部42bは異常検出後、異常にかかわるPCIe接続部28から受信する「メモリにデータをライトするためのリクエスト」を廃棄する。そして、後述するように、エラー発生アドレスレジスタ98にエラー発生アドレスを設定し、トラップ発生部97を使用してトラップを発生させる。このトラップによりデバイスドライバソフトに異常が発生したことが通知されるので、リカバリ処理が行われる。リカバリ処理の一例としては、LANに異常が発生した場合には、処理中の送受信データを一旦破棄し、LANチップの状態を初期化し、初期化後は、通常通りにデータの送受信を行う処理が挙げられる。
異常検出部42cは、ポインタ90と、タイマ91と、送信パケット92と、PA93と、リクエスト94と、検出部95とを有する。ポインタ90、タイマ91、送信パケット92、PA93、リクエスト94、検出部95のそれぞれは、上記で説明したポインタ80、タイマ81、送信パケット82、PA83、リクエスト84、検出部85と同様である。また、エラー発生アドレスレジスタ98、トラップ発生部99は、上記で説明したエラー発生アドレスレジスタ96、トラップ発生部97と同様である。すなわち、異常検出部37cは、パケット制御部37によってリクエストが送信されてからレスポンスを受信する前に所定時間が経過した場合に、ノード間のデータ転送の異常を検出する。異常検出部42cは、上記の異常検出部37cと同様に、リクエスト生成部42aからルータ40を介して、他のCPUへ送信されるリードのリクエスト、ライトのリクエストについて、ノード間のデータ転送の異常を検出する。そして、異常を検出した場合には、上記の異常検出部37cの検出部85と同様に、検出部95は、ポインタ90が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをPA93から取得し、取得した物理アドレスを、エラー発生アドレスレジスタ98に書き込む。
トラップ発生部99は、エラー発生アドレスレジスタ98に物理アドレスが書き込まれると、トラップを発生する。
次に、図12を用いて、CPU21が他のCPUに対してリクエストを送信する処理の一例について説明する。図12は、実施例1に係るCPUがリクエストを送信する処理の一例を説明するための図である。例えば、図12中(A)に示すように、サービスプロセッサ24からノードマップ34に対して、物理アドレスが振り分けられるメモリにアクセスするCPUのCPUIDと物理アドレスとを対応付けたエントリの設定が行われる。
また、演算部31は、演算処理を実行し、図12中(B)に示すように、アクセス対象となる論理アドレスをアドレス変換部35に出力する。すると、アドレス変換部35は、論理アドレスを物理アドレスに変換し、変換した物理アドレスを図12中(C)に示すように、キャッシュディレクトリ管理部36に出力する。
ここで、キャッシュディレクトリ管理部36は、アドレス変換部35から物理アドレスを取得すると、図12中(D)に示すように、ノードマップ34を参照し、取得した物理アドレスと対応付けられたCPUIDを取得する。そして、キャッシュディレクトリ管理部36は、取得したCPUIDがCPU21のCPUIDではない場合には、図12中(E)に示すように、取得したCPUIDと物理アドレスとをパケット制御部37に出力する。
このような場合には、パケット生成部37aは、キャッシュディレクトリ管理部36から取得した物理アドレスとCPUIDとを格納したパケットを生成し、図12中(F)に示すように、生成したパケットをルータ40に出力する。また、パケット生成部37aは、図12中(G)に示すように、リクエストであるパケットを送信したことを示すデータを異常検出部37cに出力する。続いて、図12中(H)に示すように、ルータ40は、パケット生成部37aから取得したパケットをXB接続部27に出力する。その後、図12中(I)に示すように、XB接続部27は、取得したパケットをXB2に出力する。すると、XB2は、パケットに格納されたCPUIDが示すCPUへパケットを伝達することとなる。
次に、図13を用いて、CPU21が他のCPUからパケットを受信した際に実行する処理の一例について説明する。図13は、実施例1に係るCPUがパケットを受信した際に実行する処理の一例を説明するための図である。例えば、図13中(J)に示すようにパケット受信部37bは、他のCPUからCPU21のCPUIDとメモリ22に振り分けられた物理アドレスとが格納されたパケットや、レスポンスのパケットを受信する。
このような場合には、パケット受信部37bは、受信したパケットが、レスポンスのパケットである場合には、図13中(K)に示すように、レスポンスであるパケットを受信したことを示すデータを異常検出部37cに出力する。そして、パケット受信部37bは、受信したパケットから物理アドレスを取得し、図13中(L)に示すように、取得した物理アドレスをキャッシュディレクトリ管理部36に出力する。すると、キャッシュディレクトリ管理部36は、物理アドレスが示す記憶領域が、共有領域であるかローカル領域であるかを判別する。
そして、共有領域に対するアクセスである場合には、キャッシュディレクトリ管理部36は、図13中(M)に示すように、物理アドレスが示す記憶領域のデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされているか判別する。
また、キャッシュディレクトリ管理部36は、データがキャッシュされていないと判別した場合には、図13中(N)に示すように、物理アドレスをメモリアクセス部41に出力する。すると、図13中(O)に示すように、メモリアクセス部41は、メモリ22から物理アドレスが示す記憶領域のデータを取得し、キャッシュディレクトリ管理部36に出力する。
そして、キャッシュディレクトリ管理部36は、L1キャッシュ32、L2キャッシュ33、またはメモリアクセス部41からデータを取得した場合には、取得したデータをパケット制御部37に出力し、リクエスト元のCPUに送信するよう指示する。
次に、図14を用いて、I/O装置がCPU21以外のCPUに対してリードやライトのリクエストを送信する処理の一例について説明する。図14は、実施例1に係るI/O装置がリクエストを送信する処理の一例を説明するための図である。例えば、PCIe接続部28は、I/O装置から物理アドレスと、CPUIDとを取得すると、図14中(P)に示すように、取得した物理アドレスと、CPUIDとをPCIeバス制御部42bに出力する。また、PCIe接続部28は、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得すると、図14中(P)に示すように、取得した物理アドレスと、CPUIDと、書き込みデータとをPCIeバス制御部42bに出力する。
そして、PCIeバス制御部42bは、PCIe接続部28から物理アドレスと、CPUIDとを取得すると、図14中(Q)に示すように、取得した物理アドレスと、CPUIDとをリクエスト生成部42aに出力する。また、PCIeバス制御部42bは、PCIe接続部28から物理アドレスと、CPUIDと、書き込みデータとを取得すると、図14中(Q)に示すように、取得した物理アドレスと、CPUIDと、書き込みデータとをリクエスト生成部42aに送信する。
リクエスト生成部42aは、PCIeバス制御部42bから物理アドレスと、CPUIDとを取得すると、取得した物理アドレスと、CPUIDとを含むリードのリクエストとなるパケットを生成する。また、リクエスト生成部42aは、PCIeバス制御部42bから物理アドレスと、CPUIDと、書き込みデータとを取得すると、取得した物理アドレスと、CPUIDと、書き込みデータとを含むライトのリクエストとなるパケットを生成する。そして、リクエスト生成部42aは、図14中(R)に示すように、生成したパケットをルータ40に出力する。
また、リクエスト生成部42aは、図14中(S)に示すように、リードのリクエスト、ライトのリクエストを送信したことを示すデータを異常検出部42cに出力する。続いて、図14中(T)に示すように、ルータ40は、リクエスト生成部42aから取得したリクエストをXB接続部27に出力する。その後、図14中(U)に示すように、XB接続部27は、取得したリクエストをXB2に出力する。すると、XB2は、リクエストに格納されたCPUIDが示すCPUへパケットを伝達することとなる。
次に、図15を用いて、I/O装置がCPU21以外のCPUからレスポンスを受信する処理の一例について説明する。図15は、実施例1に係るI/O装置がレスポンスを受信する処理の一例を説明するための図である。例えば、図15中(V)に示すようにXB接続部27は、CPU21以外のCPUからI/O装置へのレスポンスを受信する。
XB接続部27は、レスポンスを受信すると、図15中(W)に示すように、受信したレスポンスをルータ40に出力する。ルータ40は、レスポンスを受信すると、図15中(X)に示すように、受信したレスポンスをリクエスト生成部42aに出力する。リクエスト生成部42aは、レスポンスを受信すると、レスポンスを受信したことを示すデータを異常検出部42cに出力する。また、リクエスト生成部42aは、図15中(Z)に示すように、レスポンスをPCIeバス制御部42bに出力する。PCIeバス制御部42bは、レスポンスを受信すると、図15中(AA)に示すように、受信したレスポンスをPCIe接続部28に出力する。これにより、PCIe接続部28からI/O装置へレスポンスが送信される。
次に、図16、図17を用いて、ノード20と、ノード20のアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例について説明する。図16は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。例えば、異常検出部37cは、タイマ81の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、異常検出部37cは、ポインタ80が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード20と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、異常検出部37cは、ポインタ80が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをPA83から取得し、図16中(AB)に示すように、取得した物理アドレスを、エラー発生アドレスレジスタ96に書き込む。エラー発生アドレスレジスタ96に物理アドレスが書き込まれると、図16中(AC)に示すように、トラップ発生部96は、トラップを発生する。
図17は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。例えば、異常検出部42cは、タイマ91の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、異常検出部42cは、ポインタ90が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード20と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、異常検出部42cは、ポインタ90が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをPA93から取得し、図17中(AD)に示すように、取得した物理アドレスを、エラー発生アドレスレジスタ98に書き込む。エラー発生アドレスレジスタ98に物理アドレスが書き込まれると、図17中(AE)に示すように、トラップ発生部98は、トラップを発生する。
通信部23、サービスプロセッサ24、XB接続部27、XB接続部27a、PCIe接続部28は、電子回路である。ここで、電子回路の例として、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路、またはCPUやMPU(Micro Processing Unit)などを適用することができる。また、CPU21〜21cに代えて、ASICやFPGAなどの集積回路、またはMPUなどを適用することができる。
また、メモリ22〜22aは、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ (flash memory)などの半導体メモリ素子である。また、L1キャッシュ32、L2キャッシュ33は、SRAM(Static Random Access Memory)等の高速な半導体メモリ素子である。
次に、各CPU21〜21cがキャッシュコヒーレンスを保持する処理について説明する。なお、以下の説明においては、情報処理システム1の各CPUはイリノイプロトコルを用いて、キャシュコヒーレンスを保持するものとする。
また、以下の説明においては、情報処理システム1が有する各メモリは、全てのCPUからキャッシュ可能な空間を有するメモリとして識別されるものとする。また、以下の説明においては、キャッシュ対象となるデータを記憶するメモリに、そのCPU内のMACを介して物理的に直接接続されているCPUをホームCPUとし、キャッシュを要求したCPUをローカルCPUと記載する。
また、ホームCPUに対して既にリクエストを送信し、データをキャッシュ済みであるCPUをリモートCPUと記載する。なお、ローカルCPUとホームCPUとが同一のCPUとなる場合や、ローカルCPUとリモートCPUとが同一のCPUとなる場合もある。
ローカルCPUは、自身のノードマップを参照し、アクセス対象となる物理アドレスがホームCPUがアクセスするメモリに振り分けられていると判定する。そして、ローカルCPUは、物理アドレスを格納したリクエストをホームCPUに対して発行する。なお、ローカルCPUが発行するリクエストには、複数の種別のリクエストが存在する。このため、ホームCPUが有するキャッシュディレクトリ管理部は、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行することとなる。
例えば、ローカルCPUが発行するリクエストの種別としては、共有型フェッチアクセス、排他型フェッチアクセス、キャッシュ無効化要求、キャッシュリプレース要求等がある。共有型フェッチアクセスとは、例えば、「MoveIn to Share」の実行要求であり、ホームCPUがアクセスするメモリからデータの読出しを行う際に発行されるリクエストである。
また、排他型フェッチアクセスとは、例えば、「MoveIn Exclusively」の実行要求であり、ホームCPUがアクセスするメモリへデータストアを行う際の、キャッシュへのデータロードを行う際に発行される。また、キャッシュ無効化要求とは、例えば、「MoveOut」の実行要求であり、キャッシュラインの無効化をホームCPUに対して要求する際に発行される。なお、ホームCPUは、キャッシュ無効化要求を受信すると、リモートCPUに対してキャッシュ無効化要求を発行する場合や、キャッシュを「Invalidation」とさせるオーダーを発行する場合がある。
キャッシュリプレース要求とは、例えば、「WriteBack」の実行要求であり、更新されたキャッシュデータ、すなわち「Modified」状態のキャッシュデータをホームCPUがアクセスするメモリに書き戻す際に発行される。なお、キャッシュリプレース要求には、例えば、「FlushBack」の実行要求であり、更新されていないキャッシュデータ、すなわち、「Shared」又は「Exclusive」状態のキャッシュの破棄を行う際に発行される。
ホームCPUは、上述したリクエストをローカルCPUや、リモートCPUから受信した場合には、リクエストを処理するために、ローカルCPUやリモートCPUに対して、オーダーを発行する。ここで、ホームCPUは、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行するため、複数の種別のオーダーを発行することとなる。例えば、ホームCPUは、リモートCPUがキャッシュしているデータをローカルCPUにロードさせる「MoveOut and Bypass to Share」を発行する。
また、例えば、ホームCPUは、ローカルCPU以外のすべてのリモートCPUのキャッシュを無効化し、その後、ホームCPUがローカルCPUにデータを送信するための「MoveOut and Bypass Exclusively」を発行する。また、ホームCPUは、リモートCPUにキャッシュの無効化を要求する「MoveOut WITH Invalidation」を発行する。なお、ホームCPUが「MoveOut WITH Invalidation」を発行した場合には、全てのCPUのキャッシュが、対象となるアドレスについて「Invalidate」状態となる。なお、トランザクション完了時にはローカルCPUがデータをキャッシュする。
また、ホームCPUは、リモートCPUにキャッシュラインの無効化を要求する「MoveOut for Flush」を発行する。なお、ホームCPUが「MoveOut for Flush」を発行した場合には、対象となるデータは、ホームCPUのメモリにのみ記憶される。また、ホームCPUは、対象となるデータの状態が「Shared」であるときに、リモートCPUにキャッシュの破棄を要求する「Buffer Invalidation」を発行する。
ホームCPUは、リクエストの種別に応じて、上述したオーダーを発行し、各CPUがキャッシュしたデータのステートを遷移させる。また、ローカルCPUやリモートCPUは、オーダーを受信した場合には、オーダーが示す処理を実行し、自身がキャッシュしたデータのステートを遷移させる。
その後、ローカルCPUやリモートCPUは、オーダーに対する完了応答やデータ付の完了応答をホームCPUに送信する。また、ホームCPUやリモートCPUは、オーダー処理を実行した後に、ローカルCPUに対して、データ付のリクエスト応答を送信することとなる。
[処理の流れ]
次に、図18を用いて、情報処理システム1が共有領域を制御する処理の流れについて説明する。図18は、共有領域を制御する処理の流れを説明するためのフローチャートである。まず、情報処理システム1は、アプリケーションの要求に応じて、ノード間の共有メモリの割当処理を実行する(ステップS101)。次に、情報処理システム1は、ノード間で共有する共有メモリのアタッチ処理を実行する(ステップS102)。
その後、情報処理システム1が有する各CPUによって実行されるアプリケーションが各メモリを使用する(ステップS103)。次に、情報処理システム1は、共有メモリのデタッチ処理を実行する(ステップS104)。その後、情報処理システム1は、共有メモリの解放処理を実行し(ステップS105)、処理を終了する。なお、ステップS101、およびステップS105は、その共有メモリのホームノード上のアプリケーションのみが実施するものとしても良いし、実際の処理はnopとなるものの、その共有メモリのホームノード以外のノード上のアプリケーションも実施するものとしても良い。
次に、図19を用いて、図18中ステップS101で示した共有メモリの割当処理を実行する処理の流れについて説明する。図19は、共有メモリの割当処理を説明するためのフローチャートである。図19に示す例では、例えば、CPU21が実行するアプリケーションがOSに対して、ノード間の共有メモリ割当処理の実行を要求する(ステップS201)。
すると、CPU21が実行するOSが共有領域用の物理アドレスの領域から要求されたサイズのメモリ割当を行う(ステップS202)。次に、OSが割り当てた共有メモリの管理用IDをアプリケーションに引渡し(ステップS203)、共有メモリの割当処理を終了する。
次に、図20を用いて、図18中ステップS102で示したノード間の共有メモリアタッチ処理の流れについて説明する。図20は、共有メモリアタッチ処理を説明するためのフローチャートである。まず、アプリケーションは、OSに対して管理用IDを引渡し、ノード間の共有メモリのアタッチ処理を要求する(ステップS301)。このような場合には、OSは、他のノードで実行されているOSと通信を行い、管理用IDに対応する物理アドレスを獲得する(ステップS302)。
ここで、OSが他のノードで実行されているOSと通信を行う場合には、LANなどによる通信、サービスプロセッサ24を介した各ノード間の通信等を用いる。また、各ノードで実行されるOSは、特定の共有領域を、ノード間通信に用いる領域として設定し、設定した領域に対する情報の格納や読み取りを行う事で、通信を行うこととしても良い。
次に、OSは、物理アドレスに対応する論理アドレスを決定し、割当を行う(ステップS303)。例えば、CPU21で実行されるOSは、物理アドレスと論理アドレスとのTLB35aをアドレス変換部35に設定する。
なお、各CPU21〜21cが用いる論理アドレスは、重複する範囲であっても良く、また、CPUごとに異なる範囲でもよい。また、各CPU21〜21cが用いる論理アドレスは、アプリケーションがOSに指定できるようにしてもよい。その後、OSは、論理アドレスの値をアプリケーションに引渡し(ステップS304)、処理を終了する。
次に、図21を用いて、図18中ステップS103で示したアプリケーションがノード間の共有メモリを使用する処理の流れについて説明する。図21は、アプリケーションが共有メモリを使用する処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、論理アドレスを発行し、論理アドレスが示す記憶領域へのアクセスを行う(ステップS401)。
すると、CPU21は、TLBミスが発生したか否かを判別する(ステップS402)。そして、CPU21は、TLBミスが発生した場合は(ステップS402肯定)、トラップ処理を実行し、TLBに論理アドレスと物理アドレスとの組のエントリを設定する(ステップS403)。
次に、アプリケーションは、再度論理アドレスを発行し、TLBによる物理アドレスへの変換を経て、正常に共有メモリに対するアクセスを実行し(ステップS404)、処理を終了する。一方、TLBミスが発生しなかった場合は(ステップS402否定)、正常に共有メモリに対するアクセスが実行され(ステップS405)、処理を終了する。
次に、図22を用いて、図18中ステップS104で示したノード間の共有メモリデタッチ処理の流れについて説明する。図22は、ノード間の共有メモリデタッチ処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、OSに対して、ノード間共有メモリの論理アドレス、または管理用IDを指定して、デタッチ処理を要求する(ステップS501)。
すると、CPU21が実行するOSは、キャッシュのフラッシュを行う(ステップS502)。すなわち、OSは、共有メモリの割り当て解除後、再度共有メモリとして割当てを行った場合に、共有メモリとして割当てが行われていない際に共有メモリの実メモリにアクセスするCPUがリブートすると、キャッシュと実メモリの状態が食い違う恐れがある。このため、OSは、キャッシュのフラッシュを行い、キャッシュと実メモリの状態とが食い違う状態を防止する。
そして、OSは、ノード間共有メモリ、すなわち、アプリケーションが利用していた範囲の論理アドレスの割当を解除し、解除した論理アドレスに関連するTLB35aのエントリを削除する(ステップS503)。なお、これ以降、本ノード上で、デタッチが完了しているメモリアドレスについてTLBミスが発生しても(ステップS402肯定)、OSはデタッチが完了している論理アドレスに対応する物理アドレスをTLB35aに設定しない。よって、ステップS404は正常に終了せず、アクセスエラーとなる。デタッチ完了後、ステップS302と反対に、OSがノード間で通信し、本アプリケーションがこの共有メモリのPAに対してアクセスを完了したことを通知する(ステップS504)。もし、この共有メモリがホームノード上で解放済みで、かつこのアプリケーションがこの共有メモリの最後の利用者であった場合、ホームノードに解放処理を依頼し(ステップS505)、処理を終了する。
次に、図23を用いて、図18中ステップS105で示したノード間共有メモリの解放処理の流れについて説明する。図23は、ノード間共有メモリの解放処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、OSに対してノード間共有メモリの解放処理を要求する(ステップS601)。すると、OSは、指定された共有領域の使用者がすべてデタッチしていた場合は、割当てを解放し(ステップS602)、処理を終了する。もしデタッチが完了していなければ、割り当ての解放処理は行わず、処理を完了する(実際の割り当ての完了処理はS505で行われる)。
次に、図24を用いて、CPU21が他のCPUに対して、メモリアクセスのリクエストを送信する処理の流れについて説明する。図24は、リクエストを発行する処理の流れを説明するためのフローチャートである。例えば、CPU21の演算部31は、論理アドレスを発行する(ステップS701)。
すると、アドレス変換部35において、論理アドレスから物理アドレスへの変換が行われる(ステップS702)。次に、キャッシュディレクトリ管理部36が、物理アドレスを取得し、キャッシュディレクトリ管理を実行する(ステップS703)。すなわち、キャッシュディレクトリ管理部36は、取得した物理アドレスが示す記憶領域についてのキャッシュステートを遷移させる。
次に、キャッシュディレクトリ管理部36は、ノードマップ34を参照し、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスであるか否かを判定する(ステップS704)。そして、キャッシュディレクトリ管理部36は、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスではないと判定した場合には(ステップS704否定)、取得した物理アドレスを用いてメモリアクセスを実行する(ステップS705)。そして、処理を終了する。
一方、キャッシュディレクトリ管理部36は、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスである場合には(ステップS704肯定)、ノードマップ34から物理アドレスと対応付けられたCPUIDを取得する(ステップS706)。そして、パケット送信部が、CPUIDと物理アドレスとを格納したパケット、すなわち、メモリアクセスのリクエストを生成し、XB2に送出し(ステップS707)、処理を終了する。
次に、図25を用いて、CPU21が他のCPUからメモリアクセスのリクエストを受信した際に実行する処理の流れについて説明する。図25は、リクエストを受信した際に実行する処理の流れを説明するためのフローチャートである。なお、図25に示す例では、CPU21が、他のCPUから「MoveIn to Share」や「MoveIn Exclusively」を受信した際に実行する処理の流れについて説明する。例えば、CPU21は、他のCPUからXB2を介してリクエストを受信する(ステップS801)。
このような場合には、CPU21は、ノードマップ34を用いて、リクエストの対象となる物理アドレスがローカル領域であるか否かを判定する(ステップS802)。そして、CPU21は、リクエストの対象となる物理アドレスがローカル領域である場合には(ステップS802肯定)、リクエスト元のCPUに否定応答を返信し(ステップS803)、処理を終了する。
また、CPU21は、リクエストの対象となる物理アドレスがローカル領域でない場合には(ステップS802否定)、コヒーレンスを保持するキャッシュディレクトリ管理を実行する(ステップS804)。また、CPU21は、物理アドレスが示す記憶領域のステータスを判定する(ステップS805)。
そして、CPU21は、判定したステータスに応じたオーダーを他のCPUに対して発行し(ステップS806)、ステータスを遷移させる(ステップS807)。その後、CPU21は、物理アドレスが示す記憶領域のデータをリクエスト元のCPUに送信する応答を行い(ステップS808)、処理を終了する。
次に、図26を用いて、CPU21が応答を受信した際に実行する処理の流れについて説明する。図26は、CPUが応答を受信した際に実行する処理の流れを説明するためのフローチャートである。例えば、CPU21は、応答を受信する(ステップS901)。このような場合には、CPU21は、応答の内容が正常な応答であるか否かを判定する(ステップS902)。
そして、CPU21は、応答の内容が正常である場合、すなわち、リクエスト対象となるデータを受信した場合には(ステップS902肯定)、データを用いた正常な処理を実行し(ステップS903)、処理を終了する。一方、CPU21は、否定応答を受信した場合は(ステップS902否定)、否定応答の理由がアクセスエラーであるか否かを判定する(ステップS904)。
そして、CPU21は、否定応答の理由がアクセスエラーではない場合には(ステップS904否定)、通常のエラー処理を実行し(ステップS905)、処理を終了する。一方、CPU21は、否定応答の理由がアクセスエラーではない場合には(ステップS904肯定)、エラーが発生した物理アドレスをエラーレジスタに設定して、トラップ処理を実行し(ステップS906)、処理を終了する。
次に、図27を用いて、CPU21がリクエストを送信する際に実行する処理の流れについて説明する。図27は、CPUがリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、CPU21は、リクエストに含まれるアクセス先の物理アドレスをPA83に格納し、リクエストの種類をリクエスト84に格納する(ステップS1001)。そして、CPU21は、リクエストを他のノードのCPUに送信する(ステップS1002)。続いて、CPU21は、タイマ81を起動させる(ステップS1003)。
その後、CPU21は、リクエストを送信してから所定時間経過する前、すなわち、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する(ステップS1004)。タイムアウト前に、応答を受信した場合(ステップS1004肯定)には、CPU21は、タイマ81を停止する(ステップS1005)。そして、CPU21は、応答を処理し(ステップS1006)、処理を終了する。
一方、タイムアウト前に、リクエストに対する応答を受信していない場合(ステップS1004否定)には、CPU21は、次のような処理を行う。すなわち、CPU21は、当該リクエストに対応するPA83に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ96に設定し、トラップを発生させる(ステップS1007)。次に、CPU21は、特定した物理アドレスが示す記憶領域を有するメモリに接続されたCPUにとって、CPU21がホームCPUであり、かつ、リクエストに、メモリ21へダーティのキャッシュデータをライトバックする指示が含まれているか否かを判定する(ステップS1008)。
CPU21がホームCPUであり、かつ、リクエストに、メモリ21へダーティのキャッシュデータをライトバックする指示が含まれている場合(ステップS1008肯定)には、CPU21は、次のような処理を行う。すなわち、CPU21は、メモリ22の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常を示す値を生成し、生成した値をディレクトリ36aの所定の領域に書き込む。または、CPU21は、ダウンしたノードによってキャッシュデータがライトバックされるメモリ22の共有メモリの領域に、エラー状態を示すデータを生成し、生成したデータを書き込む(ステップS1009)。そして、処理を終了する。また、CPU21がホームCPUでないか、または、リクエストに、メモリ21へダーティのキャッシュデータをライトバックする指示が含まれていない場合(ステップS1008否定)にも、処理を終了する。
次に、図28を用いて、PCIe制御部42がリードのリクエストを送信する際に実行する処理の流れについて説明する。図28は、PCIe制御部がリードのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、PCIe制御部42は、リクエストに含まれるアクセス先の物理アドレスをPA83に格納し、リクエストの種類をリクエスト84に格納する(ステップS1101)。そして、PCIe制御部42は、リクエストを他のノードのCPUに送信する(ステップS1102)。続いて、PCIe制御部42は、タイマ91を起動させる(ステップS1103)。
その後、PCIe制御部42は、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する(ステップS1104)。タイムアウト前に、応答を受信した場合(ステップS1104肯定)には、PCIe制御部42は、タイマ91を停止する(ステップS1105)。そして、PCIe制御部42は、応答を処理し(ステップS1106)、処理を終了する。
一方、タイムアウト前に、リクエストに対する応答を受信していない場合(ステップS1104否定)には、PCIe制御部42は、次のような処理を行う。すなわち、PCIe制御部42は、当該リクエストに対応するPA83に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ98に設定し、トラップを発生させる(ステップS1107)。次に、PCIe制御部42は、「poisoned TLP」パケットを生成し、生成した「poisoned TLP」パケットをPCIe接続部28に送信し(ステップS1108)、処理を終了する。
次に、図29を用いて、PCIe制御部42がライトのリクエストを送信する際に実行する処理の流れについて説明する。図29は、PCIe制御部がライトのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、PCIe制御部42は、リクエストに含まれるアクセス先の物理アドレスをPA83に格納し、リクエストの種類をリクエスト84に格納する(ステップS1201)。そして、PCIe制御部42は、リクエストを他のノードのCPUに送信する(ステップS1202)。続いて、PCIe制御部42は、タイマ91を起動させる(ステップS1203)。
その後、PCIe制御部42は、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する(ステップS1204)。タイムアウト前に、応答を受信した場合(ステップS1204肯定)には、PCIe制御部42は、タイマ91を停止する(ステップS1205)。そして、PCIe制御部42は、応答を処理し(ステップS1206)、処理を終了する。
一方、タイムアウト前に、リクエストに対する応答を受信していない場合(ステップS1204否定)には、PCIe制御部42は、次のような処理を行う。すなわち、PCIe制御部42は、当該リクエストに対応するPA83に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ98に設定し、トラップを発生させ(ステップS1207)、処理を終了する。
次に、図30を用いて、トラップが発生することによってOSが実行するトラップ処理の流れについて説明する。図30は、トラップが発生することによってOSが実行するトラップ処理の流れを説明するためのフローチャートである。例えば、トラップが発生することによって、CPU21が実行するOSは、割込みハンドラを起動させる(ステップS1301)。割込みハンドラは、トラップの種別を特定する(ステップS1302)。割込みハンドラは、トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、リード処理中であることを示すか否かを判定する。トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、リード処理中であることを示す場合(S1303肯定)には、割込みハンドラは、次のような処理を行う。すなわち、割込みハンドラは、割込みが発生したときのプログラムカウンタが示すプロセスのシグナルハンドラをシグナルの送信先とする(ステップS1304)。続いて、割込みハンドラは、シグナルの送信先にシグナルを送信し(ステップS1305)、処理を終了する。
また、トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、リード処理中であることを示さない場合(ステップS1303否定)には、割込みハンドラは、次のような処理を行う。すなわち、割込みハンドラは、トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、ライト処理中であることを示すか否かを判定する(ステップS1306)。トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、ライト処理中であることを示す場合(ステップS1306肯定)には、割込みハンドラは、エラー発生アドレスレジスタ96を読み、物理アドレスを取得する(ステップS1307)。そして、割込みハンドラは、取得した物理アドレスに対応するシグナルハンドラをハンドラテーブルから検索する(ステップS1308)。
なお、ハンドラテーブルは、次のようにして作成される。まず、CPU21が実行するアプリケーションの要求によって、共有領域用の物理アドレスの領域から要求されたサイズのメモリ割当が行われた際に、シグナルハンドラを取得し、取得したシグナルハンドラの関数のエントリアドレスをハンドラテーブルに登録する。そして、ハンドラテーブルへのシグナルハンドラの関数のエントリアドレスの登録時に、OSは、次のような処理を行う。すなわち、CPU21が実行するOSは、シグナルハンドラの関数のエントリアドレスに、共有メモリのアドレスと、プロセスの識別子とを対応付けて、ハンドラテーブルに登録する。このようにして、ハンドラテーブルは作成される。
図31は、ハンドラテーブルのデータ構造の一例を示す図である。図31に示すハンドラテーブルは、「共有メモリアドレス」の項目と、「pid」の項目と、「シグナルハンドラの関数のエントリアドレス」の項目とを有する。「共有メモリアドレス」の項目には、「シグナルハンドラの関数のエントリアドレス」の項目にエントリアドレスが登録されたシグナルハンドラに対応する共有メモリのアドレスが登録される。また、「pid」の項目には、「シグナルハンドラの関数のエントリアドレス」の項目にエントリアドレスが登録されたシグナルハンドラに対応するプロセスの識別子が登録される。「シグナルハンドラの関数のエントリアドレス」の項目には、シグナルハンドラの関数のエントリアドレスが登録される。
図30に戻り、検索の結果、割込みハンドラは、シグナルハンドラを得ることができたか否かを判定する(ステップS1309)。シグナルハンドラを得ることができた場合(ステップS1309肯定)には、割込みハンドラは、得たシグナルハンドラをシグナル送信先とし(ステップS1310)、ステップS1305へ進む。一方、シグナルハンドラを得ることができなかった場合(ステップS1309否定)には、割込みハンドラは、ステップS1307で取得した物理アドレスが示す共有領域の共有メモリを使用している全プロセスを中断させ(ステップS1311)、処理を終了する。
また、トラップの種別が、CPU21が検出した他ノードのCPUとの通信エラーで、ライト処理中であることを示す場合(ステップS1306否定)には、割込みハンドラは、次のような判定を行うことができる。すなわち、割込みハンドラは、トラップの種別が、PCIe制御部42が検出した他ノードのCPUとの通信エラーであると判定することができる。そこで、割込みハンドラは、PCIe制御部42の割込み処理ルーチンを起動する(ステップS1312)。そして、CPU21が実行する割込み処理では、PCIe制御部42のエラー発生アドレスレジスタ98が読まれ、物理アドレスが取得される(ステップS1313)。
次に、割込みハンドラは、取得した物理アドレスが示す記憶領域が、共有メモリの共有領域であるか否かを判定する(ステップS1314)。取得した物理アドレスが示す記憶領域が、共有メモリの共有領域である場合(ステップS1314肯定)には、ステップS1308に戻る。一方、取得した物理アドレスが示す記憶領域が、共有メモリの共有領域でない場合(ステップS1314否定)には、所定の対応する処理を行って(ステップS1315)、処理を終了する。
次に、図32を用いて、シグナルが通知されたシグナルハンドラが実行する処理の流れについて説明する。図32は、シグナルが通知されたシグナルハンドラが実行する処理の流れを説明するためのフローチャートである。例えば、割込みハンドラは、シグナルをシグナルハンドラに通知して、シグナルハンドラを起動させる(ステップS1401)。起動されたシグナルハンドラは、シグナルハンドラに通知された物理アドレスから、異常が発生した共有メモリを特定する(ステップS1402)。シグナルハンドラは、シグナルハンドラに通知された異常が発生したノードの情報から、異常が発生したノードに存在する共有メモリをすべてデタッチする(ステップS1403)。
続いて、シグナルハンドラは、異常が発生したノードと共有しているノード20の共有メモリすべてに対してリカバリ処理を行う(ステップS1404)。そして、シグナルハンドラは、アプリケーション固有のリカバリ処理を行う(ステップS1405)。
アプリケーション固有のリカバリ処理の一例について説明する。例えば、一定間隔でディスクなどの外部記憶装置上に「checkpoint」を作成するアプリケーションをCPU21が実行する場合には、「checkpoint」が示すデータを読み出して、処理を再開するようなリカバリ処理が挙げられる。また、「checkpoint」を作成しないアプリケーションをCPU21が実行する場合には、再初期化、あるいは、再起動処理を行うようなリカバリ処理が挙げられる。
また、シグナルが通知されたシグナルハンドラが実行する処理については、上述した処理に限られない。そこで、図33を用いて、シグナルが通知されたシグナルハンドラが実行する他の処理の流れについて説明する。図33は、シグナルが通知されたシグナルハンドラが実行する他の処理の流れを説明するためのフローチャートである。例えば、割込みハンドラは、シグナルをシグナルハンドラに通知して、シグナルハンドラを起動させる(ステップS1501)。起動されたシグナルハンドラは、シグナルハンドラに通知された物理アドレスから、異常が発生した共有メモリを特定する(ステップS1502)。シグナルハンドラは、シグナルハンドラを実行するCPU21を有するノード20(自ノード)が、異常が発生したノードのメモリを共有メモリとしてアタッチしていたか否かを判定する(ステップS1503)。自ノードが、異常が発生したノードのメモリを共有メモリとしてアタッチしていない場合(ステップS1503否定)には、ステップS1508へ進む。
一方、自ノードが、異常が発生したノードのメモリを共有メモリとしてアタッチしていた場合(ステップS1503肯定)には、シグナルハンドラは、次のような処理を行う。すなわち、シグナルハンドラは、シグナルハンドラに通知された異常が発生したノードの情報から、異常が発生したノードに存在する共有メモリをすべてデタッチする(ステップS1504)。
続いて、シグナルハンドラは、異常が発生したノードに存在する共有メモリのアドレスをL1キャッシュ、L2キャッシュから削除する(ステップS1505)。そして、シグナルハンドラは、異常が発生したノードに存在する共有メモリのアドレスを含むエントリをTLB35aから削除する(ステップS1506)。そして、シグナルハンドラは、シグナルハンドラに通知された物理アドレスを、TLBミスが発生した場合であっても、TLB35aに登録を禁止する物理アドレスとする(ステップS1507)。
続いて、シグナルハンドラは、自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていたか否かを判定する(ステップS1508)。自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていた場合(ステップS1508肯定)には、シグナルハンドラは、異常が発生したノードと共有しているノード20の共有メモリすべてに対してリカバリ処理を行う(ステップS1509)。そして、シグナルハンドラは、アプリケーション固有のリカバリ処理を行い(ステップS1510)、処理を終了する。また、自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていない場合(ステップS1508否定)にも、処理を終了する。
[実施例1の効果]
上述したように、情報処理システム1は、一部を共有メモリ領域として設定可能なメモリ22〜22cを各々が備える複数のノードと、複数のノード間を接続するXB2とを有する。複数のノードの各々は、複数のノード間のデータ転送の異常または他のノードの異常を検出する異常検出部37c、42cを有する。また、複数のノードの各々は、異常検出部37c、42cにより検出された異常に基づいて「poisoned TLP」パケットや、ディレクトリ36aの「UE」の項目に登録する異常を示す値を生成する。また、複数のノードの各々は、データ転送の要求発行元のノード内のプロセッサに対して割込みを発生する。また、複数のノードの各々のCPUが実行するOSは、割込みを受信すると、リカバリ処理を行う。
すなわち、複数のノードのうち少なくとも1つのノードは、異常検出部を有する。この異常検出部は、当該1つのノード又は他のノードが備える記憶装置に含まれる、当該1つのノード及び当該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路における異常を検出する。また、異常検出部は、当該1つのノード又は当該他のノードが備える記憶装置に含まれる、当該1つのノード及び当該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路に含まれ得るいずれかのノードにおける異常を検出する。また、複数のノードのうち少なくとも1つのノードは、異常検出部により検出された異常に基づいてエラー情報を生成するとともに、自ノード内のプロセッサに対する割り込みを発生するエラー情報生成部を有する。また、複数のノードのうち少なくとも1つのノードは、割り込みに応じてエラー情報に基づいて、リカバリ処理を実行する。
このように、情報処理システム1では、データ転送中に通信相手のノードがダウンした場合であっても、割込みが通知されたCPU21で実行されるOSによって、ダウンしたノードによって共有されていた自ノードの共有メモリに対してリカバリ処理が行われる。そのため、通信相手のノードがダウンして相手ノードが共有メモリのデータをキャッシュしていた場合でも、自ノードはダウンしなくてすむ。よって、情報処理システム1によれば、データ転送中にノード間で通信異常が発生した場合であっても、従来技術のように、全ノードがダウンしなくてすむ。したがって、情報処理システム1によれば、ノード間のデータ転送に関わる異常が発生した場合に、エラーの影響範囲を抑えることができる。
また、情報処理システム1は、ポインタ80、90によって、時間を計測する対象のリクエストを切り替えることで、1つのタイマ81、91だけで、リクエストが送信されてからのタイムアウトを検出することができる。
また、情報処理システム1は、受信した物理アドレスに基づいて、アクセス対象が共有領域であるかローカル領域であるかを判別するので、ローカル領域に格納するカーネルデータやユーザデータのセキュリティレベルを高く保つことができる。また、情報処理システム1は、全てのメモリをキャッシュ可能とするので、メモリアクセスにおけるレイテンシを容易に隠蔽することができる。
また、CPU21は、他のCPUがアクセスするメモリの共有領域に対して、メモリ22にアクセスする場合と同様の方法でアクセスする。すなわち、CPU21が有する演算部31は、アクセス対象となる記憶領域がメモリ22上に存在する場合にも、他のメモリ上に存在する場合にも、論理アドレスを出力するだけでよい。
このため、CPU21は、I/Oの排他制御等の処理やプログラミング等を実行せずとも、容易に共有領域にアクセスできるため、メモリアクセス性能を向上させることができる。また、CPU21は、実行するプログラムやOSに改変を行わずとも、共有メモリを適切に利用することができる結果、プリフェッチ処理の実行を従来と同様に行う事ができるため、メモリアクセスの性能を向上させることができる。
また、CPU21は、他のCPUからのメモリアクセスの対象がローカル領域へのアクセスであると判定した場合には、否定応答を返信する。このため、情報処理システム1は、共有領域以外へのアクセスを防止する結果、エラーを防ぐことができる。
また、キャッシュディレクトリ管理部36は、ノードマップ34を用いて、物理アドレスをノードマップ34に対応付けて記憶されたCPUIDに変換する。このため、CPU21は、アクセス対象となる物理アドレスが振り分けられたメモリにアクセスするCPUを識別することができる。
また、CPU21は、メモリ22に記憶されたデータをキャッシュしたCPUを管理するディレクトリを用いて、キャッシュコヒーレンスの制御を行う。このため、情報処理システム1は、情報処理システム1が有するCPUの数が増加した場合にも、XB2のトラフィックを増加させることなく、効率的にキャッシュコヒーレンスを保持することができる。
具体的には、情報処理システム1においては、各CPU間の通信が、リモートCPUとホームCPU間、または、リモートCPUとホームCPUと更新したデータをキャッシュするローカルCPU間に限定される。このため、情報処理システム1は、効率的にキャッシュコヒーレンスを保持することができる。
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例2として本発明に含まれる他の実施例を説明する。
(1)ノードの異常を検出する方法について、
上述した実施例1では、情報処理システム1が、リクエストのタイムアウトを検出することで、ノードの異常を検出する場合について例示したが、開示のシステムは、これに限定されない。例えば、開示のシステムは、所定の時間間隔で、互いに接続されたサービスプロセッサ間でサービスプロセッサの状況を確認することにより、ノードの異常を検出することもできる。また、開示のシステムは、LAN経由でのノード間での「alive check」を、所定の時間間隔で行うことにより、ノードの異常を検出することができる。これにより、リクエストが送信されるタイミングとは、非同期で、ノードの異常を検出することができる。
図34は、ノードの異常を検出する方法の一例を説明するための情報処理システムの模式的な図である。図34の例は、ビルディングボックスを「BB」と表記した場合を示す。図34の例では、各BBのCPUは、異常検出回路72、自ノード番号情報73、ノードダウン通知部61、割込発生回路75、ノードダウン受信部62、ノードダウン情報レジスタ74を有する。
異常検出回路72は、自ノードの異常を検出する。自ノード番号情報73は、自ノードの識別番号を示す情報である。ノードダウン通知部61は、異常検出回路72で自ノードの異常が検出された場合には、異常の種類、および、自ノード番号情報73が示す自ノードの識別番号をノードダウン通知パケットに含めてXBに送信する。なお、異常の種類の一例としては、ノードダウン、ハング、どのCPUで異常が発生したかを示す情報が挙げられる。また、自ノード番号情報73が示す情報は、ノードを識別可能な情報であれば何でもよい。例えば、ノードと、ノードに搭載されているCPUとの関係が予め定義されている場合には、CPUIDからノード番号が分かるので、自ノード番号情報73が示す情報は、CPUIDでもよい。
ノードダウン受信部62は、XBから送信されたノードダウン通知パケットを受信すると、ノードダウン通知パケットに含まれる異常の種類、および、自ノードの識別番号をノードダウン情報レジスタ74に設定する。ノードダウン情報レジスタ74に異常の種類、および、自ノードの識別番号が設定されると、この設定された情報を用いて、ソフトウェアが異常の対処を行うことができる。また、ノードダウン受信部62は、ノードダウン通知パケットを受信すると、割込発生回路75に割込みを発生させるための制御信号を出力する。割込発生回路75は、ノードダウン受信部62から制御信号を受信すると、実施例1と同様に、割込みを発生させる。そのため、この割込みにより、割込みが発生してからの処理については、実施例1と同様の処理が行われる。
図34の例では、各BBのASICは、異常検出回路70、自ノード番号情報71、ノードダウン通知部60を有する。
異常検出回路70は、自ノードの異常を検出する。自ノード番号情報71は、自ノードの識別番号を示す情報である。ノードダウン通知部60は、異常検出回路70で自ノードの異常が検出された場合には、異常の種類、および、自ノード番号情報71が示す自ノードの識別番号をノードダウン通知パケットに含めてXBに送信する。
ノードダウン通知部60、61は、複数のノードダウン通知パケットをXBに送信して、複数のCPUにノードダウン通知パケットを送信することができる。また、ノードダウン通知部60、61は、1つのノードダウン通知パケットをXBに送信して、XBが複数のCPUにノードダウン通知パケットを送信することもできる。また、ノードダウン通知部60、61は、ノードごとに1つのCPUに、ノードダウン通知パケットを送信することもできる。
図35を用いて、実施例1の異常検出方法とは異なる方法を用いた場合の処理の流れについて説明する。図35は、実施例1の異常検出方法とは異なる方法を用いた場合の処理の流れを説明するためのフローチャートである。例えば、CPU21は、実施例2において上述した異常検出方法のいずれかを用いて、ノードの異常が検出されたか否かを判定する(ステップS1601)。ノードの異常が検出されない場合(ステップS1601否定)には、CPU21は、再び、ステップS1601での判定を行う。一方、ノードの異常が検出された場合(ステップS1601肯定)には、CPU21は、異常が検出されたノードが、リモートノードであるか否かを判定する(ステップS1602)。
異常が検出されたノードが、リモートノードである場合(ステップS1602肯定)には、CPU21が実行するOSが、次のような処理を行う。すなわち、OSが、自ノード20のディレクトリ36aについて、異常が発生したノードの情報が残っている場合には、ディレクトリ36aの整合性をとり(ステップS1603)、処理を終了する。ここで、ディレクトリの整合性のとりかたの一例を説明する。例えば、CPU21は、ダウンしたノードがデータをキャッシュしているが、キャッシュの状態は、「clean」である場合には、次のような処理を行う。すなわち、CPU21は、その「clean」であるキャッシュのディレクトリ36aの情報を「ダウンしたノードがキャッシュを持っていない」状態に変更するリカバリ処理を行う。また、CPU21は、ダウンしたノードがデータをキャッシュしており、キャッシュの状態は、「dirty」である場合には、次のような処理を行う。すなわち、CPU21は、「dirty」であるキャッシュラインをエラー状態に変更するリカバリ処理を行う。
一方、異常が検出されたノードが、リモートノードでない場合、すなわち、ホームノードである場合(ステップS1602否定)には、CPU21が実行するOSが、次のような処理を行う。すなわち、OSが、自ノードのキャッシュについて、異常が発生したノードの情報が残っている場合には、キャッシュのノードの情報を削除する(ステップS1604)。そして、OSが、異常が発生したノードの物理アドレスが、自ノードのTLB35aに登録されている場合には、異常が発生したノードの物理アドレスを含むエントリをすべて削除し(ステップS1605)、処理を終了する。
次に、情報処理システム1が、クラスタ動作を行うアプリケーションである場合には、クラスタソフトウェアにおいて、クラスタ管理マネージャがノードダウンを検出できる。そこで、クラスタ管理マネージャが異常を検出した場合の処理の流れについて、図36を用いて説明する。図36は、クラスタ管理マネージャが異常を検出した場合の処理の流れを説明するためのフローチャートである。例えば、クラスタ管理マネージャが、ノードの異常を検出したか否かを判定する(ステップS1701)。ノードの異常を検出しない場合(ステップS1701否定)には、クラスタ管理マネージャは、再び、ステップS1701の処理を行う。
一方、ノードの異常を検出した場合(ステップS1701肯定)には、クラスタ管理マネージャが、自ノードで動作中のアプリケーションに、ノードダウンによる再構成処理の開始を依頼する(ステップS1702)。続いて、アプリケーションは、異常が発生したノードに存在する共有メモリの解放をOSに依頼する(ステップS1703)。その後、OSは、解放した共有メモリのデータを削除し、TLBのエントリを削除する(ステップS1704)。アプリケーションは、固有のリカバリ処理を行い(ステップS1705)、処理を終了する。
(2)ビルディングブロックについて
上述した情報処理システム1は、4つのCPUを有するビルディングブロック10〜10eを有していた。しかし、実施例はこれに限定されるものではなく、ビルディングブロック10〜10eは、任意の数のCPU及び各CPUがアクセスするメモリを有することができる。また、CPUとメモリは、1対1で対応している必要はなく、メモリに直接アクセスするCPUは全体の一部であってもよい。
(3)CPUが送信するパケットについて
上述したCPU21は、CPUIDとPAとを有するパケットをメモリアクセスのリクエストとして送信した。しかし、実施例は、これに限定されるものではない。すなわち、CPU21は、アクセス対象となるメモリにアクセスするCPUを一意に識別できるのであれば、任意の情報を格納したパケットを出力してよい。
また例えば、CPU21は、CPUIDからVC(Virtual Connection)IDに変換し、VCIDを格納することとしてもよい。また、CPU21は、パケットに、データ長を示すレングス等の情報を格納することとしてもよい。
(4)CPUが発行するオーダー(命令)について
上述したように、各CPU21〜21cは、リクエストやオーダーを発行して、キャッシュのコヒーレンスを保持した。しかし、上述したリクエストやオーダーは、あくまで一例であり、例えばCPU21〜21cは、CAS(Compare AndSwap)命令を発行してもよい。
このように、CPU21〜21cがCAS命令を発行した場合には、排他制御のコンテンションが複数のCPU間で頻発しても、各CPUのキャッシュ上で処理が行われる。この結果、CPU21〜21cは、メモリアクセスの発生による遅延を防止するとともに、各CPU間のドランザクションが混雑するのを防ぐことができる。
(5)ハイパーバイザを経由した制御について
上述した情報処理システム1では、OSによってハードウェアであるアドレス変換部35にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、たとえは、仮想マシンを動作させるハイパーバイザ(HPV:Hypervisor)がアドレス変換部35にアクセスを行っても良い。
すなわち、ハイパーバイザが動作するノードにおいては、OSは、キャッシュやMMUなどのCPU21〜21cのハードウェア資源に対して直接の操作を行わず、操作をハイパーバイザに依頼することとなる。このように、各CPU21〜21cは、ハイパーバイザを介した制御を受付ける場合には、仮想アドレスを実アドレス(RA:Real Address)に変換し、その後、実アドレスを物理アドレスに変換することとなる。
また、ハイパーバイザが動作するノードにおいては、割り込み処理は、OSには直接割り込まず、HPVに対して割り込みを行う。このような場合には、ハイパーバイザが、OSの割り込み処理ハンドラを読出すことで割り込みを行う。なお、上述したハイパーバイザが実行する処理は、仮想マシンを動作させるために実行される公知な処理である。
(6)パーティションを用いた処理について
上述した情報処理システム1では、各CPU21〜21cは、1つのノードマップを用いてメモリアクセスを送信していた。しかし、実施例はこれに限定されるものではない。例えば、各ビルディングブロック10〜10eは、複数のノード群として動作し、各ノード群毎に、同一のファームウェア(ハイパーバイザ)を動作させる1つの論理パーティションを構成しても良い。
このような場合には、各CPU21〜21cは、アクセス先のCPUを示すノードマップと、同一論理パーティション内のCPUを示すノードマップとを有する。このように、各CPU21〜21cは、同一論理パーティション内に含まれるCPUを示すノードマップを有することで、エラー発生通知、ダウン要求、リセット要求パケット等の、論理パーティションを超えて転送すべきではない特殊パケットの転送範囲を識別することができる。
以下、同一論理パーティション内に含まれるCPUを示すノードマップを有するCPUについて説明する。図37は、情報処理システムの一例を説明するための図である。図37に示すように、ビルディングブロック10、10aは、論理パーティション#Aを動作させ、ビルディングブロック10b〜10dは、論理パーティション#Bを動作させる。
ここで、論理パーティション#Aでは、複数のドメイン#A〜#Cと、ファームウェア#Aが動作する。また、論理パーティション#Bでは、複数のドメイン#D〜#Gとファームウェア#Bが動作する。なお、ファームウェア#Aおよびファームウェア#Bとは、例えばハイパーバイザである。また、ドメイン#Aでは、アプリケーションとOSとが動作しており、他のドメイン#B〜#Gもドメイン#Aと同様に、アプリケーションとOSとが動作する。
つまり、各ドメイン#A〜#Gは、それぞれ独立してアプリケーションとOSが動作する仮想マシンである。ここで、ビルディングブロック10が有する各CPU21〜21cは、パーティション#Aに含まれる各CPUに対して上述した特殊パケットを送信してもよいが、パーティション#Bに含まれる各CPUに対しては特殊パケットを送信すべきではない。
このため、各ビルディングブロック10〜10dのCPUは、同一の論理パーティションに含まれるCPUのCPUIDを示すノードマップを有する。例えば、CPU21は、物理アドレスと、物理アドレスが示す記憶領域を有するメモリと接続されたCPUのCPUIDとを対応付けて記憶するノードマップ34を有する。また、CPU21は、CPU21と同一のパーティション、すなわち、パーティション#Aに含まれるCPUのCPUIDを記憶するノードマップ34aを有する。なお、ノードマップ34aは、ノードマップ34と同様に、サービスプロセッサ24によって設定されるものとする。
以下、図面を用いて、同一の論理パーティションに含まれるCPUのCPUIDを示すノードマップの一例について説明する。図38は、パーティションの一例を説明するための図である。例えば、図38に示す例では、パーティション#Aは、ビルディングブロック#0を有する。また、ビルディングブロック#0は、CPU#0とアドレス域「#0」が割当てられたメモリとを有する。
また、パーティション#Bは、ビルディングブロック#1とビルディングブロック#2とを有する。また、ビルディングブロック#1は、CPU#4、CPU#5、アドレス域「#1」が割当てられたメモリ、アドレス域「#2」が割当てられたメモリを有する。なお、アドレス域「#1」が割当てられたメモリには、CPU#4がアクセスし、アドレス域「#2」が割当てられたメモリには、CPU#5がアクセスする。また、ビルディングブロック#2は、CPU#8とアドレス域「#3」が割当てられたメモリを有する。
次に、図39A〜39Cを用いて、図38に示すCPU#0が有するノードマップと、CPU#4が有するノードマップとについて説明する。まず、図39Aおよび図39Bを用いて、パーティション#AのCPUが記憶するノードマップについて説明する。なお、図39Aは、パーティション#AのCPUが記憶するノードマップの一例を説明するための図である。また、図39Bは、パーティション#Aを示すノードマップの一例を説明するための図である。
なお、以下の説明では、ノードID「0」は、ビルディングブロック#0を示し、ノードID「1」は、ビルディングブロック#1を示す、ノードID「2」は、ビルディングブロック#2を示す。また、CPUID「0」は、CPU#0のCPUIDであり、CPUID「4」は、CPU#4のCPUIDであり、CPUID「5」は、CPU#5のCPUIDであり、CPUID「8」は、CPU#8のCPUIDであるものとする。
例えば、図39Aに示す例では、ノードマップ34は、アドレス域「#0」が、ビルディングブロック#0に存在し、CPU#0がアクセスを行う旨を示す。また、ノードマップ34は、アドレス域「#1」が、ビルディングブロック#1に存在し、CPU#4がアクセスを行う旨を示す。また、ノードマップ34は、アドレス域「#2」が、ビルディングブロック#1に存在し、CPU#5がアクセスを行う旨を示す。また、ノードマップ34は、アドレス域「#3」がビルディングブロック#2に存在し、CPU#8がアクセスを行う旨を示す。
また、図39Bには、パーティション#Aを示すノードマップを示した。図39Bに示すように、パーティション#Aを示すノードマップは、各エントリに、バリッドと、ノードIDとCPUIDとを有する。例えば、図39Bに示す例では、ノードマップは、パーティション#Aにビルディングブロック#0のCPU#0が含まれる旨を示す。
例えば、図38に示す例では、CPU#0は、図39Aおよび図39Bに示すノードマップを有する。そして、CPU#0は、メモリアクセスを行う場合には、図39Aに示すノードマップを用いて、アクセス先のCPUを識別する。一方、CPU#0は、同一パーティション内のCPUのみに特殊パケットを送信する場合には、図39Bに示すノードマップを用いて、送信先のCPUを識別する。すなわち、CPU#0は、図39Bに例示するノードマップが示すパーティション#A内のCPUに対して、特殊パケットを送信する。
一方、CPU#4は、メモリアクセスを行うために、図39Aに示すノードマップと、図39Cに示すノードマップとを有する。ここで、図39Cは、パーティション#Bを示すノードマップの一例を説明するための図である。図39Cに示す例では、パーティション#Bを示すノードマップは、パーティション#Bに、ビルディングブロック#1のCPU#4およびCPU#5、ビルディングブロック#2のCPU38が存在することを示す。CPU#4は、図39Cに例示するノードマップが示すパーティション#B内のCPUに対して、特殊パケットを送信する。
このように、CPU#1およびCPU#4は、アドレス域とCPUIDとを対応付けたノードマップと、パーティションを示すノードマップとを記憶する。そして、CPU#1およびCPU#4は、アドレス域とCPUIDとを対応付けたノードマップを用いて、他のノードが有するメモリに対して直接メモリアクセスを行う。また、CPU#1は、パーティション#Aを示すノードマップを用いて、特殊パケットの送信を行う。また、CPU#4は、パーティション#Bを示すノードマップを用いて、特殊パケットの送信を行う。
このように、各CPUは、自身を含むパーティションごとに、異なる値を有するノードマップを有してもよい。また、各CPUは、自身を含むパーティションごとに異なる値を有するノードマップを有する場合は、特殊パケットをパーティションを超えた送信を行うことを防ぐことができる。
なお、各CPUは、上記の実施例と同様、スタートアドレスとアドレスマスク、又は、スタートアドレスとレングスでアクセス対象となるアドレス域を示しても良い。すなわち、CPU#1とCPU#4とは、スタートアドレスとアドレスマスク、又は、スタートアドレスとレングスとを用いて、アクセス対象となるアドレス域を示すノードマップを用いて、アクセス対象となるノードを識別する。また、CPU#1とCPU#4とは、それぞれ異なるパーティションを示すノードマップを用いて、特殊パケットの送信を行う。
(7)サービスプロセッサを経由した制御について
上述した情報処理システム1では、サービスプロセッサ24によってハードウェアであるノードマップ34にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、サービスプロセッサ24以外がノードマップ34にアクセスするよう構成しても良い。たとえば、CPU21〜21c上の一つあるいはすべてのCPUで動作している基本ファームウェアBIOS(Basic Input/Output System)あるいはHPVなどがノードマップ34にアクセスを行えるよう構成しても良い。