図1は、本発明の実施例1による情報処理装置のブロック構成例を示す。尚、情報処理装置は、コンピュータシステムとも称することができる。図1に示すように、実施例1による情報処理装置は、n枚のボードB−0,B−1,...,B−n−1(総称してボードBと称する場合がある)を含む。n枚のボードB−0,B−1,...,B−n−1の各々は、例えばプリント配線基板であり、情報処理部とも称する。
実施例1では、n枚のボードB−0,B−1,...,B−n−1は夫々同様の構成を有する。例えばボードB−0は、4個のCPU C01、C02,C03,C04,および4個のメモリM01,M02,M03,M04を有する。又、各CPUはキャッシュメモリを有する。すなわち、CPU C01,C02,C03,C04は、夫々キャッシュメモリCA01,CA02,CA03,CA04を有する。
同様に、ボードB−1も、4個のCPU C11、C12,C13,C14,および4個のメモリM11,M12,M13,M14を有する。ここでも、各CPUはキャッシュメモリを有する。すなわち、CPU C11,C12,C13,C14は、夫々キャッシュメモリCA11,CA12,CA13,CA14を有する。
同様に、ボードB−n−1も、4個のCPU Cn−11、Cn−12,Cn−13,Cn−14,および4個のメモリMn−11,Mn−12,Mn−13,Mn−14を有する。ここでも各CPUはキャッシュメモリを有する。すなわち、CPU Cn−11,Cn−12,Cn−13,Cn−14は、夫々キャッシュメモリCAn−11,CAn−12,CAn−13,CAn−14を有する。
尚、夫々のボードB−0,B−1,...,B−n−1が有するCPU C01〜C04,C11〜C14,...,Cn−11〜Cn−14を総称してCPU Cと称する場合がある。同様に、夫々のボードB−0,B−1,...,B−n−1が有するメモリM01〜M04,M11〜M14,...,Mn−11〜Mn−14を総称してメモリMと称する場合がある。同様に夫々のボードB−0,B−1,...,B−n−1が有するキャッシュメモリCA01〜CA04,CA11〜CA14,...,CAn−11〜CAn−14を総称してキャッシュメモリCAと称する場合がある。
ボードB−0,B−1,...,B−n−1は、夫々ノードコントローラNC−0,NC−1,..., NC−n−1(総称してノードコントローラNCと称する場合がある)を有する。ノードコントローラNCの構成については、図12とともに後述する。ノードコントローラNCは、ボードB間のデータの転送を行うとともに、後述するディレクトリDRを使用して自己が属するボードB内のメモリ空間が格納するデータを保持するCPU、或いはデータを保持するCPUを有するボードを認識する。
ボードB内のメモリ空間とは、例えばボードB−0の場合、ボードB−0が有する4つのメモリM01,M02,M03,M04の夫々のメモリ空間全てを含むメモリ空間を意味する。そしてノードコントローラNCはCPU或いはボードに対し、必要に応じてスヌープの発行を行う。ここでスヌープの発行(スヌーピングとも言う)とは、キャッシュメモリCAとメモリMとの間のデータの一貫性(キャッシュコヒーレンシ)を確保する動作である。具体的には、ノードコントローラNCはデータを共有する他のキャッシュメモリCAとの間で連絡を取り合い、必要に応じてキャッシュメモリCA上のデータを消去する指示等を行う動作を言う。
又、ノードコントローラNC−0,NC−1,..., NC−n−1は、夫々ディレクトリDR−0,DR−1,...,DR−n−1(総称してディレクトリDRと称する場合がある)を有する。ディレクトリDRの構成は図3〜図5とともに後述する。ノードコントローラNCは、自身が属するボードB内のメモリ空間に格納されたデータを保持するCPU C、或いはデータを保持するCPU Cを有する他のボードBを識別する情報を自己のディレクトリDRに登録して管理する。又、ディレクトリDRは、更に、任意のCPU Cが保持するデータが他のCPU Cと共有されている(Shared)か、データがCPU Cに排他的に保持されている(Exclusive)か、或いは無効(Invalid)かを示す情報を保持する。尚、ディレクトリDRの実体は記憶装置(或いは記憶領域)であり、記憶装置の記憶領域がノードコントローラNCによって管理される。尚、データが「無効(Invalid)」とは、そのデータを「使用しない」(使用が禁じられている)ことを示す。
又、図1の情報処理装置では、各ボードB内の各CPUは各々、メモリMに接続されている。ボードB−0の場合で説明すると、CPU C01はメモリM01に接続されている。同様に,CPU C02はメモリM02に,CPU C03はメモリM02に,CPU C04はメモリM04に、夫々接続されている。又、同一のボードに搭載されているCPU C01,C02,C03,C04は相互に通信可能なように接続される。又、ノードコントローラNC−0は、CPU C01,C02,C03,C04の夫々と通信可能なように接続される。そして、夫々のボードB−0,B−1,...,B−n−1が有するノードコントローラNC−0,NC−1,..., NC−n−1同士も通信可能なように接続されている。
図1に示す構成の情報処理装置において、あるボードBに属するあるCPU C、例えばボードB−0のCPU C02がデータを必要とした場合を想定する。CPU C02のキャッシュメモリCA02がデータを保持する場合には、図2Aに示す如く、CPU C02はキャッシュメモリCA02からデータを取得する(ステップS1)。
次に、自己のキャッシュメモリCA02がデータを保持しない場合、図2Bに示す如く、CPU C02は、読み出し要求(以下、単にリード要求と称する)を、自身が搭載されているボードB−0内のノードコントローラNC−0に発行する(ステップS11)。ノードコントローラNC−0は、CPU C02からのリード要求を受けると、リード対象のデータを管理しているボードBを調べる。ここで各ノードコントローラNCは、n枚のボードB−0,B−1,...,B−n−1各々のデータ格納領域を識別するアドレスを管理しているボードBを認識する。言い換えると、個々のノードコントローラNCは、情報処理装置のメモリ空間内の各アドレスが、どのボードB内のメモリMのアドレスであるのかを認識し、リード要求の対象となるアドレスを管理しているボードに属するノードコントローラを認識する。この目的のため、ノードコントローラNCは、例えば、情報処理装置のメモリ空間におけるアドレスと、当該アドレスを管理するボードBとの対応関係を示すテーブルデータを有する。尚、「夫々のアドレスを管理するボードB」とは、当該アドレスを有するメモリMが属するボードBを意味する。
ノードコントローラNC−0は、リード要求を受け、例えばテーブルデータを参照することにより、リードの対象のデータのアドレスを管理しているボードBがボードB−1であることを認識する。すなわち、リード対象データのアドレスはボードB−1が有する4つのメモリM11,M12,M13,M14の何れかに属し、アドレスにリード対象データが格納されている。ノードコントローラNC−0は次に,リード要求をボードB−1のノードコントローラNC−1に転送する(ステップS12)。
ノードコントローラNC−0からリード要求を受けたノードコントローラNC−1は、自己のディレクトリDR−1を検索する(ステップS13)。検索の結果、リード要求に対応するアドレスに格納されているデータを保持するCPUがボードB−0のCPU C01であり、且つ、CPU C01はデータを排他的(Exclusive)に保持していることが判明したとする。ここで「CPU Cがデータを保持する」とは、CPU CのキャッシュメモリCAがデータを保持していることを意味する。又、「排他的に保持する」とは、現在データを(Invalidでなく)保持するCPU Cは、全ボードB−0,B−1,...,B−n−1が有するCPU Cのうち、CPU C01のみであることを意味する。
この場合、ノードコントローラNC−1はCPU C01に対しスヌープを発行するとともに、自己のディレクトリDR−1を更新する(ステップS14)。具体的には、スヌープを発行することで、CPU C01に対し、自己が保持するリード対象のデータを当該データを求めているリクエスタCPU C02に転送するとともに、自己が保有するリード対象のデータを消去することを指示する。スヌープを受けたCPU C01は、自己が保持するデータをリクエスタCPU C02に転送する(ステップS15)とともに、リクエスタCPUに転送したデータを自己のキャッシュメモリCA01から消去する。
更に、ノードコントローラNC−1は、自己のディレクトリDR−1中、リード対象のデータが格納されたアドレスに係るエントリを更新する(ステップS14)。具体的には、当該アドレスに格納されたデータは、元はCPU C01が保持していたが、これがCPU C02に転送され、CPU C01からは消去されている。その結果、現在はCPU C02がデータを排他的に保持しているため、ディレクトリDR−1のエントリは、CPU C02がデータを排他的に保持することを示す情報に更新される。尚、リード要求を発行するCPU(上記の例の場合、CPU C02)を、リクエスタCPUと称することがある。
次に、リクエスタCPU C02がリード要求を発行(ステップS21)し、リード対象のデータが、CPU C02が属するボードB−0内のメモリ、すなわち4つのメモリM01,M02,M03,M04のうち、メモリM03に属するアドレスに格納されていたとする。この場合、CPU C02から発行されたリード要求を受けたノードコントローラNC−0が、自己のディレクトリDR−0を検索する(ステップS22)。検索の結果、ディレクトリDR−0の情報により、リード要求に対応するアドレスに格納されているデータを(Invalidでなく)保持するCPUが、情報処理装置内に存在しないことが判明したとする。この場合ノードコントローラNC−0は、リード対象のデータが格納されたメモリM03から直接読み出して、リクエスタCPU(C02)に対し読み出したデータを転送する(ステップS23)。
次に、リクエスタCPUが属するボードBとは別のボードBのCPUが保持するデータを転送する場合につき、図2Dとともに説明する。図2Bの場合と同様、自己のキャッシュメモリCA02がデータを有さないため、CPU C02は、リード要求をボードB−0内のノードコントローラNC−0に発行する(ステップS31)。ノードコントローラNC−0は、CPU C02からリード要求を受けると、テーブルデータを参照することにより、リード対象データを管理するボードBを調べる。ここでも、図2Bの場合同様、リードの対象のデータのアドレスを管理しているボードがボードB−1であるとする。この場合ノードコントローラNC−0は次に,当該リード要求をボードB−1のノードコントローラNC−1に転送する(ステップS32)。
ノードコントローラNC−0からリード要求を受けたノードコントローラNC−1は、自己のディレクトリDR−1を検索する(ステップS33)。検索の結果、リード要求に対応するアドレスに格納されているデータを保持するCPUがボードB−1のCPU C12であり、且つ、CPU C12はリード対象データを排他的に保持していることが判明したとする。この場合、ノードコントローラNC−1はCPU C12に対しスヌープを発行するとともに、自己のディレクトリDR−1を更新する(ステップS34)。その結果、スヌープを受けたCPU C12は、自己が保持するリード対象のデータをCPU C02に転送する(ステップS35)とともに、当該データを自己のキャッシュメモリCA01から消去する。更に、ノードコントローラNC−1は、自己のディレクトリDR−1中、リード対象のデータが格納されたアドレスに係るエントリを更新する(ステップS34)。すなわち、当該アドレスに格納されたデータがCPU C02によって排他的に保持されていることを示す情報にディレクトリDR−1を更新する。
次に、図3とともに、実施例1に適用可能なディレクトリDRの構成例について説明する。図3中、左端に、例えば各ボードBが有するメモリ空間のうちの一部分のメモリ空間MSを模式的に示す。メモリ空間MSには一例としてメモリ番地MA(アドレス)0x000〜0x1000が付与される。又、図3には、メモリ空間MSに対応するディレクトリDRの部分DRRが示されている。メモリ空間MSのメモリ番地0x000〜0x1000の各々(例えばMS−i)は、例えば64バイトの容量を有するデータ格納領域に対し、付与される。
ディレクトリDRでは、メモリ空間の64バイトの各データ格納領域(例えばMS−i)に対し、1つのエントリ(2バイト)DE−iが割り当てられる。又、実施例1では、ノードコントローラNCがディレクトリDRに対する1回のアクセスで扱うブロックDRR−bのサイズは32エントリである。図3では説明の便宜上、32エントリのブロックDRR−b(合計サイズ:2×32=64バイト)を、8段×8バイト(64ビット)の構成を有するものとして示している。ブロックDRR−bは上記の如く32エントリを含み、各エントリは、例えば図3中、エントリDE−jで示す構成を有する。尚、ディレクトリDRにおける各エントリの場所によって、対応するメモリ空間のメモリ番地が一意に決まる。又、ノードコントローラNCは、メモリ空間の各メモリ番地(アドレス)に対応するディレクトリDR内のエントリの場所を認識している。したがってノードコントローラNCは、データを保持するCPU C或いはボードBを調べる場合、当該データのアドレス(すなわちメモリ空間上のメモリ番地)に基づき、ディレクトリDR中の対応するエントリを認識する。
次に図4Aとともに、参考例のディレクトリのフォーマットについて説明する。図4Aの例の場合、32エントリのブロックDDR−b1に含まれる各エントリDE−j1は、A−1タイプのDE−k1と、A−2タイプのDE−k2との2種類のフォーマットのうちの何れかのフォーマットを有する。A−1タイプのエントリDE−k1では、2バイト(16ビット)中、最初の2ビットが使用されず(Reserved)、次の2ビットがステータスビット(図中ステータス)SBである。ステータスビットSBは、CPU Cが保持するデータが無効(Invalid:00)か、他のCPU Cと共有されているか(Shared:01)、或いは排他的に保持されている(Exclusive:10)、を示す。
次の6ビットはノードID(IDentifier)を示すビットNID1であり、6ビットの内訳は、4ビットのボードIDと、2ビットのCPU−IDとである。ここでボードIDとは、n枚のボードB−0,B−1,...,B−n−1の各々を識別する情報であり、例えばボードB−0,B−1,...,B−n−1の夫々のボードIDは、0,1,...,n−1である。又、CPU−IDは、各ボード内のCPU Cを識別する情報であり、例えば、ボードB-0のCPU C01,C02,C03,C04は夫々CPU−ID 0,1,2,3を有する。同様にボードB-1のCPU C11,C12,C13,C14も、夫々CPU−ID 0,1,2,3を有する。同様にボードB-nのCPU Cn−11,Cn−12,Cn−13,Cn−14も、夫々CPU−ID 0,1,2,3を有する。
エントリDE−k1の次の6ビットもノードID(IDentifier)を示すビットNID2である。その内訳は、上記したノードIDを示すビットNID1と同様である。 ノードID NID2は、ノードID NID1が対応しているノードとは別のノードに対応している。
ノードIDは、データを保持するノードの識別情報が付与される。つまり、ボードIDにはデータを保持するボードの識別情報が、CPU−IDにはボードIDが示すボードに搭載されたCPUのうち、データを保持するCPUの識別情報が、夫々記録される。
このようにA−1タイプの場合、各エントリは2個のノードIDを保持し得る。その結果、データを共有するCPUが2個以内の場合には、データを共有する全てのCPUを示す情報をエントリDE−k1に保持できる。しかしながら、データを共有するCPU Cが3個以上の場合には、エントリのサイズの関係上、データを共有する全てのCPU Cを示す情報を保持できない。
A−2タイプは、データを共有するCPU Cが3個以上の場合にも、3個以上のボードIDを示す情報を保持することができる。A−2タイプのエントリDE−k2のフォーマットは、図4Aに示す如く、最初の2ビットが使用されず(Reserved)、次の2ビットがステータスビットSBである。ステータスビットSBは、エントリがA−2タイプであることを示す情報(11)を保持する。エントリDE−k2の次の12ビットがボードビットマップBBMを示す。ここでは情報処理装置が有する全ボード数が12の場合を想定し、BBMの各ビットが12枚のボードの夫々に対応し、対応するビットが"1"のボードがデータを共有していることを示す。したがって、例えばボードIDが3,7,9の夫々のボードのCPUがデータを保持する場合、ボードビットマップBBMは001000101000となる。
A−2タイプのエントリDE−k2の場合、データを共有するCPU Cが3個以上の場合に対処できるが、エントリにはボードIDのみが示され個別のCPU−IDが示されないため、データを保持しているCPUを特定できない。その結果、スヌープの発行を行う場合、該当するボードが有する全てのCPUに対しスヌープを発行する必要がある。したがって、A−2タイプのエントリを用いる場合には、スヌープの発行数が増加して情報処理装置のシステムの性能が低下する場合が想定される。
実施例1ではこのような問題点に鑑み、ディレクトリDRのフォーマットを工夫することにより、3個以上のCPUがデータを共有する場合であってもスヌープの発行数の増加を避けることを可能にする。
実施例1ではノードコントローラNCにおいて、図11A,11B、12とともに後述するフォーマット変換部FCを設ける。実施例1の場合、ディレクトリDRは図4Bに示すAタイプ(Ax−1タイプ及びAx−2タイプを含む)のフォーマットを使用する。そしてデータを共有するCPU Cが3個以上となる場合に、図4BのAタイプのフォーマットを図5に示すBタイプのフォーマット(後述)に変換(以下、フォーマット変換と称する)する。尚、AタイプからBタイプへのフォーマット変換は、ディレクトリDRのブロックごとに行う。その結果、ディレクトリDRのブロックのうち、あるブロックはAタイプのフォーマットを有し、他のブロックはBタイプのフォーマットを有する、という状態となり得る。なお、同一ブロック内では、AタイプのフォーマットとBタイプのフォーマットとは混在しない。又、ディレクトリDRの各ブロックに属する夫々のエントリはフォーマット変換によって変動せず、常に固定されている。すなわちBタイプの場合、後述するようにブロックごとに登録可能なエントリ数が最大で8であるため、1ブロックに属する32エントリの全ての情報を同一ブロック内には登録できない。しかしながらBタイプの場合であっても、当該ブロックに属する32エントリの全ての情報をブロック内に登録できないだけであって、32エントリが当該ブロックに属する事実は維持される。これは、ノードコントローラNCが、自己が管理するアドレスに対応するディレクトリDRのエントリを、その場所によって認識することにより、確保される。
図4Bのフォーマットは、図4Aのフォーマットとほぼ同様であり、重複する説明を省略する。図4Bに示すブロックDRR−b2に含まれるエントリDE−j2がAx−1タイプの場合(DE−k3)、上述した図4AのAx−1タイプと異なり、最初の1ビットがフォーマットビットFBである。フォーマットビットFBはエントリのフォーマットタイプを示す。フォーマットビットFBが"1"の場合はエントリがAタイプであることを示し、"0"である場合はエントリがBタイプであることを示す。図4Bに示すエントリDE−k3はAx−1タイプであるため、フォーマットビットFBは"1"である。同様に、図4Bに示すブロックDRR−b2に含まれるエントリDE−j2がAx−2タイプの場合(DE−k4)も、図4AのAx−2タイプと異なり、エントリの最初の1ビットがフォーマットビットFBである。図4Bに示すエントリDE−k4はAx−2タイプであるため、フォーマットビットFBは"1"である。
次に図5とともに、Bタイプのフォーマットについて説明する。図5に示す如く、Bタイプのフォーマットでは、ブロックDDR−b3のサイズ(64バイト)は図4Bに示すAタイプのフォーマットのブロックDDR−b2と同様であるが、図5の例ではブロック内のエントリ数が8である。したがってBタイプの各エントリDE−k5のサイズは8バイト(64ビット)である。各エントリDE−k5の内訳を以下に示す。
エントリDE−k5の最初の1ビットはフォーマットビットFBである。図5に示すエントリDE−k5はBタイプであるため、フォーマットビットFBは"0"である。次の2ビットはステータスビットSBである。ステータスビットSBは、当該エントリが空(empty: 00)か、データが2個以内のCPUで共有されている(Shared: 01)か、排他的に保持されている(Exclusive: 10)か、或いはデータが3個以上のCPUで共有されている(Shared: 11)か、を示す。尚、データが無効(Invalid)の場合、当該データに対応するエントリはブロックDDR−b2には含まれない。
次の5ビットはアドレスビットABであり、当該エントリが、Aタイプのフォーマットのブロックのどのエントリに対応するかを示す情報である。エントリDE-k5の残りの56ビットには、n個のCPU−ビットマップBID0,BID1,...,BIDn−1が保持される。n個のCPU−ビットマップBID0,BID1,...,BIDn−1は、n個のボードB−0,B−1,...,B−n−1(ボードID:0〜n−1)に夫々対応する。ボードの枚数が12の場合、CPU−ビットマップも12個となる。又、CPU−ビットマップBID0,BID1,...,BIDn−1の各々は4ビットを有し、4ビットの夫々が、各ボードBに含まれる4個のCPUに対応する。
例えばボードB−1のCPUのうち、CPU−IDが1,3のCPUがデータを保持する場合、ボードB−1に対応するCPU−ビットマップBID1は、"1010"となる。同様に、ボードB−1のCPUのうち、CPU−IDが2のCPUだけがデータを保持する場合、ボードB-1に対応するCPU−ビットマップBID1は、"0100"となる。ボードB−1のCPUのうち、CPU−IDが0,1,2,3のCPU(4個全て)がデータを保持する場合、ボードB-1に対応するCPU−ビットマップBID1は、"1111"となる。
尚、ボード数が12の場合、CPU−ビットマップBID0,BID1,...,BID11によって合計48ビットが使用され、残りの8ビットは使用されない(Reserved)。
上記の如く、図4Bに示すAタイプのフォーマットでは、ディレクトリDRの各エントリのサイズ(2バイト)の関係から、データを共有する全てのCPU Cを特定する情報を保持できない場合がある。これに対し図5に示すBタイプのフォーマットでは、各エントリのサイズ(8バイト)が大きいため、データを共有する全てのCPU Cを特定する情報をエントリ内に保持することができる。その結果、図5を用いた例では、例えばAx−2タイプを用いている場合のようにディレクトリDRで特定されるボードB内の全てのCPU Cに対しスヌープを発行する必要がなく、ディレクトリDRで特定されるCPU Cに対してのみスヌープを発行すればよい。したがって、Bタイプのフォーマットを用いることにより、スヌープの発行数の増加による情報処理装置のシステムの性能の低下を防止できる。又、実施例1によれば、Aタイプのフォーマットを、必要に応じてブロックごとにBタイプのフォーマットに変換するため、ディレクトリDRの容量を増加することなく、情報処理装置の性能の低下を防止することができる。
尚、Bタイプのフォーマットの場合、ブロックごとに保持できるエントリ数が8である。したがって当該ブロックに(Invalidでなく)保持すべきエントリ数が9以上の場合、フォーマットをAタイプ(例えばAx−2タイプ)に変換する。ここで、「ブロックにつき保持すべきエントリ数」とは、当該ブロックに属する32エントリの夫々に対応するメモリ空間内の32個のデータ格納領域のうち、CPU Cが(Invalidでなく)データを保持しているデータ格納領域の個数を意味する。ここで「データの個数」とは、1個のデータ格納領域に格納されているデータを「1個」として数える。
図6は、図4Aの参考例においてCPU Cからリード要求を受信した場合のノードコントローラNCの動作の流れを示すフローチャートである。図6は特に、CPU同士がデータを共有して持とうとする場合の動作を示す。
図6中、ステップS101で、リードの対象データのアドレスを管理するノードコントローラNCがリクエスタCPU Cからリード要求を受信すると、ノードコントローラNCは自己のディレクトリDRを検索する(ステップS102)。検索の結果得たディレクトリDRのエントリのステータスビットSBがInvalidを示す場合(ステップS103 YES)、ステップS104に進み、そうでない場合(ステップS103 NO)ステップS107に進む。
ここで、検索で得たディレクトリDRのエントリとは、リードの対象データのアドレスに対応するエントリであり、以下、自エントリと称する。又、同じブロック内の自エントリ以外のエントリを他エントリと称する。尚、エントリのステータスビットSBがInvalid(00)ということは、図4Aに示す如く、エントリがAx−1タイプであることを意味する。Ax−2タイプのフォーマットではステータスビットSBは常に11であるからである。
ステップS104で、ノードコントローラNCは自エントリに対応するメモリM上のデータ格納領域からデータを読み出して、リクエスタCPU Cに転送する(ステップS104)。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPU CのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS105、S106)。
ステップS107では、自エントリのステータスビットSBがExclusiveか否か判定する。ステータスビットがExclusiveの場合(S107 YES)、ステップS108に進み、そうでない場合(S107のNO)、ステップS111に進む。尚、ステータスビットSBがExclusive(10)ということは、図4Aに示す如く、エントリがAx−1タイプであることを意味する。
ステップS108でノードコントローラNCは、自エントリに登録されているCPUに対しスヌープを発行し、スヌープを発行したCPUに対し、自エントリのデータの保持形態をExclusiveからSharedに変更することを通知する。次にステップS109でノードコントローラNCは、スヌープの宛先のCPUからのデータをリクエスタCPUに対し転送する。次にステップS110でノードコントローラNCは、自エントリのステータスビットSBをSharedとして、リクエスタCPU CのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS105、S106)。
ステップS111では、自エントリのステータスビットSBがSharedか否かを判定する。尚、ステータスビットSBがShared(01)ということは、図4Aに示す如く、エントリがAx−1タイプであることを意味する。ステータスビットがSharedの場合(S111 YES),ステップS112に進み、そうでない場合(S111 NO),ステップS115に進む。
ステップS112でノードコントローラNCは、自エントリに対応するメモリM上のデータ格納領域からデータを読み出して、リクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリのステータスビットSBを11として、リクエスタCPU Cを有するボードBのボードIDを自エントリに、Ax−2タイプのフォーマットで登録する(ステップS113、S114)。
すなわち、ステップS111で自エントリのステータスビットSBがSharedの場合、既に自エントリには2個のCPU Cが登録されていることを意味する。そのような状態で自エントリに更にリクエスタCPUを登録するため、自エントリに登録するCPUの数が3となる。したがって自エントリを、エントリに登録し得るCPU数の最大値が2のAx−1タイプのフォーマットから、エントリに登録し得るボード数が3以上のAx−2タイプのフォーマットに変更する。そして、ノードコントローラNCは、すでに自エントリに登録されていた2個のCPUを有するボードBのボードIDとともに、リクエスタCPUを有するボードBのボードIDを登録する。
尚、ステップS112,S115においてメモリMからデータを転送する理由は以下の通りである。すなわち、ステップS112,S115の場合、データを保持するCPUが2個以上である。この参考例の場合、一律、メモリMからデータを読み出して転送することにして制御の簡便化を図る。
ステップS115でノードコントローラNCは、自エントリに対応するメモリM上のデータ格納領域からデータを読み出して、リクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、リクエスタCPU Cを有するボードBのボードIDを自エントリに登録する(ステップS116、S114)。すなわち、ステップS111で自エントリのステータスビットSBがSharedでない場合(S111のNO)、S103 NO,S107 NOを経ており、ステータスがInvalidでもExclusiveでもない。したがってこの場合、ステータスビットSBは11であり、自エントリがAx−2タイプであることがわかる。
図7A,7Bは、実施例1の情報処理装置においてCPU Cからリード要求を受信した場合のノードコントローラNCの動作の流れを示すフローチャートである。図7A、図7Bは特に、CPU同士がデータを共有して持とうとする場合の動作例を示す。尚、CPU同士がデータを共有して(Sharedで)持とうとするか、或いは排他的に(Exclusiveで)データを持とうとするかは、外部から与えられる命令によって決定される。
図7A中、ステップS121で、リードの対象データのアドレスを管理するノードコントローラNCがリクエスタCPU Cからリード要求を受信すると、ノードコントローラNCは自己のディレクトリDRを検索する(ステップS122)。検索の結果得た自エントリが属するブロックのフォーマットがBタイプの場合(ステップS123 B−type)、ステップS124に進み、フォーマットがAタイプの場合(ステップS123 A−type)、図7BのステップS138に進む。ブロックのフォーマットは、FBの参照などで判別可能である。
S123でブロックのフォーマットがBタイプであると判別された場合、ステップS124でノードコントローラNCは、自エントリがBタイプのフォーマットでブロック上にすでに存在するか否かを判別する。自エントリがブロックにすでに存在している場合(ステップS124 YES)、ステップS125に進み、一方自エントリがまだブロック内に存在しない場合(ステップS124 NO),ステップS130に進む。尚、Bタイプのフォーマットでブロック内に登録し得る最大エントリ数は8である。したがってBタイプのフォーマットのブロック上に自エントリが存在しない場合があり得る。
S124で自エントリがブロック内に存在すると判定された場合、ステップS125でノードコントローラNCは、自エントリのステータスビットSBを判別する。自エントリのステータスビットSBがExclusiveであれば(ステップS125 E),ステップS126に進み、Sharedであれば(ステップS125 S)、ステップS129に進む。
ステップS126でノードコントローラNCは、自エントリに登録されたCPUに対しスヌープを発行し、スヌープを発行したCPUに対し、当該データの保有形態をExclusiveからSharedに変更する旨を通知する。又、このとき、自エントリのステータスビットSBをSharedに変更する。次にステップS127でノードコントローラNCは、スヌープの宛先のCPUからのデータをリクエスタCPUに転送する。このとき、リクエスタCPUは自己のキャッシュメモリに転送されたデータを保持する。次にステップS128でノードコントローラNCは、自エントリにリクエスタCPUのCPU−IDを登録する。
一方、S125で自エントリのステータスビットSBがSharedであると判定された場合、ステップS129でノードコントローラNCは、メモリMからデータを読み出してリクエスタCPUに転送する。このとき、リクエスタCPUは自己のキャッシュメモリに転送されたデータを保持する。次にステップS128でノードコントローラNCは、自エントリにリクエスタCPUのCPU−IDを登録する。
ブロック内に自エントリが存在しない場合、ステップS130でノードコントローラNCは、ブロックに既にエントリが8個登録済みであるか否かを判別する。ブロック内に他エントリが8個登録済みであれば(ステップS130 YES)、ステップS133に進み、登録された他エントリ数が8個未満であれば(ステップS130 NO),ステップS131に進む。
ブロックにエントリが8個登録されていない場合、ステップS131でノードコントローラNCは、メモリMからデータを読み出して、リクエスタCPUに転送する。このとき、リクエスタCPUは自己のキャッシュメモリに転送されたデータを保持する。次にステップS132,S128でノードコントローラNCは、ステータスビットSBをExclusiveとして自エントリをブロックに追加し、追加した自エントリにリクエスタCPUのCPU−IDを登録する。
一方、ブロックに他エントリが8個登録済みの場合、ステップS133でノードコントローラNCは、ブロックのフォーマットをBタイプからAタイプにフォーマット変換する。ここで、まずブロックに追加する自エントリに対応するデータをメモリMから読み出してリクエスタCPUに転送する(ステップS134)。そして自エントリのステータスビットSBをExclusiveとして(ステップS135)、Ax−1タイプのフォーマットで自エントリをブロックに追加し、自エントリにリクエスタCPUのCPU−IDとリクエスタCPUが搭載されているボードのボードIDとを登録する(ステップS136)。
他方、ブロックに既に登録済みの8個の他エントリのうち、登録されているCPUの個数が2個以内のエントリについては、Ax−1タイプのフォーマットで夫々のボードIDとCPU−IDとを登録する(ステップS136)。又、このとき、Bタイプのフォーマット上でステータスビットSBがemptyであったエントリにつき、Ax−1タイプのフォーマットでステータスビットSBをInvalidとしてブロックに登録する。更に、上記8個に含まれなかった、当該ブロックに属する他のエントリについても、Ax−1タイプのフォーマットでステータスビットSBをInvalidとしてブロックに登録する。又、ブロックに既に登録済みの8個の他エントリのうち、登録されているCPUの個数が3個以上のエントリについては、Ax−2タイプのフォーマットで夫々のボードIDをブロックに登録する(ステップS137)。
ブロックのフォーマットがAタイプの場合、図7BのステップS138でノードコントローラNCは、自エントリのステータスビットSBがInvalidを示すか否かを判別し、Invalidを示す場合(ステップS138 YES)、ステップS139に進み、そうでない場合(ステップS138 NO)ステップS141に進む。尚、ステータスビットSBがInvalid(00)ということは、図4Bに示す如く、エントリがAx−1タイプであることを意味する。
ステップS139でノードコントローラNCは、自エントリに対応するメモリM上のデータ格納領域からデータを読み出して、リクエスタCPU Cに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPU CのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS140、S136)。
ステップS141では、自エントリのステータスビットSBがExclusiveか否か判定する。ステータスビットがExclusiveの場合(S141 YES)、ステップS142に進み、そうでない場合(S141のNO)、ステップS144に進む。ステータスビットSBがExclusive(10)ということは、図4Bに示す如く、エントリがAx−1タイプであることを意味する。
ステップS142でノードコントローラNCは、自エントリに登録されているCPUに対しスヌープを発行し、スヌープを発行したCPUに対し、エントリのデータの保持形態をExclusiveからSharedに変更することを通知する。次にノードコントローラNCは、スヌープの宛先のCPUからデータを読み出してリクエスタCPUに対し転送する。次にノードコントローラNCは、自エントリのステータスビットSBをSharedとして、リクエスタCPU CのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS143,S136)。
ステップS144では、自エントリのステータスビットSBがSharedか否かを判定する。ステータスビットSBがShared(01)ということは、図4Bに示す如く、エントリがAx−1タイプであることを意味する。Sharedの場合(S144 YES),ステップS145に進み、そうでない場合(S144 NO),ステップS149に進む。
ステップS145でノードコントローラNCは、自エントリが属するブロック内に、ステータスビットSBがInvalid以外のエントリが8個以上であれば(ステップS145 YES),ステップS148に進む。自エントリが属するブロック内のステータスビットSBがInvalid以外のエントリが7個以下であれば(ステップS145 NO),ステップS146に進む。Invalid以外のエントリが7個以下であれば、自エントリを加えてもInvalid以外のエントリが合計で8個以下となり、Bタイプのフォーマットでブロックに登録可能なエントリの最大個数8以内に収まるからである。
ステップS146でノードコントローラNCは、ブロックのフォーマットをAタイプからBタイプにフォーマット変換する。そして自エントリに対応するメモリM上のデータ格納領域からデータを読み出してリクエスタCPUに転送する(ステップS147)。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、Bタイプのフォーマットで自エントリをブロックに追加登録し、リクエスタCPU CのCPU−IDを追加登録した自エントリに登録する(ステップS128)。
Invalid以外の他エントリが8個以上ある場合、ステップS148では、自エントリに対応するメモリM上のデータ格納領域からデータを読み出してリクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリをAx−2タイプのフォーマットに変更し、リクエスタCPU Cを有するボードのボードIDを自エントリに登録する(ステップS137)。
すなわち、ステップS144で自エントリのステータスビットSBがSharedの場合とは、既に自エントリには2個のCPU Cが登録されていることを意味する。そのような状態で更にリクエスタCPUをエントリに登録するため、自エントリに登録するCPUの数が3となる。したがって自エントリを、各エントリに登録し得るCPU数の最大値が2のAx−1タイプのフォーマットから、各エントリに登録し得るボード数が3以上のAx−2タイプのフォーマットに変更する。そして、ノードコントローラNCは、すでに自エントリに登録されていた2個のCPUを有するボードBのボードIDとともに、リクエスタCPUを有するボードBのボードIDを登録する。
尚、ステップS147,S148,S149においてメモリMからデータを転送する理由は以下の通りである。すなわち、ステップS147,S148,S149は、自エントリのステータスビットSBがShared(S144 YES)或いはAx−2タイプのフォーマット(S144 NO)である状況に対応する。したがって、データを保持するCPUが2個以上である。このような場合、2個以上のCPUのいずれからデータを転送するかを予め設定する方法を採ることも可能だが、実施例1の場合、そのような設定を行わず、一律、メモリMから転送することにして制御の簡便化を図る。
ステップS149でノードコントローラNCは、自エントリに対応するメモリM上のデータ格納領域からデータを読み出してリクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、リクエスタCPU Cを有するボードBのボードIDを自エントリに登録する(ステップS137)。すなわち、ステップS144で自エントリのステータスビットSBがSharedでない場合(S144のNO)、S138 NO,S141 NOを経ており、自エントリにステータスはInvalidでもExclusiveでもない。したがってこの場合、ステータスビットSBは11であり、自エントリがAx−2タイプであることがわかる。
図8A、8Bは、実施例1の情報処理装置においてCPUからリード要求を受信した場合のノードコントローラNCの動作の流れを示すフローチャートである。図8A、図8Bは、CPU同士がデータを共有して持とうとする場合の動作のその他の例を示す。図8A,8Bの例は、図7A,7Bの例に対する変形例であり、図7A,7Bにおける動作(ステップ)と同様のものには同一の符号を付し、重複する説明を省略する。
自エントリのステータスビットSBがShared、すなわち2個のCPUが自エントリに登録済み(図8B,ステップS144 YES)であって、ブロック内にInvalid以外のステータスビットSBを有する他エントリが8個以上ある(S145 YES)場合、図7Bの例では、Ax−2タイプのフォーマットでボードIDを登録する(ステップS137)。
他方、図8Bの例では、S145でブロック内にInvalid以外のステータスビットSBを有する他エントリが8個以上あると判定された場合、更に、ブロック内にあるInvalid以外のステータスビットSBを有する他エントリが8個以上12個以下であるか否かをS151で判別する。ブロック内に存在するInvalid以外のステータスビットSBを有する他エントリが8個以上12個以下である場合(S151 YES)、ステップS152に進む。他方、ブロック内にあるInvalid以外のステータスビットSBを有する他エントリが13個以上の場合(S151 NO)、ステップS148に進む。
Invalid以外のステータスビットを有する他エントリが8個以上12個以下の場合、ステップS152では、Invalid以外のステータスビットを有する他エントリ全てにつき、或いはInvalid以外のステータスビットを有するエントリの個数が7個以下となるように、エントリの内容を消去(パージ)する。Invalid以外のエントリが7個以下であれば、自エントリを加えてもInvalid以外のエントリが合計で8個以下となり、Bタイプのフォーマットでブロックに登録可能なエントリの最大個数8以内に収まるからである。内容を消去するエントリは、Invalid以外のステータスビットSBを有するエントリから、例えば番号が小さい順に選択する。尚、エントリの番号は、例えば対応するメモリ空間上のメモリ番地の順で付与される。
なお、「8個以上12個以下」という条件は一例である。例えば、フォーマットをBタイプに変換することによって得られるメリットと、エントリをパージすることによって生ずるデメリットとを総合的に勘案し、情報処理装置の性能が最も良くなる数値を選択することができる。実際には、実機で様々なバリエーションについて実験を行い、その結果を測定して決定することができる。
一方、Invalid以外のステータスビットを有するエントリが13個以上の場合、ステップS148では、自エントリに対応するメモリM上のデータ格納領域からデータを読み出してリクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリをAx−2タイプのフォーマットに変更し、リクエスタCPU Cを有するボードのボードIDを自エントリに登録する(ステップS137)。
図9は、図4Aの参考例でCPUからリード要求を受信した場合の動作の流れを示すフローチャートである。図9は、CPU同士がデータを共有せずに(つまりExclusiveで)持とうとする場合の動作を示す。
図9中、ステップS201で、リードの対象データのアドレスを管理するノードコントローラNCがリクエスタCPU Cからリード要求を受信すると、ノードコントローラNCは自己のディレクトリDRを検索する(ステップS202)。検索の結果得た自エントリのステータスビットSBがInvalidを示す場合(ステップS203 YES)、ステップS204に進み、そうでない場合(ステップS203 NO)ステップS206に進む。尚、ステータスビットSBがInvalid(00)ということは、エントリがAx−1タイプであることを意味する。 ステップS204でノードコントローラNCは自エントリに対応するメモリM上のデータ格納領域からデータを読み出して、リクエスタCPUに転送する(ステップS204)。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS205)。
ステップS206では、自エントリのステータスビットSBがExclusiveか否か判定する。Exclusiveの場合(S206 YES)、ステップS207に進み、そうでない場合(S206のNO)、ステップS209に進む。ステータスビットSBがExclusive(10)ということは、エントリがAx−1タイプであることを意味する。
ステップS207でノードコントローラNCは、自エントリに登録されているCPUに対しスヌープを発行し、スヌープを発行したCPUに対しエントリのデータの保持形態をExclusiveからInvalidに変更することを通知し、自己のキャッシュメモリCA内のリード対象データを転送後に消去することを指示する。次にステップS208でノードコントローラNCは、スヌープの宛先のCPUからデータをリクエスタCPUに対し転送する。スヌープの宛先のCPUは、ノードコントローラNCからの指示に応じ、自己のキャッシュメモリCAからリード対象のデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS205でノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。
ステップS209では、自エントリのステータスビットSBがSharedか否かを判定する。ステータスビットSBがShared(01)ということは、エントリがAx−1タイプであることを意味する。Sharedの場合(S209 YES),ステップS210に進み、そうでない場合(S209 NO),ステップS212に進む。
ステップS210でノードコントローラNCは、自エントリに登録されている全CPUに対しスヌープを発行する。すなわち、ノードコントローラNCは、全CPUに対しエントリのデータの保持形態をSharedからInvalidに変更することを通知し、自己のキャッシュメモリCA内のリード対象のデータを消去することを指示する。次にステップS211でノードコントローラNCは、スヌープの宛先のCPUのいずれか(予め設定することが可能)からデータを読み出して、リクエスタCPUに対し転送する。スヌープの宛先となる全CPUは、ノードコントローラからの指示に応じ、自己のキャッシュメモリCAからデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS205でノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。
ステップS212でノードコントローラNCは、自エントリに登録されている全CPUに対しスヌープを発行する。すなわち、ノードコントローラNCは全CPUに対し、エントリのデータの保持形態をSharedからInvalidに変更することを通知し、自己のキャッシュメモリCA内のリード対象データを消去することを指示する。次にステップS213でノードコントローラNCは、スヌープの宛先のCPUのうち、リード対象データを保持するいずれかのCPUから、データをリクエスタCPUに対し転送する。データを転送する対象となるCPUは、予め設定することも可能である。そしてスヌープの宛先の全CPUは、ノードコントローラからの指示に応じ、自己のキャッシュメモリCAからデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS205でノードコントローラNCは、自エントリをAx−1タイプに変更する。そしてステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。
尚、ステップS209で自エントリのステータスビットSBがSharedでない場合(S209のNO)、S203 NO,S206 NOを経ており、InvalidでもExclusiveでもない。したがってこの場合、ステータスビットSBは11であり、自エントリがAx−2タイプである。
図10A,10Bは、実施例1の情報処理装置においてCPUからリード要求を受信した場合の動作の流れを示すフローチャートである。図10A、図10Bは、CPU同士がデータを共有せずに、つまりExclusiveで持とうとする場合の動作を示す。
図10A中、ステップS221で、リードの対象データのアドレスを管理するノードコントローラNCがリクエスタCPU Cからリード要求を受信すると、ノードコントローラNCは自己のディレクトリDRを検索する(ステップS222)。検索の結果得た自エントリが属するブロックのフォーマットがBタイプの場合(ステップS223 B−type)、ステップS224に進み、Aタイプの場合(ステップS223 A−type)、図10BのステップS234に進む。
ステップS224でノードコントローラNCは、Bタイプのフォーマットで自エントリ(emptyでない)がすでにブロック内に存在する場合(ステップS224 YES)、ステップS225に進み、自エントリがブロックに存在しない場合(ステップS224 NO),ステップS228に進む。
ステップS225でノードコントローラNCは、自エントリに登録されている全CPUに対しスヌープを発行し、登録されている全CPUのCPU−IDを自エントリから削除する。次にステップS226でノードコントローラNCは、エントリにCPU−IDが登録されていたCPUのいずれかからデータを受け、受けたデータをリクエスタCPUに転送する。エントリに登録されていた全CPUは、ノードコントローラからのスヌープに応じ、自己のキャッシュメモリが保持するデータを消去する。このとき、リクエスタCPUは自己のキャッシュメモリにデータを保持する。次にノードコントローラNCは、リクエスタCPUのCPU−IDを自エントリに登録し、自エントリのステータスビットSBをExclusiveにする(ステップS227)。
ステップS228でノードコントローラNCは、ブロックに既にエントリが8個登録済みであれば(ステップS228 YES)、ステップS230に進み、そうでなければ(ステップS228 NO),ステップS229に進む。ステップS229でノードコントローラNCは、メモリMからデータをリクエスタCPUに転送する。このとき、リクエスタCPUは自己のキャッシュメモリに転送されたデータを保持する。次にステップS227でノードコントローラNCは、ステータスビットSBをExclusiveとして自エントリを追加し、追加した自エントリにリクエスタCPUのCPU−IDを登録する。
ステップS230でノードコントローラNCは、ブロックのフォーマットをBタイプからAタイプにフォーマット変換する。ここで、まず追加する自エントリにつき、データをメモリMからリクエスタCPUに転送する(ステップS231)。そしてステータスビットSBをExclusiveとして、Ax−1タイプのフォーマットで自エントリをブロックに追加し、自エントリにリクエスタCPUのCPU−IDとボードIDとを登録する(ステップS236)。
他方、ブロックに既に登録済みの8個のエントリのうち、登録されているCPUの個数が2個以内のエントリにつき、Ax−1タイプのフォーマットで夫々のボードIDとCPU−IDとを登録する(ステップS232)。又このとき、Bタイプのフォーマット上でステータスビットSBがemptyであったエントリにつき、ステータスビットSBをInvalidとしてAx−1タイプのフォーマットで登録する。更に、8個に含まれない、当該ブロックに属する他のエントリについても、Ax−1タイプのフォーマットでステータスビットSBをInvalidとして登録する。
他方、既に登録済みの8個のエントリのうち、登録されているCPUの個数が3個以上のエントリにつき、Ax−2タイプのフォーマットで夫々のボードIDを登録する(ステップS233)。
図10BのステップS234でノードコントローラNCは、自エントリのステータスビットSBがInvalidを示す場合(ステップS234 YES)、ステップS235に進み、そうでない場合(ステップS234 NO)ステップS237に進む。ステータスビットSBがInvalid(00)ということは、エントリがAx−1タイプであることを意味する。
ステップS235でノードコントローラNCは自エントリに対応するメモリM上のデータ格納領域から、データをリクエスタCPUに転送する。このときリクエスタCPU Cは、自己のキャッシュメモリCAに転送されたデータを保持する。次にノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する(ステップS236)。
ステップS237では、自エントリのステータスビットSBがExclusiveか否か判定する。Exclusiveの場合(S237 YES)、ステップS238に進み、そうでない場合(S237のNO)、ステップS240に進む。
ステップS238でノードコントローラNCは、自エントリに登録されているCPUに対しスヌープを発行し、スヌープを発行したCPUに対し、エントリのデータの保持形態がExclusiveからInvalidに変化することを通知する。そして、自己のキャッシュメモリCA内のデータを転送後に消去することを指示する。次にステップS239でノードコントローラNCは、スヌープの宛先のCPUからデータをリクエスタCPUに対し転送する。スヌープの宛先のCPUは、ノードコントローラからの指示に応じ、自己のキャッシュメモリCAからデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS236でノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。
ステップS240では、自エントリのステータスビットSBがSharedか否かを判定する。ステータスビットSBがShared(01)ということは、自エントリがAx−1タイプであることを意味する。Sharedの場合(S240 YES),ステップS241に進み、そうでない場合(S240 NO),ステップS243に進む。
ステップS241でノードコントローラNCは、自エントリに登録されている全CPUに対しスヌープを発行する。すなわち、全CPUに対し、エントリのデータの保持形態をSharedからInvalidに変更することを通知し、自己のキャッシュメモリCA内のリード対象データを消去することを指示する。次にステップS242でノードコントローラNCは、スヌープの宛先のCPUのうち、リード対象データを保持するいずれかのCPUから、データをリクエスタCPUに対し転送する。スヌープの宛先の全CPUは、ノードコントローラからの指示に応じ、自己のキャッシュメモリCAからデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS236でノードコントローラNCは、自エントリのステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。
ステップS243でノードコントローラNCは、自エントリに登録されている全CPUに対しスヌープを発行する。すなわち、登録されている全CPUに対し、エントリのデータの保持形態がSharedからInvalidに変化することを通知し、自己のキャッシュメモリCA内のデータを消去することを指示する。次にステップS244でノードコントローラNCは、スヌープの宛先のCPUのうち、リード対象データを保持するCPUのいずれかから、データをリクエスタCPUに対し転送する。スヌープの宛先の全CPUは、上記指示に応じ、自己のキャッシュメモリCAからデータを消去する。又リクエスタCPUは、転送されたデータを自己のキャッシュメモリに保持する。次にステップS236でノードコントローラNCは、自エントリをAx−1タイプに変更する。そしてステータスビットSBをExclusiveとして、リクエスタCPUのCPU−IDおよびリクエスタCPUを有するボードBのボードIDを自エントリに登録する。尚、ステップS240で自エントリのステータスビットSBがSharedでない場合(S240のNO)、S234 NO,S237 NOを経ており、InvalidでもExclusiveでもない。したがってこの場合、ステータスビットSBは11であり、自エントリがAx−2タイプである。
図11Aは、実施例1の情報処理装置において適用可能なディレクトリのフォーマットをAタイプからBタイプに変換する手順の一例について説明する図である。当該手順は、図12とともに後述するフォーマット変換部FCが実行する。
フォーマット変換部FCは、カウンタCNT1,エントリ選択指示回路(1st, 2nd, 3rd, ...., 8th)SLL1,SLL2,SLL3,...,SLL8,およびエントリ選択回路SL1,SL2,SL3,..,SL8を有する。フォーマット変換部FCは更に、ビットマップ変換回路(Bitmap変換回路)BMC1,BMC2,BMC3,...,BMC8、およびエンコーダENC1,ENC2,ENC3,...,ENC8を有する。
カウンタCNT1は、AタイプのフォーマットFTAを有するブロックのエントリ中、Invalid以外のステータスビットSBを有するエントリ数を計数する。そして、Invalid以外のステータスビットSBを有するエントリ数が8を超える場合、当該ブロックのBタイプへのフォーマット変換を許可しない。一方カウンタCNT1は、Invalid以外のステータスビットを有するエントリ数が8個以下であれば、当該ブロックのBタイプへのフォーマット変換を許可する。
カウンタCNT1が当該ブロックのBタイプへのフォーマット変換を許可した場合、エントリ選択指示回路SLL1,SLL2,SLL3,...,SLL8の各々は、以下の動作を行う。すなわち、エントリ選択指示回路SLL1は、当該ブロック内の、Invalid以外のステータスビットSBを有するエントリ中、番号が小さい順に1エントリずつ選択する。エントリ選択指示回路SLL2は、ブロックのInvalid以外のステータスビットSBを有するエントリ中、エントリ選択指示回路SLL1が選択したエントリの次に番号が小さいエントリを選択する。エントリ選択指示回路SLL3は、ブロックのInvalid以外のステータスビットSBを有するエントリ中、エントリ選択指示回路SLL2が選択したエントリの次に番号が小さいエントリを選択する。このようにして、ブロック内のInvalid以外のステータスビットSBを有するエントリが夫々、エントリ選択指示回路SLL1,SLL2,SLL3,...,SLL8によって順次選択される。
エントリ選択回路SL1,SL2,SL3,..,SL8は、エントリ選択指示回路SLL1,SLL2,SLL3,...,SLL8のいずれか、およびBitmap変換回路BMC1・・・BMC8のいずれかに対応している。符号末尾の数字が同じ要素は、互いに対応している。エントリ選択回路SL1,SL2,SL3,..,SL8は、対応するエントリ選択指示回路SLL1、SLL2,SLL3,...,SLL8によって選択されたエントリの登録内容を、対応するビットマップ変換回路BMC1,BMC2,BMC3,...,BMC8に夫々出力する。ビットマップ変換回路BMC1,BMC2,BMC3,...,BMC8は、対応するエントリ選択回路から出力されたエントリの登録内容に基づき、Bタイプのフォーマットによるエントリに登録する、ボードBごとのCPU−ビットマップに変換する。
エンコーダENC1,ENC2,ENC3,...,ENC8には、対応するエントリ選択指示回路SLL1、SLL2,SLL3,...,SLL4から、Aタイプのフォーマットのうちいずれのエントリを選択したかを示す情報が夫々入力する。エンコーダENC1,ENC2,ENC3,...,ENC8の各々は、入力した情報をエンコードし、Bタイプのフォーマットのエントリに登録するアドレスビットABを得る。
図11A中、AタイプのフォーマットFTAの各エントリが有する情報は、図4Bに示されるステータスビットSBと、ノードID NID1,NID2或いはボートビットマップBBMとを含む。図11A中、AタイプのフォーマットFTAにおける"V"はステータスビットSBを示し、"Data"はノードID NID1及びNID2或いはボードビットマップBBMを示す。
又、図11A中、BタイプのフォーマットFTBが有する情報は、図5に示されるステータスビットSBと、アドレスビットABと、CPU−ビットマップBIDn−1、...,BID1,BID0とを含む。図11A中、BタイプのフォーマットFTBにおける"V"はステータスビットSBを示し、"Index"はアドレスビットABを示し、"Bitmap"はCPU−ビットマップを示す。尚、アドレスビットAB(Index)は、アドレスビットAB(Index)が属するフォーマットFTBにおけるエントリが、Aタイプのフォーマットのブロックにおけるどのエントリに対応するかを示す情報(アドレス、インデックス等)である。
図11Bは、実施例1の情報処理装置において適用可能なディレクトリのフォーマットをBタイプからAタイプに変換する手順の一例について説明する図である。当該手順も、図11Aとともに上述した手順とともに、図12とともに後述するフォーマット変換部FCが実行する。
フォーマット変換部FCは、図11Aとともに説明した構成に加え、アンド回路AND1,デコーダDC1,書き込みデータ生成回路WDG1を有する。
カウンタCNT2は、各ブロックにつき、BタイプのフォーマットFTBで登録されている、empty以外のステータスビットSBを有するエントリの個数を計数する。アンド回路AND1は、BタイプのフォーマットFTBを有するブロックが以下の条件を満たす場合に、当該ブロックをAタイプのフォーマットFTAにフォーマット変換することを許可する。すなわち、ブロックにつき、エントリを新たに追加登録する要求ERR1がなされ、且つ、カウンタCNT2が計数した登録済みのエントリの個数が8個である場合である。尚、エントリを新たに追加登録する要求ERR1は、例えば図7A中、ステップS124の判断結果がNOとなる場合のように、リード要求を受信した際に自エントリが登録されていない場合に生ずる。
アンド回路AND1によって当該ブロックをAタイプに変換することを許可された場合、デコーダDC1は、BタイプのフォーマットFTBを有するブロックのアドレスビットABをデコードする。アドレスビットABは、図11Bでは、Indexとして示される。このようにして、BタイプのフォーマットFTBの各エントリが、AタイプのフォーマットFTAのいずれのエントリに対応するかを判断する。
書き込みデータ生成回路WDG1は、BタイプのフォーマットFTBでブロックに登録済みの各エントリのCPU−ビットマップの内容に基づき、AタイプのフォーマットFTAの対応するエントリのフォーマットを決定する。すなわち元のエントリのフォーマットをAx−1タイプのフォーマットとするかAx−2タイプのフォーマットとするかを決定する。より具体的には、データを保持するCPUのエントリでの登録個数が2以下の場合にはAx−1タイプのフォーマットを選択し、データを保持するCPUが3個以上登録されている場合にはAx−2タイプのフォーマットを選択する。
更に書き込みデータ生成回路WDG1は、Ax−1タイプのフォーマットの場合にはエントリにデータを保持するCPUのCPU−IDと当該CPUを有するボードBのボードIDとを示す情報を登録する。他方、Ax−2タイプのフォーマットの場合には、データを保持する各CPUを有する夫々のボードBのボードIDを示す情報をエントリに登録する。ここで登録するAタイプのフォーマットFTA上のエントリは、デコーダDC1によって判断される。
図12は、実施例1の情報処理装置において適用可能なノードコントローラNCの機能ブロック図である。ノードコントローラNCは、ノードコントローラNCが属するボードBに含まれる夫々のCPU Cと接続されるルータRT1,および他のボードのノードコントローラNCと接続されるルータRT2を有する。ノードコントローラNCは更に、図11A,11Bとともに上述した構成を有するフォーマット変換部FCと、ディレクト検索機能部DSとを有する。
ルータRT1は、ノードコントローラNCが属するボードBに含まれるCPU Cとの間で、命令やデータのやり取りを行う。ルータRT2は、他のボードのノードコントローラNCとの間で、命令やデータのやり取りを行う。ディレクトリ検索機能部DSは、ルータRT1を介してノードコントローラNCが属するボードB内のCPU Cから転送されたリード要求に応じ、リードの対象のデータを保持するCPU Cにつき、ディレクトリDRを検索する。ディレクトリDRは図4Bおよび図5等とともに上述した構成を有する。
このような構成を有するノードコントローラNCの動作例について以下に説明する。例えばルータRT1は、ノードコントローラNCを有するボードBに含まれるリクエスタCPU Cからリード要求を受信し、リードの対象のデータを自己が管理する場合には、ディレクトリ検索機能部DSを使用してディレクトリDRを検索する。このようにして、ノードコントローラはデータを保持するCPU Cを認識する。データを保持するCPU Cが、自身の属するボードB内のCPU Cである場合、ルータRT1はデータを保持するCPU Cにリード要求を転送する。リード要求を受信したCPU Cは、リードの対象のデータを自己のキャッシュメモリCAから読み出しリクエスタCPU Cに転送する。
他方、データを保持するCPU Cが他のボードBに属する場合、ルータRT1は、ルータRT2,および他のボードBのルータRT2,RT1を介し、データを保持するCPUにリード要求を転送する。リード要求を受信した他のボードBのCPU Cは、リード要求の対象のデータを自己のキャッシュメモリCAから読み出し、読み出したデータを、他のボードBのルータRT1,RT2、およびリクエスタCPU Cが属するボードBのルータRT2,RT1を介し、リクエスタCPU Cに転送する。