(57)【要約】【課題】主記憶共有マルチプロセッサにおいて、キャッシュ一貫性を保持するためのトランザクションを削減する。【解決手段】主記憶の各ページに対応して、当該ページが各ノードグループのキャッシュに登録されていないかどうか（登録されていない場合を０）をビット列で保持するディレクトリ３４０を設ける。プロセッサ１０は、指定ページに対応するディレクトリエントリを０クリアする命令を持つ。また縮約装置３３０は、結合網１００を流れるキャッシュ一貫性保持のためのトランザクションを観測し、ディレクトリ中で０に設定できるビットを検出する。【選択図】        図１
2005250830.tif 000002
【特許請求の範囲】
【請求項１】
第１のサイズのブロックをひとつまたは複数保持するキャッシュを有するプロセッサにおいて、
前記第１のサイズの２以上の自然数倍である第２のサイズのブロックを指定し、指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、前記キャッシュへの登録を抹消する操作が可能なことを特徴とするプロセッサ。
【請求項２】
第１のサイズのブロックをひとつまたは複数保持するキャッシュを有するプロセッサにおいて、
前記第１のサイズの２以上の自然数倍である第２のサイズのブロックを指定し、指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、前記キャッシュへの登録を抹消する操作が、ひとつの命令によって開始されることを特徴とするプロセッサ。
【請求項３】
指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、前記キャッシュへの登録を抹消する前記操作が、前記キャッシュに登録されていた前記第１のサイズのブロックのうち、ひとつまたは複数をプロセッサ外部に出力することを特徴とする請求項１または請求項２記載のプロセッサ。
【請求項４】
指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、前記キャッシュへの登録を抹消する前記操作が、他のプロセッサに対して、前記指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、キャッシュへの登録を抹消する操作を要求することを特徴とする請求項１ないし請求項３記載のいずれかのプロセッサ。
【請求項５】
複数の請求項４記載のプロセッサと主記憶とを有し、
前記複数のプロセッサが前記主記憶を共有することを特徴とする主記憶共有マルチプロセッサ。
【請求項６】
前記主記憶の前記第２のサイズの各ブロック対応にエントリを有するディレクトリを有し、
前記複数のプロセッサを、それぞれ０個以上のプロセッサを含む複数のプロセッサグループに分け、
前記ディレクトリの各エントリは、前記プロセッサグループのそれぞれに対応するビット列を含み、
前記ビット列は、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないかどうかを示し、
指定した前記第２のサイズのブロックに属するすべての前記第１のサイズのブロックについて、前記キャッシュへの登録を抹消する前記操作をおこなう際に、
前記指定した前記第２のサイズのブロックに対応する前記ディレクトリのエントリの前記ビット列を、いずれのプロセッサの有するキャッシュにも前記指定した第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないことを示すよう書き換えることを特徴とする請求項５記載の主記憶共有マルチプロセッサ。
【請求項７】
第１のサイズのブロックをひとつまたは複数保持するキャッシュを有する複数のプロセッサと、主記憶と、
前記主記憶の、前記第１のサイズの２以上の自然数倍である第２のサイズの各ブロック対応にエントリを有するディレクトリとを有し、
前記複数のプロセッサを、それぞれ０個以上のプロセッサを含む複数のプロセッサグループに分け、
前記ディレクトリの各エントリは、前記プロセッサグループのそれぞれに対応するビット列を含み、
前記ビット列は、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないかどうかを示し、
前記ディレクトリの、指定した前記第２のサイズのブロックに対応するエントリの前記ビット列を、いずれのプロセッサグループの有するキャッシュにも、前記指定した前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないことを示すよう書き換える操作が、ひとつの命令によって開始されることを特徴とする主記憶共有マルチプロセッサ。
【請求項８】
第１のサイズのブロックをひとつまたは複数保持するキャッシュを有する複数のプロセッサと、主記憶と、
前記主記憶の、前記第１のサイズの２以上の自然数倍である第２のサイズの各ブロック対応にエントリを有するディレクトリと、
ディレクトリエントリ縮約装置とを有し、
前記複数のプロセッサを、それぞれ０個以上のプロセッサを含む複数のプロセッサグループに分け、
前記ディレクトリの各エントリは、前記プロセッサグループのそれぞれに対応するビット列を含み、
前記ビット列は、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないかどうかを示し、
前記ディレクトリエントリ縮約装置は、
前記プロセッサグループのひとつが、前記第２のサイズのあるブロックに属するすべての前記第１のサイズのブロックに対して、自プロセッサグループのキャッシュにのみ登録されており他プロセッサグループのキャッシュには登録されていないことを保証する操作をおこない、かつ、他プロセッサグループが前記第２のサイズの前記ブロックに属する前記第１のサイズのブロックをキャッシュに登録するための操作をおこなっていないことを検出し、
前記第２のサイズの前記ブロックに対応した前記ディレクトリのエントリにおける前記ビット列において、
自ノードグループに対応するビットのみを、対応する前記プロセッサグループに属する少なくともひとつのプロセッサの有するキャッシュに、前記第２のサイズのブロックに属する前記第１のサイズのブロックが少なくともひとつ登録されていることを示すように設定し、
その他のビットは、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないことを示すように設定することを特徴とする主記憶共有マルチプロセッサ。
【請求項９】
前記ディレクトリエントリ縮約装置はカウンタを有し、
前記カウンタは、前記プロセッサグループのひとつが、前記第２のサイズのあるブロックに属する、最もアドレスの小さい前記第１のサイズのブロックか、最もアドレスの大きい前記第１のサイズのブロックに対して、自プロセッサグループのキャッシュにのみ登録されており他のプロセッサグループのキャッシュには登録されていないことを保証する操作がおこなわれた際に初期値が設定され、
前記プロセッサグループのひとつが、前記第２のサイズのあるブロックに属するすべての前記第１のサイズのブロックに対して、自プロセッサグループのキャッシュにのみ登録されており他のプロセッサグループのキャッシュには登録されていないことを保証する操作をおこない、かつ、他プロセッサグループが前記第２のサイズの前記ブロックに属する前記第１のサイズのブロックをキャッシュするための操作をおこなっていないことを、
前記カウンタを用いた計数によりおこなうことを特徴とする主記憶共有マルチプロセッサ。
【請求項１０】
前記プロセッサが、すべて請求項４記載のプロセッサであることを特徴とする、
請求項８または請求項９記載の主記憶共有マルチプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、主記憶共有マルチプロセッサに係り、特に、主記憶共有型の高速な並列計算機システムを構築するに用いて好適な主記憶共有マルチプロセッサに関する。
【背景技術】
【０００２】
近年パーソナルコンピュータ（ＰＣ）、ワークステーション（ＷＳ）の上位機種、およびサーバ機などでは、主記憶共有型のマルチプロセッサ（ＳＭＰ、Symmetric MultiProcessor）構成が広まっており、性能を向上させるために、２０〜３０台以上の多数台のプロセッサの間で主記憶を共有することが重要な課題になってきている。主記憶共有型のマルチプロセッサの構成方法として広く使われている方式として共有バスがあるが、バスではバスのスループットがネックになるため、接続可能なプロセッサの数は高々８台程度である。従って、多数台のプロセッサを接続する方式としては適さない。
【０００３】
現在おこなわれている多数台のプロセッサを接続する主記憶共有マルチプロセッサの構成方法には、大きくふたつの方式がある。そのひとつに、クロスバスイッチによる構成があり、そのような構成は、例えば、非特許文献１に開示されている。この方式では、プロセッサと主記憶を持つ各ボードを、高速なクロスバスイッチで接続し、プロセッサ間のキャッシュ一貫性を保持する。この方式では、キャッシュ一貫性の保持が高速にできるという利点がある。しかし、キャッシュの一貫性を保持するためのトランザクションが全プロセッサにブロードキャストされるため、クロスバスイッチにかかるトラフィックが非常に高く、性能的に隘路になるとともに、高速なスイッチが必要になるためコスト高を招くという欠点がある。さらに、キャッシュ一貫性保持のためのトランザクションをブロードキャストしなければならないため、台数が非常に多いシステムを実現することは困難であり、数十台程度が限度である。
【０００４】
これに対して、ディレクトリ方式によるマルチプロセッサの構成があり、たとえば非特許文献２に開示されている。この方式では、主記憶のキャッシュブロックごとに、そのキャッシュブロックがどのプロセッサにキャッシュされているかを示すビットマップであるディレクトリを設けることにより、必要なプロセッサにのみキャッシュ一貫性を保持するためのトランザクションを送る。これにより、スイッチにかかるトラフィックを大幅に削減することができ、スイッチのハードウェアコストを削減することができる。しかし、ディレクトリ方式では、ディレクトリを置くための記憶領域が大きくなると言う欠点を持つ。例えば、１６プロセッサ、４ＧＢ主記憶、１２８Ｂ／ラインのシステムのディレクトリとしては、４ＧＢ÷１２８Ｂ×１６ｂｉｔ＝６４ＭＢもの記憶領域が必要になる。
【０００５】
ディレクトリのサイズが大きいという問題に対し、ディレクトリのサイズを削減する方法として、特許文献１、特許文献２、および、特許文献３に開示されているような、主記憶のキャッシュブロックより大きい単位ごとに、どのプロセッサにキャッシュされているかを示すディレクトリを設ける技術が知られている。
【０００６】
【特許文献１】特開平０９−３１１８２０号公報
【０００７】
【特許文献２】特開平０８−２６３３７４号公報
【特許文献３】特開平０７−２００４０３号公報
【非特許文献１】「進化したシステム・アーキテクチャ」（ＳｕｎＷｏｒｌｄ誌１９９６年１月号、第２９頁から第３２頁）
【非特許文献２】“The Stanford FLASH Multiprocessor”（第２１回ＩＳＣＡ  Ｐｒｏｃｅｅｄｉｎｇｓ）
【非特許文献３】Don Anderson, Tom Shanley著, “PENTUIM PROCESSOR SYSTEM ARCHITECTURE Second Edition” (MINDSHARE INC., 1995年）, 第６１頁から第９１頁
【発明の開示】
【発明が解決しようとする課題】
【０００８】
従来技術で述べた、主記憶のキャッシュブロックより大きい単位ごとに、どのプロセッサにキャッシュされているかを示すディレクトリを設ける技術には、以下のような問題がある。例えば、キャッシュブロックのサイズが１２８Ｂ（バイト）とし、ディレクトリのエントリを４ＫＢ（キロバイト）のページごとに設ける場合を考える。この時、あるプロセッサが、あるページのうちのただひとつのキャッシュブロックしかキャッシュに登録していなくても、そのページに含まれる他のキャッシュブロックに対するキャッシュ一貫性保持のためのトランザクションが、そのプロセッサに向けて送られることになる。また、キャッシュに登録していたあるキャッシュブロックのキャッシュ登録を解除しても、その１キャッシュブロックのキャッシュ登録解除から、そのページに含まれるすべてのキャッシュブロックがキャッシュに登録されていないことを検出することは困難である。その結果、いったんキャッシュに登録されたページは、それ以降ずっと、そのページに対するキャッシュ一貫性保持のためのトランザクションを送られることになり、性能低下を引き起こす。
【０００９】
本発明の目的は、主記憶のキャッシュブロックより大きいページごとにディレクトリを設けた際に、いったんキャッシュに登録されたページが、それ以降ずっと、そのページに対するキャッシュ一貫性保持のためのトランザクションを送られる続けることを解決することにある。
【課題を解決するための手段】
【００１０】
上記問題を解決するため、本発明による主記憶マルチプロセッサは、第１のサイズのブロックをひとつまたは複数保持するキャッシュを有する複数のプロセッサと、主記憶と、前記主記憶の、前記第１のサイズの２以上の自然数倍である第２のサイズの各ブロック対応にエントリを有するディレクトリを有し、前記複数のプロセッサを、それぞれ０個以上のプロセッサを含む複数のプロセッサグループに分け、前記ディレクトリの各エントリは、前記プロセッサグループのそれぞれに対応するビット列を含み、前記ビット列は、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないかどうかを示し、前記ディレクトリの、指定した前記第２のサイズのブロックに対応するエントリの前記ビット列を、いずれのプロセッサグループの有するキャッシュにも、前記指定した前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないことを示すよう書き換える操作が、ひとつの命令によって開始されるようにしている。
【００１１】
さらに、前記プロセッサグループのひとつが、前記第２のサイズのあるブロックに属するすべての前記第１のサイズのブロックに対して、自プロセッサグループのキャッシュにのみ登録されており他プロセッサグループのキャッシュには登録されていないことを保証する操作をおこない、かつ、他プロセッサグループが前記第２のサイズの前記ブロックに属する前記第１のサイズのブロックをキャッシュに登録するための操作をおこなっていないことを検出し、前記第２のサイズの前記ブロックに対応した前記ディレクトリのエントリにおける前記ビット列において、自ノードグループに対応するビットのみを、対応する前記プロセッサグループに属する少なくともひとつのプロセッサの有するキャッシュに、前記第２のサイズのブロックに属する前記第１のサイズのブロックが少なくともひとつ登録されていることを示すように設定し、その他のビットは、対応する前記プロセッサグループに属するいずれのプロセッサの有するキャッシュにも、前記第２のサイズのブロックに属する前記第１のサイズのブロックが登録されていないことを示すように設定する、ディレクトリエントリ縮約装置を設けている。
【発明の効果】
【００１２】
本発明により、主記憶のキャッシュブロックより大きいページごとにディレクトリを設けた場合であっても、いったんキャッシュに登録されたページを、自主的な命令発行やディレクトリ縮約装置による自動検出により、ディレクトリエントリの登録から解除することが可能となる。これにより、そのページに対してキャッシュ一貫性保持のためのトランザクションが送られる続けることを解決することができる。
【発明を実施するための最良の形態】
【００１３】
以下、図面を用いて本発明を実施するための最良の形態を説明する。
（１）装置の概要
図１は、本発明の一実施例による主記憶共有マルチプロセッサ９９９（以下、システム９９９）の構成を示すブロック図である。本システムは８ノードのシステムであり、ノード１ないし８、主記憶２００、ディレクトリユニット３００が、結合網１００により相互に接続される。ノード１ないしノード８はそれぞれ線１１、２１、３１、４１、５１、６１、７１、８１を介して、主記憶２００は線２０１を介して、ディレクトリユニット３００は線４００、４０１を介して結合網１００に接続される。本実施例の結合網１００はクロスバネットワークであるが、それ以外の結合方式でもよい。結合網１００については公知の技術であるので、詳細な説明はおこなわない。
【００１４】
ノード１ないし８は同じ構造を有し、各ノードがプロセッサ１０を有する。本実施例では各ノードがプロセッサを１個だけ有するが、各ノードが複数のプロセッサを有してもよく、また、各ノードの有するプロセッサの数が異なってもよい。システム９９９では、すべてのプロセッサが主記憶２００にアクセスすることができる、いわゆる共有メモリ型の並列計算機である。
【００１５】
プロセッサ１０は、キャッシュ１２、ＰＦ（Ｐａｇｅ  Ｆｌｕｓｈ）機構１３、および、ＰＰ（Ｐａｇｅ  Ｐｕｒｇｅ）機構１４を有する。キャッシュ１２は１２８Ｂ（バイト）のキャッシュブロック単位に管理され、キャッシュコヒーレンシ制御を、Ｍｏｄｉｆｉｅｄ（Ｍ）、Ｅｘｃｌｕｓｉｖｅ（Ｅ）、Ｓｈａｒｅｄ（Ｓ）、Ｉｎｖａｌｉｄ（Ｉ）の４状態で管理するＭＥＳＩプロトコルによって実現する。ＭＥＳＩプロトコルによるキャッシュコヒーレンシ制御は、例えば非特許文献３に詳しい。
【００１６】
ディレクトリユニット３００は、受信フィルタ３１０、ＣＣＣ（Ｃａｃｈｅ  Ｃｏｈｅｒｅｎｃｙ  Ｃｏｎｔｒｏｌ）装置３２０、縮約装置３３０、ディレクトリ３４０、ｂｕｓｙ記憶領域３５０、および、ｒｅｑ記憶領域３６０を有する。
【００１７】
ＣＣＣ装置３２０は、ノードグループ表３７０、ｖａｌｉｄ記憶領域３８０、および、ｄａｔａ記憶領域３９０を有する。線４００を介して結合網１００と受信フィルタ３１０が、線４０１を介して受信フィルタ３１０、ＣＣＣ装置３２０と結合網１００が、線４０２を介して受信フィルタ３１０とＣＣＣ装置３２０が、線４０３を介して受信フィルタ３１０とｂｕｓｙ記憶領域３５０が、線４０４を介してＣＣＣ装置３２０とｂｕｓｙ記憶領域３５０が、線４０５を介してＣＣＣ装置３２０とディレクトリ３４０が、線４０６を介してＣＣＣ装置３２０とｒｅｑ記憶領域３６０が、線４０７を介してＣＣＣ装置３２０と縮約装置３３０が、線４０８を介して縮約装置３３０とディレクトリ３４０が、線４０９を介してｒｅｑ記憶領域３６０と縮約装置３３０が、それぞれ接続されている。
【００１８】
縮約装置３３０は、ｄｉｒｅｃｔｉｏｎ記憶領域３３１、ｐａｇｅ記憶領域３３２、ｎｏｄｅ−ｇｒｏｕｐ記憶領域３３３、および、カウンタ３３４を有する。
【００１９】
システム９９９では、ひとつまたは複数のノードをひとつのノードグループとする。ノード１ないし８は、それぞれひとつのノードグループに属する。システム９９９は最大４個のノードグループＡ、Ｂ、Ｃ、Ｄを扱うことができ、ノード１および２がノードグループＡを、ノード３ないし５がノードグループＢを、ノード６および７がノードグループＣを、ノード８がノードグループＤを、それぞれ形成する。ノードグループは、後述するディレクトリ３４０の各エントリにおいて１ビットの情報として扱われ、ディレクトリユニット３００があるノードグループに対してキャッシュコヒーレンシ制御のためのコマンドを送信する際には、そのノードグループに属するすべてのノードに対して送信する。ノードとノードグループの対応関係は、ノードグループ表３７０に設定する。ノードグループ表３７０は、システム起動時に設定する。図２は、ノードグループ表３７０の構成を示している。ノードグループ３７０は、ノードグループを表す次元とノードを表す次元とからなる二次元の表であり、あるノードがあるノードグループに属する場合にその交点を１とし、そうでない部分はすべて０とした表である。例えば、ノード１はノードグループＡに属するため、ノード１とノードグループＡの交点は１であり、ノード１とノードグループＢの交点、ノード１とノードグループＣの交点、および、ノード１とノードグループＤの交点は０である。
【００２０】
次に、図３を用いてディレクトリ３４０について説明する。ディレクトリ３４０は、ページと呼ぶ４ＫＢ（キロバイト）サイズの主記憶ブロックのそれぞれについて、当該ページ中の少なくともひとつのキャッシュブロックが、どのノードグループのキャッシュに存在している可能性があるかという情報を保持するテーブルである。ディレクトリを４ＫＢのページ単位で管理するため、１２８Ｂのキャッシュブロック単位で管理する場合と比べて、必要な容量を１２８Ｂ÷４ＫＢ＝1／３２に抑えることができる。各ディレクトリエントリは４ビットからなり、左のビットから順に、ノードグループＡ、ノードグループＢ、ノードグループＣ、ノードグループＤに対応する。ディレクトリエントリのあるビットが１である場合には、当該ページに属する少なくともひとつのキャッシュブロックが、そのビットに対応したノードグループに属するノードのいずれかにキャッシュされている可能性があることを示し、ディレクトリエントリのあるビットが０である場合には、当該ページに属するキャッシュブロックが、そのビットに対応したノードグループに属するノードにまったくキャッシュされていないことを示している。ディレクトリ３４０のすべてのビットは、システム起動時に値０に設定される。
（２）結合網を流れるコマンド
図４ないし図６を用いて、結合網を流れるコマンドを説明する。結合網を流れるコマンドは２２種類ある。すなわち、Ｆコマンド２０００、ＣＦコマンド２０１０、ＦＣコマンド２０２０、ＦＩコマンド２０３０、ＣＦＩコマンド２０４０、ＦＩＣコマンド２０５０、Ｉコマンド２０６０、ＣＩコマンド２０７０、ＩＣコマンド２０８０、ＷＢコマンド２０９０、ＰＦコマンド２１００、ＣＰＦコマンド２１１０、ＰＦＣコマンド２１２０、ＰＰコマンド２１３０、ＣＰＰコマンド２１４０、ＰＰＣコマンド２１５０、ＡＣＫコマンド２１６０、ＮＡＣＫコマンド２１７０、Ｄコマンド２１８０、ＮＤコマンド２１９０、Ｍコマンド２２００、ＭＤコマンド２２１０の２２種類である。
【００２１】
コマンド種別２００１、２０１１、２０２１、２０３１、２０４１、２０５１、２０６１、２０７１、２０８１、２０９１、２１０１、２１１１、２１２１、２１３１、２１４１、２１５１、２１６１、２１７１、２１８１、２１９１、２２０１、２２１１のサイズは、それぞれ４Ｂである。
【００２２】
ノード番号２００２、２０３２、２０６２、２１０２、２１３２のサイズは、それぞれ４Ｂである。
【００２３】
アドレス２００３、２０１２、２０３３、２０４２、２０６３、２０７２、２０９２、２１０３、２１１２、２１３３、２１４２、２２０２のサイズは、それぞれ８Ｂである。
【００２４】
データ２０２２、２０５２、２０９３、２１８２、２２１２のサイズは、それぞれキャッシュブロックサイズの１２８Ｂである。
【００２５】
それぞれの機能・動作については後述する。
（３）動作の詳細
（３−１）システム起動時の動作
図７のフローチャートを用いて、システム起動時の動作を説明する。
【００２６】
まずステップ１７００で、ノードグループ表３７０を、ノードグループの設定に従って設定する。続くステップ１７０１で、ディレクトリ３４０の全ビットを値０に設定する。続くステップ１７０２で、ｂｕｓｙ記憶領域に値０を設定する。続くステップ１７０３で、ｄｉｒｅｃｔｉｏｎ記憶領域に値０を設定する。続くステップ１７０４でシステム９９９中の全キャッシュを無効化し、システム９９９の起動が完了する。
（３−２）受信フィルタの動作              
ディレクトリユニット３００が、結合網１００で送られたコマンドを線４００経由で受信した場合の受信フィルタ３１０の動作の流れを、図８のフローチャートを用いて説明する。
【００２７】
まずステップ１０００で、受信フィルタ３１０は、線４００を経由して送られてきたコマンドを受信する。続くステップ１００１で、受信コマンドのコマンド種別を調べる。受信コマンドがＦ、ＦＩ、Ｉ、ＰＦ、ＰＰの場合は、ステップ１００２に移行する。一方、受信コマンドがＦ、ＦＩ、Ｉ、ＰＦ、ＰＰ以外の場合は、ステップ１００５に移行する。
【００２８】
ステップ１００２でｂｕｓｙ記憶領域３５０を線４０３経由で読み出し、続くステップ１００３で、読み出したｂｕｓｙ記憶領域３５０の値が１であるかどうかを判定する。もしｂｕｓｙ記憶領域３５０の値が１であればステップ１００６に移行し、コマンド中のノード番号フィールドに示されるコマンド送信ノードに対して、ＮＡＣＫコマンド２１７０を送信した後、ステップ１０００に戻る。また、もしｂｕｓｙ記憶領域３５０の値が１でなければステップ１００４に移行し、線４０３経由でｂｕｓｙ記憶領域を１に設定し、コマンド中のノード番号フィールドに示されるコマンド送信ノードに対して、ＡＣＫコマンド２１６０を送信した後、ステップ１００５に移行する。
【００２９】
ステップ１００５では受信コマンドをＣＣＣ装置３２０に転送し、ステップ１０００に戻る。
（３−３）プロセッサがＦコマンドを発行した場合の動作
プロセッサ１０が実行したデータ読み出し命令がキャッシュミスを起こした場合、当該キャッシュブロックのデータをキャッシュ１２に転送し、状態Ｓとして登録する必要がある。そこでプロセッサ１０は、Ｆコマンド２０００のノード番号２００２に自身の属するノード番号を、アドレス２００３に当該キャッシュブロックのアドレスを設定して、結合網１００経由で、ディレクトリユニット３００に送信する。その後プロセッサ１０はディレクトリユニット３００から送られるＡＣＫコマンド２１６０またはＮＡＣＫコマンド２１７０を待ち、ＮＡＣＫコマンド２１７０を受信した場合には、ＮＡＣＫコマンド２１７０を受信するのではなくＡＣＫコマンド２１６０を受信するようになるまでＦコマンド２０００を再送する。ＡＣＫコマンド２１６０を受信したプロセッサ１０は、ＦＣコマンド２０２０を受信するまで、後続命令の実行を停止する。
【００３０】
Ｆコマンド２０００を受信したディレクトリユニットでは、受信フィルタ３１０が図８のフローチャートに従って動作し（前述のため省略）、ステップ２００５で、受信したＦコマンド２０００をＣＣＣ装置３２０に転送する。
【００３１】
続くＣＣＣ装置３２０の動作を、図９および図１０のフローチャートを用いて説明する。
【００３２】
まずステップ１１００で、受信フィルタ３１０から転送されたＦコマンド２０００を受信する。続くステップ１１０１で、受信したＦコマンド２０００を、線４０６経由でｒｅｑ記憶領域３６０に記録する。続くステップ１１０２で、ｒｅｑ記憶領域３６０に記録したＦコマンド２０００のアドレス２００３（ｒｅｑアドレス）に対応するディレクトリエントリを読み出す。続くステップ１１０３で、読み出したディレクトリエントリをもとに、ノード集合に変換する。ノード集合とは、ディレクトリエントリで値１が設定されているビット群に対応したノードグループ群に属するノードの集合であり、ノードグループ表３７０を参照して求めることができる。例えばディレクトリエントリが値１０１０である場合には、ディレクトリエントリの左から１番目の値１のビットに対応するノードグループ１に属するのはノード１とノード２であり、ディレクトリエントリの左から３番目の値１のビットに対応するノードグループ３に属するのはノード６とノード７であることが、いずれもノードグループ表３７０から求まり、ノード集合は｛ノード１、ノード２、ノード６、ノード７｝である。続くステップ１１０６で、ノード集合から、ｒｅｑ記憶領域３６０に記録したＦコマンド２０００のノード番号２００２（ｒｅｑノード）を除去する。続くステップ１１０６でｒｅｑ記憶領域３６０に記録したＦコマンド２０００のコマンド種別２００１を判定することにより、ステップ１２００に移行する。
【００３３】
ステップ１２００では、ｖａｌｉｄ記憶領域３８０に値０を設定する。続くステップ１２０１で、ノード集合に要素があるかどうかを判定し、ノード集合に要素があればステップ１２０２に、ノード集合に要素がなければステップ１２０７に移行する。
【００３４】
ステップ１２０２では、ノード集合から１ノードを選択した上、選択したノードをノード集合から除去する。続くステップ１２０３で、アドレス２０１２にｒｅｑアドレスを設定した上、ＣＦコマンド２０１０を選択したノードに宛てて送信する。
【００３５】
ここでＣＦコマンド２０１０を受信したノードは、アドレス２０１２が自身のキャッシュに登録されているかどうかをチェックする。もしアドレス２０１２が自身のキャッシュでＭ状態であればＳ状態に遷移させた上、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０１２が自身のキャッシュでＥ状態であればＳ状態に遷移させた上、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０１２が自身のキャッシュでＳ状態であれば、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０１２が自身のキャッシュでＩ状態であるかキャッシュに登録されていなければ、ＮＤコマンド２１９０をディレクトリユニット３００に送信する。ディレクトリユニット３００に送信されたＤコマンド２１８０またはＮＤコマンド２１９０は、受信フィルタ３１０を経由してＣＣＣ装置３２０に転送される。受信フィルタ３１０の動作は前述したため、省略する。
【００３６】
ここでＣＣＣ装置３２０の動作に戻り、ＣＣＣ装置３２０はステップ１２０４で、Ｄコマンド２１８０またはＮＤコマンド２１９０を受信する。続くステップ１２０５で受信したコマンドの種別を判定する。もしＤコマンド２１８０であれば、ステップ１２０６に移行し、ｖａｌｉｄ記憶領域３８０に１を設定、ｄａｔａ記憶領域３９０にＤコマンド２１８０のデータ２１８２を登録した上、ステップ１２０１に戻る。また、もしＮＤコマンド２１９０であれば、ステップ１２０１に戻る。
【００３７】
ステップ１２０７では、ｖａｌｉｄ記憶領域３８０が１かどうかを判定する。もしｖａｌｉｄ記憶領域３８０が１であればステップ１２１４に移行し、もし１でなければステップ１２０８に移行する。
【００３８】
ステップ１２０８では、ｒｅｑアドレスを主記憶から読み出す。具体的には、ｒｅｑアドレスをアドレス２２０２に設定した上、Ｍコマンド２２００を主記憶２００に送信する。Ｍコマンド２２００を受信した主記憶２００は、アドレス２２０２に対応した１２８Ｂデータをデータ２２１２に登録した上、ＭＤコマンド２２１０をディレクトリユニット３００に送信する。ディレクトリユニット３００に送信されたＭＤコマンド２２１０は、受信フィルタ３１０を経由してＣＣＣ装置３２０に転送される。受信フィルタ３１０の動作は前述したため、省略する。
【００３９】
続くステップ１２０９で、ＭＤコマンド２２１０のデータ２２１２をｄａｔａ記憶領域３９０に登録する。続くステップ１２１０で縮約装置３３０に対して「非占有」を通知し、ステップ１２１１に移行する。
【００４０】
ステップ１２１４では、縮約装置３３０に対して「占有」を通知し、ステップ１２１１に移行する。
【００４１】
ステップ１２１１では、ｒｅｑノードの属するノードグループを、ノードグループ表３７０を参照して求める。続くステップ１２１２では、ｒｅｑアドレスに対応するディレクトリエントリのうち、ステップ１２１１で求めたノードグループに対応するビットを１に設定する。続くステップ１２１３では、データ２０２２にｄａｔａ記憶領域３９０に登録されているデータを設定した上、ｒｅｑノードに対してＦＣコマンド２０２０を送信し、ステップ１１０７に移行する。
【００４２】
ステップ１１０７では、ｂｕｓｙ記憶領域３５０に値０を設定し、ステップ１１００のコマンド待機状態となる。
（３−４）プロセッサがＦＩコマンドを発行した場合の動作
プロセッサ１０が実行したデータ書き込み命令がキャッシュミスを起こした場合、当該キャッシュブロックをキャッシュ１２に転送し、状態Ｍとして登録する必要がある。そこでプロセッサ１０は、ＦＩコマンド２０３０のノード番号２０３２に自身の属するノード番号を、アドレス２０３３に当該キャッシュブロックのアドレスを設定して、結合網１００経由で、ディレクトリユニット３００に送信する。その後プロセッサ１０はディレクトリユニット３００から送られるＡＣＫコマンド２１６０またはＮＡＣＫコマンド２１７０を待ち、ＮＡＣＫコマンド２１７０を受信した場合には、ＮＡＣＫコマンド２１７０を受信するのではなくＡＣＫコマンド２１６０を受信するようになるまでＦＩコマンド２０３０を再送する。ＡＣＫコマンド２１６０を受信したプロセッサ１０は、ＦＩＣコマンド２０５０を受信するまで、後続命令の実行を停止する。
【００４３】
ＦＩコマンド２０３０を受信したディレクトリユニットでは、受信フィルタ３１０が図８のフローチャートに従って動作し（前述のため省略）、ステップ２００５で、受信したＦＩコマンド２０３０をＣＣＣ装置３２０に転送する。
【００４４】
続くＣＣＣ装置３２０の動作を、図９および図１１のフローチャートを用いて説明する。
【００４５】
まずステップ１１００で、受信フィルタ３１０から転送されたＦＩコマンド２０３０を受信する。続くステップ１１０１で、受信したＦＩコマンド２０３０を、線４０６経由でｒｅｑ記憶領域３６０に記録する。続くステップ１１０２で、ｒｅｑ記憶領域３６０に記録したＦＩコマンド２０３０のアドレス２０３３（ｒｅｑアドレス）に対応するディレクトリエントリを読み出す。続くステップ１１０３で、読み出したディレクトリエントリをもとに、ノード集合に変換する。続くステップ１１０６で、ノード集合から、ｒｅｑ記憶領域３６０に記録したＦＩコマンド２０３０のノード番号２０３２（ｒｅｑノード）を除去する。続くステップ１１０６でｒｅｑ記憶領域３６０に記録したＦＩコマンド２０３０のコマンド種別２０３１を判定することにより、ステップ１３００に移行する。
【００４６】
ステップ１３００では、ｖａｌｉｄ記憶領域３８０に値０を設定する。続くステップ１３０１で、ノード集合に要素があるかどうかを判定し、ノード集合に要素があればステップ１３０２に、ノード集合に要素がなければステップ１３０７に移行する。
【００４７】
ステップ１３０２では、ノード集合から１ノードを選択した上、選択したノードをノード集合から除去する。続くステップ１３０３で、アドレス２０４２にｒｅｑアドレスを設定した上、ＣＦＩコマンド２０４０を選択したノードに宛てて送信する。
【００４８】
ここでＣＦＩコマンド２０４０を受信したノードは、アドレス２０４２が自身のキャッシュに登録されているかどうかをチェックする。もしアドレス２０４２が自身のキャッシュでＭ状態であればＩ状態に遷移させた上、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０４２が自身のキャッシュでＥ状態であればＩ状態に遷移させた上、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０４２が自身のキャッシュでＳ状態であればＩ状態に遷移させた上、当該キャッシュブロックのデータをデータ２１８２に設定し、Ｄコマンド２１８０をディレクトリユニット３００に送信する。また、もしアドレス２０４２が自身のキャッシュでＩ状態であるかキャッシュに登録されていなければ、ＮＤコマンド２１９０をディレクトリユニット３００に送信する。ディレクトリユニット３００に送信されたＤコマンド２１８０またはＮＤコマンド２１９０は、受信フィルタ３１０を経由してＣＣＣ装置３２０に転送される。受信フィルタ３１０の動作は前述したため、省略する。
【００４９】
ここでＣＣＣ装置３２０の動作に戻り、ＣＣＣ装置３２０はステップ１３０４で、Ｄコマンド２１８０またはＮＤコマンド２１９０を受信する。続くステップ１３０５で受信したコマンドの種別を判定する。もしＤコマンド２１８０であれば、ステップ１３０６に移行し、ｖａｌｉｄ記憶領域３８０に１を設定、ｄａｔａ記憶領域３９０にＤコマンド２１８０のデータ２１８２を登録した上、ステップ１３０１に戻る。また、もしＮＤコマンド２１９０であれば、ステップ１３０１に戻る。
【００５０】
ステップ１３０７では、ｖａｌｉｄ記憶領域３８０が１かどうかを判定する。もしｖａｌｉｄ記憶領域３８０が１であればステップ１３１０に移行し、もし１でなければステップ１３０８に移行する。
【００５１】
ステップ１３０８では、ｒｅｑアドレスを主記憶から読み出す。具体的には、ｒｅｑアドレスをアドレス２２０２に設定した上、Ｍコマンド２２００を主記憶２００に送信する。Ｍコマンド２２００を受信した主記憶２００は、アドレス２２０２に対応した１２８Ｂデータをデータ２２１２に登録した上、ＭＤコマンド２２１０をディレクトリユニット３００に送信する。ディレクトリユニット３００に送信されたＭＤコマンド２２１０は、受信フィルタ３１０を経由してＣＣＣ装置３２０に転送される。受信フィルタ３１０の動作は前述したため、省略する。
【００５２】
続くステップ１３０９で、ＭＤコマンド２２１０のデータ２２１２をｄａｔａ記憶領域３９０に登録する。
【００５３】
ステップ１３１０では、縮約装置３３０に対して「占有」を通知する。続くステップ１３１１では、ｒｅｑノードの属するノードグループを、ノードグループ表３７０を参照して求める。続くステップ１３１２では、ｒｅｑアドレスに対応するディレクトリエントリのうち、ステップ１３１１で求めたノードグループに対応するビットを１に設定する。続くステップ１３１３では、データ２０５２にｄａｔａ記憶領域３９０に登録されているデータを設定した上、ｒｅｑノードに対してＦＩＣコマンド２０５０を送信し、ステップ１１０７に移行する。
【００５４】
ステップ１１０７では、ｂｕｓｙ記憶領域３５０に値０を設定し、ステップ１１００のコマンド待機状態となる。
（３−５）プロセッサがＩコマンドを発行した場合の動作
プロセッサ１０がＳ状態のキャッシュブロックに対するデータ書き込み命令を実行した場合、当該キャッシュブロックを状態Ｍとして登録する必要がある。そこでプロセッサ１０は、Ｉコマンド２０６０のノード番号２０６２に自身の属するノード番号を、アドレス２０６３に当該キャッシュブロックのアドレスを設定して、結合網１００経由で、ディレクトリユニット３００に送信する。その後プロセッサ１０はディレクトリユニット３００から送られるＡＣＫコマンド２１６０またはＮＡＣＫコマンド２１７０を待ち、ＮＡＣＫコマンド２１７０を受信した場合には、ＮＡＣＫコマンド２１７０を受信するのではなくＡＣＫコマンド２１６０を受信するようになるまでＩコマンド２０６０を再送する。ＡＣＫコマンド２１６０を受信したプロセッサ１０は、ＩＣコマンド２０８０を受信するまで、後続命令の実行を停止する。
【００５５】
Ｉコマンド２０６０を受信したディレクトリユニットでは、受信フィルタ３１０が図８のフローチャートに従って動作し（前述のため省略）、ステップ２００５で、受信したＩコマンド２０６０をＣＣＣ装置３２０に転送する。
【００５６】
続くＣＣＣ装置３２０の動作を、図９および図１２のフローチャートを用いて説明する。
【００５７】
まずステップ１１００で、受信フィルタ３１０から転送されたＩコマンド２０６０を受信する。続くステップ１１０１で、受信したＩコマンド２０６０を、線４０６経由でｒｅｑ記憶領域３６０に記録する。続くステップ１１０２で、ｒｅｑ記憶領域３６０に記録したＩコマンド２０６０のアドレス２０６３（ｒｅｑアドレス）に対応するディレクトリエントリを読み出す。続くステップ１１０３で、読み出したディレクトリエントリをもとに、ノード集合に変換する。続くステップ１１０６で、ノード集合から、ｒｅｑ記憶領域３６０に記録したＩコマンド２０６０のノード番号２０６２（ｒｅｑノード）を除去する。続くステップ１１０６でｒｅｑ記憶領域３６０に記録したＩコマンド２０６０のコマンド種別２０６１を判定することにより、ステップ１４００に移行する。
【００５８】
ステップ１４００では、ノード集合に要素があるかどうかを判定し、ノード集合に要素があればステップ１４０１に、ノード集合に要素がなければステップ１４０３に移行する。
【００５９】
ステップ１４０１では、ノード集合から１ノードを選択した上、選択したノードをノード集合から除去する。続くステップ１４０２で、アドレス２０７２にｒｅｑアドレスを設定した上、ＣＩコマンド２０７０を選択したノードに宛てて送信する。
【００６０】
ここでＣＩコマンド２０７０を受信したノードは、アドレス２０７２が自身のキャッシュに登録されているかどうかをチェックする。もしアドレス２０７２が自身のキャッシュでＭ状態であれば、Ｉ状態に遷移させる。また、もしアドレス２０７２が自身のキャッシュでＥ状態であれば、Ｉ状態に遷移させる。また、もしアドレス２０７２が自身のキャッシュでＳ状態であれば、Ｉ状態に遷移させる。また、もしアドレス２０７２が自身のキャッシュでＩ状態であるかキャッシュに登録されていなければ、何もしない。
【００６１】
ここでＣＣＣ装置３２０の動作に戻り、ステップ１４０３では、縮約装置３３０に対して「占有」を通知する。続くステップ１４０４では、ｒｅｑノードの属するノードグループを、ノードグループ表３７０を参照して求める。続くステップ１４０５では、ｒｅｑアドレスに対応するディレクトリエントリのうち、ステップ１４０４で求めたノードグループに対応するビットを１に設定する。続くステップ１４０６で、ｒｅｑノードに対してＩＣコマンド２０８０を送信し、ステップ１１０７に移行する。
【００６２】
ステップ１１０７では、ｂｕｓｙ記憶領域３５０に値０を設定し、ステップ１１００のコマンド待機状態となる。
（３−６）プロセッサがＷＢコマンドを発行した場合の動作
プロセッサ１０のキャッシュ１２に登録されているＭ状態にあるキャッシュブロックが、Ｓ状態またはＩ状態に遷移する場合、および、リプレースによりキャッシュから追い出される場合、当該キャッシュブロックを主記憶２００に書き戻す必要がある。そこでプロセッサ１０は、ＷＢコマンド２０９０のアドレス２０９２に当該キャッシュブロックのアドレスを、データ２０９３に当該キャッシュブロックのデータを設定して、結合網１００経由で、主記憶２００に送信する。
【００６３】
ＷＢコマンド２０９０を受信した主記憶２００は、アドレス２０９２にデータ２０９３を書き込む。
（３−７）プロセッサがＰａｇｅＦｌｕｓｈ命令を実行した場合の動作
プロセッサ１０は、ＰａｇｅＦｌｕｓｈ命令を備える。ＰａｇｅＦｌｕｓｈ命令は、オペランドで指定したアドレスの属する４ＫＢページ中のすべてのキャッシュブロックを、システム９９９中のすべてのキャッシュからフラッシュする命令である。キャッシュブロックのフラッシュとは、そのキャッシュブロックがキャッシュに登録されている場合に、必要に応じてデータを主記憶に書き戻しながら、キャッシュへの登録を抹消する処理である。具体的には、あるアドレスが指定された場合に、そのアドレスに対応するキャッシュブロックがＭ状態であればデータを主記憶に書き戻すとともにＩ状態に遷移させ、Ｅ状態およびＳ状態であればＩ状態に遷移させることで実現される。
【００６４】
ＰａｇｅＦｌｕｓｈ命令が実行された場合、当該ページがシステム中のどのキャッシュにも登録されていないことが保証されることから、当該ページに対応するディレクトリエントリを値００００に設定する。
【００６５】
ＰａｇｅＦｌｕｓｈ命令を実行したプロセッサは、自プロセッサによる当該ページのフラッシュが完了するまで、後続命令による当該ページへのアクセスを停止する。本実施例では、ＰＦＣコマンド２１２０を受信するまで、すべての後続命令を停止している。また、他のプロセッサがＰａｇｅＦｌｕｓｈ命令を実行した場合には、自プロセッサによる当該ページのフラッシュが完了するまで、後続命令による当該ページへのアクセスを停止する。本実施例では、すべての後続命令を停止している。
【００６６】
図１５を用いて、ＰａｇｅＦｌｕｓｈ命令を実行したプロセッサ１０におけるＰＦ機構１３の動作を説明する。
【００６７】
まずステップ３０００で、ＰＦ機構１３はＰａｇｅＦｌｕｓｈ命令の実行を検知する。続くステップ３００１で、ＰＦコマンド２１００のノード番号２１０２に自身の属するノード番号を、アドレス２１０３にＰａｇｅＦｌｕｓｈ命令のオペランドで指定されたアドレスを設定して、結合網１００経由で、ディレクトリユニット３００に送信する。その後プロセッサ１０はディレクトリユニット３００から送られるＡＣＫコマンド２１６０またはＮＡＣＫコマンド２１７０を待ち、ＮＡＣＫコマンド２１７０を受信した場合には、ＮＡＣＫコマンド２１７０を受信するのではなくＡＣＫコマンド２１６０を受信するようになるまでＰＦコマンド２１００を再送する。ＡＣＫコマンド２１６０を受信したプロセッサ１０は、ＰＦＣコマンド２１２０を受信するまで、後続命令の実行を停止する。
【００６８】
続くステップ３００２で、ＰａｇｅＦｌｕｓｈ命令のオペランドで指定されたアドレスから、対象ページの先頭アドレスを算出する。オペランドで指定されたアドレスをＯＡとすると、対象ページの先頭アドレスは、ＯＡ−（ＯＡ  ｍｏｄ  ４０９６）で算出される。ここで（ＯＡ  ｍｏｄ  ４０９６）とは、ＯＡを４０９６で割った時の剰余である。
【００６９】
続くステップ３００３で、ステップ３００２で算出した対象ページの先頭アドレスを変数ｉに代入する。続くステップ３００４で、アドレスｉのキャッシュブロックをフラッシュする。続くステップ３００５で、値ｉ＋１２８を変数ｉに代入する。続くステップ３００６で値ｉが先頭アドレス＋４０９６より小さいかどうかを判定し、もし小さければステップ３００４に、もし小さくなければステップ３００７に移行する。
【００７０】
ステップ３００７ではＰＦＣコマンド２１２０を受信し、終了する。
【００７１】
続いて、ＰＦコマンド２１００を受信した場合のＣＣＣ装置３２０の動作を、図９および図１３のフローチャートを用いて説明する。
【００７２】
まずステップ１１００で、受信フィルタ３１０から転送されたＰＦコマンド２１００を受信する。続くステップ１１０１で、受信したＰＦコマンド２１００を、線４０６経由でｒｅｑ記憶領域３６０に記録する。続くステップ１１０２で、ｒｅｑ記憶領域３６０に記録したＰＦコマンド２１００のアドレス２１０３（ｒｅｑアドレス）に対応するディレクトリエントリを読み出す。続くステップ１１０３で、読み出したディレクトリエントリをもとに、ノード集合に変換する。続くステップ１１０６で、ノード集合から、ｒｅｑ記憶領域３６０に記録したＰＰコマンド２１００のノード番号２１０２（ｒｅｑノード）を除去する。続くステップ１１０６でｒｅｑ記憶領域３６０に記録したＰＦコマンド２１００のコマンド種別２１０１を判定することにより、ステップ１５００に移行する。
【００７３】
ステップ１５００では、ノード集合に要素があるかどうかを判定し、ノード集合に要素があればステップ１５０１に、ノード集合に要素がなければステップ１５０３に移行する。
【００７４】
ステップ１５０１では、ノード集合から１ノードを選択した上、選択したノードをノード集合から除去する。続くステップ１５０２で、アドレス２１１２にｒｅｑアドレスを設定した上、ＣＰＦコマンド２１１０を選択したノードに宛てて送信する。
【００７５】
ステップ１５０３では、ｒｅｑアドレスに対応するディレクトリエントリの全ビットを０（００００）に設定する。続くステップ１５０４で、ｒｅｑノードに対してＰＦＣコマンド２１２０を送信し、ステップ１１０７に移行する。
【００７６】
ステップ１１０７では、ｂｕｓｙ記憶領域３５０に値０を設定し、ステップ１１００のコマンド待機状態となる。
【００７７】
ＣＰＦコマンド２１１０を受信したノードは、プロセッサ１０のＰＦ機構１３にそのＣＦＰコマンド２１１０を転送する。ＣＰＦコマンド２１１０を受信したＰＦ機構１３の動作を、図１６のフローチャートを用いて説明する。
【００７８】
まずステップ３１００で、ＰＦ機構１３はＣＰＦコマンド２１１０を受信する。続くステップ３１０１で、ＣＰＦコマンド２１１０のアドレス２１１２から、対象ページの先頭アドレスを算出する。対象ページの先頭アドレスは、アドレス２１１２−（アドレス２１１２  ｍｏｄ  ４０９６）で算出される。ここで（アドレス２１１２  ｍｏｄ  ４０９６）とは、アドレス２１１２を４０９６で割った時の剰余である。
【００７９】
続くステップ３１０２で、ステップ３１０１で算出した対象ページの先頭アドレスを変数ｉに代入する。続くステップ３１０３で、アドレスｉのキャッシュブロックをフラッシュする。続くステップ３１０４で、値ｉ＋１２８を変数ｉに代入する。続くステップ３１０５で値ｉが先頭アドレス＋４０９６より小さいかどうかを判定し、もし小さければステップ３１０３に、もし小さくなければ終了する。
（３−８）プロセッサがＰａｇｅＰｕｒｇｅ命令を実行した場合の動作
プロセッサ１０は、ＰａｇｅＰｕｒｇｅ命令を備える。ＰａｇｅＰｕｒｇｅ命令は、オペランドで指定したアドレスの属する４ＫＢページ中のすべてのキャッシュブロックを、システム９９９中のすべてのキャッシュからパージする命令である。キャッシュブロックのパージとは、そのキャッシュブロックがキャッシュに登録されている場合に、データを主記憶に書き戻すことなく、キャッシュへの登録を抹消する処理である。具体的には、あるアドレスが指定された場合に、そのアドレスに対応するキャッシュブロックがＭ状態、Ｅ状態およびＳ状態であれば、Ｉ状態に遷移させることで実現される。フラッシュとは異なり、Ｍ状態であってもデータを主記憶に書き戻さない。
【００８０】
ＰａｇｅＰｕｒｇｅ命令が実行された場合、当該ページがシステム中のどのキャッシュにも登録されていないことが保証されることから、当該ページに対応するディレクトリエントリを値００００に設定する。
【００８１】
ＰａｇｅＰｕｒｇｅ命令を実行したプロセッサは、自プロセッサによる当該ページのパージが完了するまで、後続命令による当該ページへのアクセスを停止する。本実施例では、ＰＰＣコマンド２１２０を受信するまで、すべての後続命令を停止している。また、他のプロセッサがＰａｇｅＰｕｒｇｅ命令を実行した場合には、自プロセッサによる当該ページのパージが完了するまで、後続命令による当該ページへのアクセスを停止する。本実施例では、すべての後続命令を停止している。
【００８２】
図１７を用いて、ＰａｇｅＰｕｒｇｅ命令を実行したプロセッサ１０におけるＰＰ機構１４の動作を説明する。
【００８３】
まずステップ３２００で、ＰＰ機構１４はＰａｇｅＰｕｒｇｅ命令の実行を検知する。続くステップ３２０１で、ＰＰコマンド２１３０のノード番号２１３２に自身の属するノード番号を、アドレス２１３３にＰａｇｅＰｕｒｇｅ命令のオペランドで指定されたアドレスを設定して、結合網１００経由で、ディレクトリユニット３００に送信する。その後プロセッサ１０はディレクトリユニット３００から送られるＡＣＫコマンド２１６０またはＮＡＣＫコマンド２１７０を待ち、ＮＡＣＫコマンド２１７０を受信した場合には、ＮＡＣＫコマンド２１７０を受信するのではなくＡＣＫコマンド２１６０を受信するようになるまでＰＰコマンド２１３０を再送する。ＡＣＫコマンド２１６０を受信したプロセッサ１０は、ＰＰＣコマンド２１５０を受信するまで、後続命令の実行を停止する。
【００８４】
続くステップ３２０２で、ＰａｇｅＰｕｒｇｅ命令のオペランドで指定されたアドレスから、対象ページの先頭アドレスを算出する。オペランドで指定されたアドレスをＯＡとすると、対象ページの先頭アドレスは、ＯＡ−（ＯＡ  ｍｏｄ  ４０９６）で算出される。ここで（ＯＡ  ｍｏｄ  ４０９６）とは、ＯＡを４０９６で割った時の剰余である。
【００８５】
続くステップ３２０３で、ステップ３２０２で算出した対象ページの先頭アドレスを変数ｉに代入する。続くステップ３２０４で、アドレスｉのキャッシュブロックをパージする。続くステップ３２０５で、値ｉ＋１２８を変数ｉに代入する。続くステップ３２０６で値ｉが先頭アドレス＋４０９６より小さいかどうかを判定し、もし小さければステップ３２０４に、もし小さくなければステップ３２０７に移行する。
【００８６】
ステップ３２０７ではＰＰＣコマンド２１５０を受信し、終了する。
【００８７】
続いて、ＰＰコマンド２１３０を受信した場合のＣＣＣ装置３２０の動作を、図９および図１４のフローチャートを用いて説明する。
【００８８】
まずステップ１１００で、受信フィルタ３１０から転送されたＰＰコマンド２１３０を受信する。続くステップ１１０１で、受信したＰＰコマンド２１３０を、線４０６経由でｒｅｑ記憶領域３６０に記録する。続くステップ１１０２で、ｒｅｑ記憶領域３６０に記録したＰＰコマンド２１３０のアドレス２１３３（ｒｅｑアドレス）に対応するディレクトリエントリを読み出す。続くステップ１１０３で、読み出したディレクトリエントリをもとに、ノード集合に変換する。続くステップ１１０６で、ノード集合から、ｒｅｑ記憶領域３６０に記録したＰＦコマンド２１３０のノード番号２１３２（ｒｅｑノード）を除去する。続くステップ１１０６でｒｅｑ記憶領域３６０に記録したＰＰコマンド２１３０のコマンド種別２１３１を判定することにより、ステップ１６００に移行する。
【００８９】
ステップ１６００では、ノード集合に要素があるかどうかを判定し、ノード集合に要素があればステップ１６０１に、ノード集合に要素がなければステップ１６０３に移行する。
【００９０】
ステップ１６０１では、ノード集合から１ノードを選択した上、選択したノードをノード集合から除去する。続くステップ１６０２で、アドレス２１４２にｒｅｑアドレスを設定した上、ＣＰＰコマンド２１４０を選択したノードに宛てて送信する。
【００９１】
ステップ１６０３では、ｒｅｑアドレスに対応するディレクトリエントリの全ビットを０（００００）に設定する。続くステップ１６０４で、ｒｅｑノードに対してＰＰＣコマンド２１５０を送信し、ステップ１１０７に移行する。
【００９２】
ステップ１１０７では、ｂｕｓｙ記憶領域３５０に値０を設定し、ステップ１１００のコマンド待機状態となる。
【００９３】
ＣＰＰコマンド２１４０を受信したノードは、プロセッサ１０のＰＰ機構１４にそのＣＰＰコマンド２１４０を転送する。ＣＰＰコマンド２１４０を受信したＰＰ機構１４の動作を、図１８のフローチャートを用いて説明する。
【００９４】
まずステップ３３００で、ＰＰ機構１４はＣＰＰコマンド２１４０を受信する。続くステップ３３０１で、ＣＰＰコマンド２１４０のアドレス２１４２から、対象ページの先頭アドレスを算出する。対象ページの先頭アドレスは、アドレス２１４２−（アドレス２１４２  ｍｏｄ  ４０９６）で算出される。ここで（アドレス２１４２  ｍｏｄ  ４０９６）とは、アドレス２１４２を４０９６で割った時の剰余である。
【００９５】
続くステップ３３０２で、ステップ３３０１で算出した対象ページの先頭アドレスを変数ｉに代入する。続くステップ３３０３で、アドレスｉのキャッシュブロックをフラッシュする。続くステップ３３０４で、値ｉ＋１２８を変数ｉに代入する。続くステップ３３０５で値ｉが先頭アドレス＋４０９６より小さいかどうかを判定し、もし小さければステップ３３０３に、もし小さくなければ終了する。
（３−９）縮約装置の動作
縮約装置３３０は、あるひとつのノードグループが、あるページに属するすべてのキャッシュブロックに対して自ノードグループにのみキャッシュされており他のノードグループにはキャッシュされていないことを保証できる操作をおこない、かつ、他ノードグループが当該ページに属するキャッシュブロックをキャッシュするための操作をおこなっていないことを検出し、当該ページに対応したディレクトリエントリにおいて、自ノードグループに対応するビットのみ１を設定し、残りの３ビットには０を設定する装置である。圧縮装置３３０により、ＰａｇｅＦｌｕｓｈ命令やＰａｇｅＰｕｒｇｅ命令を発行せずとも、ディレクトリ中の値１のビットを減らすことが可能となり、キャッシュ一貫性を保持するためのトランザクションを減らすことができる。
【００９６】
図１９のフローチャートを用いて、縮約装置３３０の動作を説明する。
【００９７】
まずステップ３４００で、ＣＣＣ装置３２０より、「占有」または「非占有」を受信する。「占有」とは、ｒｅｑ記憶領域３６０に記憶されているコマンドにより、コマンド発行対象アドレス（ｒｅｑアドレス）のキャッシュブロックが、コマンドを発行したノード（ｒｅｑノード）にのみキャッシュされ、他ノードにはキャッシュされていない状態にあることを意味し、「非占有」とはそうでないことを意味する。
【００９８】
次にステップ３４０１で、ｒｅｑアドレスの属するページ番号を算出する。このページ番号は、（ｒｅｑアドレス−（ｒｅｑアドレス  ｍｏｄ  ４０９６））÷４０９６で算出される。ここで（ｒｅｑアドレス  ｍｏｄ  ４０９６）とは、ｒｅｑアドレスを４０９６で割った時の剰余である。
【００９９】
続くステップ３４０２で、ノードグループ表３７０を参照し、ｒｅｑノードの属するノードグループを算出する。
【０１００】
続くステップ３４０３で、期待アドレスを算出する。期待アドレスは、ｄｉｒｅｃｔｉｏｎ記憶領域３３１が０の場合は０とし、また、ｄｉｒｅｃｉｔｏｎ記憶領域が“＋”の場合は（ｒｅｑアドレス−（ｒｅｑアドレス  ｍｏｄ  ４０９６））＋（カウンタ３３４）×１２８とし、また、ｄｉｒｅｃｉｔｏｎ記憶領域が“−”の場合は（ｒｅｑアドレス−（ｒｅｑアドレス  ｍｏｄ  ４０９６））＋３９６８−（カウンタ３３４）×１２８とする。
【０１０１】
続くステップ３４０４で、ｒｅｑアドレスがページの先頭または末尾のいずれかであるかどうかを算出する。具体的には、（ｒｅｑアドレス  ｍｏｄ  ４０９６）が０以上１２７以下であればページの先頭であり、３９６８以上４０９５以下であればページの末尾である。
【０１０２】
続くステップ３４０５では、ステップ３４００で得た「占有」または「非占有」の種別、ステップ３４０１で得たページ番号がｐａｇｅ記憶領域３３２の値と一致しているかどうかという情報、ステップ３４０２で得たノードグループがｎｏｄｅ−ｇｒｏｕｐ記憶領域３３３の値と一致しているかどうかという情報、ステップ３４０３で得た期待アドレスがｒｅｑアドレスと一致しているかどうかという情報、および、ステップ３４０４で得たｒｅｑアドレスがページの先頭または末尾であるかどうかという情報を用い、図２０に示したテーブルに基づいて動作を選択する。すなわち、列３５００ないし３５０４を検索キーとして、列３５０５の動作を選択する。列３５０５の動作のうち、Ｎ／Ａとは、列３５００ないし３５０４の組み合わせとしてあり得ないことを意味している。
【０１０３】
続くステップ３４０６では、ステップ３４０５で選択した動作を実行する。ステップ３４０５で選択した動作が「縮約」であれば、ｐａｇｅ記憶領域３３２に対応したディレクトリエントリにおいて、ｎｏｄｅ−ｇｒｏｕｐ記憶領域３３３に対応するビットのみ１を設定、残りの３ビットには０を設定した上、ｄｉｒｅｃｔｉｏｎ記憶領域に０を設定する。また、ステップ３４０５で選択した動作が「カウントアップ」であれば、カウンタ３３４の値を１だけ増やす。また、ステップ３４０６で選択した動作が「開始」であれば、ｒｅｑアドレスがページ先頭ならｄｉｒｅｃｔｉｏｎ記憶領域３３１を“＋”に、ｒｅｑアドレスがページ末尾ならｄｉｒｅｃｔｉｏｎ記憶領域３３１を“−”に設定した上、さらに、ｐａｇｅ記憶領域３３２にはステップ３４０１で得たページ番号を、ｎｏｄｅ−ｇｒｏｕｐ記憶領域３３３にはステップ３４０２で得たノードグループを、カウンタ３３４には値１を、それぞれ設定する。また、ステップ３４０５で選択した動作が「ＮＯＰ」であれば、何もしない。
【０１０４】
ステップ３４０６実行後、縮約装置３３０は動作を終了する。
【図面の簡単な説明】
【０１０５】
【図１】本発明の実施例による主記憶共有マルチプロセッサの概略構成図である。
【図２】ノードグループ表の構成を示す図である。
【図３】ディレクトリの構成を示す図である。
【図４】結合網を流れるコマンドのフォーマット一覧の一部を示す図である。
【図５】結合網を流れるコマンドのフォーマット一覧の一部を示す図である。
【図６】結合網を流れるコマンドのフォーマット一覧の一部を示す図である。
【図７】システム起動時のシステムの処理の流れを説明するフローチャートである。
【図８】受信フィルタの処理の流れを説明するフローチャートである。
【図９】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１０】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１１】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１２】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１３】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１４】ＣＣＣ装置の処理の流れを説明するフローチャートの一部である。
【図１５】ＰａｇｅＦｌｕｓｈ命令に対するＰＦ機構の処理の流れを説明するフローチャートである。
【図１６】ＰＦコマンド受信時のＰＦ機構の処理の流れを説明するフローチャートである。
【図１７】ＰａｇｅＰｕｒｇｅ命令に対するＰＰ機構の処理の流れを説明するフローチャートである。
【図１８】ＰＰコマンド受信時のＰＰ機構の処理の流れを説明するフローチャートである。
【図１９】縮約装置の処理の流れを説明するフローチャートである。
【図２０】縮約装置における動作を選択するためのテーブルである。
【符号の説明】
【０１０６】
１〜８  ノード
１０  プロセッサ
１３  ＰＦ（Ｐａｇｅ  Ｆｌｕｓｈ）機構
１４  ＰＰ（Ｐａｇｅ  Ｐｕｒｇｅ）機構
１００  結合網
２００  主記憶
３００  ディレクトリユニット
３１０  受信フィルタ
３２０  ＣＣＣ（Ｃａｃｈｅ  Ｃｏｈｅｒｅｃｙ  Ｃｏｎｔｒｏｌ）装置
３３０  縮約装置
３３１  ｄｉｒｅｃｔｉｏｎ記憶領域
３３２  ｐａｇｅ記憶領域
３３３  ｎｏｄｅ−ｇｒｏｕｐ記憶領域
３３４  カウンタ
３４０  ディレクトリ
３５０  ｂｕｓｙ記憶領域
３６０  ｒｅｑ記憶領域
３７０  ノードグループ表
３８０  ｖａｌｉｄ記憶領域
３９０  ｄａｔａ記憶領域
９９９  主記憶共有マルチプロセッサ
【図１】
2005250830.tif 000003
【図２】
2005250830.tif 000004
【図３】
2005250830.tif 000005
【図４】
2005250830.tif 000006
【図５】
2005250830.tif 000007
【図６】
2005250830.tif 000008
【図７】
2005250830.tif 000009
【図８】
2005250830.tif 000010
【図９】
2005250830.tif 000011
【図１０】
2005250830.tif 000012
【図１１】
2005250830.tif 000013
【図１２】
2005250830.tif 000014
【図１３】
2005250830.tif 000015
【図１４】
2005250830.tif 000016
【図１５】
2005250830.tif 000017
【図１６】
2005250830.tif 000018
【図１７】
2005250830.tif 000019
【図１８】
2005250830.tif 000020
【図１９】
2005250830.tif 000021
【図２０】
2005250830.tif 000022