(57)【特許請求の範囲】
【請求項１】
それぞれがプロセッサおよび記憶装置を備える複数のノードを有する情報処理装置において、
前記ノードは、
前記ノード間で送受信するデータを前記記憶装置に格納する際のアドレスを示すライトポインタと、前記データを前記記憶装置から読み出す際のアドレスを示すリードポインタとを対応付けたポインタセットを、前記プロセッサが同時に実行可能なプロセスの数と同じか、またはそれ以上の数記憶する記憶部と、
前記ポインタセットを示すポインタ識別子を他のノードに通知するための通知部と、
他のノードから受信したデータを前記記憶装置に格納する格納部と、
前記プロセッサが同時に実行可能なプロセスの数と同じ数の送信部と、
を有し、
受信側ノードの通知部は、送信側ノードに対して前記ポインタ識別子を通知し、
前記送信側ノードの送信部は、送信対象となるデータと前記受信側ノードから通知された前記ポインタ識別子とを前記受信側ノードに送信し、
前記受信側ノードの格納部は、前記データと前記ポインタ識別子とを前記送信側ノードから受信した場合は、当該ポインタ識別子が示すポインタセットのライトポインタが示すアドレスに従って、当該受信したデータを前記記憶装置に格納する
ことを特徴とする情報処理装置。
【請求項２】
前記ノードは、実行中のプロセスのプログラムの進行を停止させる停止部を有し、
前記送信側ノードの停止部は、前記プロセスが前記受信側ノードに対して前記データを送信した場合には、当該データに対する応答を受信するまでの間、当該プロセスのプログラムの進行を停止させることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記ノードは、前記データの送信元となるノードに対して応答を送信する応答部を有し、
前記受信側ノードの応答部は、前記格納部が前記データを前記記憶装置に格納した場合は、前記送信側ノードに対して応答を送信することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記情報処理装置は、各ノードが共有する共有メモリを有し、
前記送信側ノードの送信部は、前記データを前記共有メモリに格納するとともに、当該データを格納した共有メモリのメモリアドレスを前記ポインタ識別子とともに前記受信側ノードに送信し、
前記受信側ノードの格納部は、前記ポインタ識別子と前記メモリアドレスとを受信した場合は、当該ポインタ識別子が示すポインタセットのライトポインタが示すアドレスに従って、当該受信したメモリアドレスを格納し、
前記受信側ノードが実行するプロセスは、前記格納部が前記記憶装置に格納したメモリアドレスに従って、前記共有メモリから前記データを取得することを特徴とする請求項１〜３のいずれか１つに記載の情報処理装置。
【請求項５】
前記記憶部は、前記ポインタセットごとに鍵情報を記憶し、
前記受信側ノードの通知部は、前記ポインタ識別子と当該ポインタ識別子が示すポインタセットの鍵情報とを前記送信側ノードに通知し、
前記送信側ノードの送信部は、前記データと、前記受信側ノードから通知された鍵情報と、前記ポインタ識別子とを送信し、
前記受信側ノードの格納部は、前記送信側ノードから受信したポインタ識別子が示すポインタセットについて前記記憶部が記憶する鍵情報と、当該ポインタ識別子とともに受信した鍵情報とが一致する場合は、当該ポインタセットのライトポインタが示すアドレスに従って、当該受信したデータを格納することを特徴とする請求項１〜４のいずれか１つに記載の情報処理装置。
【請求項６】
前記受信側ノードの応答部は、自ノードが新たなデータを受信できるか否かを示すオーバーフロービットを前記応答とともに前記送信側ノードへ送信し、
前記送信側ノードの送信部は、前記受信側ノードから通知されたオーバーフロービットが新たなデータを受信できない旨を示す場合は、前記受信側ノードに対して、新たなデータを記憶する余裕が生じた際に通知を行うよう要請し、
前記送信側ノードの停止部は、当該通知を受信するまでの間、当該受信側ノードに対してデータの送信を行うプロセスを停止させることを特徴とする請求項３に記載の情報処理装置。
【請求項７】
前記記憶部は、
複数の前記ポインタセットを記憶するメモリと、
前記データの送信元となるノードから受信したポインタ識別子が示すポインタセットを前記メモリから取得する取得部と、
前記取得部が取得したポインタセットを一時的に保持するレジスタと
を有することを特徴とする請求項１〜６のいずれか１つに記載の情報処理装置。
【請求項８】
前記ノードは、
前記格納部がデータを格納した場合は、当該データとともに受信したポインタ識別子が示すポインタセットのライトポインタの値を更新する更新部と、
前記ライトポインタと前記リードポインタとの値が一致するか否かを判別する判別部と、
前記判別部が、前記ライトポインタと前記リードポインタとの値が一致しないと判別した場合には、当該リードポインタが示すアドレスに従って、前記記憶装置から前記データの読み出しを行う読み出し部と
を有することを特徴とする請求項１〜７のいずれか１つに記載の情報処理装置。
【請求項９】
他の演算装置との間でデータの送受信を行う演算装置において、
前記データをメモリに書き込む際のアドレスを示すライトポインタと、前記データを前記メモリから読み出す際のアドレスを示すリードポインタとを対応付けた複数のポインタセットを、前記演算装置が同時に実行可能なプロセスの数と同じか、またはそれ以上の数記憶する記憶部と、
前記ポインタセットを示すポインタ識別子を、他の演算装置に通知するための通知部と、
他の演算装置から受信したデータを前記メモリに格納する格納部と、
前記演算装置が同時に実行可能なプロセスの数と同じ数の送信部と、
を有し、
受信側演算装置の通知部は、送信側演算装置に対して前記ポインタ識別子を通知し、
前記送信側演算装置の送信部は、送信対象となるデータと前記受信側演算装置から通知された前記ポインタ識別子とを前記受信側演算装置に送信し、
前記受信側演算装置の格納部は、前記データと前記ポインタ識別子とを前記送信側演算装置から受信した場合は、当該ポインタ識別子が示すポインタセットのライトポインタが示すアドレスに従って、当該受信したデータを前記メモリに格納する
ことを特徴とする演算装置。
【請求項１０】
それぞれがプロセッサおよび記憶装置を備える複数のノードを有する情報処理装置が実行する情報転送方法において、
前記ノード間で送受信するデータを前記記憶装置に格納する際のアドレスを示すライトポインタと、前記データを前記記憶装置から読み出す際のアドレスを示すリードポインタとを対応付けたポインタセットを、前記プロセッサが同時に実行可能なプロセスの数と同じか、またはそれ以上の数記憶する記憶部と、
前記ポインタセットを示すポインタ識別子を他のノードに通知するための通知部と、
他のノードから受信したデータを前記記憶装置に格納する格納部と、
前記プロセッサが同時に実行可能なプロセスの数と同じ数の送信部と、
を有するノードが、
受信側ノードとなる場合に、前記通知部を用いて、送信側ノードに対して前記ポインタ識別子を通知し、
前記送信側ノードとなる場合に、前記送信部のいずれかを用いて、送信対象となるデータと前記受信側ノードから通知された前記ポインタ識別子とを前記受信側ノードに送信し、
前記受信側ノードとなる場合に、前記格納部を用いて、前記データと前記ポインタ識別子とを前記送信側ノードから受信した場合は、当該ポインタ識別子が示すポインタセットのライトポインタが示すアドレスに従って、当該受信したデータを前記記憶装置に格納する
処理を実行することを特徴とする情報転送方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、演算装置および情報転送方法に関する。
【背景技術】
【０００２】
従来、複数のソフトウェアが連係して処理を実行する際に、各ソフトウェアが用いるデータを送受信するプロセス間通信（IPC:Inter  Process  Communication）の技術が知られている。このようなプロセス間通信を行う技術の一例として、キューを用いてプロセス間通信を行う技術が知られている。
【０００３】
以下、図４０〜４３を用いて、キューを用いてプロセス間通信を行う技術の一例について説明する。図４０は、従来のソフトウェアによるプロセス間通信の概念を説明するための図である。例えば、図４０に示す例では、各ユーザープロセスＡ〜Ｃは、ユーザープロセスＤに対して送信するデータをソフトウェアによって実現されたＦＩＦＯ（Fast  In  Fast  Out）方式のキューに格納する。一方、ユーザープロセスＤは、ＦＩＦＯ方式のキューに格納されたデータを、先頭から順に取得する。
【０００４】
次に、図４１を用いて、ユーザープロセスＡ〜Ｃがキューを用いてユーザープロセスＤにメッセージＡ〜Ｃの送信を行う際に実行する処理の内容について説明する。図４１は、従来のソフトウェアによるプロセス間通信における処理を説明するための図である。図４１に示す例では、キューとして用いられる記憶領域のベースアドレス、データの読み出しアドレスを示すリードポインタ、およびデータの書込アドレスを示すライトポインタがメモリに格納される。なお、以下の例では、初期状態におけるリードポインタとライトポインタとの値は、「０ｘ０１２０」であるものとする。
【０００５】
例えば、ユーザープロセスＡは、ライトポインタを参照し、ライトポインタが示すアドレス「０ｘ０１２０」から３２バイトのメッセージＡを格納する。そして、ユーザープロセスＡは、ライトポインタの値「０ｘ０１２０」に「０ｘ００２０」を加算し、「０ｘ０１４０」に更新する。なお、ユーザープロセスＡは、ライトポインタの更新を行う場合は、ＣＡＳ（Compare  And  Swap）命令やＦＡＤ（Fetch  And  Add）命令等のアトミックな命令を発行したり、ライトポインタの排他的ロックを取得する等の排他制御を行う。
【０００６】
続いて、ユーザープロセスＢは、ユーザープロセスＡと同様に、ライトポインタを参照し、ライトポインタが示すアドレス「０ｘ０１４０」から３２バイトのメッセージＢを格納し、ライトポインタの値を「０ｘ０１４０」から「０ｘ０１６０」に更新する。また、ユーザープロセスはＣも同様に、ライトポインタが示すアドレス「０ｘ０１６０」にメッセージＣを格納し、ライトポインタの値を「０ｘ０１６０」から「０ｘ０１８０」に更新する。
【０００７】
一方、ユーザープロセスＤは、ユーザープロセスＡ〜Ｃとは非同期に、リードポインタの値とライトポインタの値とが一致するか否かを判別し、各値が一致しない場合は、新たなメッセージがキューに格納されていると判別する。そして、ユーザープロセスＤは、新たなメッセージがキューに格納されると判別した場合は、リードポインタが示すアドレスからメッセージの読み出しを行う。
【０００８】
例えば、ユーザプロセスＤは、リードポインタの値が「０ｘ０１２０」であり、ライトポインタの値が「０ｘ０１６０」であるため、「０ｘ０１２０」からメッセージＡを読み出すとともに、リードポインタの値を「０ｘ０１２０」から「０ｘ０１４０」に更新する。このような処理をリードポインタとライトポインタの値が一致するまで繰り返すことで、ユーザープロセスＤは、キューに格納された各メッセージＡ〜Ｃの読み出しを行う。
【０００９】
ここで、複数のＣＰＵがそれぞれ異なるプロセスを実行するマルチノードシステムの技術が知られている。このようなマルチノードシステムの技術の一例として、データをキャッシュする機能を有するＣＰＵ（Central  Processing  Unit）を複数有し、各ＣＰＵがそれぞれ異なるプロセスを同時に実行する情報処理システムが知られている。さらには、各ＣＰＵがそれぞれ独立したＯＳを実行し、このＣＰＵ間で一部のメモリ領域を共有する、共有メモリシステムの技術が知られている。この様な構成とする事で、処理能力をより向上させる事が出来、さらに各ノードでＯＳが個別に動作する事で、エラーの波及を防止する事が出来るのでシステムの可用性を向上させる事が出来る。
【００１０】
図４２は、共有メモリを使用したマルチノードシステムの概念を説明するための図である。図４２に示すように、情報処理システムは、それぞれ個別のＣＰＵ＃０〜＃３を有する複数のノード＃０〜＃３を有する。また各ノード＃０〜＃３は、ローカルメモリ、ＨＰＶ（Hypervisor）ソフト、ＯＳ（Operating  System）、デバイスドライバを有し、それぞれ異なるユーザープロセスＡ〜Ｄを同時に実行する。なお、ＨＰＶソフトとは、各ノード＃０〜＃３が稼働させる仮想マシンの管理を行うソフトウェアである。このような情報処理システムでは、各ノード＃０〜＃３が共有する共有メモリにライトポインタとリードポインタとを格納することでキューを実現し、ユーザープロセスＡ〜Ｄ間のプロセス間通信を行う。
【００１１】
以下、図４３を用いて、ユーザープロセスＡ〜ＣがユーザプロセスＤにメッセージＡ〜Ｃを送信する際に各ＣＰＵ＃０〜＃３が実行する処理の一例について説明する。図４３は、各ノードがライトポインタをキャッシュする処理を説明するための図である。例えば、ユーザープロセスＡを実行するＣＰＵ＃０は、共有メモリ上のライトポインタをキャッシュし、ライトポインタが示すアドレス「０ｘ０１２０」からメッセージＡを格納する（図４３中（１））。また、ＣＰＵ＃０は、キャッシュしたライトポインタの値を「０ｘ０１４０」に更新し（図４３中（２））、ライトポインタのキャッシュラインが更新ステート（いわゆるＭｏｄｉｆｙ）である旨を記憶する。
【００１２】
続いて、ユーザープロセスＢを実行するＣＰＵ＃１は、ライトポインタのキャッシュラインが更新ステートであるため、ＣＰＵ＃０が更新したライトポインタをＣＰＵ＃０からキャッシュする（図４３中（３））。そして、ＣＰＵ＃１は、キャッシュしたライトポインタが示すアドレス「０ｘ０１４０」からメッセージＢを格納すると、ライトポインタの値を「０ｘ０１６０」に更新する（図４３中（４））。同様に、ユーザープロセスＣを実行するＣＰＵ＃２は、ＣＰＵ＃１が更新したライトポインタをＣＰＵ＃１からキャッシュし（図４３中（５））、キャッシュしたライトポインタが示すアドレス「０ｘ０１６０」からメッセージＣを格納する。そして、ＣＰＵ＃２は、ライトポインタの値を「０ｘ０１８０」に更新する（図４３中（６））。
【００１３】
ここで、ユーザープロセスＤを実行するＣＰＵ＃３は、リードポインタを共有メモリからキャッシュする（図４３中（７））。また、ＣＰＵ＃３は、ライトポインタのキャッシュラインが更新ステートであるため、ＣＰＵ＃２が更新したライトポインタをＣＰＵ＃２からキャッシュする（図４３中（８））。すると、ＣＰＵ＃３は、リードポインタの値「０ｘ０１２０」とライトポインタとの値「０ｘ０１６０」が一致しないので、リードポインタが示すアドレスからメッセージを読み出し、リードポインタの値を更新する。その後、ＣＰＵ＃３は、リードポインタの値とライトポインタの値とが一致するまで、メッセージの読み出しと、リードポインタの更新とを行い、各ユーザープロセスＡ〜Ｃが送信したメッセージＡ〜Ｃを取得する。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特許第２７０３４１７号公報
【特許文献２】特開２００３−２１６５９２号公報
【特許文献３】特開平０７−２００５０６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、共有メモリ上にリードポインタとライトポインタとを格納する技術では、データ送信側のノードがライトポインタをキャッシュし、キャッシュしたライトポインタの値を更新する。このため、ライトポインタをキャッシュしたノードが故障した場合は、他のノードがライトポインタの最新の値を取得できないため、データの伝送を行うことができなくなる。この結果、他のノードに故障が伝播するという問題がある。
【００１６】
以下、図４４を用いて、ライトポインタをキャッシュしているノードが故障した際に、他のノードに故障が伝播するという問題について説明する。図４４は、ノードが故障した際に他のノードへ故障が伝播する流れを説明するための図である。
【００１７】
例えば、ＣＰＵ＃０は、共有メモリ上のライトポインタをキャッシュし、メッセージＡを格納し、キャッシュしたライトポインタの値を「０ｘ０１４０」に更新する。続いて、ＣＰＵ＃１は、ＣＰＵ＃０が更新したライトポインタをＣＰＵ＃０からキャッシュすると、キャッシュしたライトポインタが示すアドレス「０ｘ０１４０」からメッセージＢを格納し、ライトポインタの値を「０ｘ０１６０」に更新する。
【００１８】
ここで、ノード＃１においてエラーが発生し、ＣＰＵ＃１が異常停止したものとする。すると、ＣＰＵ＃２は、メッセージを送信するために、ＣＰＵ＃１が更新したライトポインタをキャッシュしようとするが、ＣＰＵ＃１が停止しているので、図４４中（Ａ）に示すように、ライトポインタをキャッシュすることができない。このため、ＣＰＵ＃２は、処理を継続することができずに異常停止してしまう。
【００１９】
また、ＣＰＵ＃３は、新たなメッセージが送信されたか否かを判別するため、ライトポインタをキャッシュしようとする。しかし、ＣＰＵ＃３は、ＣＰＵ＃１が停止しているので、図４４中（Ｂ）に示すように、ＣＰＵ＃１からライトポインタをキャッシュすることができず、異常停止してしまう。さらに、ＣＰＵ＃０は、ＣＰＵ＃３が異常停止した場合は、メッセージＡで指定した処理が実行されないため、タイムアウト等により異常停止する可能性がある。
【００２０】
１つの側面では、本発明は、マルチノードシステムの技術が適用されたプロセス間通信において、ノードの故障が発生した際に他のノードに故障が伝播しないようにすることを目的とする。
【課題を解決するための手段】
【００２１】
１つの側面では、それぞれがプロセッサおよび記憶装置を備える複数のノードを有する情報処理装置において、前記ノードは、前記ノード間で送受信するデータを前記記憶装置に格納する際のアドレスを示すライトポインタと、前記データを前記記憶装置から読み出す際のアドレスを示すリードポインタとを対応付けたポインタセットを、前記プロセッサが同時に実行可能なプロセスの数と同じか、またはそれ以上の数記憶する記憶部と、前記ポインタセットを示すポインタ識別子を他のノードに通知するための通知部と、他のノードから受信したデータを前記記憶装置に格納する格納部と、前記プロセッサが同時に実行可能なプロセスの数と同じ数の送信部と、を有し、受信側ノードの通知部は、送信側ノードに対して前記ポインタ識別子を通知し、前記送信側ノードの送信部は、送信対象となるデータと前記受信側ノードから通知された前記ポインタ識別子とを前記受信側ノードに送信し、前記受信側ノードの格納部は、前記データと前記ポインタ識別子とを前記送信側ノードから受信した場合は、当該ポインタ識別子が示すポインタセットのライトポインタが示すアドレスに従って、当該受信したデータを前記記憶装置に格納する。
【発明の効果】
【００２２】
１実施形態では、マルチプノードシステムの技術が適用されたプロセス間通信において、ノードの故障が発生した際に他のノードに故障が伝播しないようにする。
【図面の簡単な説明】
【００２３】
【図１】図１は、実施例１に係る情報処理システムを説明するための図である。
【図２】図２は、実施例１に係るノードの機能構成を説明するための図である。
【図３】図３は、実施例１に係るメモリの割当を説明するための図である。
【図４】図４は、実施例１に係る情報処理システムが各メモリにマッピングするメモリマップを説明するための図である。
【図５】図５は、実施例１に係る情報処理システムにおけるハードウェアとソフトウェアとの関係を説明するための図である。
【図６】図６は、実施例１に係るＣＰＵが実行する処理の概念を説明するための図である。
【図７】図７は、実施例１に係るプロセス間通信の処理の流れを説明するための図である。
【図８】図８は、実施例１に係るＣＰＵの機能構成を説明するための図である。
【図９】図９は、実施例１に係る送信制御部の機能構成を説明するための図である。
【図１０】図１０は、各レジスタに付与されるアドレスの一例を説明するための図である。
【図１１】図１１は、ＭＳＧＱ−ＩＤのフォーマットの一例を説明するための図である。
【図１２】図１２は、ＭＳＧＱ−ＩＤの各フィールドに格納される情報を説明するための図である。
【図１３】図１３は、パケットフォーマットの一例を説明するための図である。
【図１４】図１４は、応答のパケットフォーマットの一例を説明するための図である。
【図１５】図１５は、実施例１に係る受信制御部の機能構成を説明するための図である。
【図１６】図１６は、ＲＡＭのフィールドの一例を説明するための図である。
【図１７】図１７は、ＲＡＭのフィールドに格納されるデータの内容を説明するための図である。
【図１８】図１８は、ソフトウェアから見た受信制御部のレジスタのアドレスの一例を説明するための図である。
【図１９】図１９は、メモリライトアドレスの一例を説明するための図である。
【図２０】図２０は、動作種類別にＲＡＭのフィールドの更新箇所を説明するための図である。
【図２１】図２１は、メッセージ記憶エリアを説明するための図である。
【図２２】図２２は、プログラムミスを考慮したアドレスマップを説明するための図である。
【図２３】図２３は、プログラムミスを考慮したアドレスマップにおけるアドレス構成を説明するための図である。
【図２４】図２４は、メッセージを送受信する際の動作を説明するためのシーケンス図である。
【図２５】図２５は、割り込み命令を用いてユーザプロセスに到着通知を発行する処理の流れを説明するためのシーケンス図である。
【図２６】図２６は、送信側ノードでコンテキストスイッチが発生した場合の処理の流れを説明するためのシーケンス図である。
【図２７】図２７は、従来のインフィニバンドにおけるキューペアの機能を説明するための図である。
【図２８】図２８は、プロセス間でキューペアを共有化した際の処理を説明するための図である。
【図２９】図２９は、新たなメッセージキューを獲得したプロセスが実行する処理の流れを説明するためのフローチャートである。
【図３０】図３０は、ドライバが新たなメッセージキューを獲得する処理の流れを説明するためのフローチャートである。
【図３１】図３１は、送信側のＣＰＵにおけるメッセージ送信処理の流れを説明するためのフローチャートである。
【図３２】図３２は、受信側のＣＰＵにおけるメッセージ受信処理の流れを説明するためのフローチャートである。
【図３３】図３３は、実施例２に係る受信制御部の機能構成を説明するための図である。
【図３４】図３４は、実施例２に係るＲＡＭのフィールドの定義を説明するための図である。
【図３５】図３５は、実施例２に係るＲＡＭのフィールドに格納されるデータの内容を説明するための図である。
【図３６】図３６は、実施例２に係るソフトウェアから見た受信制御部のアドレスの一例を説明するための図である。
【図３７】図３７は、実施例２に係るＲＡＭのフィールドを更新する処理を説明するための図である。
【図３８】図３８は、実施例２においてオーバーフローが発生した際に実行する処理の流れを説明するためのシーケンス図である。
【図３９】図３９は、実施例２に係るＣＰＵがオーバーフローの発生時に実行する処理の流れを説明するためのフローチャートである。
【図４０】図４０は、従来のソフトウェアによるプロセス間通信の概念を説明するための図である。
【図４１】図４１は、従来のソフトウェアによるプロセス間通信における処理を説明するための図である。
【図４２】図４２は、共有メモリを使用したマルチノードシステムの概念を説明するための図である。
【図４３】図４３は、各ノードがライトポインタをキャッシュする処理を説明するための図である。
【図４４】図４４は、ノードが故障した際に他のノードへ故障が伝播する流れを説明するための図である。
【発明を実施するための形態】
【００２４】
以下に添付図面を参照して本願に係る情報処理装置、演算装置および情報転送方法について説明する。
【実施例１】
【００２５】
以下の実施例１では、図１を用いて、情報処理システムの一例を説明する。図１は、実施例１に係る情報処理システムを説明するための図である。図１に示す例では、情報処理システム１は、クライアント端末２、クライアント端末２ａ、ＬＡＮ（Local  Area  Network）スイッチ３、管理端末４、ＬＡＮスイッチ５、２重のグローバルクロスバ６、複数のノード１０〜１０ｍを有する。また、グローバルクロスバ６は、サービスプロセッサ７を有する。
【００２６】
本実施例において、ノードは１つの独立したＯＳ（Operating  System）が走行する単位であり、ＯＳが走行する為に最低限必要な装置を含む。後に詳細に述べるが、それらは１つ以上のＣＰＵ、メモリ、ＨＤＤ（Hard  Disk  Drive）またはＨＤＤに代わる外部記憶装置を有する。ノードは物理的に単一の装置であっても良いし、ケーブル等の装置間接続機能によって接続されて物理的に複数の装置で構成されていても良い。
【００２７】
各ノード１０〜１０ｍは、サービス用ＬＡＮによってＬＡＮスイッチ３および各クライアント端末２、２ａと接続されている。また、各ノード１０〜１０ｍは、内部ＬＡＮによってＬＡＮスイッチ５と接続されている。また、各ノード１０〜１０ｍは、管理ＬＡＮを介して管理端末４と接続されている。また、各ノード１０〜１０ｍは、２重のグローバルクロスバ６と接続されており、インターコネクトを介して、相互に接続されている。
【００２８】
各クライアント端末２、２ａは、サービス用ＬＡＮを介して各ノード１０〜１０ｍからサービスを取得する。なお、図１では図示を省略したが、情報処理システム１は、任意の数のクライアント端末を他にも有してもよい。
【００２９】
ノード１０は、サービスプロセッサ１１、ＣＰＵ１２、ローカルＸＢ（クロスバ）１６を有する。また、他のノード１０ａ〜１０ｍは、ノード１０と同様に、サービスプロセッサ、ＣＰＵ、ローカルＸＢを有する。なお、以下の説明では、各ノード１０ａ〜１０ｍは、ノード１０と同様の機能を発揮するものとして、説明を省略する。
【００３０】
サービスプロセッサ１１は、管理ＬＡＮを介して管理端末４と接続されており、各ノード１０の電源管理等の管理制御を実行する。なお、グローバルクロスバ６が有するサービスプロセッサ７は、サービスプロセッサ１１のマスタとして動作し、全体の管理制御を行う。ここで、各サービスプロセッサ７、１１が実行する管理制御の例としては、電源管理、リセット、動作モードの変更、ノードの追加や削除の設定、エラーログの収集、縮退動作制御等である。
【００３１】
また、ノード１０〜１０ｍは、それぞれ独立してＯＳ（Operating  System）を実行する。また、図１では省略したが、ノード１０は、ＣＰＵ１２以外にも複数のＣＰＵを有し、各ＣＰＵは、ローカルＸＢ１６を介して、グローバルクロスバ６と接続されている。
【００３２】
また、ノード１０のＣＰＵ１２は、メモリアクセスのリクエストであるメモリアクセス要求をローカルＸＢ１６に出力することで、他のノードにメモリアクセス要求を転送する。そして、ノード１０のＣＰＵ１２は、メモリアクセス要求を取得すると、自身が自身と接続されたメモリに対してアクセスを行う際と同様にメモリアクセスを実行する。すなわち、情報処理システム１には、ＮＵＭＡ（Non-Uniform  Memory  Access）の技術が適用されており、各ノード１０〜１０ｍが、それぞれのメモリを共用して処理を実行する。
【００３３】
次に、図２を用いて、ノード１０の機能構成について説明する。図２は、実施例１に係るノードの機能構成を説明するための図である。図２に示す例では、ノード１０は、サービスプロセッサ１１、複数のＣＰＵ１２〜１５、ローカルＸＢ１６、複数のメモリ１７〜２４、ＰＣＩｅ（Peripheral  Component  Interconnect  Express）スイッチ２５を有する。また、ノード１０は、サービス用ＬＡＮと接続するためのＬＡＮアダプタ２６、管理用ＬＡＮと接続するためのＬＡＮアダプタ２７、ＳＡＳ（Serial  Attached  SCSI）２８、ＨＤＤ（Hard  Disk  Drive）２９を有する。
【００３４】
また、メモリ１７およびメモリ１８は、ＣＰＵ１３と接続されており、ＣＰＵ１３によるメモリアクセスを受付ける記憶装置である。また、メモリ１９およびメモリ２０は、ＣＰＵ１２と接続されており、ＣＰＵ１２によるメモリアクセスを受付ける記憶装置である。また、メモリ２１およびメモリ２２は、ＣＰＵ１４と接続されており、ＣＰＵ１４によるメモリアクセスを受付ける記憶装置である。
【００３５】
また、メモリ２３およびメモリ２４は、ＣＰＵ１５と接続されており、ＣＰＵ１５によるメモリアクセスを受付ける記憶装置である。なお、図２に示す例では、ノード１０は、ＨＤＤ２９を有しているが、実施例はこれに限定されるものではなく、ＳＡＮ（Storage  Area  Network）等の技術を適用し、ノード１０の外部に設置してもよい。
【００３６】
サービスプロセッサ１１は、ノード１０の管理制御を実行する。具体的には、サービスプロセッサ１１は、処理を実行するプロセッサとＦＰＧＡ（Field-Programmable  Gate  Array）を有し、管理端末４から管理用ＬＡＮを介して、管理制御の実行命令を受付ける。そして、サービスプロセッサ１１は、管理端末４から受付けた実行命令に従って、各種管理制御を実行する。
【００３７】
ＰＣＩｅスイッチ２５は、各ＣＰＵ１２〜１５からＰＣＩｅスロットを介して接続されるＩ／Ｏ装置等へのアクセスを制御するスイッチである。また、ＬＡＮアダプタ２６は、サービス用ＬＡＮとノード１０とを接続するＬＡＮアダプタである。また、ＬＡＮアダプタ２７は、管理用ＬＡＮとノード１０とを接続するＬＡＮアダプタである。また、ＳＡＳ２８は、ＰＣＩｅスロットに搭載されたＬＡＮやＳＡＳ用のアダプタであり、ＨＤＤ２９と各ＣＰＵ１２〜１５との接続を中継する。
【００３８】
次に、各ＣＰＵ１２〜１５について説明する。各ＣＰＵ１２〜１５は、相互に接続されており、メモリアクセス要求や応答を相互に送受信することができる。以下、ＣＰＵ１２について説明する。なお、ＣＰＵ１２は、他のＣＰＵ１３〜１５と相互に接続されている。なお、ＣＰＵ１３〜１５は、ＣＰＵ１２と同様の機能を発揮するものとして説明を省略する。
【００３９】
ＣＰＵ１２は、メモリ１９およびメモリ２０に対してメモリアクセスを行うメモリインターフェースの機能を有し、メモリ１９またはメモリ２０が記憶するデータをキャッシュし、キャッシュしたデータを用いて、演算処理を実行する。また、ＣＰＵ１２は、ＰＣＩｅスイッチ２５を介して、ＨＤＤ２９や内部ＬＡＮ、管理用ＬＡＮ等を用いたアクセスを制御するＰＣＩｅインターフェース機能を有する。
【００４０】
また、ＣＰＵ１２は、ローカルＸＢ１６、グローバルクロスバ６を介して、他のノード１０ａ〜１０ｍが有するＣＰＵとインターコネクトで接続され、相互にメモリアクセスの要求等を送受信するインターコネクトルータ機能を有する。このようなＣＰＵ１２は、例えば、実行するプロセスにより、メモリ１９、または、メモリ２０に対するメモリアクセス要求が発行された場合には、以下の処理を実行する。すなわち、ＣＰＵ１２は、メモリ１９、または、メモリ２０にアクセスし、アクセス対象となるデータをキャッシュする。
【００４１】
また、ＣＰＵ１２は、実行するプロセスにより、メモリ１９、メモリ２０以外のメモリに対するメモリアクセス要求が発行された場合には、メモリアクセス対象となるメモリと接続されたＣＰＵを識別し、識別したＣＰＵに対してメモリアクセス要求を送信する。詳細には、ＣＰＵ１２は、アクセス対象となるメモリアドレスと、メモリアドレスが示す記憶領域にアクセスするＣＰＵを一意に示す情報とを対応付けたノードマップを有する。
【００４２】
そして、ＣＰＵ１２は、プロセスがメモリアクセス要求を発行した場合には、ノードマップを参照し、メモリアクセスの対象となるメモリアドレスに対応付けられたＣＰＵを識別する。その後、ＣＰＵ１２は、識別したＣＰＵを宛先とするパケットを生成し、生成したパケットにメモリアクセス要求を格納して、ＣＰＵ１２〜１５の相互接続、又はローカルＸＢ１６に出力する。ローカルＸＢ１６に出力された場合には、ローカルＸＢ１６は、グローバルクロスバ６を介して、パケットを宛先となるＣＰＵに送信する。
【００４３】
なお、ＣＰＵ１２は、メモリ１９、および、メモリ２０に対するメモリアクセスを実行する場合には、メモリ１９、または、メモリ２０からキャッシュされたデータのコヒーレンシを保持する処理を実行する。例えば、ＣＰＵ１２は、メモリ１９、または、メモリ２０からデータをキャッシュしたＣＰＵに対してスヌープを送信し、キャッシュされたデータのライトバックを実行する。
【００４４】
ローカルＸＢ１６は、ノード１０が有するＣＰＵ１２〜１５と、他のノード１０ａ〜１０ｍが有するＣＰＵとの間でやり取りされるパケットを、指定相手先に転送するためのスイッチである。例えば、ローカルＸＢ１６は、ＣＰＵ１２が、ＣＰＵ１２ａを宛先として発行したパケットを、グローバルクロスバ６を介して、ノード１０ａが有するＣＰＵ１２ａに送信する。
【００４５】
メモリ１７〜メモリ２４は、ＯＳやアプリケーションが利用するデータを記憶するメモリであり、例えば、ＤＩＭＭ（Dual  In-Line  Memory  Module）である。また、メモリ１７〜２４は、同一のメモリアドレス空間にマッピングされている。
【００４６】
また、メモリ１７〜２４は、同一ノード内のＣＰＵ１２〜１５のみがアクセス可能な領域、すなわち、自身を有するノード専用の領域であるローカル領域を有する。また、メモリ１７〜２４は、情報処理システム１が有する任意のＣＰＵがアクセス可能な領域、すなわち、全てのノードが利用可能な共有メモリ領域を有する。また、メモリ１７〜２４の共有メモリ領域は、複数のセグメントに分割される。そして、各セグメントは、メモリトークンによるアクセス制御が行われるプロテクト領域、又は、メモリトークンによるアクセス制御を行わないノンプロテクト領域となる。
【００４７】
ここで、図３、図４を用いて、各メモリ１７〜２４にマッピングされるメモリアドレスについて説明する。図３は、実施例１に係るメモリの割当を説明するための図である。例えば、情報処理システム１は、各ノードが有する２つのメモリのうち、一方のメモリをローカル領域のみのメモリとし、他方のメモリを共用メモリ領域のみのメモリとする。すなわち、図３中（ａ）に示すように、メモリ１７、メモリ１９、メモリ２１、メモリ２３をノード専用のメモリとし、図３中（ｂ）に示すように、メモリ１８、メモリ２０、メモリ２２、メモリ２４を共用するメモリとする。
【００４８】
図４は、実施例１に係る情報処理システムが各メモリにマッピングするメモリマップを説明するための図である。なお、図４には、全部で１２８テラバイトのメモリアドレス空間が準備され、そのうちローカル領域に６４テラバイトが割当てられ、共有メモリ領域に６４テラバイトが割当てられる例について示す。
【００４９】
例えば、情報処理システム１は、ノード１０〜１０ｍが有するメモリのうち、ローカル領域として用いる範囲に「０」から「２４６−１」までのメモリアドレスを割当てる。また、情報処理システム１は、ノード１０〜１０ｍが有するメモリのうち、共有メモリ領域として用いる範囲に、「２４６」から「２４7−１」までのメモリアドレスを割当てる。
【００５０】
すなわち、図３および図４に示す例では、情報処理システム１は、図３中（ａ）に示すメモリ１７、メモリ１９、メモリ２１、メモリ２３に対して、図４中（ｃ）に示す範囲のメモリアドレスをマッピングする。また、情報処理システム１は、図３中（ｂ）に示すメモリ１８、メモリ２０、メモリ２２、メモリ２４に対して、図４中（ｄ）に示す範囲のメモリアドレスをマッピングする。なお、図４中の「２４7」から「２４8−１」までのアドレスは、ＵＣ（Uncacheable）領域として用いられるアドレスの範囲であり、例えば、ＨＤＤ２９等のＩ／Ｏ装置が用いるＩ／Ｏ空間として用いられるアドレスの範囲である。
【００５１】
このように、情報処理システム１は、各ノード１０〜１０ｍが有するメモリに対して、単一のメモリアドレス空間をマッピングする。このため、任意のＣＰＵが任意のノードの共有メモリ領域に対して直接アクセスできる。なお、図４に示すメモリマップはあくまで一例であり、任意の割当を行うこととしても良い。
【００５２】
すなわち、メモリマップ上のメモリアドレスの全てがメモリに割当てられている必要はなく、メモリホールが存在しても良い。また、情報処理システム１が有する各ノードにＯＳが利用するローカル領域が存在し、かつ、１つ以上のノードに共有メモリ領域が存在するように、メモリマップを設定すればよい。
【００５３】
なお、情報処理システム１は、１つのノード内に含まれるメモリ（例えば、メモリ１７とメモリ１８）に対して連続するメモリアドレスをマップした場合は、制御資源を削減することができる。また、情報処理システム１は、少なくとも、セグメント領域のアライメントをそろえることができるようにメモリアドレスの割り当てを行う。
【００５４】
次に、図５を用いて、各ＣＰＵ１２〜１５のハードウェアと各ＣＰＵ１２〜１５が実行するソフトウェアとの関係について説明する。図５は、実施例１に係る情報処理システムにおけるハードウェアとソフトウェアとの関係を説明するための図である。なお、図５に示す例では、ＣＰＵ１２が有するハードウェアをハードウェア３０とし、ＣＰＵ１３が有するハードウェアをハードウェア３０ａとした。また、図５に示す例では、ＣＰＵ１４が有するハードウェアをハードウェア３０ｂとし、ＣＰＵ１５が有するハードウェアをハードウェア３０ｃとした。
【００５５】
例えば、ＣＰＵ１２は、ハードウェア３０を有し、ＣＰＵ１２専用のローカルなメモリ１７および共有メモリ１８、２０、２２、２４にアクセスする。また、ＣＰＵ１２は、ハードウェア３０上で、ハイパーバイザ３１、オペレーティングシステム３２、ドライバ３３、ミドルウェア３４を動作させる。また、ＣＰＵ１２は、ミドルウェア３４上に、各ＣＰＵ１２〜１５が協調して動作させるアプリケーション３５を実行する。
【００５６】
また、他のＣＰＵ１３〜１５は、ＣＰＵ１２と同様に、ハードウェア３０ａ〜３０ｃを有し、ハイパーバイザ３１ａ〜３１ｃ、オペレーティングシステム３２ａ〜３２ｃ、ドライバ３３ａ〜３３ｃ、ミドルウェア３４ａ〜３４ｃを動作させる。
【００５７】
次に、図６を用いて、実施例１に係るＣＰＵ１２〜１５が実行する処理の概要について説明する。なお、以下の説明においては、ＣＰＵ１３〜１５は、ＣＰＵ１２と同様の機能を発揮するものとして、説明を省略する。
【００５８】
図６は、実施例１に係るＣＰＵが実行する処理の概念を説明するための図である。図６には、ＣＰＵ１２が実行する複数の送信プロセス＃１〜＃６が、受信側のＣＰＵ１３が実行する受信プロセス＃１〜＃ｎに対してメッセージを送信する処理の概要について記載した。例えば、ＣＰＵ１２は、複数のコアと各コアごとの送信バッファとを有する。また、ＣＰＵ１３は、実行する受信プロセスごとの受信キュー＃１〜＃ｎを有する。
【００５９】
例えば、各コアは、ＯＳ３２上で動作する複数の送信プロセス＃１〜＃６のうち、いずれかの送信プロセスを動作させる。例えば、図６に示す例では、各コアは、送信プロセス＃２〜＃５を動作させる。そして、各コアは、実行中の送信プロセスがメッセージをＣＰＵ１３に送信する場合は、送信するメッセージを送信バッファに格納する。
【００６０】
また、各送信バッファは、各コアが実行するプロセスのメッセージが格納されると、メッセージを受信する受信プロセスに応じて、ＣＰＵ１３が有する受信キュー＃１〜＃ｎのいずれかに格納する。そして、各受信プロセス＃１〜＃ｎは、ＣＰＵ１３によって実行された際に、自身の受信キューに格納されたメッセージを取得する。
【００６１】
なお、１つのコアが複数スレッドを同時に実行出来るのであれば、ＣＰＵ１２は、送信バッファレジスタをスレッド毎に持つ。そして、ＣＰＵ１２は、コンテキストスイッチが発生した際に、送信バッファレジスタに格納されたデータのセーブやリストアを行う事で、仮想的に送信プロセスの数と同じ送信バッファを有するように動作する。
【００６２】
次に、図７を用いて、情報処理システム１において、各ＣＰＵが実行するプロセスがプロセス間通信を行う処理の流れについて説明する。図７は、実施例１に係るプロセス間通信の処理の流れを説明するための図である。なお、図７に示す例では、ハードウェア３０、３０ａ上で動作する送信プロセス＃Ａ、＃Ｂが、ハードウェア３０ｃ上で動作する受信プロセスに対して、メッセージを送信する処理の流れについて説明する。
【００６３】
例えば、図７に示す例では、ハードウェア３０およびハードウェア３０ａは、送信するメッセージを一時的に記憶する送信レジスタを有する。また、メッセージを受信するハードウェア３０ｃは、リードポインタとライトポインタとを対応付けた複数のレジスタセットと、メッセージを受信する受信バッファとを有する。
【００６４】
まず、ハードウェア３０ｃが実行する受信プロセスは、図７中（ａ）に示すように、共有メモリ上、またはローカルメモリ上にメッセージを格納する領域を予め設定する。つぎに、受信プロセスは、図７中（ｂ）に示すように、ドライバ３３ｃを呼び出して、レジスタセット資源の獲得、および初期化を行う。次に、受信プロセスは、図７中（ｃ）に示すように、獲得したレジスタセットを一意に示すレジスタＩＤを送信プロセス＃Ａおよび送信プロセス＃Ｂに通知する。
【００６５】
すると、送信プロセス＃Ａは、受信プロセスから通知されたレジスタＩＤと送信メッセージ＃Ａとを含むメッセージ＃Ａを生成し、図７中（ｄ）に示すように、ハードウェア３０が有する送信レジスタに格納する。また、送信プロセス＃Ｂは、受信プロセスから通知されたレジスタＩＤと送信メッセージ＃Ｂとを含むメッセージ＃Ｂを生成し、図７中（ｅ）に示すように、ハードウェア３０が有する送信レジスタに格納する。
【００６６】
また、ハードウェア３０、３０ａは、送信レジスタにメッセージ＃Ａ、＃Ｂが格納されると、各メッセージをパケット化する。そして、ハードウェア３０、３０ａは、図７中（ｆ）に示すように、ノード間インターコネクトを介して、ハードウェア３０ｃが有する受信バッファに格納する。するとハードウェア３０ｃは、受信したパケットに含まれるレジスタＩＤを識別し、識別したレジスタＩＤが示すレジスタセットのライトポインタが示す記憶領域に、メッセージを格納する。例えば、ハードウェア３０ｃは、図７中（ｇ）に示すように、同一のレジスタセットのライトポインタが示す記憶領域から、メッセージ＃Ａおよびメッセージ＃Ｂを順に格納する。
【００６７】
ここで、受信プロセスは、図７中（ｈ）に示すように、ポーリングによる監視、または、割り込み処理の発生を用いて、メッセージの着信を検知する。そして、受信プロセスは、送信プロセス＃Ａおよび送信プロセス＃Ｂに通知したレジスタＩＤが示すレジスタセットのリードポインタを用いて、図７中（ｉ）に示すように、メッセージ＃Ａおよびメッセージ＃Ｂの読み出しを行う。
【００６８】
このように、実施例１に係るプロセス間通信においては、メッセージ受信側のＣＰＵが複数のレジスタセットを有し、メッセージ送信側のＣＰＵに対して、レジスタセットを識別するレジスタ識別子を送信する。すると、メッセージ送信側のＣＰＵは、レジスタ識別子とともに、メッセージをメッセージ受信側のＣＰＵへ送信する。その後、メッセージ受信側のＣＰＵは、受信したレジスタ識別子が示すレジスタセットのライトポインタを用いて、受信したメッセージの格納を行う。
【００６９】
この結果、各ＣＰＵ１２〜１５は、リードポインタやライトポインタをキャッシュせずとも、キューを用いたプロセス間通信を実現することができる。このため、各ＣＰＵ１２〜１５は、いずれかのＣＰＵに故障が生じた際にも、リードポインタやライトポインタの読み出しができなくなるということがないため、故障の波及を防ぐことができる。
【００７０】
なお、各ＣＰＵ１２〜１５は、自身に対して同時にメッセージを送信するプロセスの数、同時にメッセージを送信するプロセスの数よりも多くのレジスタセットを有する。すなわち、各ＣＰＵ１２〜１５は、同時にメッセージを受信するプロセスの数だけレジスタセットを有する。この結果、各ＣＰＵ１２〜１５は、任意のプロセスを実行中にレジスタセットが足りなくなり、プロセス間通信ができなくなるといった事態を防ぐことができる。
【００７１】
次に、図８を用いて、ＣＰＵ１２の機能構成の一例について説明する。図８は、実施例１に係るＣＰＵの機能構成を説明するための図である。図８に示す例では、ＣＰＵ１２は、ローカルＸＢ１６、メモリ１７、メモリ１８、ＰＣＩｅスイッチ２５と接続されている。また、ＣＰＵ１２は、複数のコア４０〜４０ｂ、Ｌ１キャッシュタグ４１〜４１ｂ、Ｌ１キャッシュ４２〜４２ｂ、ＴＬＢ（Translation  Lookaside  Buffer）４３〜４３ｂを有する。
【００７２】
また、ＣＰＵ１２は、Ｌ２キャッシュアクセスコントローラ４４、Ｌ２キャッシュタグ４５、Ｌ２キャッシュ４６、アドレスマップ４７、設定レジスタ群４８、ＰＣＩ制御部４９、ディレクトリ制御部５０、キャッシュコヒーレンシトランザクション制御部５１、ＭＳＧＱ（メッセージキュー）制御ブロック５６を有する。また、ＭＳＧＱ制御部５６は、送信制御部５７、受信制御部５８を有する。
【００７３】
なお、アドレスマップ４７、ＰＣＩ制御部４９、ディレクトリ制御部５０、キャッシュコヒーレンシトランザクション制御部５１、ＭＳＧＱ制御部５６は、メモリＲ／Ｗ（Read/Write）バス５３を介して接続されている。また、各コア４０〜４０ｂ、アドレスマップ４７、設定レジスタ群４８、ＰＣＩ制御部４９、ディレクトリ制御部５０、キャッシュコヒーレンシトランザクション制御部５１、ＭＳＧＱ制御部５６は、レジスタＲ／Ｗバス５４を介して接続されている。
【００７４】
なお、コア４０ａ、コア４０ｂについては、コア４０と同様の機能を発揮するものとして、以下の説明を省略する。また、Ｌ１キャッシュタグ４１ａ、Ｌ１キャッシュタグ４１ｂは、Ｌ１キャッシュタグ４１と同様の機能を発揮し、Ｌ１キャッシュ４２ａ、Ｌ１キャッシュ４２ｂは、Ｌ１キャッシュ４２と同様の機能を発揮するものとして、以下の説明を省略する。また、ＴＬＢ４３ａ、ＴＬＢ４３ｂは、ＴＬＢ４３と同様の機能を発揮するものとして、以下の説明を省略する。
【００７５】
コア４０は、Ｌ１キャッシュ４２に格納されたデータを用いて、演算処理を実行する演算装置であり、命令実行ユニットおよび演算ユニットを有する。また、コア４０は、ＣＰＵ１２以外のＣＰＵが実行するプロセスに対して、メッセージの送信を行う場合には、以下の処理を実行する。
【００７６】
まず、コア４０は、メッセージの送信先となるＣＰＵが実行するプロセスから、レジスタセットを示すレジスタＩＤを取得する。また、コア４０は、送信先のＣＰＵから受信したレジスタＩＤと、メッセージの送信先となるＣＰＵを示すＣＰＵ−ＩＤとを含むＭＳＧＱ−ＩＤを生成する。そして、コア４０は、送信するメッセージと、ＭＳＧＱ−ＩＤをＭＳＧＱ制御部５６の送信制御部５７に送信する。また、コア４０は、メッセージの送信先となるＣＰＵのアドレスと、送信を要求するコマンドとを送信制御部５７に送信する。
【００７７】
また、コア４０は、ＣＰＵ１２以外のＣＰＵが実行するプロセスから、メッセージの受信を行う場合は、ＭＳＧＱ制御部５６が記憶するレジスタセットを獲得し、獲得したレジスタセットを示すレジスタＩＤを取得する。そして、コア４０は、取得したレジスタＩＤを、メッセージ送信元のＣＰＵが実行するプロセスに対して通知する。なお、コア４０は、任意の手法を用いて、ＣＰＵ１２以外のＣＰＵが実行するプロセスに対してレジスタＩＤを通知してよい。
【００７８】
なお、コア４０がメッセージとＭＳＧＱ−ＩＤをＭＳＧＱ制御部５６の送信制御部５７に送信する処理は、レジスタＲ／Ｗバス５４を介して実行される。すなわち、コア４０は、送信対象となるメッセージとＭＳＧＱ−ＩＤとを送信制御部５７が有するレジスタに書き込むストア要求を発行することにより、メッセージとＭＳＧＱ−ＩＤを送信制御部５７に送信する。
【００７９】
Ｌ１キャッシュタグ４１は、Ｌ１キャッシュ４２のタグデータであり、Ｌ１キャッシュ４２の各キャッシュラインに格納されたデータのアドレス、ステート、リプレース用のＬＲＵ（Least  Recently  Used）情報等を記憶する。Ｌ１キャッシュ４２は、高速にアクセス可能なキャッシュメモリであり、メモリ１７、メモリ１８、Ｌ２キャッシュ４６に格納されたデータの一部をキャッシュする。
【００８０】
なお、Ｌ１キャッシュ４２は、コア４０専用の１次キャッシュである。例えば、Ｌ１キャッシュ４２は、命令用の領域とデータ用の領域とにそれぞれ６４キロバイトの容量を有する。また、ＴＬＢ４３は、変換テーブルを用いて、コア４０が出力する仮想アドレスを物理アドレスに変換する。
【００８１】
Ｌ２キャッシュアクセスコントローラ４４は、Ｌ２キャッシュタグ４５やＬ２キャッシュ４６のアクセスコントローラであり、Ｌ２キャッシュタグ４５やＬ２キャッシュ４６にアクセスするためのパイプラインである。また、Ｌ２キャッシュアクセスコントローラ４５は、同一アドレスをシリアライズ処理する機能を有する。
【００８２】
Ｌ２キャッシュタグ４５は、Ｌ２キャッシュ４６のタグデータであり、Ｌ１キャッシュタグ４１と同様の情報を記憶する。また、Ｌ２キャッシュ４６は、各コア４０〜４０ｂが共用する２次キャッシュメモリである。アドレスマップ４７は、リクエスト対象となる物理アドレスと、物理アドレスが示す記憶領域にアクセスするＣＰＵの識別子とを対応付けて記憶し、物理アドレスをＣＰＵの識別子に変換する。
【００８３】
つまり、アドレスマップ４７は、ＣＰＵ１２が他のＣＰＵと接続されたメモリにアクセスするリクエストを発行すると、アクセス対象の物理アドレスからリクエストの送信先となるＣＰＵの識別子を判別する。そして、アドレスマップ４７は、ディレクトリ制御部５０や、キャッシュコヒーレンシトランザクション制御部５１にＣＰＵの識別子を通知する。
【００８４】
設定レジスタ群４８は、ＣＰＵ１２の各種設定を行う複数のレジスタであり、レジスタＲ／Ｗバス５４を介して、コア４０〜４０ｂからのストア要求等により、データが格納される。ＰＣＩ制御部４９は、ＣＰＵ接続のＰＣＩｅｘｐｒｅｓｓに対するルートコンプレックスである。
【００８５】
ディレクトリ制御部５０は、ＮＵＭＡの技術を用いたメモリアクセスを制御する。また、ディレクトリ制御部５０は、ＤＭＡ（Direct  Memory  Access）等のメモリリクストを取得すると、メモリ１７、メモリ１８に格納されたディレクトリ情報を用いて、キャッシュコヒーレンシを維持する処理を実行する。例えば、ディレクトリ制御部５０は、キャッシュコヒーレンシトランザクション制御部５１を用いて、他のＣＰＵにスヌープを発行したり、他のＣＰＵが発行したスヌープに対する応答等を実行する。
【００８６】
キャッシュコヒーレンシトランザクション制御部５１は、ローカルＸＢ１６を介して、ＣＰＵ１２以外のＣＰＵからのスヌープを受付けると、Ｌ２キャッシュ４６を検査し、検査結果を応答として返信する。また、キャッシュコヒーレンシトランザクション制御部５１は、ディレクトリ制御部５０からスヌープの発行を要求された場合は、スヌープをＣＰＵ１２以外のＣＰＵに対して送信する。例えば、キャッシュコヒーレンシトランザクション制御部５１は、Ｌ２キャッシュ４６に格納されたスヌープ対象のデータのステートが「Ｍ」であった場合には、キャッシュデータをスヌープの応答として送信する。
【００８７】
ＭＳＧＱ制御部５６は、他のＣＰＵ１３〜１５や、他のノード１０ａ〜１０ｍが実行するプロセスと、ＣＰＵ１２が実行するプロセスとの間におけるプロセス間通信を制御する。具体的には、ＭＳＧＱ制御部５６は、メッセージの書き込み開始位置を示すライトポインタと、メッセージの読み込み開始位置を示すリードポインタとの組であるレジスタセットを複数記憶する。
【００８８】
また、ＭＳＧＱ制御部５６は、コア４０〜４０ｂは、コア４０〜４０ｂが実行するプロセスが、ＣＰＵ１２以外のＣＰＵが実行するプロセスからメッセージを受信する場合は、使用していないレジスタセットを獲得する。その後、ＭＳＧＱ制御部５６は、獲得したレジスタセットを示すレジスタＩＤをコア４０〜４０ｂが実行するプロセスに通知する。そして、ＭＳＧＱ制御部５６は、コア４０〜４０ｂから送信するメッセージとレジスタ識別子とを受信すると、受信したメッセージとＭＳＧＱ−ＩＤとを含むパケットを生成し、ローカルＸＢ１６を介して、パケットを送信する。
【００８９】
また、ＭＳＧＱ制御部５６は、レジスタセットを複数記憶し、他のＣＰＵ１３〜１５や他のノード１０ａ〜１０ｍからパケットを受信した場合は、受信したパケットに含まれるＭＳＧＱ−ＩＤからレジスタＩＤを抽出する。そして、ＭＳＧＱ制御部５６は、抽出したレジスタＩＤが示すレジスタセットを識別する。そして、ＭＳＧＱ制御部５６は、識別したレジスタセットのライトポインタが示す記憶領域に、受信したパケットに含まれるメッセージを格納する。なお、ＭＳＧＱ制御部５６は、メッセージを格納する場合には、メモリＲ／Ｗバス５３を介して、ディレクトリ制御部５０にメッセージを転送する。このような場合には、ディレクトリ制御部５０は、受信したメッセージをメモリ１７、１８に格納する。
【００９０】
ローカルＸＢ１６は、インターコネクト用のルータであり、ＣＰＵの識別子に対応した宛先へ、リクエストを送信する。また、ローカルＸＢ１６は、送信するリクエストのパケット化やＣＲＣ（Cyclic  Redundancy  Check）の付加等を行う。
【００９１】
次に、図９を用いて、送信制御部５７の機能構成について説明する。図９は、実施例１に係る送信制御部の機能構成を説明するための図である。図９に示す例では、送信制御部５７は、アドレスデコーダ５９、複数の制御資源６０〜６０ｃ、セレクタ６９、リードデータセレクタ７０を有する。また、各制御資源６０〜６０ｃは、メッセージデータレジスタ６１、ＭＳＧＱ−ＩＤレジスタ６２、発行要求フラグレジスタ６３、送信パケット生成部６４、セレクタ６５、応答ステータスレジスタ６６、リードデータセレクタ６７、応答受信フラグレジスタ６８を有する。
【００９２】
ここで、制御資源６０は、コア４０用の制御資源であり、他の制御資源６０ａ、６０ｂは、それぞれ、コア４０ａ、４０ｂ用のコア資源であり、制御資源６０ｃは、図８において記載を省略した他のコア用の制御資源である。なお、図９に示す例では、制御資源６０についてのみ機能構成を記載したが、他の制御資源６０ａ〜６０ｃは、制御資源６０と同様の機能構成を有するものとする。また、図９に示す例では、各コア４０〜４０ｂごとの制御資源を記載したが、ＣＰＵ１２は、同時に実行可能なプロセスの数だけ制御資源６０〜６０ｃを有するものとする。
【００９３】
まず、制御資源６０が有する各レジスタについて説明する。ここで、メッセージデータレジスタ６１、ＭＳＧＱ−ＩＤレジスタ６２、発行要求フラグレジスタ６３、応答ステータスレジスタ６６、応答受信フラグレジスタ６８には、それぞれアドレスが付与されている。そして、各コア４０〜４０ｂは、各レジスタに格納するデータを送信するとともに、データを格納するレジスタのアドレスとライト要求を発行することで、データを各レジスタに格納する。また、各コア４０〜４０ｂは、各レジスタのアドレスとリード要求とを発行することで、各レジスタの値を読み出すことができる。
【００９４】
図１０は、各レジスタに付与されるアドレスの一例を説明するための図である。なお、図１０には、各レジスタに付与されるアドレス、各レジスタに対して発行可能なコマンド、各レジスタに格納するデータのサイズ、各レジスタに格納するデータの意味、コンテキストスイッチ時にセーブ・リストアの対象とするか否かを記載した。コア４０が実行するプロセスは、図１０に示すアドレスとともに、リード要求またはライト要求を発行することで、制御資源６０が有する各レジスタの値を操作することができる。
【００９５】
例えば、メッセージデータレジスタ６１は、送信するメッセージを記憶するレジスタである。図１０に示す例では、メッセージデータレジスタ６１は、アドレス「０ｘ００」〜「０ｘ３Ｆ」が付与され、リード要求またはライト要求の対象となるレジスタであり、３２バイト又は６４バイトのデータが格納される。なお、メッセージデータレジスタ６１は、コンテキストスイッチ時にセーブ・リストアの対象となるレジスタである。
【００９６】
また、ＭＳＧＱ−ＩＤレジスタ６２は、ＭＳＧＱ−ＩＤを記憶するレジスタである。図１０に示す例では、ＭＳＧＱ−ＩＤレジスタ６２は、アドレス「０ｘ４０」〜「０ｘ４７」が付与され、リード要求またはライト要求の対象となるレジスタであり、３２ビットのデータが格納される。また、ＭＳＧＱ−ＩＤレジスタ６２は、コンテキストスイッチ時にセーブ・リストアの対象となるレジスタである。
【００９７】
ここで、図１１を用いて、ＭＳＧＱ−ＩＤレジスタ６２に格納するデータの一例について説明する。図１１は、ＭＳＧＱ−ＩＤのフォーマットの一例を説明するための図である。図１１に示すように、ＭＳＧＱ−ＩＤは、メッセージの送信先となるＣＰＵのＣＰＵ番号、レジスタセットの番号、レジスタセットに対するアクセスの可否を判断するためのアクセスキー、メッセージサイズを格納するフィールドを有する。
【００９８】
次に、図１２を用いて、ＭＳＧＱ−ＩＤの各フィールドに格納する情報の内容について説明する。図１２は、ＭＳＧＱ−ＩＤの各フィールドに格納される情報を説明するための図である。例えば、ＣＰＵ−ＩＤ［７：０］は、メッセージの送信先となるＣＰＵを示す８ビットの情報である。
【００９９】
また、レジスタＩＤとは、レジスタセットを示す１１ビットの番号であり、ＣＰＵ−ＩＤと合わせることで、情報処理システム１全体におけるユニークな宛先を示す。また、アクセスキーとは、アクセスの可否を判別するために用いる１２ビットの鍵情報であり、メッセージ受信側のプロセスが任意に決定し、メッセージ送信側のプロセスに対して通知される情報である。また、Ｍサイズとは、送信するメッセージのサイズを示す情報であり、値が「０」である場合は、送信するメッセージが３２バイトである旨を示し、値が「１」である場合は、送信するメッセージが６４バイトである旨を示す。
【０１００】
図１０に戻って、発行要求フラグレジスタ６３は、コア４０がメッセージの送信を要求する際にフラグを格納するレジスタである。図１０に示す例では、発行要求フラグレジスタ６３は、アドレス「０ｘ４８」〜「０ｘ４Ｆ」が付与され、ライト要求の対象となるレジスタであり、１ビットのデータ、すなわちフラグが格納される。後述する送信パケット生成部６４は、コア４０が発行要求フラグレジスタ６３に「１」を格納すると、メッセージとＭＳＧＱ−ＩＤとを含むパケットを宛先に送信することとなる。なお、発行要求フラグレジスタ６３は、コンテキストスイッチ時にセーブ・リストアの対象とはならない。
【０１０１】
応答ステータスレジスタ６６は、メッセージを送信したＣＰＵからの応答が正常に受信したか否かを示す応答ステータスを記憶するレジスタである。図１０に示す例では、応答ステータスフラグレジスタ６６は、「０ｘ５０」〜「０ｘ５７」のアドレスが付与され、リード要求またはライト要求の対象となるレジスタであり、ＰＲＯＴビットとＯＶＦＬビット２ビットのデータが格納される。ここで、ＰＲＯＴビットとは、鍵情報にアクセス可否の判別結果を示すビットであり、ＯＶＦＬビットとは、オーバーフローが発生したか否かの判別結果を示すビットである。なお、図１０では記載を省略したが、応答受信フラグレジスタ６８は、メッセージの応答を受信したか否かを示すフラグを記憶するレジスタである。
【０１０２】
なお、図１０に示された各レジスタは、ソフトウェアからアクセスが行い易い様に、データの有効長が８バイト（６４ビット）以内であっても、８バイトバウンダリに揃えられたアドレス域を占有する。また、各レジスタが占有するアドレス域において、データの有効長以外の部分の値は意味を持たないものとする。また、各コア４０〜４０ｂは、自身に対応する制御資源６０〜６０ｂのレジスタに対してのみ、リードおよびライトが格納であり、他の制御資源に対するリードおよびライトを行うことはできない。
【０１０３】
図９に戻って、アドレスデコーダ５９は、レジスタＲ／Ｗバス５４を介して、コア４０からアドレスとコマンドを受信すると、受信したアドレスとコマンドとをデコードし、制御資源６０が有するレジスタに格納する。例えば、アドレスデコーダ５９は、コア４０からコマンドとアドレスとを受信すると受信したコマンドとアドレスとをデコードし、デコードしたコマンドとアドレスとを制御資源６０に通知する。すると、制御資源６０は、アドレスデコーダ５９から受信したアドレスが示すレジスタを対象としたデータの読み出し、又は書き込みを実行する。
【０１０４】
送信パケット生成部６４は、発行要求フラグレジスタ６３に「１」が格納されると、メッセージデータレジスタ６１に格納されたメッセージと、ＭＳＧＱ−ＩＤレジスタ６２に格納されたＭＳＧＱ−ＩＤとを取得する。そして、送信パケット生成部６４は、取得したメッセージとＭＳＧＱ−ＩＤとを有するパケットを生成し、生成したパケットをセレクタ６９に出力する。
【０１０５】
ここで、図１３は、パケットフォーマットの一例を説明するための図である。図１３に示すように、送信パケット生成部６４は、フォーマット、送信先ＣＰＵ番号、オペコード、送信元ＣＰＵ番号、エントリＩＤ、ＭＳＧＱ−ＩＤ、データが格納されたパケットを生成する。ここで、フォーマットには、パケットのフォーマットタイプを示す４ビットの情報が格納される。
【０１０６】
送信先ＣＰＵ番号には、送信先のＣＰＵを示すＩＤ、すなわち８ビットのＤＩＤ（Destination  ID）が格納される。なお、送信パケット生成部６４は、ＭＳＧＱ−ＩＤレジスタ６２に格納されたＭＳＧＱ−ＩＤから送信先のＣＰＵ−ＩＤを取得し、取得したＣＰＵＩＤを送信先ＣＰＵ番号とする。
【０１０７】
オペコードには、アクセス要求の内容を示す４ビットの情報が格納される。送信元ＣＰＵ番号には、送信元のＣＰＵ、すなわちＣＰＵ１２を示す８ビットのＩＤが格納される。また、エントリＩＤには、リクエスト元のプロセスを一意に示す８ビットのエントリＩＤが格納される。なお、ＭＳＧＱ−ＩＤには、ＭＳＧＱ−ＩＤレジスタ６２に格納されたＭＳＧＱ−ＩＤが格納され、データには、ＭＳＧＱ−ＩＤのＭサイズの値に応じたサイズのメッセージが格納されるものとする。また、送信パケット生成部６４は、３２バイト、または６４バイトのメッセージが格納されたパケットを発行した場合、パケットのエントリＩＤを記憶する。
【０１０８】
図９に戻って、セレクタ６５は、コア４０が応答ステータスレジスタ６６に記憶された情報を読み出す場合には、レジスタＲ／Ｗバス５４と応答ステータスレジスタ６６を接続する。また、セレクタ６５は、ローカルＸＢ１６を介して、ＣＰＵ１２以外のＣＰＵから、図１４に示すフォーマットのパケットを応答として受信する。
【０１０９】
図１４は、応答のパケットフォーマットの一例を説明するための図である。図１４に示すように、応答のパケットには、ステータスとして、メッセージを正常に受信したか否かを示す２ビットの情報が格納されている。セレクタ６５は、応答を受信すると、エントリＩＤを用いて、受信した応答が送信パケット生成部６４が送信したパケットに対する応答であるか否かを判別する。そして、セレクタ６５は、送信パケット生成部６４が送信したパケットに対する応答であると判別した場合は、受信した応答からステータスを抽出し、抽出したステータスを応答ステータスレジスタ６６に格納する。
【０１１０】
リードデータセレクタ６７は、レジスタＲ／Ｗバス５４を介してコア４０が発行したリード要求の対象となるアドレスに応じて、メッセージデータレジスタ６１、ＭＳＧＱ−ＩＤレジスタ６２、応答ステータスレジスタ６６に格納されたデータを出力する。
【０１１１】
応答受信フラグレジスタ６８は、セレクタ６５が応答を受信すると同時に、応答を受信した旨を示すフラグ「１」が格納される。そして、応答受信フラグレジスタ６８は、フラグ「１」が格納されると、コア４０に対して、リクエストの送信が完了した旨をしめす信号を送信する。つまり、コア４０が実行するプロセスは、応答受信フラグレジスタ６８にフラグ「１」が格納されて始めて、メッセージの送信が行われたと判別する。
【０１１２】
ここで、コア４０は、メッセージを送信してから応答を受信するまでの間、プロセスの動作を待機する。すなわち、発行要求フラグレジスタ６３に「１」が格納されてから、応答受信フラグレジスタ６８に「１」が格納されてコアに対してリクエスト完了通知を送信するまでの間、コアで実行されるプログラムの進行を停止させる。これによって、コア４０は、メッセージの送信時にコンテキストスイッチが発生したとしても、プロセスに対して、１ステップでメッセージの送信が行われたように見せることができる。
【０１１３】
セレクタ６９は、各制御資源６０〜６０ｃが取得するパケットを取得すると、取得したパケットをローカルＸＢ１６に出力し、送信先となるＣＰＵへパケットを送信させる。また、リードデータセレクタ７０は、各コア４０〜４０ｂのリード要求に応じて、各制御資源６０〜６０ｃのレジスタから読み出されたデータを、レジスタＲ／Ｗバス５４を介して、各コア４０〜４０ｂに送信する。
【０１１４】
次に、図１５を用いて、受信制御部５８の機能構成について説明する。図１５は、実施例１に係る受信制御部の機能構成を説明するための図である。図１５に示す例では、受信制御部５８は、パケット受信部７１、メモリリクエスト制御部７４、ＲＡＭ（Random  Access  Memory）周辺部７８、コマンド実行部８９を有する。
【０１１５】
また、パケット受信部７１は、リクエストキュー７２、実行レジスタ７３を有する。また、メモリリクエスト制御部７４は、メモリリクエスト生成部７５、メモリリクエストレジスタ７６、ライトデータレジスタ７７を有する。また、ＲＡＭ周辺部７８は、ＲＡＭアドレス選択回路７９、ライトデータ生成部８０、ＲＡＭ８１、一時レジスタ群８２を有する。
【０１１６】
また、一時レジスタ群８２は、ＢＡＤＲＥＳ（ベースアドレス）レジスタ８３、ＭＫＥＹ（メモリキー）レジスタ８４、ＷＤＰ（ライトポインタ）レジスタ８５、ＲＤＰ（リードポインタ）レジスタ８６を有する。また、一時レジスタ群８２は、Ｑサイズ／Ｍサイズレジスタ８７、ＩＮＴＭＡＳＫ（インタラプトマスク）レジスタ８８を有する。また、コマンド実行部８９は、不一致検査部９０、一致検査部９１、加算値生成部９２、加算器９３、応答パケット生成部９４、応答コマンドレジスタ９５、割り込み生成回路９６を有する。
【０１１７】
まず、受信制御部５８が有するＲＡＭ周辺部７８について説明する。以下の説明では、ＲＡＭ８１および一時レジスタ群８２について説明し、その後、ＲＡＭ周辺部７８が有する各部について説明する。
【０１１８】
ＲＡＭ８１は、一時レジスタ群８２に格納される各情報を対応付けたエントリを複数記憶する。すなわち、ＲＡＭ８１は、複数のレジスタセットを記憶する。また、ＲＡＭ８１の記憶領域には、アドレスが付与されており、各コア４０〜４０ｂがＲＡＭ８１のアドレスとライト要求およびリード要求を発行することで、ＲＡＭ８１が記憶する値の操作や読み出しを行うことができる。
【０１１９】
具体的には、ＲＡＭ８１は、各レジスタ８３〜８８に格納される情報を対応付けたエントリを複数記憶する。以下、図１６を用いて、ＲＡＭ８１が記憶する各エントリに格納される情報について説明する。図１６は、ＲＡＭのフィールドの一例を説明するための図である。図１６に示す例では、ＲＡＭ８１は、８２ビットのエントリを有する。詳細には、ＲＡＭ８１は、エントリの８１ビット目から７９ビット目にＱサイズを保持し、７８ビット目にＭサイズを保持し、７７ビット目にＩＮＴＭＡＳＫを保持する。
【０１２０】
また、ＲＡＭ８１は、エントリの７６ビット目から３６ビット目にベースアドレスの４７ビット目から７ビット目までを保持し、３４ビット目から２４ビット目にメモリキーを保持する。また、ＲＡＭ８１は、エントリの２３ビット目から１６ビット目にライトポインタを保持し、エントリの１５ビット目から８ビット目にリードポインタを保持し、エントリの７ビット目から０ビット目にチェックビットを保持する。
【０１２１】
ここで、図１７を用いて、ＲＡＭ８１の各エントリに格納される情報の内容について説明する。図１７は、ＲＡＭのフィールドに格納されるデータの内容を説明するための図である。Ｑサイズとは、受信したメッセージを格納する記憶領域であるメッセージ記憶エリアのサイズを示す情報である。なお、Ｑサイズは、値が「０００」である場合は、当該エントリが無効である旨を示し、値が「００１」である場合は、メッセージ記憶エリアのサイズが１２８バイトである旨を示す。また、Ｑサイズは、値が「０１０」である場合は、メッセージ記憶エリアのサイズが２５６バイトである旨を示し、値が「０１１」である場合は、メッセージ記憶エリアのサイズが「５１２」バイトである旨を示す。
【０１２２】
また、Ｑサイズは、値が「１００」である場合は、メッセージ記憶エリアのサイズが１キロバイトである旨を示し、値が「１０１」である場合は、メッセージ記憶エリアのサイズが２キロバイトである旨を示す。また、Ｑサイズは、値が「１１０」である場合は、メッセージ記憶エリアのサイズが４キロバイトである旨を示し、値が「１１１」である場合は、メッセージ記憶エリアのサイズが８キロバイトである旨を示す。
【０１２３】
Ｍサイズとは、メッセージのサイズを示す情報であり、値が「０」の時は、メッセージのサイズが３２バイトであり、値が「１」の時は、メッセージのサイズが６４バイトであることを示す。ＩＮＴＭＡＳＫとは、メッセージ受信時に割込みを発生させるか否かを指示する情報である。なお、ＩＮＴＭＡＳＫは、値が「０」の場合は、割込みを発生させない旨を示し、値が「１」の場合は、割込みを発生させる旨を示す。
【０１２４】
ベースアドレスとは、メッセージを格納する記憶領域であるメッセージ記憶エリアの基準となる４１ビットのアドレス情報である。なお、ベースアドレスは、リードポインタとライトポインタと合わせて、メッセージ記憶エリアのアドレスを示し、メッセージ記憶エリアのサイズに応じて、データサイズが変化する。また、メッセージ記憶エリアは、後述する加算値が示すエリアサイズに一致したアドレスバウンダリから開始することとなる。
【０１２５】
メモリキーとは、メッセージ記憶エリアに対するアクセスを許可するか否かを判別するための鍵情報であり、すなわち、メッセージ記憶エリア保護のためのメモリキーの値である。また、ライトポインタとは、メッセージ記憶エリアにメッセージを書き込む際の書き込み開始アドレスを示す８ビットのアドレスである。また、リードポインタとは、メッセージ記憶エリアからメッセージを読み出す際の読み出し開始アドレスを示す８ビットのアドレスである。
【０１２６】
なお、ライトポインタの値およびリードポインタの値は、メッセージ記憶エリアのサイズに応じてデータサイズが変化する。また、チェックビットとは、同一エントリ内に含まれる各情報からエラーの検出および訂正を行うための冗長ビットであり、ＥＣＣ（Error  Detection  and  Correction）用のビットである。
【０１２７】
次に、一時レジスタ群８２が有する各レジスタ８３〜８８について説明する。各レジスタ８３〜８８は、ＲＡＭ８１が記憶する各エントリに含まれる情報を一時的に保持するレジスタである。具体的には、各レジスタ８３〜８８には、コア４０が実行するプロセスから見た際にそれぞれアドレスが付与されている。そして、コア４０が実行するプロセスは、アドレスを指定することで、各レジスタ８３〜８８に格納される情報の書き出しや読み出しを行うことができる。
【０１２８】
ここで、図１８を用いて、一時レジスタ群８２の各レジスタ８３〜８８に付与されるアドレスの一例について説明する。図１８は、ソフトウェアから見た受信制御部のレジスタのアドレスの一例を説明するための図である。なお、図１８に示す例では、各レジスタに付与されるアドレスと、各レジスタに対して発行可能なコマンド、各レジスタ８３〜８８に格納するデータのサイズについて記載した。また、図１８に示す例では、Ｑサイズ／Ｍサイズレジスタ８７に格納される情報を、ＱサイズとＭサイズとに分けて記載した。
【０１２９】
Ｑサイズ／Ｍサイズレジスタ８７は、ＱサイズとＭサイズとが格納されるレジスタである。図１８に示す例では、Ｑサイズ／Ｍサイズレジスタ８７は、Ｑサイズを格納するアドレスとして「０ｘ００」〜「０ｘ０７」が付与され、Ｍサイズを格納するアドレスとして「０ｘ０８」〜「０ｘ０Ｆ」が付与される。また、Ｑサイズ／Ｍサイズレジスタ８７は、ライト要求とリード要求との対象となるレジスタであり、３ビットのＱサイズと１ビットのＭサイズとが格納される。
【０１３０】
ＩＮＴＭＡＳＫレジスタ８８は、ＩＮＴＭＡＳＫが格納されるレジスタである。図１８に示す例では、ＩＮＴＭＡＳＫレジスタ８８には、ＩＮＴＭＡＳＫを格納するアドレスとして「０ｘ１０」〜「０ｘ１７」が付与され、ライト要求とリード要求との対象となるレジスタである。
【０１３１】
ＢＡＤＲＳレジスタ８３は、ベースアドレスが格納されるレジスタである。図１８に示す例では、ＢＡＤＲＳレジスタ８３には、ベースアドレスを格納するアドレスとして「０ｘ１８」〜「０ｘ１Ｆ」が付与され、ライト要求とリード要求との対象となるレジスタである。ＭＫＥＹレジスタ８４は、メモリキーが格納されるレジスタである。図１８に示す例では、ＭＫＥＹレジスタ８４は、メモリキー値を格納するアドレスとして「０ｘ２０」〜「０ｘ２７」が付与され、ライト要求とリード要求との対象となるレジスタである。
【０１３２】
また、ＷＤＰレジスタ８５は、ライトポインタが格納されるレジスタである。図１８に示す例では、ＷＤＰレジスタ８５は、ライトポインタを格納するアドレスとして「０ｘ２８」〜「０ｘ２Ｆ」が付与され、ライト要求とリード要求との対象となるレジスタである。また、ＲＤＰレジスタ８６は、リードポインタが格納されるレジスタである。図１８に示す例では、ＲＤＰレジスタ８６は、リードポインタを格納するアドレスとして「０ｘ３０」〜「０ｘ３７」が付与され、ライト要求とリード要求との対象となるレジスタである。
【０１３３】
なお、図１８中のアップデートレジスタとは、メッセージを読み出す際にリードポインタの値を更新する処理を、プロセスから指示するための仮想的なレジスタである。すなわち、アップデートレジスタに対するライト要求が発行された場合は、ライトデータの入力は行われず、更新されたリードポインタの値のみが書き込まれることとなる。図１８に示す例では、アップデートレジスタは、加算値を格納するアドレスとして「０ｘ３８」〜「０ｘ３Ｆ」が付与される。
【０１３４】
なお、図１８に示された各レジスタは、図１０に示す各レジスタと同様に、ソフトウェアからアクセスが行い易い様に、データの有効長が８バイト（６４ビット）以内であっても、８バイトバウンダリに揃えられたアドレス域を占有する。また、図１８に示された各各レジスタは、占有するアドレス域において、データの有効長以外の部分の値は意味を持たないものとする。
【０１３５】
次に、図１５に戻って、ＲＡＭアドレス選択回路７９について説明する。ＲＡＭアドレス選択回路７９は、レジスタＲ／Ｗバス５４を介して、コア４０からレジスタアドレスとコマンドとを取得する。すると、ＲＡＭアドレス選択回路７９は、受信したレジスタアドレスの上位アドレスを用いて、ＲＡＭ８１が記憶するエントリのうち、アクセス対象となるエントリを選択する。
【０１３６】
そして、ＲＡＭアドレス選択回路７９は、受信したレジスタアドレスの下位アドレスを用いて、アクセス対象となる記憶領域を識別する。その後、ＲＡＭアドレス選択回路７９は、受信したコマンドに従って、識別した記憶領域の読み出しや書き込みを実行する。また、ＲＡＭアドレス選択回路７９は、パケット受信部からレジスタＩＤを受信すると、受信したレジスタＩＤが示すエントリの各情報のうち、チェックビット以外の情報を、一時レジスタ群８２の各レジスタ８３〜８８に格納する。すなわち、ＲＡＭアドレス選択回路７９は、レジスタＩＤが示すレジスタセットの値を一時レジスタ群８２の各レジスタ８３〜８８に格納する。
【０１３７】
ここで、コア４０が実行するプロセスから見た際に、一時レジスタ群８２に付与されているように見えるアドレスは、実際にはＲＡＭ８１の下位アドレスである。つまり、コア４０が実行するプロセスは、ＲＡＭ８１が記憶する各エントリをそれぞれ異なるレジスタ群が記憶するように認識する。そして、コア４０が実行するプロセスは、レジスタ群を選択するための状態アドレス、すなわちＲＡＭ８１が記憶するエントリを選択するための上位アドレスに、各レジスタに付与されるアドレスを下位アドレスとして付加したレジスタアドレスを生成する。
【０１３８】
その後、コア４０が実行するプロセスは、生成したレジスタアドレスを受信制御部５８に出力することで、あたかもＲＡＭ８１が記憶する各情報がそれぞれ異なるレジスタに格納されているように、アクセス対象となるＲＡＭ８１上の情報を選択する。
【０１３９】
ライトデータ生成部８０は、レジスタＲ／Ｗバス５４を介して、コア４０からライトデータを取得すると、ＲＡＭアドレス選択回路７９が選択した記憶領域に、コア４０から取得したデータを格納する。また、ライトデータ生成部８０は、後述する加算器９３が生成した新たなライトポインタやリードポインタをＲＡＭ８１に格納する。
【０１４０】
なお、コア４０が発行したコマンドがＲＡＭ８１へのライトである場合には、ＲＡＭ周辺部７８は、以下の処理を実行することとなる。すなわち、ＲＡＭ周辺部７８は、レジスタアドレスの上位アドレスが示すエントリのうち、下位アドレスが示す情報についてデータの書換えを行うとともに、ライトデータに対する冗長ビットを計算し、新たなチェックビットを格納する。
【０１４１】
また、ＲＡＭ８１が記憶する情報の読み出が行われる場合は、読み出されたリードデータがレジスタＲ／Ｗバス５４を介して、コア４０に送信されるとともに、読み出されたデータをライトデータ生成部８０が受信する。そして、ライトデータ生成部８０は、受信したデータを、再度ＲＡＭ８１に書き込むこととなる。
【０１４２】
次に、受信制御部５８が有するパケット受信部７１、メモリリクエスト制御部７４、コマンド実行部８９が実行する処理について説明する。パケット受信部７１は、ローカルＸＢ１６を介して、他のＣＰＵが送信したパケットを受信すると、受信したパケットをリクエストキュー７２に格納する。また、パケット受信部７１は、ＲＡＭ８１の更新タイミングと同期して、リクエストキュー７２の先頭から、１つのパケットを取り出し、取り出したパケットを実行レジスタ７３に格納する。
【０１４３】
そして、パケット受信部７１は、実行レジスタ７３に格納したパケットからＭＳＧＱ−ＩＤを抽出し、抽出したＭＳＧＱ−ＩＤからレジスタＩＤを取得する。その後、パケット受信部７１は、取得したレジスタＩＤをＲＡＭ周辺部７８のＲＡＭアドレス選択回路７９に出力することで、レジスタＩＤが示すレジスタセットの値を一時レジスタ群８２の各レジスタ８３〜８８に格納する。また、パケット受信部７１は、実行レジスタ７３に格納したパケットからデータ、すなわちメッセージを抽出し、抽出したメッセージをメモリリクエスト制御部７４が有するライトデータレジスタ７７に格納する。
【０１４４】
次に、パケット受信部７１は、抽出したＭＳＧＱ−ＩＤからアクセスキー値を取得し、取得したアクセスキー値をコマンド実行部８９の不一致検査部９０に出力する。すると、不一致検査部９０は、ＭＫＥＹレジスタ８４に格納されたメモリキーの値と、パケット受信部７１から受信したアクセスキー値とが一致するか否かを判別する。そして、不一致検査部９０は、メモリキーの値とアクセスキー値とが一致する場合は、アクセスを許可する旨をメモリリクエスト生成部７５、応答パケット生成部９４、割り込み生成回路９６に通知する。一方、不一致検査部９０は、メモリキーの値とアクセスキー値とが一致しない場合は、アクセスを許可しない旨をメモリリクエスト生成部７５、応答パケット生成部９４、割り込み生成回路９６に通知する。
【０１４５】
また、上述した不一致検査部９０の処理と同時に、一致検査部９１、加算値生成部９２、加算器９３が、以下の処理を実行する。まず、加算値生成部９２は、Ｑサイズ／Ｍサイズレジスタ８７に格納されたＭサイズの値に従って加算値を生成する。また、加算器９３は、ＲＤＰレジスタ８６に格納されたライトポインタの値に加算値生成部９２が生成した加算値を加算することで、ライトポインタの更新値を算出する。
【０１４６】
そして、一致検査部９１は、加算器９３によって算出されたライトポインタの更新値と、ＲＤＰレジスタ８６に格納されたリードポインタの値とが一致するか否かを判別する。また、一致検査部９１は、ライトポインタの更新値とリードポインタの値とが一致すると判別した場合は、オーバーフローが発生したと判別する。そして、一致検査部９１は、オーバーフローが発生した旨を、メモリリクエスト生成部７５、応答パケット生成部９４、割り込み生成回路９６に出力する。
【０１４７】
一方、一致検査部９１は、ライトポインタの更新値とリードポインタの値とが一致しないと判別した場合は、メモリへの書込みを許可する旨をメモリリクエスト生成部７５、応答パケット生成部９４、割り込み生成回路９６に出力する。
【０１４８】
ここで、メモリリクエスト制御部７４のメモリリクエスト生成部７５は、不一致検査部９０からアクセスを許可する旨の通知を取得するとともに、一致検査部９１からメモリへの書き込みを許可する旨を取得した場合は、以下の処理を実行する。すなわち、メモリリクエスト生成部７５は、ＢＡＤＲＳ８３に格納されたベースアドレスの値と、ＷＤＰレジスタ８５に格納されたライトアドレスの値と、Ｑサイズ／Ｍサイズレジスタ８７に格納されたＱサイズの値とＭサイズの値とを取得する。
【０１４９】
そして、メモリリクエスト生成部７５は、取得したベースアドレスの値、ライトアドレスの値、Ｑサイズの値、およびＭサイズの値を用いて、メモリライトアドレスを生成し、生成したメモリライトアドレスをメモリリクエストレジスタ７６に格納する。すると、メモリリクエスト制御部７４は、メモリリクエストレジスタ７６に格納されたメモリライトアドレスと、ライトデータレジスタ７７に格納されたメッセージとをメモリＲ／Ｗバス５３に出力することで、メッセージをメモリ１７、１８に格納する。
【０１５０】
なお、メモリリクエスト生成部７５は、不一致検査部９０からアクセスを許可しない旨の通知を取得した場合や、一致検査部９１からオーバーフローが発生した旨の通知を取得した場合は、メモリリクエストの生成を行わず、処理を終了する。このような場合には、パケット受信部７１は、実行レジスタ７３に格納されたパケットを破棄し、リクエストキュー７２から新たなパケットを取り出し、実行レジスタ７３に格納する。
【０１５１】
ここで、図１９を用いて、メモリリクエスト生成部７５が生成するメモリライトアドレスの一例について説明する。図１９は、メモリライトアドレスの一例を説明するための図である。例えば、図１９に示す例では、メモリリクエスト生成部７５は、Ｑサイズのコード値が「００１」であり、Ｍサイズの値が「０」である場合は、以下のメモリライトアドレスを生成する。すなわち、メモリリクエスト生成部７５は、ベースアドレスの４７ビット目から７ビット目とライトアドレスの０ビット目と「０ｂ００００００」とをつなげた４８ビットのメモリライトアドレスを生成する。
【０１５２】
また、例えば、メモリリクエスト生成部７５は、Ｑサイズのコード値が「００１」であり、Ｍサイズの値が「１」である場合は、以下のメモリライトアドレスを生成する。すなわち、メモリリクエスト生成部７５は、ベースアドレスの４７ビット目から７ビット目とライトアドレスの１ビット目から０ビット目と「０ｂ０００００」とをつなげた４８ビットのメモリライトアドレスを生成する。
【０１５３】
また、例えば、メモリリクエスト生成部７５は、Ｑサイズのコード値が「０１０」であり、Ｍサイズの値が「０」である場合は、以下のメモリライトアドレスを生成する。すなわち、メモリリクエスト生成部７５は、ベースアドレスの４７ビット目から８ビット目とライトアドレスの１ビット目から０ビット目と「０ｂ００００００」とをつなげた４８ビットのメモリライトアドレスを生成する。
【０１５４】
また、例えば、メモリリクエスト生成部７５は、Ｑサイズのコード値が「０１０」であり、Ｍサイズの値が「１」である場合は、以下のメモリライトアドレスを生成する。すなわち、メモリリクエスト生成部７５は、ベースアドレスの４７ビット目から８ビット目とライトアドレスの２ビット目から０ビット目と「０ｂ０００００」とをつなげた４８ビットのメモリライトアドレスを生成する。
【０１５５】
つまり、メモリリクエスト生成部７５は、図１９に示すように、Ｑサイズのコード値が増加するにつれて、メモリライトアドレスとして用いるベースアドレスのビット数を少なくする。また、メモリリクエスト生成部７５は、Ｑサイズのコード値が増加するにつれて、メモリライトアドレスとして用いるライトポインタのビット数を増加させる。
【０１５６】
図１５に戻って、応答パケット生成部９４は、図１４に示す応答を生成し、不一致検査部９０および一致検査部９１の処理結果に応じたステータスを応答に格納する。ここで、応答パケット生成部９４は、送信先ＣＰＵ番号に、メッセージ送信元のＣＰＵを示すＣＰＵ番号を格納する。
【０１５７】
そして、応答パケット生成部９４は、生成した応答を応答コマンドレジスタ９５に格納する。例えば、応答パケット生成部９４は、不一致検査部９０からアクセスを許可する旨の通知を取得し、一致検査部９１からメモリへの書き込みを許可する旨の通知を取得した場合は、以下のステータスを格納する。すなわち、応答パケット生成部９４は、ＯＶＦＬビットを「０」とし、ＰＲＯＴビットを「０」とすることで、正常にメッセージを受信した旨を示すステータスを格納する。
【０１５８】
一方、応答パケット生成部９４は、不一致検索部９０からアクセスを許可しない旨の通知を取得した場合は、ＰＲＯＴビットを「１」とする。また、応答パケット生成部９４は、一致検査部９１からオーバーフローが発生した旨の通知を取得した場合は、ＯＶＦＬビットを「１」とする。なお、ステータスの各ビットは、送信先のＣＰＵが有する応答ステータスレジスタに格納された後、送信先のＣＰＵが実行するプロセスにより読み出される。なお、応答コマンドレジスタ９５は、応答パケット生成部９４から応答を取得すると、取得した応答を一時的に保持し、その後、ローカルＸＢ１６を介して、メッセージ送信元のＣＰＵへと送信する。
【０１５９】
割り込み生成回路９６は、不一致検査部９０からアクセスを許可する旨の通知を取得し、かつ、一致検査部９１からメモリへの書き込みを許可する旨の通知を取得した場合は、以下の処理を実行する。まず、割り込み生成回路９６は、ＩＮＴＭＡＳＫレジスタ８８に格納されたＩＮＴＭＡＳＫの値が「１」であるか「０」であるか判別する。そして、割り込み生成回路９６は、ＩＮＴＭＡＳＫの値が「１」である場合には、レジスタＲ／Ｗバス５４を介して、コア４０〜４０ｂに割り込み処理の実行を要求する割り込み要求信号を出力する。
【０１６０】
一方、割り込み生成回路９６は、ＩＮＴＭＡＳＫの値が「０」である場合は、割り込み要求信号を出力しない。また、割り込み生成回路９６は、不一致検査部９０からアクセスを許可しない旨の通知を取得した場合や、一致検査部９１からオーバーフローが発生した旨の通知を取得した場合は、割り込み要求信号を出力しない。
【０１６１】
ここで、割り込み要求信号が出力された場合は、各コア４０〜４０ｂは、コンテキストスイッチにより、メッセージの受信を待機していたプロセスを実行する。そして、コア４０〜４０ｂは、メッセージ送信元のＣＰＵが実行するプロセスに通知したレジスタＩＤが示すレジスタセットを用いて、メモリ１８、１９に格納されたメッセージの読み出しを行う。
【０１６２】
なお、ＲＡＭ周辺部７８は、ＲＡＭ８１が記憶するエントリの初期化、割り込みマスクの変更、メッセージ書き込み動作、メッセージ読み出し操作を行う場合は、図２０に示す動作に従って、ＲＡＭ８１に記憶された情報の更新を行う。図２０は、動作種類別にＲＡＭのフィールドの更新箇所を説明するための図である。
【０１６３】
例えば、ＲＡＭ周辺部７８は、コア４０が各レジスタ８３〜８８に対するリード要求やライト要求によりエントリの初期化を行う場合は、各フィールドの値を以下の様に更新する。まず、ＲＡＭ周辺部７８は、Ｑサイズ、Ｍサイズ、ベースアドレス、メモリキーの値をプロセスが指定した値に更新する。また、ＲＡＭ周辺部７８は、ＩＮＴＭＡＳＫの値を「０」に更新し、ライトポインタとリードポインタの値を「Ａｌｌ  ０」に更新する。なお、ＲＡＭ周辺部７８は、チェックビットの値を、更新後の各情報に応じて生成される値に更新する。
【０１６４】
また、ＲＡＭ周辺部７８は、コア４０が割り込みマスクの変更を行う場合は、Ｑサイズ、Ｍサイズ、ベースアドレス、メモリキー、ライトポインタ、リードポインタの値を変更せず、ＩＮＴＭＡＳＫの値をプロセスが指定した値に更新する。また、ＲＡＭ周辺部７８は、メッセージを受信し、メッセージをメモリ１８、１９に書き込む場合は、ライトポインタの値のみを更新する。また、ＲＡＭ周辺部７８は、コア４０がメッセージをメモリ１８、１９から読み出す場合は、リードポインタの値のみを更新する。
【０１６５】
なお、上述した受信制御部５８は、複数のレジスタセットをＲＡＭ８１内に保持することとしたが、実施例はこれに限定されるものではなく、例えば、ＦＦ（Flip  Flop）等を用いて各レジスタセットを保持してもよい。また、受信制御部５８は、ＲＡＭ８１から読み出されたレジスタセットを一時レジスタ群８２に格納することで、ＲＡＭ８１からの読み出しにおける遅延時間を考慮したものであるが、実施例はこれに限定されるものではない。すなわち、受信制御部５８は、複数のレジスタセットを記憶し、受信したレジスタＩＤが示すレジスタセットに従って、メッセージをメモリ１８、１９に格納することができれば、他の構成を有することとしてもよい。
【０１６６】
次に、図２１を用いて、ドライバ３３がメモリ１８、１９上に確保されるメッセージ記憶エリアと、各アドレスポインタの有効ビット長について説明する。図２１は、メッセージ記憶エリアを説明するための図である。例えば、ＲＡＭ８１は、ハードウェアの低コスト化を目的として、ライトポインタとリードポインタとして用いられる物理アドレスのうち一部のビットのみを保持する。このため、ドライバ３３は、図２１に示すように、ＱサイズとＭサイズとに応じて、メッセージ記憶エリアを確保する。
【０１６７】
例えば、ドライバ３３は、Ｑサイズが「００１」であり、Ｍサイズが「１」である場合は、メッセージ記憶エリアのサイズを１２８バイトとし、６４バイトのメッセージを１件記憶できるようにする。この際、ベースアドレスの有効ビット長は、ベースアドレスの４７ビット目から７ビット目までとなり、ライトポインタおよびリードポインタの有効ビット長が０ビット目のみとなる。
【０１６８】
また、ドライバ３３は、Ｑサイズが「００１」であり、Ｍサイズが「０」である場合は、メッセージ記憶エリアのサイズを１２８バイトとし、３２バイトのメッセージを３件記憶できるようにする。この際、ベースアドレスの有効ビット長は、ベースアドレスの４７ビット目から７ビット目までとなり、ライトポインタおよびリードポインタの有効ビット長は、１ビット目から０ビット目までとなる。
【０１６９】
また、ドライバ３３は、Ｑサイズが「０１０」であり、Ｍサイズが「１」である場合は、メッセージ記憶エリアのサイズを２５６バイトとし、６４バイトのメッセージを３件記憶できるようにする。この際、ベースアドレスの有効ビット長は、ベースアドレスの４７ビット目から８ビット目までとなり、ライトポインタおよびリードポインタの有効ビット長は、１ビット目から０ビット目までとなる。
【０１７０】
以下、ドライバ３３は、ＱサイズとＭサイズの値に応じて、図２１に示すサイズのメッセージ記憶エリアを設定する。すなわち、ドライバ３３は、２のべき乗で示される広さの連続した物理アドレスをメッセージ記憶エリア用に確保する。また、ドライバ３３は、Ｑサイズの値が増えるに従って、指数関数的に広いメッセージ記憶エリアを設定する。
【０１７１】
ここで、Ｍサイズは、メッセージの大きさを示す情報であるため、ＱサイズとＭサイズの値に応じて、メッセージ記憶エリアに格納されるメッセージ記憶件数が変化する。この結果、ベースアドレスの有効ビット長は、メッセージ記憶エリアが広くなるにつれて短くなり、ライトポインタとリードポインタとの有効ビット長は、メッセージ記憶件数が多くなるにつれて長くなる。なお、受信制御部５８は、加算器９３と一致検査部９１を用いてオーバーフローを検出するので、メッセージ記憶件数は、メッセージ記憶エリアのサイズをメッセージサイズで除算した数から１を減算した値となる。
【０１７２】
なお、ＣＰＵ１２は、メモリ１８、１９上にメッセージを格納するメッセージ記憶エリアを確保する。しかしながら、メモリ１８、１９は、ＯＳ３２のカーネルやドライバ３３等の管理プログラムだけではなく、アプリケーション３５等のユーザーモードで動作するソフトウェアからも直接利用可能な資源である。このため、メモリ１８、１９上に確保したメッセージ記憶エリアに対して、ユーザーモードで動作するソフトウェアがアクセスした場合には、メッセージが書き換えられる恐れがある。
【０１７３】
そこで、ＣＰＵ１２〜ＣＰＵ１５が実行するプロセスは、メモリキーとアドレスキー、および、メッセージ記憶エリアに割り当てるメモリアドレスを用いて、メッセージ記憶エリアに対するアクセスを制御し、メッセージ通信資源の破壊を防止する。以下、メッセージ通信士元の破壊を防止する方法について説明する。
【０１７４】
まず、メモリキーとアドレスキーを用いて、メッセージ通信資源の破壊を防止する方法について説明する。まず、メッセージ送信側のプロセスは、メッセージ受信側のプロセスから通知されたアクセスキーの値を含むＭＳＧＱ−ＩＤを生成し、生成したＭＳＧＱ−ＩＤをメッセージとともに、メッセージ受信側のプロセスへ送信する。
【０１７５】
また、メッセージ受信側のプロセスは、ＭＳＧＱ−ＩＤに含まれるアクセスキーの値がメモリキーの値と一致するか否かを判別し、アクセスキーとメモリキーの値が一致しない場合は、メッセージの書き込みやライトポインタの更新を行わない。ここで、メモリキーの値は、メッセージ受信側のプロセスが任意に決定し、メッセージ送信側のプロセスに通知するものであるので、送信側のプロセスのミスにより他のメッセージ通信資源の破壊を防止できる。
【０１７６】
次に、図２２、図２３を用いて、メッセージ記憶エリアに割り当てるメモリアドレスを用いて、メッセージ受信エリアの破壊を防止する方法について説明する。図２２は、プログラムミスを考慮したアドレスマップを説明するための図である。また、図２３は、プログラムミスを考慮したアドレスマップにおけるアドレス構成を説明するための図である。
【０１７７】
例えば、ドライバ３３は、図２２中（ｊ）に示すように、図１８に示す各レジスタを、メモリマップ上のＮＣ（Non-Cacheable）領域からＭＭＩＯ（Memory  Mapped  Input/Output）方式で定義する。この際、ドライバ３３は、図２２中（ｋ）に示すように、レジスタセットの１セット分、すなわち、ＲＡＭ８１が記憶する１エントリ分のレジスタを、８キロバイトの物理ページ領域内に定義する。さらに、ドライバ３３は、他のレジスタセットを、異なる８キロバイトの物理ページ領域内に定義する。ここで、各レジスタセットは、物理アドレス上のみで定義されており、仮想アドレスとの対応付けが行われていないため、ユーザーモードで動作するソフトウェアからアクセスすることができない。
【０１７８】
そして、ドライバ３３は、ユーザープロセス＃１からメッセージ通信資源の割り当てを要求されると、レジスタＩＤを割り当てて、ユーザープロセス＃１にＭＳＧＱ−ＩＤを通知する。この際、ドライバ３３は、ＮＣ領域上のレジスタＩＤに対応する物理ページアドレスを任意の仮想アドレスと対応付けてＴＬＢ４３に登録する。そして、ドライバ３３は、ユーザープロセス＃１に、物理ページアドレスと対応付けた仮想アドレスを通知する。すると、ユーザープロセス＃１は、通知された仮想アドレスにアクセスすることで、通知されたＭＳＧＱ−ＩＤに対応したレジスタ資源にアクセスすることができる。
【０１７９】
このように、ユーザープロセス＃１は、ドライバ３３から割り当てられたドライバセット以外のドライバセットについては、仮想アドレスがＴＬＢ４３に登録されていないので、アクセスすることができない。この結果、例えば、ユーザープロセス＃１は、誤ってユーザープロセス＃２が使用するメッセージ通信資源を破壊することがない。なお、ドライバ３３は、メッセージ記憶エリアについても、レジスタセットと同様の処理を行うことで、ユーザープロセス＃１がユーザープロセス＃２に割り当てたメッセージ記憶エリアに対するアクセスを防ぐことができる。このため、プロセス３３は、プログラムミスによるメッセージ通信資源の破壊を防ぐことができる。
【０１８０】
なお、例えば、ドライバ３３は、図２３に例示するアドレス構成の物理アドレスを各レジスタに対して付与する。例えば、ドライバ３３は、ＮＣ空間における２４ビットの固有アドレスを、アドレスビットの４７ビット目から２４ビット目までに格納する。また、ドライバ３３は、１１ビットのレジスタＩＤをアドレスビットの２３ビット目から１３ビット目までに格納する。また、ドライバ３３は、図１８に示す各レジスタに付与する１３ビットの固有アドレスをアドレスビットの１２ビット目から０ビット目までに格納する。そして、ドライバ３３は、各ビットを格納したアドレスビットを各レジスタに付与する。
【０１８１】
例えば、送信制御部５７、アドレスデコーダ５９、セレクタ６５、送信パケット生成部６４、リードデータセレクタ６７、セレクタ６９、リードデータセレクタ７０とは、電子回路である。また、ＲＡＭアドレス選択回路７９、ライトデータ生成部８０、メモリリクエスト生成部７５、不一致検査部９０、一致検査部９１、加算値生成部９２、加算器９３、応答パケット生成部９４、割り込み生成回路９６は、電子回路である。ここで、電子回路の例として、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路、またはＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などを適用する。
【０１８２】
次に、図２４を用いて、メッセージを送受信する際にメッセージ送信側のノードとメッセージ受信側ノードが実行する処理の流れについて説明する。図２４は、メッセージを送受信する際の動作を説明するためのシーケンス図である。なお、図２４に示す例では、受信側ノードが実行するユーザプロセス＃２がポーリングを行うことで、メッセージの受信を監視する際の処理の流れについて説明する。
【０１８３】
まず、受信側ノードが実行するユーザプロセス＃２は、一時レジスタ群８２を監視し（ステップＳ１０１、Ｓ１０３）、ライトポインタの値とリードポインタの値とを比較することで、メッセージの受信を検知する。なお、図２４に示す例では、ステップＳ１０２およびステップＳ１０４において、メッセージが受信していないため、メッセージの受信は未検知となる（ステップＳ１０２、Ｓ１０４）。
【０１８４】
ここで、ユーザープロセス＃１は、発行要求フラグレジスタ６３にフラグ「１」を格納することで、ＣＰＵ１２にメッセージの送信を指示する（ステップＳ１０５）。すると、ＣＰＵ１２は、メッセージを含むパケットを受信側ノードに送信する（ステップＳ１０６）。また、受信側ノードが有するＣＰＵは、受信したメッセージをメッセージ記憶エリアに格納する（ステップＳ１０７）。この際、受信側ノードが有するＣＰＵは、ライトポインタの値を更新する。また、受信側ノードが有するＣＰＵは、完了応答をＣＰＵ１２に送信する（ステップＳ１０８）。
【０１８５】
すると、ＣＰＵ１２は、応答受信フラグレジスタ６８にフラグ「１」を格納することで、ユーザープロセス＃１にメッセージの送信が完了した旨と通知する。そして、ユーザープロセス＃１は、応答ステータスレジスタ６６の値の読み出しを行う（ステップＳ１０９）。
【０１８６】
一方、ユーザープロセス＃２は、一時レジスタ群８２を監視し（ステップＳ１１０）、ライトポインタの値とリードポインタの値とを比較する。すると、ユーザープロセス＃２は、ライトポインタの値とリードポインタの値とが異なるため、メッセージを検知する（ステップＳ１１１）。そして、ユーザープロセス＃２は、メッセージの読み出しを実行し（ステップＳ１１２）、処理を終了する。
【０１８７】
次に、図２５を用いて、メッセージを受信したメッセージ受信側のノードが割り込み処理を用いてメッセージを受信する処理の流れについて説明する。すなわち、ＩＮＴＭＡＳＫレジスタ８８に「１」が格納されている際に、メッセージ送信側のノードとメッセージ受信側のノードとが実行する処理の流れについて説明する。図２５は、割り込み命令を用いてユーザプロセスに到着通知を発行する処理の流れを説明するためのシーケンス図である。
【０１８８】
ここで、ユーザープロセス＃１は、発行要求フラグレジスタ６３にフラグ「１」を格納することで、ＣＰＵ１２にメッセージの送信を指示する（ステップＳ２０１）。すると、ＣＰＵ１２は、メッセージを含むパケットを受信側ノードに送信する（ステップＳ２０２）。また、受信側ノードが有するＣＰＵは、受信したメッセージをメッセージ記憶エリアに格納する（ステップＳ２０３）。この際、受信側ノードが有するＣＰＵは、ライトポインタの値を更新する。また、受信側ノードが有するＣＰＵは、完了応答をＣＰＵ１２に送信する（ステップＳ２０４）。
【０１８９】
すると、ＣＰＵ１２は、応答受信フラグレジスタ６８にフラグ「１」を格納することで、ユーザープロセス＃１にメッセージの送信が完了した旨と通知する。そして、ユーザープロセス＃１は、応答ステータスレジスタ６６の値の読み出しを行う（ステップＳ２０５）。
【０１９０】
ここで、受信側ノードが実行するユーザプロセス＃２は、スリープ状態となっている（ステップＳ２０６）。そこで、受信側ノードのＣＰＵは、応答をＣＰＵ１２に送信すると、到着通知として、割り込み要求信号を発行する（ステップＳ２０７）。すると、ノード受信側のドライバは、コンテキストスイッチを実行し（ステップＳ２０８）、スリープ状態であったユーザープロセス＃２を実行する。その後、ユーザープロセス＃２は、メッセージの読み出しを行い（ステップＳ２０９）、処理を終了する。
【０１９１】
次に、図２６を用いて、送信側ノードでユーザープロセス＃１がメッセージ＃１を送信する際にコンテキストスイッチが発生した場合の処理の流れについて説明する。図２６は、送信側ノードでコンテキストスイッチが発生した場合の処理の流れを説明するためのシーケンス図である。
【０１９２】
例えば、送信側ノードのユーザープロセス＃１は、メッセージ＃１をメッセージデータレジスタ６１に格納する（ステップＳ３０１）。ここで、コンテキストスイッチが発生し、ドライバ３２は、ユーザープログラム＃１のセーブ・リストア処理を行う（ステップＳ３０２）。この際、メッセージデータレジスタ６１に格納されたメッセージ＃１もセーブ・リストア処理の対象となる。
【０１９３】
次に、コンテキストスイッチによって実行されたユーザープロセス＃２が、メッセージ＃２をメッセージデータレジスタ６１に格納する（ステップＳ３０３）。そして、ユーザープロセス＃２は、発行要求フラグレジスタ６３に「１」を格納することで（ステップＳ３０４）、ＣＰＵ１２にメッセージ＃２を含むパケットを送信させる（ステップＳ３０５）。
【０１９４】
すると、受信側ノードのＣＰＵは、メッセージ＃２をメッセージ記憶エリアに格納する（ステップＳ３０６）。そして、受信側ノードのＣＰＵは、割り込み要求信号を発行するとともに（ステップＳ３０７）、応答をＣＰＵ１２に送信する（ステップＳ３０８）。ここで、ＣＰＵ１２が応答を受信すると、応答受信フラグレジスタ６８に「１」が格納されるので、ユーザープロセス＃２は、応答ステータスレジスタ６６に格納されたステータス
の読み出しを行う（ステップＳ３０９）。その後、コンテキストスイッチが発生し、ドライバ３２は、ユーザープログラム＃２のセーブ・リストア処理を行う（ステップＳ３１０）。
【０１９５】
一方、受信側ノードのドライバは、メッセージ＃２を受信した際に割り込み要求信号を発行されるので（ステップＳ３０７）、割り込み通知をユーザープロセス＃３に発行する（ステップＳ３１１）。すると、ユーザープロセス＃３は、メッセージ＃２の読み出しを行う（ステップＳ３１２）。
【０１９６】
ここで、コンテキストスイッチにより実行されたユーザープロセス＃１は、ステップＳ３０１にて送信するメッセージ＃１をメッセージデータレジスタ６１に格納している。このため、ユーザープロセス＃１は、発行要求フラグレジスタ６３に「１」を格納することで（ステップＳ３１３）、ＣＰＵ１２にメッセージ＃１を含むパケットを送信させる（ステップＳ３１４）。
【０１９７】
すると、受信側ノードのＣＰＵは、メッセージ＃１をメッセージ記憶エリアに格納する（ステップＳ３１５）。そして、受信側ノードのＣＰＵは、割り込み要求信号を発行するとともに（ステップＳ３１６）、応答をＣＰＵ１２に送信する（ステップＳ３１７）。ここで、ＣＰＵ１２が応答を受信すると、応答受信フラグレジスタ６８に「１」が格納されるので、ユーザープロセス＃１は、応答ステータスレジスタ６６に格納されたステータス
の読み出しを行う（ステップＳ３１８）。
【０１９８】
一方、受信側ノードのドライバは、メッセージ＃１を受信した際に割り込み要求信号を発行されるので（ステップＳ３１６）、割り込み通知をユーザープロセス＃３に発行する（ステップＳ３１９）。すると、ユーザープロセス＃３は、メッセージ＃１の読み出しを行う（ステップＳ３２０）。
【０１９９】
ここで、ＣＰＵ１２は、図２６中（ａ）で示される期間の間は、ユーザープロセス＃１の実行を待機する。すなわち、ＣＰＵ１２は、メッセージ送信コマンドをプロセスが発行してから、応答ステータスレジスタ６６にステータスが格納され、応答受信フラグレジスタ６８にフラグ「１」が格納されるまで、メッセージ送信コマンドの実行完了を待機する。このため、メッセージ送信コマンドをプロセスが発行した直後にコンテキストスイッチが発生した際も、プロセス側からは、メッセージ送信コマンドを発行した直後に応答を受信したように見える。このため、ＣＰＵ１２は、コンテキストスイッチが発生しても、プロセスの実行を正常に停止、および再開することができる。
【０２００】
このように、ＣＰＵ１２は、ライトポインタとリードポインタとを対応付けた複数のレジスタセットを記憶するＲＡＭ８１を有し、メッセージ送信元のＣＰＵにレジスタセットを示すレジスタＩＤを通知する。そして、ＣＰＵ１２は、メッセージとともにレジスタＩＤを取得した場合は、取得したレジスタＩＤが示すレジスタセットのライトポインタが示すメッセージ記憶エリアに、受信したメッセージを格納する。また、他のＣＰＵ１３〜１５も同様の処理を実行する。このため、ＣＰＵ１２〜１５は、送信側のＣＰＵがライトポインタをキャッシュせずとも、プロセス間通信を行う事ができるので、いずれかのＣＰＵが故障した際に、他のＣＰＵに故障が波及するのを防ぐことができる。
【０２０１】
また、ＣＰＵ１２は、同時に実行可能なプロセスと同数の制御資源６０〜６０ｃを有する。すなわち、ＣＰＵ１２は、同時に実行可能なプロセスと同数の送信キューを有する。また、ＣＰＵ１２は、あるプロセスに対して同時にメッセージを送信するプロセスと同数のレジスタセットを記憶する。すなわち、ＣＰＵ１２は、実行中のプロセスに対して同時にメッセージを送信するプロセスと同数の受信キューを有する。このため、ＣＰＵ１２は、プロセス間通信にともなう回路規模の増大を防ぎつつ、プロセス間通信におけるレイテンシを軽減することができる。
【０２０２】
一方、従来インフィニバンドの技術では、送信側のハードウェアに用意された送信キューと、受信側のハードウェアに用意された受信キューとを組み合わせたキューペアを用いて、プロセス間通信を行う。具体的には、送信プロセスが受信プロセスと通信を行う場合、事前にプロセス間で合意したキューペアを確保し、送信側プロセス＃１〜＃３は確保したキューペアにメッセージを書き込む。そして、受信側プロセス＃１〜＃３は、確保したキューペアからメッセージを取得する。
【０２０３】
しかしながら、従来のインフィニバンドの技術では、送信プロセスと受信プロセスとの組ごとにキューペアを用意する必要がある。例えば、図２７は、従来のインフィニバンドにおけるキューペアの機能を説明するための図である。図２７に示す例では、複数の送信プロセス＃１〜＃３が複数の受信プロセス＃１〜＃３に対してメッセージを送信する例について記載した。
【０２０４】
ここで、図２７に示す例では、送信プロセス＃１〜＃３と受信プロセス＃１〜＃３がプロセス間通信を実行するため、送信側のＨＣＡ（Host  Channel  Adapter）ハードウェアと受信側のＨＣＡハードウェアは、それぞれ９個のキューペアを用意する必要がある。この結果、従来のインフィニバンドの技術では、プロセス間通信の実現に要する資源数を増大させてしまう。
【０２０５】
なお、１つのキューペアを複数のプロセスが共有することで、資源数を増大させずにプロセス間通信を行う方法も考えられる。図２８は、プロセス間でキューペアを共有化した際の処理を説明するための図である。図２８に示すように、送信プロセス＃１〜＃３は、デバイスドライバソフトウェアを介して、キューペアの送信キューを共有する。また、受信プロセス＃１〜＃３は、デバイスドライバソフトウェアを介して、キューペアの受信キューを共有する。
【０２０６】
例えば、送信プロセス＃１は、送信側のデバイスドライバソフトウェアを呼び出し、受信プロセス＃２へ送信するメッセージを送信キューに書き込むよう依頼する。このような場合は、送信側のデバイスドライバソフトウェアは、メッセージを送信キューに書き込む。すると、受信側のデバイスドライバソフトウェアは、受信キューに到着したメッセージを読み出し、読み出したメッセージを送信先の受信プロセス＃２に通知する。
【０２０７】
しかしながら、１つのキューペアを共有する技術では、送信側プロセス＃１〜＃３がデバイスドライバソフトウェアを読み出し、メッセージの送信を依頼するとともに、受信側プロセス＃１〜＃３は、デバイスドライバソフトウェアを介してメッセージを取得する。このため、メッセージの送受信が行われるたびに、コンテキストスイッチが発生し、プロセス間通信を行う際の遅延時間が悪化してしまう。
【０２０８】
一方、ＣＰＵ１２は、同時に実行可能なプロセスと同数の送信キューを有するので、各プロセスがメッセージを送信する際にキューの不足が発生しない。また、ＣＰＵ１２は、実行中のプロセスに対して同時にメッセージを送信するプロセスと同数の受信キューを有するので、メッセージを受信する際にキューの不足が発生しない。このため、ＣＰＵ１２は、全プロセス間のキューペアを用意せずとも、プロセス間通信を行う際の遅延時間を悪化させることなく、プロセス間通信を行うことができる。
【０２０９】
次に、図２９〜図３２を用いて、ＣＰＵ１２が実行するプロセスが実行する処理の流れについて説明する。まず、図２９を用いて、新たなメッセージキューを獲得したプロセスが実行する処理の流れについて説明する。図２９は、新たなメッセージキューを獲得したプロセスが実行する処理の流れを説明するためのフローチャートである。
【０２１０】
まず、プロセスは、ＭサイズおよびＱサイズを指定して、メッセージキューを獲得するためのドライバ３３を呼び出す（ステップＳ４０１）。次に、プロセスは、メッセージキューを獲得できたか否かを判別し（ステップＳ４０２）、メッセージキューを獲得できなかった場合には（ステップＳ４０２否定）、異常終了通知を発行する。
【０２１１】
一方、プロセスは、メッセージキューを取得できた場合は（ステップＳ４０２肯定）、ＭＳＧＱ−ＩＤを送信側ノードが実行するプロセスに通知する（ステップＳ４０３）。続いて、プロセスは、割り込みによる受信待ちを行うか否かを判別し（ステップＳ４０４）、割り込みによる受信待ちを行う場合は（ステップＳ４０４肯定）、ＩＮＴＭＡＳＫを「１」にセットして（ステップＳ４０５）、処理を終了する。一方、プロセスは、割り込みによる受信待ちを行わない場合は（ステップＳ４０４否定）、ポーリングによる受信メッセージ監視を行い（ステップＳ４０６）、処理を終了する。
【０２１２】
次に、図３０を用いて、ドライバ３３がメッセージキューを獲得する処理について説明する。図３０は、ドライバが新たなメッセージキューを獲得する処理の流れを説明するためのフローチャートである。なお、図３０に示す処理は、図２９中のステップＳ４０１にて呼び出されたドライバが実行する処理である。
【０２１３】
例えば、ドライバ３３は、ＲＡＭ８１が記憶するレジスタセットをいずれかのプロセスに割り当てたか否かを示すレジスタセット管理テーブルをチェックする（ステップＳ５０１）。なお、レジスタセット管理テーブルは、例えば、メモリ１８、１９に格納される。そして、ドライバ３３は、いずれかのプロセスに割り当てられていない空きレジスタセットが存在するか否かを判別する（ステップＳ５０２）。
【０２１４】
そして、ドライバ３３は、空きレジスタセットが存在する場合は（ステップＳ５０２肯定）、空きレジスタセットを獲得するとともに、指定されたＭサイズ、Ｑサイズからメッセージ記憶エリアに必要な容量を計算する（ステップＳ５０３）。次に、ドライバ３３は、計算した容量のメモリを獲得できるか否かを判別し（ステップＳ５０４）、獲得できる場合は（ステップＳ５０４肯定）、メモリキーの値を決定する（ステップＳ５０５）。
【０２１５】
続いて、ドライバ３３は、獲得した空きレジスタセットを初期化し（ステップＳ５０６）、獲得したレジスタセットを示すレジスタＩＤとメモリキーの値からＭＳＧＱ−ＩＤを生成し、呼び出し元のプロセスに通知して（ステップＳ５０７）、処理を終了する。一方、ドライバ３３は、空きレジスタセットが存在しない場合や（ステップＳ５０２否定）、メモリが獲得できなかった場合は（ステップＳ５０４否定）、呼び出し元のプロセスにメッセージキューが取得できなかった旨を通知して、異常終了する。
【０２１６】
次に、図３１を用いて、ＣＰＵ１２がメッセージを送信する処理の流れについて説明する。図３１は、送信側のＣＰＵにおけるメッセージ送信処理の流れを説明するためのフローチャートである。まず、ＣＰＵ１２は、送信するメッセージのサイズが所定のビット長よりも長いロングサイズであるか否かを判別する（ステップＳ６０１）。
【０２１７】
そして、ＣＰＵ１２は、メッセージのサイズがロングサイズである場合は（ステップＳ６０１肯定）、共有メモリ上に送信メッセージを格納する（ステップＳ６０２）。次に、ＣＰＵ１２は、メッセージを格納したメモリアドレスとメッセージ長をメッセージデータレジスタ６１に格納する（ステップＳ６０３）。一方、ＣＰＵ１２は、メッセージのサイズがロングサイズではないと判別した場合は（ステップＳ６０１否定）、メッセージをメッセージデータレジスタ６１に格納する（ステップＳ６０４）。
【０２１８】
次に、ＣＰＵ１２は、ＭＳＧＱ−ＩＤをセットし、メッセージを送信する（ステップＳ６０５）。次に、ＣＰＵ１２は、応答ステータスレジスタ６６の読み出しを行い（ステップＳ６０６）、ＯＶＦＬが「１」か否かを判別する（ステップＳ６０７）。すなわち、ＣＰＵ１２は、オーバーフローが発生したか否かを判別する。そして、ＣＰＵ１２は、ＯＶＦＬが「１」であると判別した場合は（ステップＳ６０７肯定）、再度ステップＳ６０５を実行する。一方、ＣＰＵ１２は、ＯＶＦＬが「１」ではないと判別した場合は（ステップＳ６０７否定）、ＰＲＯＴが「１」であるか否かを判別する（ステップＳ６０８）。
【０２１９】
すなわち、ＣＰＵ１２は、メモリキーの値とアクセスキーの値とが一致したか否かを判別する。そして、ＣＰＵ１２は、ＰＲＯＴが「０」であると判別した場合は（ステップＳ６０８否定）、正常終了し、ＰＲＯＴが「１」であると判別した場合は（ステップＳ６０８肯定）、実行中のプロセスに異常終了通知を発行し、処理を終了する。
【０２２０】
次に、図３２を用いて、ＣＰＵ１２がメッセージを受信した際の処理の流れについて説明する。図３２は、受信側のＣＰＵにおけるメッセージ受信処理の流れを説明するためのフローチャートである。なお、図３２に示す例では、メッセージの受信をポーリングにより待ち合わせる場合と、割り込み要求によりメッセージの受信を識別する場合とを並べて記載した。
【０２２１】
例えば、ＣＰＵ１２は、ポーリングによりメッセージの受信を待ち合わせる場合は、リードポインタとライトポインタとを読み出す（ステップＳ７０１）。そして、ＣＰＵ１２は、リードポインタとライトポインタとが一致するか否かを判別し（ステップＳ７０２）、一致すると判別した場合は（ステップＳ７０２肯定）、再度、ステップＳ７０１の処理を実行する。一方、ＣＰＵ１２は、リードポインタとライトポインタとが一致しないと判別した場合は（ステップＳ７０２否定）、リードポインタに従って、メモリからメッセージの読み出しを行う（ステップＳ７０３）。
【０２２２】
次に、ＣＰＵ１２は、リードポインタの値を更新し（ステップＳ７０４）、受信したメッセージを解析する（ステップＳ７０５）。そして、ＣＰＵ１２は、受信したメッセージにメモリアドレスが格納されているか否かに応じて、受信したメッセージがロングサイズであるか否かを判別する（ステップＳ７０６）。その後、ＣＰＵ１２は、メッセージがロングサイズであると判別した場合は（ステップＳ７０６肯定）、メッセージ中のアドレスを用いて共有メモリからロングメッセージを読み出し（ステップＳ７０７）、処理を終了する。一方、ＣＰＵ１２は、メッセージがロングサイズではないと判別した場合は（ステップＳ７０６否定）、処理を終了する。
【０２２３】
また、ＣＰＵ１２は、割り込み通知によりメッセージの受信を識別する場合は、割り込み要求が発行されたことをトリガとして、リードポインタとライトポインタとの読み出しを行う（ステップＳ７０８）。そして、ＣＰＵ１２は、リードポインタとライトポインタとが一致するか否かを判別し（ステップＳ７０９）、一致すると判別した場合は（ステップＳ７０９肯定）、異常終了通知を発行し、処理を終了する。一方、ＣＰＵ１２は、リードポインタとライトポインタとが一致しないと判別した場合は（ステップＳ７０９否定）、ステップＳ７０３の処理を実行する。
【０２２４】
[実施例１の効果]
上述したように、ＣＰＵ１２は、ライトポインタとリードポインタとを対応付けた複数のレジスタセットを記憶し、レジスタセットを識別するレジスタＩＤをメッセージ送信側のノードに通知する。そして、ＣＰＵ１２は、メッセージとレジスタＩＤとを受信した場合は、受信したレジスタＩＤが示すレジスタセットのライトポインタに従って、受信したメッセージをメモリ１８、１９に格納する。
【０２２５】
このため、ＣＰＵ１２は、共有メモリを用いたマルチノードシステムの技術が適用されたプロセス間通信において、ノードの故障が発生した際に他のノードに故障が伝播するのを防ぐことができる。すなわち、ＣＰＵ１２は、メッセージを送信する際に、ライトポインタをキャッシュせずとも、適切にメッセージの送信を行うことができる。この結果、ＣＰＵ１２は、故障した際に他のＣＰＵ１３〜１５に故障が伝播するのを防ぐことができる。
【０２２６】
また、ＣＰＵ１２は、同時に実行可能なプロセスの数だけ、制御資源６０〜６０ｃを有する。このため、ＣＰＵ１２は、プロセスがキューを確保する際の遅延時間を増加させることなく、メッセージの転送を行うことができる。
【０２２７】
さらに、ＣＰＵ１２は、実行中のプロセスが他のノードに対してメッセージを送信した場合は、メッセージに対する応答を受信するまでの間、実行中のプロセスのプログラムの進行を停止する。例えば、ＣＰＵ１２は、メッセージをメモリ１８、１９に格納した場合には、メッセージの送信元へ応答を送信する機能を有する。そして、ＣＰＵ１２は、プロセスが発行要求フラグレジスタ６３に「１」を格納してから、応答受信フラグレジスタ６８に「１」が格納されてコアに対してリクエスト完了通知を送信するまでの間、コアで実行されるプログラムの進行を停止させる。この結果、プロセスは、応答ステータスレジスタ６６の読み出しを行った際に、自身が送信したメッセージに対する応答のステータスを読み出すことができる。
【０２２８】
また、ＣＰＵ１２は、自身が実行するプロセスに対してメッセージを送信するプロセスの数、または、自身が実行するプロセスに対してメッセージを送信するプロセスの数よりも多くのポインタセットを記憶する。このため、ＣＰＵ１２は、ＣＰＵ１２は、実行するプロセスの全ての組み合わせについてキューを用意せずとも、プロセス間通信を実現することができる。この結果、ＣＰＵ１２は、回路規模を増大させることなく、プロセス間通信における遅延時間の悪化を防ぐことができる。
【０２２９】
なお、ＣＰＵ１２は、プロセスがメッセージを直接メッセージデータレジスタ６１に書き込む。また、ＣＰＵ１２は、メッセージが受信した際にも、デバイスドライバを呼び出さずとも、直接メッセージをメッセージ記憶エリアに書き込む。この結果、デバイスドライバを呼び出すためのコンテキストスイッチを行う際のオーバーヘッドによる遅延が発生しないので、ＣＰＵ１２は、プロセス間通信のレイテンシ性能を良好に保つことができる。
【０２３０】
また、ＣＰＵ１２は、メッセージがロングメッセージである場合は、メッセージを共有メモリ１７、１８に格納し、ロングメッセージを格納したメモリアドレスをメッセージの代わりに送信する。そして、ＣＰＵ１２は、メッセージの変わりにメモリアドレスを受信した場合は、共有メモリ１７、１８のうち、受信したメモリアドレスが示す記憶領域からロングメッセージを取得する。このため、ＣＰＵ１２は、メッセージの長さが所定の閾値よりも長いロングメッセージである場合にも、レイテンシを増加させることなく、プロセス間通信を行う事ができる。
【０２３１】
また、ＣＰＵ１２は、メッセージ送信側のノードにアクセスキーを通知する。そして、ＣＰＵ１２は、メッセージ送信側のノードからメッセージとともに受信したアクセスキーが、自身が記憶するメモリキーと一致するか否かを判別し、一致すると判別した場合は、メッセージをメッセージ記憶エリアに格納する。このため、ＣＰＵ１２は、プログラムミスや、悪意のあるプログラムによるメッセージの破壊を防止することができる。
【０２３２】
また、ＣＰＵ１２は、複数のレジスタセットをＲＡＭ８１に格納する。そして、ＣＰＵ１２は、メッセージとともに受信したレジスタＩＤが示すレジスタセットを一時レジスタ群８２に格納する。このため、ＣＰＵ１２は、レジスタセットを記憶する多くのレジスタを実際に有さなくともよいので、回路規模を増大させることなくプロセス間通信を実現できる。
【０２３３】
また、ＣＰＵ１２は、メッセージの格納を行った場合には、ライトポインタの値を更新する。また、ＣＰＵ１２は、ライトポインタとリードポインタとの値が一致するか否かを判別し、一致しないと判別した場合は、リードポインタに従って、メモリ１８、１９からメッセージの読み出しを行う。このため、ＣＰＵ１２は、複雑な処理を行うことなく、メッセージの受信を待ち合わせることができる。
【実施例２】
【０２３４】
上述した実施例１では、ＣＰＵ１２が実行するプロセスは、応答ステータスレジスタに格納されたＯＶＦＬが「１」である場合は、オーバーフローが発生したと判別し、メッセージの送信を再実行した。しかし、実施例はこれに限定されるものではない。
【０２３５】
すなわち、実施例１に係るＣＰＵ１２は、プロセスが連続してメッセージの送信を実行した場合は、処理時間を無駄にしてしまう場合がある。例えば、ＣＰＵ１２は、受信側のノードが長時間の間、何らかの処理を実行している場合は、受信側のメッセージキューがいつ解放されるかわからない。この結果、ＣＰＵ１２は、受信側のメッセージキューが解放されるまで、メッセージの送信を実行し続けることとなる。
【０２３６】
そこで、実施例２に係るＣＰＵ１２ａは、メッセージを送信する際に、オーバーフロー状態である旨の応答を受信した場合は、メッセージを送信するプロセスを停止し、他のプロセスを実行することで、処理時間の無駄を解消する。
【０２３７】
以下、図面を用いて、実施例２に係るＣＰＵ１２ａについて説明する。図３３は、実施例２に係る受信制御部の機能構成を説明するための図である。なお、図３３に示すもののうち、実施例１と同様の処理を行うものについては、図１５で示した符号と同一の符号を付し、以下の説明を省略する。ＣＰＵ１２ａは、実施例１に係るＣＰＵ１２と同様の構成を有するとともに、図３３に示す例では、ＣＰＵ１２ａは、受信制御部５８ａを有する。
【０２３８】
受信制御部５８ａは、実施例１に係る受信制御部５８と同様の機能を有するとともに、ＲＡＭ８１と同様に複数のレジスタセットを記憶するＲＡＭ８１ａを有する。また、受信制御部５８ａは、受信制御部５８が有する一時レジスタ群８２のうち、ＩＮＴＭＡＳＫレジスタ８８をＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａとしたものである。
【０２３９】
まず、図３４、図３５を用いて、ＲＡＭ８１ａが記憶するレジスタセットについて説明する。図３４は、実施例２に係るＲＡＭのフィールドの定義を説明するための図である。図３４に示すように、ＲＡＭ８１ａは、実施例１に係るＲＡＭ８１が記憶するレジスタセットに加えて、ＯＶＦＬビット（オーバーフロービット）を記憶する。詳細には、ＲＡＭ８１ａは、８３ビットのエントリのうち、７７ビット目をＯＶＦＬビットとし、他の８２ビットに、実施例１に係るレジスタセットと同様の情報を格納する。
【０２４０】
図３５は、実施例２に係るＲＡＭのフィールドに格納されるデータの内容を説明するための図である。図３５に示すように、ＲＡＭ８１ａは、メッセージ着信時にキューのオーバーフローが発生したか否かを示す１ビットのＯＶＦＬビットを記憶する。なお、図３５に示すように、ＲＡＭ８１ａが記憶する他の情報については、ＲＡＭ８１が記憶する情報と同じ情報であるため、説明を省略する。
【０２４１】
次に、図３６を用いて、ＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａについて説明する。図３６は、実施例２に係るソフトウェアから見た受信制御部のアドレスの一例を説明するための図である。例えば、ＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａは、ＩＮＴＭＡＳＫに加えて、メッセージを受信した際にキューのオーバーフローが発生したか否か示すＯＶＦＬビットを記憶するレジスタである。
【０２４２】
ここで、ＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａは、図３６に示すように、他のレジスタ８３〜８７と同様に、ソフトウェアから見た際にアドレスが付与されている。例えば、図３６に示す例では、ＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａがＩＮＴＭＡＳＫを記憶する範囲については、実施例１と同様に、「０ｘ１０」〜「０ｘ１７」のアドレスが付与されている。また、ＩＮＴＭＡＳＫ／オーバーフローレジスタ８８ａがＯＶＦＬビットを記憶する範囲については、「０ｘ４０」〜「０ｘ４７」が付与されている。
【０２４３】
以下、図３３に戻って、受信制御部５８ａが実行する処理について説明する。例えば、受信制御部５８ａは、ローカルＸＢ１６からメッセージを受信すると、一致検査部９１を用いて、受信したメッセージを格納するメッセージ記憶エリアに新たなメッセージを格納できるか否かを判別する。すなわち、受信制御部５８ａは、メッセージを受信すると、オーバフローが発生したか否かを判別する。
【０２４４】
そして、受信制御部５８ａは、オーバーフローが発生した場合、応答のＯＶＦＬビットを「１」にすることで、メッセージ送信側のノードにオーバーフローが発生した旨を通知する。また、受信制御部５８ａは、ＲＡＭ８１ａが記憶する各情報のうち、メッセージとともに受信したレジスタＩＤが示すエントリのＯＶＦＬビットを「１」にする。
【０２４５】
また、受信制御部５８ａは、アップデートレジスタに対するライト要求によってリードポインタが更新される際に、ＯＶＦＬビットが「１」である場合は、割り込み生成回路９６を用いて、割り込み要求信号を出力する。このような場合には、ドライバ３３は、オーバーフローが発生したためにメッセージ記憶エリアにメッセージを格納できなかったメッセージ送信元のノードに空き通知を送信する。
【０２４６】
ここで、図３７は、実施例２に係るＲＡＭのフィールドを更新する処理を説明するための図である。図３７に示すように、ＲＡＭ周辺部７８は、エントリの初期化を行う場合は、ＯＶＦＬビトを「０」に更新し、メッセージを書き込む場合には、ＯＶＦＬビットの値を更新値に更新する。すなわち、ＲＡＭ周辺部７８は、メッセージを書き込む際にオーバーフローが発生した場合には「１」を、オーバーフローが発生しなかった場合は「０」を格納する。また、ＲＡＭ周辺部７８は、割り込みマスクの変更やメッセージの読み出しを行う場合は、ＯＶＦＬビットの値を不変とする。なお、図３７に示す各情報のうち、ＯＶＦＬビット以外のフィールドについては、図２０に示す処理と同一の処理を行うものとして、説明を省略する。
【０２４７】
次に、図３８を用いて、オーバーフローが発生した際にＣＰＵ１２ａが実行するプロセスの動作について説明する。図３８は、実施例２においてオーバーフローが発生した際に実行する処理の流れを説明するためのシーケンス図である。
【０２４８】
例えば、ユーザープロセス＃１は、発行要求フラグレジスタ６３にフラグ「１」を格納することで、ＣＰＵ１２ａにメッセージの送信を指示する（ステップＳ８０１）。すると、ＣＰＵ１２ａは、メッセージを含むパケットを受信側ノードに送信する（ステップＳ８０２）。また、受信側ノードが有するＣＰＵａは、メッセージ記憶エリアがＦＵＬＬ状態（満杯）であるため（ステップＳ８０３）、オーバーフローを検出する（ステップＳ８０４）。
【０２４９】
そして、受信側ノードが有するＣＰＵは、ＯＶＦＬビットを「１」とした応答をＣＰＵ１２ａに送信する（ステップＳ８０５）。さらに受信側ノードが有するＣＰＵは送信したメッセージに係るＲＡＭ８１ａのオーバーフロービットを「１」にセットする（ステップＳ８０６）。次にユーザープロセス＃１は応答ステータスレジスタ６６の値の読み出しを行い、ＯＶＦＬビットを検出する。（ステップＳ８０７）。次に、ユーザープロセス＃１は、待ちリストへの追加依頼を受信側ノードが実行するドライバに送信する（ステップＳ８０８）。
【０２５０】
すると、受信側のノードが実行するドライバは、待ちリストにユーザープロセス＃１を追加する（ステップＳ８０９）。そして、受信側のノードが実行するドライバは、待ちリストへの登録完了通知をユーザープロセス＃１へ送信する（ステップＳ８１０）。すると、ユーザープロセス＃１は、空き待ち状態（スリープ）へ移行する（ステップＳ８１１）。この間、ＣＰＵ１２ａは、ユーザープロセス＃１以外のプロセスを実行することとしてもよい。
【０２５１】
次に、受信側ノードが実行するユーザープロセス＃２は、メッセージの読み出しを実行する（ステップＳ８１２）。すると、受信側ノードのＣＰＵは、メッセージ記憶エリアに空きが発生したと判別し（ステップＳ８１３）、さらには、ＲＡＭ８１ａのオーバーフロービットが「１」である事からオーバーフローを検出してスリープ状態になっている送信側プロセスが存在する事を検知して、割り込み処理をドライバに通知する（ステップＳ８１４）。すると、受信側ノードのドライバは、待ちリストを確認し（ステップＳ８１５）、ユーザープロセス＃１が待ちリストに登録されていると判別する。
【０２５２】
この結果、受信側ノードのドライバは、空き通知を、ドライバ３２に通知する（ステップＳ８１６）。すると、ドライバ３２は、コンテキストスイッチを実行し（ステップＳ８１７）、ユーザープロセス＃１を動作させる。この結果、ユーザープロセス＃１は、メッセージ＃１をメッセージデータレジスタ６１に格納し、ＣＰＵ１２ａがメッセージ＃１の再送を行う。
【０２５３】
次に、図３９を用いて、ＣＰＵ１２ａがオーバーフロー発生時に実行する処理の流れについて説明する。図３９は、実施例２に係るＣＰＵがオーバーフローの発生時に実行する処理の流れを説明するためのフローチャートである。なお、図３９に示すステップＳ９０１〜Ｓ９０８については、図３１に示すステップＳ６０１〜Ｓ６０８と同様の処理を実行するものとして説明を省略する。
【０２５４】
例えば、ＣＰＵ１２ａは、ＯＶＦＬビットが「１」である場合は、ドライバ３２に空き待ち割り込みを依頼する（ステップＳ９０９）。すると、ドライバ３２は、待ちリストへの追加依頼をメッセージ送信先のノードに送信し、登録完了通知を受信する。その後、ＣＰＵ１２ａは、実行するプロセスをスリープさせて、処理を終了する。一方、ＣＰＵ１２ａは、メッセージ送信先のノードから空き通知を受信すると、プロセスをスリープから再開させ、ステップＳ９０５の処理を実行する。なお、他の処理の流れについては、図３１に示す処理と同様であるため、説明を省略する。
【０２５５】
[実施例２の効果]
上述したように、受信側ノードのＣＰＵは、応答にＯＶＦＬビットを含めて送信するとともに、ＲＡＭ８１ａ内のオーバーフロービットをセットする。そして、ＣＰＵ１２ａは、メッセージ送信先のノードから通知された応答に含まれるＯＶＦＬビットが、新たなメッセージを受信できない旨を示す場合は、以下の処理を実行する。すなわち、ＣＰＵ１２ａは、メッセージ送信先のノードに対して、待ちリストへの追加依頼を送信するとともに、メッセージを送信するプロセスを停止させ、他のプロセスを実行する。
【０２５６】
そして、ＣＰＵ１２ａは、メッセージ送信先のノードから空き通知を受信すると、停止させたプロセスを実行し、再度メッセージを送信する。このため、ＣＰＵ１２ａは、処理時間の無駄を解消することができる。
【実施例３】
【０２５７】
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例３として本発明に含まれる他の実施例を説明する。
【０２５８】
（１）ＲＡＭが記憶する情報について
上述したＣＰＵ１２、１２ａは、レジスタセットを記憶するＲＡＭ８１、８１ａを有していた。しかし、実施例はこれに限定されるものではなく、例えば、ＣＰＵ１２、１２ａは、各レジスタセットを記憶するレジスタを実際に備えることとしてもよい。また、ＣＰＵ１２、１２ａは、ＲＡＭ８１、８１ａから読み出したレジスタセットを一時レジスタ群８２ではなく、ＦＦ等のバッファに格納することとしてもよい。
【０２５９】
（２）メッセージ格納エリアについて
上述した、ＣＰＵ１２、１２ａは、メモリ１７、１８にメッセージ記憶エリアを設定した。しかし、実施例はこれに限定されるものではなく、例えば、ＣＰＵ１２、１２ａは、他のＣＰＵ１３〜１５と共有する共有メモリ領域に対してメッセージ記憶エリアを設定することとしてもよい。
【０２６０】
（３）制御資源について
上述したＣＰＵ１２は、各コア４０〜４０ｂごとに制御資源６０〜６０ｃを有していた。しかし、実施例はこれに限定されるものではない。例えば、各コア４０〜４０ｂがスレッディングの技術を用いて２つのプロセスを実行することができる場合は、各コア４０〜４０ｂごとに２つの制御資源を有してもよい。また、例えば、コア４０ｂが実行するプロセスを限定し、他のプロセスとプロセス間通信を行わないプロセスのみをコア４０ｂに実行させる場合は、コア４０ｂの制御資源を有さないこととしてもよい。
【符号の説明】
【０２６１】
１〜１ｄ  情報処理システム
２、２ａ  クライアント端末
３、５  ＬＡＮスイッチ
４  管理端末
６  グローバルクロスバ
７  サービスプロセッサ
１０〜１０ｍ  ノード
１１  サービスプロセッサ
１２〜１５、１２ａ  ＣＰＵ
１６  ローカルＸＢ
１７〜２４  メモリ
２５  ＰＣＩｅスイッチ
２６、２７  ＬＡＮアダプタ
２８  ＳＡＳ
２９  ＨＤＤ
３０〜３０ｃ  ハードウェア
３１〜３１ｃ  ハイパーバイザ
３２〜３２ｃ  オペレーティングシステム
３３〜３３ｃ  ドライバ
３４〜３４ｃ  ミドルウェア
３５、３５ａ  アプリケーション
４０〜４０ｂ  コア
４１〜４１ｂ  Ｌ１キャッシュタグ
４２〜４２ｂ  Ｌ１キャッシュ
４３〜４３ｂ  ＴＬＢ
４４  Ｌ２キャッシュアクセスコントローラ
４５  Ｌ２キャッシュタグ
４６  Ｌ２キャッシュ
４７  アドレスマップ
４８  設定レジスタ群
４９  ＰＣＩ制御部
５０  ディレクトリ制御部
５１  キャッシュコヒーレンシトランザクション制御部
５３  メモリＲ／Ｗバス
５４  レジスタＲ／Ｗバス
５６  ＭＳＧＱ制御部
５７  送信制御部
５８  受信制御部
５９  アドレスデコーダ
６０〜６０ｃ  制御資源
６１  メッセージデータレジスタ
６２  ＭＳＧＱ−ＩＤレジスタ
６３  発行要求フラグレジスタ
６４  送信パケット生成部
６５、６９  セレクタ
６６  応答ステータスレジスタ
６７、７０  リードデータセレクタ
６８  応答受信フラグレジスタ
７１  パケット受信部
７２  リクエストキュー
７３  実行レジスタ
７４  メモリリクエスト制御部
７５  メモリリクエスト生成部
７６  メモリリクエストレジスタ
７７  ライトデータレジスタ
７８  ＲＡＭ周辺部
７９  ＲＡＭアドレス選択回路
８０  ライトデータ生成部
８１、８１ａ  ＲＡＭ
８２  一時レジスタ群
８３  ＢＡＤＲＳレジスタ
８４  ＭＫＥＹレジスタ
８５  ＷＤＰレジスタ
８６  ＲＤＰレジスタ
８７  Ｑサイズ／Ｍサイズレジスタ
８８  ＩＮＴＭＡＳＫレジスタ
８８ａ  ＩＮＴＭＡＳＫ／オーバーフローレジスタ
８９  コマンド実行部
９０  不一致検査部
９１  一致検査部
９２  加算値生成部
９３  加算器
９４  応答パケット生成部
９５  応答コマンドレジスタ
９６  割り込み生成回路
【図１】
0005598493.tif 000002
【図２】
0005598493.tif 000003
【図３】
0005598493.tif 000004
【図４】
0005598493.tif 000005
【図５】
0005598493.tif 000006
【図６】
0005598493.tif 000007
【図７】
0005598493.tif 000008
【図８】
0005598493.tif 000009
【図９】
0005598493.tif 000010
【図１０】
0005598493.tif 000011
【図１１】
0005598493.tif 000012
【図１２】
0005598493.tif 000013
【図１３】
0005598493.tif 000014
【図１４】
0005598493.tif 000015
【図１５】
0005598493.tif 000016
【図１６】
0005598493.tif 000017
【図１７】
0005598493.tif 000018
【図１８】
0005598493.tif 000019
【図１９】
0005598493.tif 000020
【図２０】
0005598493.tif 000021
【図２１】
0005598493.tif 000022
【図２２】
0005598493.tif 000023
【図２３】
0005598493.tif 000024
【図２４】
0005598493.tif 000025
【図２５】
0005598493.tif 000026
【図２６】
0005598493.tif 000027
【図２７】
0005598493.tif 000028
【図２８】
0005598493.tif 000029
【図２９】
0005598493.tif 000030
【図３０】
0005598493.tif 000031
【図３１】
0005598493.tif 000032
【図３２】
0005598493.tif 000033
【図３３】
0005598493.tif 000034
【図３４】
0005598493.tif 000035
【図３５】
0005598493.tif 000036
【図３６】
0005598493.tif 000037
【図３７】
0005598493.tif 000038
【図３８】
0005598493.tif 000039
【図３９】
0005598493.tif 000040
【図４０】
0005598493.tif 000041
【図４１】
0005598493.tif 000042
【図４２】
0005598493.tif 000043
【図４３】
0005598493.tif 000044
【図４４】
0005598493.tif 000045