(57)【要約】  ノードコントローラ（３０）は、メモリに記憶された情報のディレクトリをキャッシュするディレクトリキャッシュ（３１）において発生したディレクトリのエラーを検出する。また、ノードコントローラ（３０）は、エラーを検出した場合には、エラーを検出したディレクトリに対応する情報が格納されたメモリのメモリアドレスの下位アドレスを保持する。また、ノードコントローラ（３０）は、メモリに記憶された情報に対するリード要求を受信した場合には、リード要求の対象となるメモリアドレスの下位アドレスと、保持した下位アドレスとが一致するか否かを判別する。そして、ノードコントローラ（３０）は、リード要求の対象となるメモリアドレスの下位アドレスと、保持した下位アドレスとが一致しないと判別した場合には、リード要求の対象となる情報のディレクトリに基づいて、リード要求の対象となる情報のコヒーレンシを制御する。
2012124094.tif 000002
【特許請求の範囲】
【請求項１】
メモリに記憶された情報をキャッシュしている情報処理装置を示すディレクトリをキャッシュするキャッシュ部と、
前記キャッシュ部におけるディレクトリのエラーを検出する検出部と、
前記検出部がエラーを検出した場合には、当該エラーが検出されたディレクトリに対応する情報が格納された前記メモリのメモリアドレスを保持する保持部と、
前記メモリに記憶された情報に対するリード要求を受信した場合には、当該リード要求の対象となるメモリアドレスと、前記保持部が保持するアドレスとが一致するか否かを判別する判別部と、
前記判別部が前記リード要求の対象となるメモリアドレスと、前記保持部が保持するアドレスとが一致しないと判別した場合に、当該リード要求の対象となる情報のディレクトリに基づいて、当該リード要求の対象となる情報のコヒーレンシを制御する制御部と
を有することを特徴とするディレクトリキャッシュ制御装置。
【請求項２】
前記保持部は、前記メモリアドレスの下位アドレスを保持し、
前記判別部は、受信したリード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持する下位アドレスとが一致するか否かを判別することを特徴とする請求項１に記載のディレクトリキャッシュ制御装置。
【請求項３】
前記ディレクトリは、対応する情報をキャッシュしている情報処理装置を示し、
前記制御部は、前記判別部が前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持する下位アドレスとが一致しないと判別した場合には、当該リード要求の対象となる情報のディレクトリが示す情報処理装置に対してスヌープを発行することを特徴とする請求項２に記載のディレクトリキャッシュ制御装置。
【請求項４】
前記制御部は、前記判別部が前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持する下位アドレスとが一致すると判別した場合には、前記メモリに記憶された情報をキャッシュすることができる全ての情報処理装置に対してスヌープを発行し、当該スヌープを発行した結果を、前記キャッシュ部にキャッシュすることを特徴とする請求項３に記載のディレクトリキャッシュ制御装置。
【請求項５】
前記制御部は、前記判別部が前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持した下位アドレスとが一致すると判別した場合には、前記全ての情報処理装置に対してスヌープを発行した結果が前記キャッシュ部に格納されているか否かを判別し、スヌープを発行した結果が前記キャッシュ部に格納されていた場合には、当該スヌープを発行した結果が示す情報処理装置に対してスヌープを発行することを特徴とする請求項４に記載のディレクトリキャッシュ制御装置。
【請求項６】
前記制御部は、前記判別部が前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持した下位アドレスとが一致すると判別した場合には、前記全ての情報処理装置に対してスヌープを発行した結果を前記キャッシュ部から検索し、当該スヌープを発行した結果が前記キャッシュ部にキャッシュされていないと判別した場合には、前記メモリに記憶された情報をキャッシュすることができる全ての情報処理装置に対してスヌープを発行することを特徴とする請求項４に記載のディレクトリキャッシュ制御装置。
【請求項７】
前記キャッシュ部は、キャッシュ元のディレクトリと対応する情報が格納されているメモリアドレスの下位アドレスを有するタグ情報を、当該ディレクトリと対応付けてキャッシュし、
前記検出部は、前記タグ情報において発生したエラーを検出することを特徴とする請求項１〜６に記載のディレクトリキャッシュ制御装置。
【請求項８】
メモリに記憶された情報をキャッシュしている情報処理装置を示すディレクトリをキャッシュするキャッシュ部と、
前記キャッシュ部において発生したディレクトリのエラーを検出する検出部と、
前記検出部によってタグ情報のエラーが検出された場合には、当該エラーが検出されたディレクトリに対応する情報が格納された前記メモリのメモリアドレスのうち、所定の下位アドレスを保持する保持部と、
前記メモリに記憶された情報に対するリード要求を受信した場合には、当該リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持した下位アドレスとが一致するか否かを判別する判別部と、
前記判別部が前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持部が保持した下位アドレスとが一致しないと判別した場合には、当該リード要求の対象となる情報のディレクトリに基づいて、当該リード要求の対象となる情報のコヒーレンシを制御する制御部と
を有することを特徴とするディレクトリキャッシュ制御回路。
【請求項９】
メモリに記憶された情報をキャッシュしている情報処理装置を示すディレクトリをキャッシュするキャッシュ装置を有するディレクトリキャッシュ制御装置によって実行されるディレクトリキャッシュ制御方法であって、
前記キャッシュ装置において発生したディレクトリのエラーを検出し、
前記エラーがタグ情報のエラーであった場合には、当該エラーを検出したディレクトリに対応する情報が格納された前記メモリのメモリアドレスのうち、所定の下位アドレスを保持し、
前記メモリに記憶された情報に対するリード要求を他のコンピュータから受信した場合には、当該リード要求の対象となるメモリアドレスの下位アドレスと、前記保持した下位アドレスとが一致するか否かを判別し、
前記リード要求の対象となるメモリアドレスの下位アドレスと、前記保持した下位アドレスとが一致しないと判別した場合には、当該リード要求の対象となる情報のディレクトリに基づいて、当該リード要求の対象となる情報のコヒーレンシを制御する
ことを特徴とするディレクトリキャッシュ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ディレクトリキャッシュ制御装置、ディレクトリキャッシュ制御回路、およびディレクトリキャッシュ制御方法に関する。
【背景技術】
【０００２】
従来、キャッシュメモリを有するプロセッサとメモリとを有する複数のノードが、相互にデータを送受信する技術が知られている。このようなノードの一例として、他のノードが有するプロセッサからデータのリード要求を受信した場合には、自装置のメモリに格納されたデータを要求元のプロセッサに送信し、送信したデータを要求元のプロセッサにキャッシュさせる技術が知られている。【０００３】
このようなノードは、自装置のメモリに格納されたデータと、要求元のプロセッサがキャッシュしたデータとの矛盾を防ぐ必要がある。そこで、ノードは、データをキャッシュしたプロセッサを示すディレクトリを用いて、メモリに格納されたデータとキャッシュされているデータとの同一性を保持するコヒーレンシ処理を行う。このようなコヒーレンシ処理を行うノードの一例として、メモリからディレクトリを検索する時間を短縮するためのディレクトリキャッシュを有し、ディレクトリキャッシュにキャッシュされたディレクトリを用いて、コヒーレンシ処理を行うノードが知られている。【０００４】
図６は、ディレクトリキャッシュの一例を説明するための図である。図６に示す例では、ディレクトリキャッシュが有する各キャッシュラインのうち、図６中（Ａ）に示す範囲には、ディレクトリのデータが格納されたメモリアドレスの上位アドレスが格納されている。また、図６中（Ｂ）に示す範囲には、キャッシュ元のディレクトリデータとキャッシュしたディレクトリデータとの関係を示すステータス情報が格納されている。また、図６中（Ｃ）に示す範囲には、ディレクトリデータが格納されている。なお、ディレクトリデータが格納されたメモリアドレスの上位アドレスとステータス情報とは、タグ情報として、同一キャッシュラインに格納されたディレクトリデータと対応付けられている。【０００５】
このようなディレクトリキャッシュを有するノードは、ディレクトリのデータが格納されたメモリアドレスの下位アドレス（インデックス）と対応するキャッシュラインに、ディレクトリデータとタグ情報とを格納する。例えば、ノードは、図６に示す例では、インデックスが同じであって、上位アドレスが異なるメモリアドレスに格納されたディレクトリデータ「Ａ」〜「Ｄ」を、同じキャッシュラインの異なるＷＡＹに格納する。【０００６】
以下、図７を用いて、従来のノードが実行する処理を説明する。図７は、従来のノードが実行する処理の流れを説明するためのフローチャートである。例えば、ノードは、プロセッサからデータのリード要求を受信した場合には（ステップＳ１）、ディレクトリが有効か否かを判別する（ステップＳ２）。また、ノードは、ディレクトリが有効であると判別した場合には（ステップＳ２肯定）、ディレクトリキャッシュからリード要求の対象であるデータのディレクトリデータを検索する（ステップＳ３）。【０００７】
ここで、ノードは、タグ情報にエラーが発生しているか否かを判別し（ステップＳ４）、タグ情報にエラーが発生していないと判別した場合には（ステップＳ４否定）、ディレクトリがキャッシュヒットしたか否かを判別する（ステップＳ５）。また、ノードは、ディレクトリデータがキャッシュヒットした場合には（ステップＳ５肯定）、キャッシュヒットしたディレクトリデータを用いて、スヌープを発行し、データのコヒーレンシを保持する。【０００８】
すなわち、ノードは、キャッシュヒットしたディレクトリデータからスヌープを発行するプロセッサを特定し、特定したプロセッサにスヌープを発行する（ステップＳ６）。そして、ノードは、スヌープを発行したプロセッサがキャッシュするデータと自装置のメモリに格納されたデータとの同一性を保持した後に、データを要求元のプロセッサに送信し（ステップＳ７）、処理を終了する。【０００９】
また、ノードは、ディレクトリデータがキャッシュヒットしなかった場合には（ステップＳ５否定）、ディレクトリデータをメモリから読み込み（ステップＳ１０）、ディレクトリキャッシュにディレクトリデータを格納する（ステップＳ１１）。その後、ノードは、スヌープを発行するプロセッサを特定し、特定したプロセッサにスヌープを発行する（ステップＳ１２）。【００１０】
ここで、ノードは、ディレクトリキャッシュに格納されたディレクトリにエラーが発生した場合には、タグ情報を用いて、エラーが発生したディレクトリを再度キャッシュすることができる。しかし、ノードは、ディレクトリキャッシュのタグ情報においてエラーが発生した場合には、エラーが発生したタグ情報に対応付けられたディレクトリを特定することができない。例えば、ノードは、図６中（Ｄ）に示すタグ情報においてエラーが発生した場合には、同一のインデックスを有するメモリアドレスに格納されたディレクトリデータ「Ａ」〜「Ｄ」からエラーが発生したディレクトリデータを特定できない。【００１１】
このため、ノードは、ディレクトリキャッシュのタグ情報においてエラーが発生した場合には（ステップＳ４肯定）、ディレクトリを使用することができないと判断し、ディレクトリを無効とする（ステップＳ８）。そして、ノードは、全てのプロセッサに対してスヌープを発行するブロードキャスト発行を行う（ステップＳ９）。また、ノードは、他のノードから新たにリード要求を受信した場合には（ステップＳ１）、ディレクトリが有効ではないと判断する（ステップＳ２否定）。このため、ノードは、他のノードが有する全てのプロセッサに対してスヌープを発行する（ステップＳ９）。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開平１０−３２０２７９号公報
【特許文献２】特許第３２３９９３５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかし、上述したディレクトリキャッシュのタグにエラーが発生した場合にディレクトリの使用を中止する技術では、リード要求を受信するたびに、他のノードが有する全てのプロセッサに対してスヌープを発行する。このため、ノード間の通信量が膨大となり、並列計算機システムの性能を低下させるという問題があった。【００１４】
本願に開示の技術は、上述した問題に鑑みてなされたものであって、スヌープによるノード間の通信量を削減する。
【課題を解決するための手段】
【００１５】
１つの側面では、メモリに記憶された情報をキャッシュしている情報処理装置を示すディレクトリをキャッシュするディレクトリキャッシュを有し、ディレクトリキャッシュのエラーを検出する制御装置である。また、制御装置は、エラーを検出した場合には、エラーを検出したディレクトリに対応する情報が格納されたメモリのメモリアドレスの下位アドレスを保持する。また、制御装置は、エラーを検出した後でメモリに記憶された情報に対するリード要求を受信した場合には、リード要求の対象となるメモリアドレスの下位アドレスと、保持した下位アドレスとが一致するか否かを判別する。そして、制御装置は、リード要求の対象となるメモリアドレスの下位アドレスと、保持した下位アドレスとが一致しないと判別した場合には、リード要求の対象となる情報のディレクトリに基づいて、リード要求の対象となる情報のコヒーレンシを制御する。
【発明の効果】
【００１６】
１つの側面では、スヌープによるノード間の通信量を削減する。
【図面の簡単な説明】
【００１７】
【図１】図１は、実施例１に係る並列計算機システムを説明するための図である。
【図２】図２は、ディレクトリデータを説明するための図である。
【図３】図３は、ディレクトリキャッシュ制御回路がディレクトリデータを検索する処理を説明するための図である。
【図４】図４は、ディレクトリキャッシュ制御回路が実行する処理について説明するための図である。
【図５】図５は、ノードコントローラが実行する処理の流れを説明するためのフローチャートである。
【図６】図６は、ディレクトリキャッシュの一例を説明するための図である。
【図７】図７は、従来のノードが実行する処理の流れを説明するためのフローチャートである。
【発明を実施するための形態】
【００１８】
以下に添付図面を参照して本願に係るディレクトリキャッシュ制御装置、ディレクトリキャッシュ制御回路、およびディレクトリキャッシュ制御方法について説明する。
【実施例１】
【００１９】
以下の実施例１では、図１を用いて、ディレクトリキャッシュ制御装置を有する複数のノードがシステムバスにより接続された並列計算機システムの一例を説明する。図１は、実施例１に係る並列計算機システムを説明するための図である。【００２０】
図１に示すように、並列計算機システム１は、それぞれ同様の構成を有するノード２、ノード２ａを有する。また、図１では省略したが、並列計算機システム１は、ノード２と同様の構成を有する複数のノードをさらに有するものとする。また、各ノードは、システムバス３〜６によって相互に接続されているものとする。なお、以下の説明では、ノード２が有する各部について説明し、他のノードについての説明を省略する。【００２１】
ノード２は、メモリ１０、メモリコントローラ２０、ノードコントローラ３０、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０、ＣＰＵ５０を有する。メモリ１０は、メモリデータ１１、ディレクトリデータ１２を記憶する。ノードコントローラ３０は、ディレクトリキャッシュ３１、エラー検出回路３２、エラーインデックス格納レジスタ３３、ディレクトリキャッシュ制御回路３４を有する。なお、ノードコントローラ３０は、図１に示す各部３１〜３４以外にも、ノード２と他のノードとの通信を制御する機能や、ノード２の機能を制御する回路を有するものとする。【００２２】
メモリ１０は、メモリデータ１１とディレクトリデータ１２とを記憶する。具体的には、メモリ１０は、論理的に２つの領域に分割されている。そして、一方の領域にはリード要求の対象となるデータであるメモリデータ１１が格納されており、他方の領域には、各メモリデータ１１をキャッシュしたＣＰＵを示す情報であるディレクトリデータ１２が格納されている。また、各ディレクトリデータ１２が格納されている領域には、対応するメモリデータ１１が格納されているメモリアドレスと同一のメモリアドレスが付与されている。つまり、各メモリデータ１１と対応する各ディレクトリデータ１２とは、同じメモリアドレスが付与された領域に格納されているものとする。【００２３】
なお、以下の説明においては、メモリデータ１１とディレクトリデータ１２とが格納された領域には、同一のメモリアドレスが付与されるものとして説明するが、実施例は、これに限定されるものではない。【００２４】
図２は、ディレクトリデータを説明するための図である。図２に示すように、ディレクトリデータ１２には、先頭から「Ｖａｌｉｄ」、「Ｓｔａｔｕｓ」、「ＣＰＵ−ＩＤ」を示すビットが格納されている。ここで、「Ｖａｌｉｄ」には、ディレクトリデータ１２のデータが有効であるか否かを示すバリッドビットが格納される。また、「Ｓｔａｔｕｓ」には、メモリ１０に格納されたメモリデータ１１とキャッシュされたメモリデータ１１との同一性を示す情報が格納される。また、「ＣＰＵ−ＩＤ」には、対応するメモリデータ１１をキャッシュしたＣＰＵを示す識別子が格納される。【００２５】
例えば、「Ｓｔａｔｕｓ」には「Ｍ：Ｍｏｄｉｆｙ」、「Ｅ：Ｅｘｃｌｕｓｉｖｅ」、「Ｓ：Ｓｈａｒｅｄ」、「Ｉ：Ｉｎｖａｌｉｄ」のいずれかが格納される。ここで、「Ｍ」は、「ＣＰＵ−ＩＤ」に格納された識別子が示すＣＰＵが排他的にメモリデータ１１をキャッシュしており、キャッシュされたメモリデータ１１が書換えられた最新の状態に更新されていることを示す（ｄｉｒｔｙ）。【００２６】
また、「Ｅ」は、「ＣＰＵ−ＩＤ」に格納された識別子が示すＣＰＵが排他的にメモリデータ１１をキャッシュしており、キャッシュされたメモリデータ１１が書換えられていない状態を示す（Ｃｌｅａｎ）。また、「Ｓ」は、「ＣＰＵ−ＩＤ」に格納された識別子が示す複数のＣＰＵが同一のメモリデータ１１をキャッシュしている状態を示す。また、「Ｉ」は、キャッシュしてあるデータが無効であることを示す。【００２７】
図１に戻って、メモリコントローラ２０は、メモリ１０に格納されたメモリデータ１１とディレクトリデータ１２とを制御する。具体的には、メモリコントローラ２０は、ノードコントローラ３０からメモリアドレスを取得した場合には、取得したメモリアドレスに格納されているメモリデータ１１をメモリ１０から取得する。そして、メモリコントローラ２０は、取得したメモリデータ１１をノードコントローラ３０へ送信する。【００２８】
また、メモリコントローラ２０は、ノードコントローラ３０からディレクトリデータ１２を取得する旨のメモリアドレスを取得した場合には、取得したメモリアドレスに格納されているディレクトリデータ１２をメモリ１０から取得する。そして、メモリコントローラ２０は、取得したディレクトリデータ１２をノードコントローラ３０へ送信する。【００２９】
また、メモリコントローラ２０は、ノードコントローラ３０から新たなメモリデータ１１とメモリアドレスとを取得した場合には、取得したメモリアドレスに格納されているメモリデータ１１を新たなメモリデータ１１に更新する。また、メモリコントローラ２０は、ノードコントローラ３０から新たなディレクトリデータ１２とメモリアドレスとを取得した場合には、取得したメモリアドレスに格納されているディレクトリデータ１２を新たなディレクトリデータ１２に更新する。【００３０】
ノードコントローラ３０は、メモリコントローラ２０を介して、メモリ１０に記憶されたディレクトリデータ１２をキャッシュする。また、ノードコントローラ３０は、キャッシュしたディレクトリデータ１２のエラーを検出する。また、ノードコントローラ３０は、エラーを検出した場合には、エラーが検出したディレクトリデータ１２に対応するメモリデータ１１が格納されたメモリアドレスの下位アドレス（インデックス）を保持する。【００３１】
そして、ノードコントローラ３０は、ＣＰＵからメモリデータのリード要求を受信した場合には、ディレクトリキャッシュ３１からリード要求の対象となるメモリアドレスのインデックスを検索する。また、ノードコントローラ３０は、ディレクトリキャッシュ３１からインデックスを検索した結果、キャッシュミスヒットが発生した場合には、リード要求の対象となるメモリアドレスのインデックスと保持したインデックスとが一致するか否かを判別する。その後、ノードコントローラ３０は、リード要求の対象となるメモリアドレスのインデックスと保持したインデックスとが一致しないと判別した場合には、以下の処理を実行する。すなわち、ノードコントローラ３０は、リード要求の対象となるメモリデータ１１のディレクトリデータ１２に基づいて、リード要求の対象となるメモリデータのコヒーレンシを制御する。その後、ノードコントローラ３０は、リード要求の対象となる情報を要求元のＣＰＵへ送信する。【００３２】
以下、ノードコントローラ３０が有する各部について説明する。ディレクトリキャッシュ３１は、メモリ１０に記憶された情報をキャッシュしているＣＰＵを示すディレクトリデータ１２をキャッシュする。また、ディレクトリキャッシュ３１は、ディレクトリデータ１２が格納されているメモリアドレスの上位アドレスと、ディレクトリデータ１２の状態を示すステータス情報とをタグ情報とし、ディレクトリデータ１２と対応付けてキャッシュする。【００３３】
また、ディレクトリキャッシュ３１は、メモリ１０が有する各メモリアドレスの下位アドレスと対応付けられた複数のキャッシュラインを有する。また、ディレクトリキャッシュ３１は、各キャッシュラインに複数のＷＡＹを有する。つまり、ディレクトリキャッシュ３１は、マルチウェイ方式のキャッシュメモリである。そして、ディレクトリキャッシュ３１は、インデックスが同じメモリアドレスに格納された複数のディレクトリデータ１２を、それぞれ同一キャッシュラインの異なるＷＡＹに格納する。【００３４】
エラー検出回路３２は、ディレクトリキャッシュ３１において発生したエラーを検出する。例えば、エラー検出回路３２は、ディレクトリキャッシュ３１が有するディレクトリデータ１２のうち、ディレクトリキャッシュ制御回路３４が検索対象としたキャッシュラインに格納された各ＷＡＹのエラーを検出する。そして、エラー検出回路３２は、タグ情報において発生したエラーを検出した場合には、エラーを検出したタグ情報が格納されていたキャッシュラインのＷＡＹをディレクトリキャッシュ制御回路３４に通知する。なお、エラー検出回路３２は、任意の方法でエラーを検出することができる。【００３５】
エラーインデックス格納レジスタ３３は、エラー検出回路３２がタグ情報のエラーを検出した場合には、エラーが検出されたタグ情報と対応付けられたディレクトリデータ１２が格納されたメモリアドレスのインデックスを保持する。つまり、ディレクトリキャッシュ制御回路３４は、エラーが検出されたタグ情報と対応付けられたディレクトリデータ１２が格納されているメモリアドレスのインデックスをエラーインデックス格納レジスタ３３に格納する。【００３６】
ディレクトリキャッシュ制御回路３４は、メモリデータ１１に対するリード要求を受信した場合には、リード要求の対象となるメモリアドレスのインデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致するか否かを判別する。そして、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致しない場合には、以下の処理を実行する。すなわち、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリデータ１１と対応するディレクトリデータ１２が示すＣＰＵに対して、スヌープを発行し、リード要求の対象となるメモリデータ１１のコヒーレンシを制御する。【００３７】
また、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致する場合には以下の処理を実行する。すなわち、並列計算機システム１が有する全てのＣＰＵに対して、スヌープをブロードキャスト発行する。【００３８】
その後、ディレクトリキャッシュ制御回路３４は、スヌープを発行した結果に応じて、リード要求の対象となるメモリデータ１１のコヒーレンシを制御する。また、ディレクトリキャッシュ制御回路３４は、スヌープをブロードキャスト発行することにより取得した結果をディレクトリキャッシュ３１にキャッシュする。【００３９】
また、ディレクトリキャッシュ制御回路３４は、再度リード要求を受信した場合には、ディレクトリキャッシュ３１に、ブロードキャストしたスヌープの結果がキャッシュされているか否かを判別する。そして、ディレクトリキャッシュ制御回路３４は、ブロードキャストしたスヌープの結果がキャッシュされていると判別した場合には、キャッシュされていたスヌープの結果が示すＣＰＵにスヌープを発行する。【００４０】
すなわち、ディレクトリキャッシュ３１には、エラーが発生していないキャッシュラインに格納されているディレクトリデータ１２については、メモリ１０からキャッシュ前のデイレクトリデータを特定することが可能である。このため、ノードコントローラ３０は、エラーが発生していないキャッシュラインに格納されているディレクトリデータ１２については、信頼することができるディレクトリデータ１２であると判別する。【００４１】
そこで、ディレクトリキャッシュ制御回路３４は、エラーが発生したタグ情報と対応付けられたディレクトリデータ１２のインデックス、つまり、エラーが発生したキャッシュラインに対応するインデックスをエラーインデックス格納レジスタ３３に格納する。そして、ディレクトリキャッシュ３１は、新たに受信したリード要求の対象となるメモリアドレスのインデックスが、エラーインデックス格納レジスタ３３に格納されたインデックスと一致しない場合には、ディレクトリデータ１２を用いてスヌープを送信する。【００４２】
すなわち、ディレクトリキャッシュ制御回路３４は、メモリ１０に格納されたディレクトリデータ１２又はディレクトリキャッシュ３１に格納されたディレクトリデータ１２が示すＣＰＵに対してのみスヌープを送信する。このため、ノードコントローラ３０は、リード要求が連続して発行される場合にも、スヌープをブロードキャスト発行しないので、ノード間の通信量を削減することができる。この結果、並列計算機システム１は、効率良く処理を進めることができる。【００４３】
さらに、ディレクトリキャッシュ制御回路３４は、スヌープをブロードキャスト発行した結果を、ディレクトリキャッシュ３１に格納する。そして、ディレクトリキャッシュ制御回路３４は、リード要求のインデックスがエラーインデックス格納レジスタ３３に格納されたインデックスと一致した場合には、以下の処理を実行する。【００４４】
すなわち、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのメモリデータ１１に関してブロードキャスト発行されたスヌープの結果をディレクトリキャッシュ３１から検索する。そして、ディレクトリキャッシュ制御回路３４は、スヌープの結果が検索された場合には、このスヌープの結果が示すＣＰＵのみに対してスヌープを実行する。【００４５】
このため、ディレクトリキャッシュ制御回路３４は、エラーが発生したためにディレクトリデータ１２を用いることができないメモリデータ１１に対するリード要求が連続した場合にも、スヌープのブロードキャスト発行を防ぎ、ノード間の通信量を削減する。この結果、並列計算機システム１は、効率よく処理をすすめることができる。【００４６】
なお、ノードコントローラ３０は、スヌープを発行した結果、メモリ１０に格納されたメモリデータ１１を他のノードが有するＣＰＵにキャッシュされたメモリデータ１１に更新する場合には、以下の処理を実行する。すなわち、ノードコントローラ３０は、新たなメモリアドレスと新たなメモリデータ１１をメモリコントローラ２０に送信する。また、ノードコントローラ３０は、スヌープを発行した結果、ディレクトリデータ１２に変更があった場合には、メモリアドレスと変更後のディレクトリデータ１２をメモリコントローラ２０に送信する。【００４７】
また、ノードコントローラ３０は、メモリデータ１１をメモリ１０から取得する場合には、メモリデータ１１が格納されたメモリアドレスをメモリコントローラ２０に送信する。また、ノードコントローラ３０は、ディレクトリデータ１２をメモリ１０から取得する場合には、ディレクトリデータ１２が格納されたメモリアドレスとディレクトリデータ１２を取得する旨をメモリコントローラ２０に送信する。【００４８】
ＣＰＵ４０は、メモリ１０、１０ａに格納されたメモリデータ１１、１１ａを用いて処理を実行する情報処理装置である。ここで、ＣＰＵ４０は、キャッシュ４１を有し、メモリ１０、１０ａに格納されたメモリデータ１１、１１ａをキャッシュする。また、ＣＰＵ４０は、ノードコントローラ３０が他のノード２ａからスヌープのブロードキャストを取得した場合には、自装置がノード２ａのメモリ１０ａからメモリデータ１１ａをキャッシュしているか否かを判別する。そして、ＣＰＵ４０は、自装置がメモリデータ１１ａをキャッシュしていると判別した場合には、トランザクションをノード２ａへ送信し、自装置がキャッシュしたメモリデータ１１ａとメモリ１０ａに格納されたメモリデータ１１ａとの同一性を保持する。【００４９】
ＣＰＵ５０は、キャッシュ５１を有し、メモリ１０、１０ａに格納されたメモリデータ１１、１１ａを用いて処理を実行する情報処理装置である。なお、ＣＰＵ５０は、ＣＰＵ４０と同様の機能を有するものとし、説明を省略する。【００５０】
例えば、エラー検出回路３２、ディレクトリキャッシュ制御回路３４とは、電子回路である。ここで、電子回路の例として、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ  （Field  Programmable  Gate  Array）などの集積回路、またはＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などを適用する。【００５１】
また、ディレクトリキャッシュ３１とは、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ  （flash  memory）などの半導体メモリ素子などの記憶装置である。また、エラーインデックス格納レジスタ３３は、レジスタである。【００５２】
次に、図３を用いて、ディレクトリキャッシュ制御回路３４がディレクトリキャッシュ３１からキャッシュデータを検索する処理について説明する。図３は、ディレクトリキャッシュ制御回路がディレクトリデータを検索する処理を説明するための図である。なお、図３中（Ａ）の範囲には、ディレクトリデータ１２が格納されているメモリアドレスの上位アドレスが格納されている。また、図３中（Ｂ）の範囲には、ディレクトリデータ１２の状態を示す情報が格納されている。また、図３中（Ｃ）の範囲には、ディレクトリデータ１２が格納されている。なお、ディレクトリデータ１２が格納されているメモリアドレスの上位アドレスと、ディレクトリデータ１２の状態を示す情報とは、タグ情報として、ディレクトリデータ１２と対応付けて記憶されている。【００５３】
また、図３中の（Ｄ）に示すように、ディレクトリキャッシュ３１は、マルチウェイ方式のキャッシュメモリである。また、１つのキャッシュラインに含まれる各ＷＡＹには、同一のインデックスを有するメモリアドレスに格納された複数のディレクトリデータが格納される。例えば、図３に示す例では、それぞれ同じインデックスを有するメモリアドレスに格納された複数のディレクトリデータ「Ａ」〜「Ｄ」が同一のキャッシュラインに含まれるＷＡＹに格納される。【００５４】
このため、図３中の（Ｅ）に示すタグ情報においてエラーが検出された場合には、ディレクトリデータ「Ａ」〜「Ｄ」のうち、どのデータについてエラーが発生したのか判別することができなくなる。しかし、図３中の（Ｅ）に示すタグ情報においてエラーが発生した場合にも、他のキャッシュラインに格納されているディレクトリデータ１２は、信用しても良いデータであると考えられる。【００５５】
そこで、ディレクトリキャッシュ制御回路３４は、タグ情報にエラーが発生したキャッシュラインのインデックスをエラーインデックス格納レジスタ３３に格納する。そして、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスがエラーインデックス格納レジスタ３３に格納されたインデックスと一致した場合には、ディレクトリデータ１２を信用しない。つまり、ディレクトリキャッシュ制御回路３４は、リード要求の対象のメモリアドレスが有するインデックスがエラーしたインデックスである場合には、ディレクトリデータ１２を使用せずに、スヌープをブロードキャスト発行する。【００５６】
一方、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスがエラーしたインデックスと異なる場合には、リード要求の対象となるメモリアドレスのディレクトリデータ１２を信用する。つまり、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスがエラーインデックス格納レジスタ３３に格納されたインデックスと一致しない場合には、ディレクトリデータ１２が示すＣＰＵにスヌープを発行する。【００５７】
次に、図４を用いて、ディレクトリキャッシュ制御回路３４が実行する処理の流れの一例を説明する。図４は、ディレクトリキャッシュ制御回路が実行する処理について説明するための図である。例えば、図４中（Ａ）に示すようにディレクトリキャッシュ制御回路３４は、システムバス３を介して、ノード２ａが有するＣＰＵ４０ａからリード要求を受信する。このような場合には、図４中（Ｂ）に示すように、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスと同じメモリアドレスに格納されたディレクトリデータ１２をディレクトリキャッシュ３１から検索する。【００５８】
ここで、ディレクトリキャッシュ制御回路３４は、ディレクトリキャッシュ３１からディレクトリデータ１２を検索する場合には、受信したリード要求の対象となるメモリアドレスを特定し、特定したメモリアドレスから上位アドレスとインデックスとを判別する。そして、ディレクトリキャッシュ制御回路３４は、判別したインデックスと対応付けられたキャッシュラインをディレクトリキャッシュ３１から選択し、選択したキャッシュラインの各ＷＡＹに格納されているディレクトリデータ１２とタグ情報とを取得する。また、ディレクトリキャッシュ制御回路３４は、取得した各ＷＡＹに格納されていた各タグ情報の上位アドレスと、リード要求の対象となるメモリアドレスから判別した上位アドレスとを比較する。【００５９】
そして、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスから判別した上位アドレスと同じ上位アドレスが格納されているタグ情報が格納されたＷＡＹを選択する。そして、ディレクトリキャッシュ制御回路３４は、選択したＷＡＹにキャッシュされたディレクトリデータ１２を取得する。一方、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスから判別した上位アドレスと同じ上位アドレスが格納されているタグ情報が格納されたＷＡＹが存在しない場合には、キャッシュミスヒットが発生したと判別する。【００６０】
ここで、エラー検出回路３２は、図４中（Ｃ）に示すように、ディレクトリキャッシュ制御回路３４がディレクトリキャッシュ３１から選択したキャッシュラインの各ＷＡＹにおいてエラーが発生しているか否かを判別する。そして、図４中（Ｄ）に示すように、エラー検出回路３２は、いずれかのＷＡＹにおいてエラーを検出した場合には、エラーを検出したＷＡＹを示す情報をディレクトリキャッシュ制御回路３４へ送信する。そして、ディレクトリキャッシュ制御回路３４は、エラー検出回路３２から取得した情報に基づいて、エラー検出の有無、および、エラーが発生したＷＡＹを特定する。【００６１】
また、ディレクトリキャッシュ制御回路３４は、キャッシュヒットし、かつ、エラーが検出されなかった場合には、以下の処理を実行する。すなわち、ディレクトリキャッシュ制御回路３４は、図４中（Ｅ）に示すように、キャッシュヒットしたディレクトリデータ１２に格納されている「Ｓｔａｔｕｓ」を確認する。その後、ディレクトリキャッシュ制御回路３４は、「Ｓｔａｔｕｓ」が「Ｍ」である場合には、図４中（Ｅ）に示すように、キャッシュヒットしたディレクトリデータ１２の「ＣＰＵ−ＩＤ」が示すＣＰＵに対してスヌープを発行する。【００６２】
また、図４中（Ｇ）に示すように、ディレクトリキャッシュ制御回路３４は、スヌープを発行した後、スヌープを発行したＣＰＵから最新のメモリデータ１１を受信する。そして、図４中（Ｈ）に示すように、ディレクトリキャッシュ制御回路３４は、受信したメモリデータ１１をリード要求元のＣＰＵへ送信する。また、ディレクトリキャッシュ制御回路３４は、メモリ１０に格納されているメモリデータ１１を更新する。また、ディレクトリキャッシュ制御回路３４は、キャッシュヒットしたディレクトリデータ１２とメモリ１０に格納されているディレクトリデータ１２との「Ｓｔａｔｕｓ」を更新する。【００６３】
また、ディレクトリキャッシュ制御回路３４は、キャッシュヒットし、かつ、キャッシュヒットしたＷＡＹ以外でタグ情報のエラーが発生している場合には、キャッシュヒットしたディレクトリデータ１２を信用することができない。このため、ディレクトリキャッシュ制御回路３４は、図４中（Ｆ）に示すように、選択したキャッシュラインに対応するインデックス（以下、エラーしたインデックスと記載）をエラーインデックス格納レジスタ３３に格納する。そして、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリデータ１１のスヌープ要求をブロードキャスト発行する。【００６４】
ここで、ディレクトリキャッシュ制御回路３４は、スヌープ要求をブロードキャスト発行した結果、リード要求の対象となるメモリデータ１１をキャッシュするＣＰＵを判別した場合には、判別したＣＰＵとの間でコヒーレンシ処理を実行する。そして、ディレクトリキャッシュ制御回路３４は、メモリデータ１１を更新するとともに、更新したメモリデータ１１を要求元のプロセッサへ送信する。また、ディレクトリキャッシュ制御回路３４は、スヌープをブロードキャスト発行した結果を、リード要求の対象となるメモリアドレスの上位アドレスとともに、ディレクトリキャッシュ３１に格納する。【００６５】
また、ディレクトリキャッシュ制御回路３４は、キャッシュミスヒットした場合には、リード要求の対象となるメモリアドレスのインデックスとエラーインデックス格納レジスタ３３に格納されているインデックスとが一致するか否かを判別する。そして、ディレクトリキャッシュ制御回路３４は、エラー要求の対象となるメモリアドレスのインデックスとエラーインデックス格納レジスタ３３に格納されているインデックスとが一致した場合には、以下の処理を実行する。【００６６】
すなわち、ディレクトリキャッシュ制御回路３４は、選択したキャッシュラインの各ＷＡＹからリード要求の対象となるメモリアドレスの上位アドレスに一致するアドレスがタグ情報に格納されたＷＡＹを検索する。そして、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスの上位アドレスに一致するアドレスがタグ情報に格納されたＷＡＹに格納されたスヌープをブロードキャストした結果が示すＣＰＵのみに対して、スヌープを発行する。また、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスの上位アドレスに一致するアドレスがタグ情報に格納されたＷＡＹが存在しない場合には、スヌープ要求をブロードキャスト発行する。【００６７】
一方、ディレクトリキャッシュ制御回路３４は、リード要求の対象となるメモリアドレスのインデックスがエラーインデックス格納レジスタ３３に格納されているインデックスと一致しない場合には、以下の処理を実行する。すなわち、ディレクトリキャッシュ制御回路３４は、エラー検出の有無を判別し、エラーが検出されていない場合には、ディレクトリデータ１２をメモリ１０からディレクトリキャッシュ３１にキャッシュさせる。そして、ディレクトリキャッシュ制御回路３４は、キャッシュしたディレクトリデータ１２が示すＣＰＵのみにスヌープを発行する。【００６８】
一方、ディレクトリキャッシュ制御回路３４は、エラーが検出されている場合には、エラーしたインデックスをエラーインデックス格納レジスタ３３に格納する。また、ディレクトリキャッシュ制御回路３４は、スヌープ要求をブロードキャスト発行する。【００６９】
このような各部３１〜３４を有するノードコントローラ３０は、ディレクトリキャッシュ３１が記憶するタグ情報にエラーが発生した場合には、エラーしたインデックスを保持する。そして、ノードコントローラ３０は、リード要求の対象メモリアドレスのインデックスが保持したインデックスと異なる場合には、ディレクトリキャッシュ３１、または、メモリ１０に格納されたディレクトリデータ１２が示すＣＰＵのみにスヌープを発行する。【００７０】
このため、ノードコントローラ３０は、リード要求を受信するたびにスヌープをブロードキャスト発行せずとも、適切なコヒーレンシ処理を実行することができる。この結果、ノードコントローラ３０は、ノード間の通信量を抑え、並列計算機システム１の性能を向上させることができる。【００７１】
また、ノードコントローラ３０は、スヌープをブロードキャスト発行した場合には、スヌープ結果をディレクトリキャッシュ３１にキャッシュさせる。その後、ノードコントローラ３０は、リード要求の対象メモリアドレスのインデックスが保持したインデックスと同じである場合には、ディレクトリキャッシュ３１からディレクトリデータ１２ａを検索する。そして、ノードコントローラ３０は、ディレクトリデータ１２ａが示すＣＰＵのみにスヌープを発行する。【００７２】
このため、ノードコントローラ３０は、タグ情報にエラーが発生したキャッシュラインと対応するメモリアドレスに格納されたメモリデータ１１に対するリード要求が繰り返し発行された場合にも、特定のＣＰＵのみにスヌープを発行することとなる。この結果、ノードコントローラ３０は、さらにノード間の通信量を削減し、並列計算機システム１の性能を向上させることができる。【００７３】
なお、ブロードキャスト発行したスヌープの結果をディレクトリキャッシュ３１に格納する方法は、任意の方法を用いることができるが、この実施例においては、スヌープ対象となるメモリアドレスの上位アドレスと、スヌープの結果とを対応付けてディレクトリキャッシュ３１に格納するものとする。【００７４】
［ノードコントローラ３０の処理の流れ］
次に、図５を用いて、ノードコントローラ３０が実行する処理の流れについて説明する。図５は、ノードコントローラが実行する処理の流れを説明するためのフローチャートである。例えば、ノードコントローラ３０は、他のノードが有するＣＰＵからリード要求を受信したことを契機として、処理を開始する（ステップＳ１０１）。【００７５】
次に、ノードコントローラ３０は、リード要求の対象となるメモリデータ１１のディレクトリデータ１２をディレクトリキャッシュ３１から検索する（ステップＳ１０２）。そして、ノードコントローラ３０は、キャッシュヒットしたか否かを判別し（ステップＳ１０３）、キャッシュヒットした場合には（ステップＳ１０３肯定）、ヒットしたＷＡＹ以外でタグ情報にエラーが検出されたか否かを判別する（ステップＳ１０４）。【００７６】
次に、ノードコントローラ３０は、ヒットしたＷＡＹ以外でタグ情報にエラーが検出されなかった場合には（ステップＳ１０４否定）、キャッシュヒットしたディレクトリデータ１２が示すＣＰＵにスヌープを発行する（ステップＳ１０５）。そして、ノードコントローラ３０は、スヌープを発行し、コヒーレンシ処理を実行することによって同一性を保持したメモリデータ１１を要求元のＣＰＵへ送信し（ステップＳ１０６）、処理を終了する。【００７７】
一方、ノードコントローラ３０は、ヒットしたＷＡＹ以外でタグ情報にエラーが検出された場合には（ステップＳ１０４肯定）、エラーしたインデックスをエラーインデックス格納レジスタ３３に保持する（ステップＳ１０７）。また、ノードコントローラ３０は、スヌープ要求をブロードキャスト発行し（ステップＳ１０８）、スヌープ結果をディレクトリキャッシュ３１に格納する（ステップＳ１０９）。【００７８】
また、ノードコントローラ３０は、キャッシュヒットしなかった場合には（ステップＳ１０３否定）、以下の処理を実行する。すなわち、ノードコントローラ３０は、リード要求対象インデックスとエラーインデックスとが一致するか否かを判別する（ステップＳ１１０）。そして、ノードコントローラ３０は、リード要求対象インデックスとエラーインデックスとが一致すると判別した場合には（ステップＳ１１０肯定）以下の処理を実行する。すなわち、ノードコントローラ３０は、ディレクトリキャッシュ３１からリード要求の対象となるメモリアドレスの上位アドレスがディレクトリキャッシュ３１からヒットするか否かを判別する（ステップＳ１１１）。【００７９】
そして、ノードコントローラ３０は、上位アドレスがディレクトリキャッシュ３１からヒットした場合には（ステップＳ１１１肯定）、上位アドレスと対応付けてディレクトリキャッシュ３１に保持していたブロードキャストしたスヌープの結果が示すＣＰＵにスヌープを発行する（ステップＳ１１２）。その後、ノードコントローラ３０は、スヌープを発行し、コヒーレンシ処理を実行することによって同一性を保持したメモリデータ１１を要求元のＣＰＵへ送信し（ステップＳ１０６）、処理を終了する。【００８０】
また、ノードコントローラ３０は、上位アドレスがディレクトリキャッシュ３１からヒットしなかった場合には（ステップＳ１１１否定）、スヌープ要求をブロードキャスト発行する（ステップＳ１０８）。そして、ノードコントローラ３０は、スヌープの結果をディレクトリキャッシュ３１に格納する（ステップＳ１０９）。【００８１】
また、ノードコントローラ３０は、リード要求対象インデックスがエラーインデックスと一致しない場合には（ステップＳ１１０否定）、タグ情報にエラーが検出されたか否かを判別する（ステップＳ１１３）。そして、ノードコントローラ３０は、タグ情報にエラーが検出された場合には（ステップＳ１１３肯定）、エラーしたインデックスをエラーインデックス格納レジスタ３３に格納する（ステップＳ１０７）。一方、ノードコントローラ３０は、タグ情報からエラーが検出されなかった場合には（ステップＳ１１３否定）、メモリ１０からディレクトリデータ１２をリードする（ステップＳ１１４）。そして、ノードコントローラ３０は、リードしたディレクトリデータ１２をディレクトリキャッシュ３１に格納する（ステップＳ１１５）。その後、ノードコントローラ３０は、ディレクトリキャッシュ３１に格納されたディレクトリデータ１２が示すＣＰＵにスヌープを発行する（ステップＳ１０５）。【００８２】
［実施例１の効果］
上述したように、ノードコントローラ３０は、ディレクトリキャッシュ３１におけるタグ情報のエラーを検出した場合には、エラーしたインデックスをエラーインデックス格納レジスタ３３に格納する。また、ノードコントローラ３０は、リード要求を取得した場合には、リード要求対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致するか否かを判別する。そして、ノードコントローラ３０は、リード要求対象インデックスとエラーしたインデックスとが一致しない場合には、リード要求の対象となるメモリデータ１１に対応するディレクトリデータ１２に基づいて、メモリデータ１１のコヒーレンシを制御する。【００８３】
このため、ノードコントローラ３０は、エラーしたインデックス以外のインデックスを含むメモリアドレスを対象とするリード要求を受信した場合には、ディレクトリデータ１２を用いてコヒーレンシを制御する。つまり、ノードコントローラ３０は、スヌープをブロードキャスト発行せずとも、ディレクトリデータ１２に基づいて、コヒーレンシを制御することができる。この結果、ノードコントローラ３０は、ノード間の通信量を削減し、並列計算機システム１の性能を向上させることができる。【００８４】
また、ノードコントローラ３０は、リード要求対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致しない場合には、ディレクトリデータ１２が示すＣＰＵに対してスヌープを発行する。このため、ノードコントローラ３０は、リード要求を受信した際にスヌープをブロードキャストせずともメモリデータ１１のコヒーレンシを適切に保持することができるので、ノード間の通信量を削減し、並列計算機システム１の性能を向上させることができる。【００８５】
また、ノードコントローラ３０は、スヌープをブロードキャスト発行した場合には、スヌープの結果をディレクトリキャッシュ３１に格納する。また、ノードコントローラ３０は、再度受信したリード要求の対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致する場合には、ディレクトリキャッシュ３１にスヌープをブロードキャスト発行した結果が格納されているか否かを判別する。そして、ノードコントローラ３０は、スヌープをブロードキャストした結果が格納されていると判別した場合には、このスヌープ結果が示すＣＰＵに対してスヌープを発行する。つまり、ノードコントローラ３０は、信用できないディレクトリデータ１２を使用せずに、ディレクトリキャッシュ３１に格納しておいたスヌープの結果を用いて、コヒーレンシ処理を実行する。【００８６】
このため、ノードコントローラ３０は、エラーが発生したタグ情報が格納されているキャッシュラインと対応付けられたメモリアドレスに対するリード要求を連続して受信した場合にも、スヌープをブロードキャスト発行することなく、コヒーレンシを保持できる。この結果、ノードコントローラ３０は、ノード間の通信量を削減し、並列計算機システム１の性能を向上させることができる。【００８７】
一方、ノードコントローラ３０は、再度受信したリード要求の対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致する場合には、ディレクトリキャッシュ３１からリード要求の対象となるメモリアドレスを検索する。そして、ノードコントローラ３０は、ディレクトリキャッシュ３１にリード要求対象となるメモリアドレスのスヌープ結果がキャッシュされていない場合には、並列計算機システム１が有する全てのＣＰＵにスヌープをブロードキャスト発行する。【００８８】
つまり、ノードコントローラ３０は、新たなリード要求の対処となるメモリアドレスがエラーしたインデックスを含み、かつ、ディレクトリキャッシュ３１にスヌープ結果がキャッシュされていない場合には、スヌープをブロードキャスト発行する。このため、ノードコントローラ３０は、タグ情報にエラーが発生したキャッシュラインに格納される信用できないディレクトリデータ１２を使用しない。このため、ノードコントローラ３０は、適切にコヒーレンシ処理をおこなうことができる。【００８９】
また、ノードコントローラ３０は、ディレクトリデータ１２と対応するメモリデータ１１が格納されているメモリアドレスの下位アドレスをタグ情報としてディレクトリキャッシュ３１にキャッシュする。そして、ノードコントローラ３０は、発生したエラーを検出する。このため、ノードコントローラ３０は、ディレクトリキャッシュ３１において発生したエラーのうち、メモリ１０に格納されたディレクトリデータ１２によって回復させることができないエラーが発生した場合にのみ、スヌープをブロードキャスト発行する。この結果、ノードコントローラ３０は、ノード間の通信を押さえ、並列計算機システム１の性能を向上させることができる。
【実施例２】
【００９０】
これまで本発明の実施例について説明したが、上述した実施例以外にも様々な異なる形態にて実施されてよい。そこで、以下では実施例２として本発明に含まれる他の実施例を説明する。【００９１】
（１）並列計算機システムが有するノードについて
上述したノード２は、２つのＣＰＵ４０、５０を有していたが、実施例はこれに限定されるものではなく、任意の数のＣＰＵを有することとしてもよい。また、上述した並列計算機システム１は、ノード２と同様の構成を有するノード２ａや他のノードを有するものとしたが、実施例はこれに限定されるものではない。例えば、各ノードは、ノードコントローラ３０が実行する処理を同様の処理を実行する構成を有する限りは、それぞれ任意の構成を有してもよい。【００９２】
（２）ディレクトリデータについて
上述したディレクトリデータ１２は、「Ｖａｌｉｄ」、「Ｓｔａｔｕｓ」、「ＣＰＵ−ＩＤ」が格納されたデータであるとしたが、実施例はこれに限定されるものではない。すなわち、ディレクトリデータ１２は、対応するメモリデータ１１をキャッシュしたＣＰＵを示す情報と、キャッシュされたメモリデータ１１とメモリ１０に格納されたメモリデータ１１との関係を示すステータス情報とが格納されていればよい。【００９３】
また、上述した実施例１では、「Ｓｔａｔｕｓ」に格納される情報として、イリノイプロトコルによるステータス情報が格納されていた。しかし、実施例はこれに限定されるものではなく、任意のプロトコルによるステータス情報を格納することができる。【００９４】
また、上述したディレクトリキャッシュ制御回路３４は、スヌープをブロードキャスト発行した結果、スヌープ結果をディレクトリキャッシュ３１に格納していた。しかし、実施例はこれに限定されるものではない。【００９５】
例えば、ノードコントローラ３０は、エラーが発生したディレクトリを有するメモリアドレスに格納されたディレクトリデータ１２をキャッシュする補助メモリをさらに有する。そして、ディレクトリキャッシュ制御回路３４は、スヌープをブロードキャスト発行したスヌープ結果を補助メモリに格納する。その後、ディレクトリキャッシュ制御回路３４は、リード要求の対象インデックスがエラーインデックス格納レジスタ３３に格納されたインデックスと一致した場合には、補助メモリに格納されたスヌープ結果を用いて、スヌープを発行してもよい。【００９６】
（３）ノードコントローラの処理について
上述したノードコントローラ３０は、スヌープのブロードキャスト発行を極力行わないようにするため、リード要求対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致した場合には、以下の処理を実行した。すなわち、ノードコントローラ３０は、スヌープをブロードキャスト発行したスヌープ結果がディレクトリキャッシュ３１にキャッシュされているか否かを判別する。そして、ノードコントローラ３０は、スヌープ結果がディレクトリキャッシュ３１にキャッシュされている場合には、キャッシュされたディレクトリデータ１２が示すＣＰＵのみにスヌープを発行した。【００９７】
しかし、実施例は、これに限定されるものではない。例えば、ノードコントローラ３０は、リード要求対象インデックスとエラーインデックス格納レジスタ３３に格納されたインデックスとが一致した場合には、即時スヌープをブロードキャスト発行しても良い。このような処理を行うことによって、ノードコントローラ３０の構成を容易にすることができる。【００９８】
なお、ディレクトリキャッシュ制御回路３４は、スヌープ結果をディレクトリキャッシュ３１にキャッシュする場合には、エラーが発生したキャッシュラインにスヌープ結果を格納することとなる。しかし、実施例はこれに限定されるものではない。例えば、ディレクトリキャッシュ制御回路３４は、スヌープ結果をエラーが発生したキャッシュラインの異なるＷＡＹに格納しても良いし、異なるキャッシュラインに格納しても良い。【００９９】
（４）メモリアドレスについて
実施例１においては、各メモリデータ１１と各ディレクトリデータ１２とは、同じメモリアドレスが付与されているものとした。しかし、実施例は、これに限定されるものではない。例えば、メモリデータ１１と対応するディレクトリデータ１２とが異なるメモリアドレスが付与されている場合には、ディレクトリキャッシュ制御回路３４は、メモリデータ１１が格納されたメモリアドレスと、対応するディレクトリデータ１２が格納されたメモリアドレス（以下、ディレクトリアドレスと記載する。）とを対応付けて記憶する。【０１００】
また、ディレクトリキャッシュ制御回路３４は、ディレクトリデータ１２をディレクトリキャッシュ３１が有するキャッシュラインのうち、ディレクトリアドレスに応じたキャッシュラインに格納する。また、ディレクトリキャッシュ制御回路３４は、ディレクトリキャッシュ３１からエラーが検出された場合には、エラーが検出されたキャッシュラインに関わるディレクトリアドレスのインデックスをエラーインデックス格納レジスタ３３に格納する。【０１０１】
そして、ディレクトリキャッシュ制御回路３４は、リード要求を受信した場合には、リード要求が示すメモリアドレスと対応付けて記憶されたディレクトリアドレスを検索する。その後、ディレクトリキャッシュ制御回路３４は、検索したディレクトリアドレスのインデックスがエラーインデックス格納レジスタ３３に格納されているか否かを判別する。そして、ディレクトリキャッシュ制御回路３４は、検索したディレクトリアドレスのインデックスがエラーインデックス格納レジスタ３３に格納されている場合には、ディレクトリキャッシュを使用せずに、スヌープをブロードキャストする。【０１０２】
なお、メモリアドレスと対応するディレクトリアドレスを対応付けて記憶し、変換を行う処理は、メモリコントローラ２０に実行させるものとしてもよい。このような処理をメモリコントローラ２０に実行させることにより、ディレクトリキャッシュ制御回路３４は、リード要求のメモリアドレスのみを用いてメモリデータ１１とディレクトリデータ１２との要求をメモリコントローラ２０に要求するだけで、対応するメモリデータ１１とディレクトリデータ１２とを取得することができる。この結果、ディレクトリキャッシュ制御回路３４は、容易に実装を行うことができる。【０１０３】
このように、ディレクトリキャッシュ制御回路３４は、メモリアドレスとディレクトリアドレスとが同一ではない場合にも、適切に処理を実行し、各ノード間の通信効率を改善させ、並列計算機システム１の効率を改善することができる。
【符号の説明】
【０１０４】
１  並列計算機システム
２、２ａ  ノード
３、４、５、６、  システムバス
１０、１０ａ  メモリ
１１、１１ａ  メモリデータ
１２、１２ａ  ディレクトリデータ
２０、２０ａ  メモリコントローラ
３０、３０ａ  ノードコントローラ
３１、３１ａ  ディレクトリキャッシュ
３２、３２ａ  エラー検出回路
３３、３３ａ  エラーインデックス格納レジスタ
３４、３４ａ  ディレクトリキャッシュ制御回路
４０、４０ａ、５０、５０ａ  ＣＰＵ
４１、４１ａ、５１、５１ａ  キャッシュ
【図１】
2012124094.tif 000003
【図２】
2012124094.tif 000004
【図３】
2012124094.tif 000005
【図４】
2012124094.tif 000006
【図５】
2012124094.tif 000007
【図６】
2012124094.tif 000008
【図７】
2012124094.tif 000009
【国際調査報告】
2012124094.tif 000010
2012124094.tif 000011
2012124094.tif 000012