(57)【要約】  本発明は、コヒーレント共有メモリ・システムのプロセッサ・デバイスによって命令シーケンスの実行を調整するための方法に関する。命令が実行され、メモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる。メモリ・ラインは、メモリ・ラインについての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示す第１のフラグ情報を検知すると、プロセッサ・デバイスによってフラグを付けられる。メモリ・ラインは、メモリ・ラインについてのメモリ一貫性の伝搬が確認されたことを示す第２のフラグ情報を検知すると、プロセッサ・デバイスによってフラグを外される。メモリ・バリア命令を実行すると、メモリ・バリア命令の実行の完了は、メモリ・ラインがフラグを付けられている間、妨げられる。
2021519456.tif 000002
【特許請求の範囲】
【請求項１】
コヒーレント共有メモリ・システムのプロセッサ・デバイスによる複数の命令を含む命令シーケンスの実行を調整するための方法であって、前記プロセッサ・デバイスが、プロセッサ・キャッシュ・メモリに動作可能なように接続され、前記方法が、
前記プロセッサ・デバイスによって前記命令シーケンスの命令を実行することであって、前記命令の前記実行が、前記共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーを前記プロセッサ・キャッシュ・メモリに充填することを前記プロセッサ・デバイスに行わせる、前記実行すること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示す第１のフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインにフラグを付けること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたことを示す第２のフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインのフラグを外すこと、
前記命令シーケンスのメモリ・バリア命令を実行すると、前記メモリ・ラインがフラグを付けられている間、前記プロセッサ・デバイスによって、前記メモリ・バリア命令の実行の完了を妨げること
を含む、方法。
【請求項２】
前記メモリ・バリア命令の実行の前記完了が、前記プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる、請求項１に記載の方法。
【請求項３】
前記メモリ・ラインの前記フラグ付けが、前記メモリ・ラインの識別子を前記プロセッサ・デバイスのバッファに追加することを含み、前記フラグ付きメモリ・ラインの前記フラグ外しが、前記プロセッサの前記バッファから前記メモリ・ラインの前記識別子を削除することを含む、請求項１に記載の方法。
【請求項４】
前記バッファに記憶された前記フラグ付きメモリ・ラインの前記識別子が、前記メイン・メモリ内の前記個々のメモリ・ラインのメモリ・アドレスを含む、請求項３に記載の方法。
【請求項５】
前記メモリ・バリア命令の実行の前記完了が、前記プロセッサ・デバイスの前記バッファが空になるまで妨げられる、請求項３に記載の方法。
【請求項６】
前記共有メモリ・システムの前記メモリ一貫性が、コヒーレンス・ディレクトリを使用して実現される、請求項１に記載の方法。
【請求項７】
前記第１および前記第２のフラグ情報のうちの少なくとも１つが、前記コヒーレンス・ディレクトリから前記プロセッサ・デバイスによって受け取られたメッセージによって提供される、請求項６に記載の方法。
【請求項８】
前記第１および前記第２のフラグ情報のうちの少なくとも１つが、前記コヒーレンス・ディレクトリに前記プロセッサ・デバイスによって送られたメッセージによって提供される、請求項６に記載の方法。
【請求項９】
前記共有メモリ・システムの前記メモリ一貫性が、ブロードキャスティングを使用して実現される、請求項１に記載の方法。
【請求項１０】
前記メモリ・ラインの前記コピーを前記プロセッサ・キャッシュ・メモリに充填することを前記プロセッサ・デバイスに行わせる前記命令が、前記個々のメモリ・ラインへのライト・アクセスを指定する命令である、請求項１に記載の方法。
【請求項１１】
前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が、前記共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリによって使用される前記メモリ・ラインのさらなるコピーを無効化することを含む、請求項１に記載の方法。
【請求項１２】
前記プロセッサ・キャッシュ・メモリの内容の修正に関するものであり、前記プロセッサ・デバイスによって処理されたメッセージが、一貫性伝搬フィールドを含み、前記一貫性伝搬フィールドが、前記修正についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報、前記修正についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報、または、フラグを付けるアクションも、フラグを外すアクションも要求されていないことを示すフラグ情報のうちの１つを含む、請求項１に記載の方法。
【請求項１３】
コヒーレント共有メモリ・システムのプロセッサ・デバイスであって、プロセッサ・キャッシュ・メモリに動作可能なように接続され、複数の命令を含む命令シーケンスの実行を調整するように構成され、前記調整することが、
前記命令シーケンスの命令を実行することであって、前記命令の前記実行が、前記共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーを前記プロセッサ・キャッシュ・メモリに充填することを前記プロセッサ・デバイスに行わせる、前記実行すること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインにフラグを付けること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたことを示すフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインのフラグを外すこと、
前記命令シーケンスのメモリ・バリア命令を実行すると、前記メモリ・ラインがフラグを付けられている間、前記メモリ・バリア命令の実行の完了を妨げること
を含む、プロセッサ・デバイス。
【請求項１４】
前記メモリ・バリア命令の実行の前記完了が、前記プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる、請求項１３に記載のプロセッサ・デバイス。
【請求項１５】
前記プロセッサ・デバイスが、コピーが前記プロセッサ・キャッシュ・メモリに充填されたが、前記個々のコピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないメモリ・ラインを登録するためのバッファを備え、前記メモリ・ラインの前記フラグ付けが、前記メモリ・ラインの識別子を前記プロセッサ・デバイスの前記バッファに追加することを含み、前記フラグ付きメモリ・ラインの前記フラグ外しが、前記プロセッサの前記バッファから前記メモリ・ラインの前記識別子を削除することを含む、請求項１３に記載のプロセッサ・デバイス。
【請求項１６】
前記バッファに記憶された前記フラグ付きメモリ・ラインの前記識別子が、前記メイン・メモリ内の前記個々のメモリ・ラインのメモリ・アドレスを含む、請求項１５に記載のプロセッサ・デバイス。
【請求項１７】
前記メモリ・バリア命令の実行の前記完了が、前記プロセッサ・デバイスの前記バッファが空になるまで妨げられる、請求項１５に記載のプロセッサ・デバイス。
【請求項１８】
共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための方法であって、
前記コヒーレンス・ディレクトリによって、前記共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持することであって、前記共有メモリ・システムのプロセッサ・デバイスが、前記プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへの前記メモリ・ラインのコピーの充填を開始し、前記フラグ情報が、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す、前記維持すること、
前記プロセッサ・デバイスに前記コヒーレンス・ディレクトリによって送られることになるメッセージに前記フラグ情報を含めること、
前記コヒーレンス・ディレクトリによって前記メッセージを前記プロセッサ・デバイスに送ること
を含む、方法。
【請求項１９】
前記コヒーレンス・ディレクトリが、前記メモリ・ラインの前記コピーの前記充填についてのメモリ一貫性を前記共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリに伝搬させるために、前記リモート・プロセッサ・キャッシュ・メモリの内容の修正が必要であると判定すると、前記メモリ・ラインに割り当てられた前記フラグ情報の前記維持を開始する、請求項１８に記載の方法。
【請求項２０】
前記コヒーレンス・ディレクトリが、前記メモリ・ラインの前記コピーの前記充填についての前記メモリ一貫性を前記リモート・プロセッサ・キャッシュ・メモリに伝搬させるために、前記リモート・プロセッサ・キャッシュ・メモリの前記内容の修正をリクエストするリクエストを前記リモート・プロセッサ・キャッシュ・メモリに送る、請求項１９に記載の方法。
【請求項２１】
前記コヒーレンス・ディレクトリによってリクエストされた前記修正が、前記リモート・プロセッサ・キャッシュ・メモリに含まれる前記メモリ・ラインのさらなるコピーの無効化を含む、請求項２０に記載の方法。
【請求項２２】
前記コヒーレンス・ディレクトリが、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬による、前記共有メモリ・システムの前記さらなるプロセッサ・デバイスの前記プロセッサ・キャッシュ・メモリの内容の前記修正を追跡するためのレジスタを備える、請求項１９に記載の方法。
【請求項２３】
前記レジスタが、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたとき、前記コヒーレンス・ディレクトリによって通知されることになる前記共有メモリ・システムのプロセッサ・デバイスのプロセッサ・キャッシュ・メモリを識別する一貫性伝搬通知指標を含む、請求項２２に記載の方法。
【請求項２４】
共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリであって、
前記共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持することであって、前記共有メモリ・システムのプロセッサ・デバイスが、前記プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへの前記メモリ・ラインのコピーの充填を開始し、前記フラグ情報が、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す、前記維持すること、
メッセージに前記フラグ情報を含めること、
前記メッセージを前記プロセッサ・デバイスに送ること
を行うように構成された、コヒーレンス・ディレクトリ。
【請求項２５】
共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、メイン・メモリ、および、プロセッサ・キャッシュ・メモリに動作可能なように接続されたプロセッサ・デバイスを備えるコヒーレント共有メモリ・システムであって、
前記プロセッサ・デバイスが、複数の命令を含む命令シーケンスの実行を調整するように構成され、前記調整することが、
前記命令シーケンスの命令を実行することであって、前記命令の前記実行が、前記メイン・メモリのメモリ・ラインのコピーを前記プロセッサ・キャッシュ・メモリに充填することを前記プロセッサ・デバイスに行わせる、前記実行すること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインにフラグを付けること、
前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたことを示すフラグ情報を検知すると、前記プロセッサ・デバイスによって、前記個々のメモリ・ラインのフラグを外すこと、
前記命令シーケンスのメモリ・バリア命令を実行すると、前記メモリ・ラインがフラグを付けられている間、前記メモリ・バリア命令の実行の完了を妨げること
を含み、
前記コヒーレンス・ディレクトリが、前記メモリ・ラインの前記コピーの前記充填の開始を判定すると、前記メイン・メモリの前記メモリ・ラインに割り当てられた前記フラグ情報を維持するように構成され、前記フラグ情報が、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたかどうかを示し、前記維持することが、
最初に、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されていないことを示すフラグ情報を第１のメッセージに含めること、
前記第１のメッセージを前記プロセッサ・デバイスに送ること、
前記伝搬の確認を得ると、前記フラグ情報を更新し、前記メモリ・ラインの前記コピーの前記充填についての前記共有メモリ・システム全体の前記メモリ一貫性の前記伝搬が確認されたことを示す前記更新したフラグ情報を第２のメッセージに含めること、
前記第２のメッセージを前記プロセッサ・デバイスに送ること
を含む、
コヒーレント共有メモリ・システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンピュータ・システムの分野に関する。より詳細には、コヒーレント共有メモリ・システムのプロセッサ・デバイスによる複数の命令を含む命令シーケンスの実行を調整するための方法、コヒーレント共有メモリ・システムのプロセッサ・デバイス、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための方法、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、および、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを備えるコヒーレント共有メモリ・システムに関する。
【背景技術】
【０００２】
共有メモリ・システムは、メモリ・アクセスを全て提供された複数のプロセッサを備え、したがって、データ処理の効率を改善する。共有メモリは、同じデータへの同時アクセスを複数のプロセッサに行わせ、データの冗長コピーを記憶しないようにし、プロセッサ間のデータ転送を可能にすることができる。共有メモリ・システムは、例えば、複数のプロセッサによるアクセスが可能なメイン・メモリを備える。プロセッサが、メイン・メモリのメモリ・ラインに高速アクセスできるようにするために、このような共有メモリ・システムのメモリ・アーキテクチャは、プロセッサによって処理されることになるデータをキャッシュするための複数のプロセッサ・キャッシュ・メモリをさらに備えることができる。例えば、各プロセッサは、１つまたは複数のプロセッサ・キャッシュ・メモリに動作可能なように接続されてもよい。
【０００３】
しかし、複数のプロセッサ・キャッシュ・メモリを有する共有メモリ・システムには、データ一貫性の欠如が原因で生じ得る複雑化のリスクがある。プロセッサ・キャッシュ・メモリのうちの１つに含まれるデータが更新されるたびに、異なるプロセッサが一貫性のないデータを使用しないようにするために、同じデータを処理するとき、残りのプロセッサ・キャッシュ・メモリ全てが、更新されたデータを使用することになるということが保証されなければならない。言い換えれば、共有メモリ・システムの全体にわたる一貫性を確立するために、共有メモリ・システム全体の一貫性の伝搬が保証されなければならない。
【０００４】
それまでに修正された期限切れのデータを、プロセッサが使用しないようにするために、メモリ動作の順序制約が必要になる。強く順序付けられたメモリ・モデルは、共有変数の値の変更が、実行されるマルチスレッド・プログラムの他のスレッドに常に可視でなければならないことを要求する。言い換えれば、メモリ動作の順序付けは、競争状態を避けるために、例外を可能にすることなく、予め定義されなければならない。しかし、強く順序付けられたモデルは柔軟性がなく、処理効率の限界を生じる可能性がある。対照的に、処理効率は、強い順序の緩和を可能にすることによって改善される可能性がある。問題を生じるまたは競争状態になることなく、並列に、または任意の順序であっても、実行され得る命令があってもよい。順序の緩和を可能にするメモリ・モデルは、弱く順序付けられたメモリ・モデルと呼ばれる。順序付けのいくつかのレベルをなおも維持するために、弱く順序付けられたメモリ・モデルは、特殊で明確に定義されたメモリ・バリア命令を介して確立されるメモリ・バリアを指定する。メモリ・バリア命令は、一貫性が保証され、必要であれば同期が実行されなければならない命令シーケンスにおけるポイントを定義する。このような弱いメモリ・モデルは、このようなメモリ・バリアが届けられたとき、共有変数の値への変更が、他のスレッドに可視になることが必要なだけであることを要求する。
【０００５】
弱く順序付けられたメモリ・モデルは、命令シーケンスを最適化するときの自由度を高くすることができる。最適化された命令シーケンスと、最適化されない命令シーケンスの両方において、メモリ・バリアにおける潜在的な共有変数の値が同じであることが確実に保証されなければならないだけである。具体的には、メモリ・バリアを含まない命令のブロック内のステートメントを並べ替えることは、安全であると仮定されてもよい。
【０００６】
共有メモリ・システムのメモリ一貫性を保証し、性能を改善するために、メモリ・バリアの実行および管理を絶えず改善する必要がある。
【発明の概要】
【０００７】
様々な実施形態は、コヒーレント共有メモリ・システムのプロセッサ・デバイスによる複数の命令を含む命令シーケンスの実行を調整するための方法、コヒーレント共有メモリ・システムのプロセッサ・デバイス、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための方法、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、および、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを備えるコヒーレント共有メモリ・システムを提供する。有利な実施形態が、従属請求項に記述される。本発明の実施形態は、互いに排他的でない場合、互いに自由に組み合わされてもよい。
【０００８】
１つの態様において、本発明は、コヒーレント共有メモリ・システムのプロセッサ・デバイスによる複数の命令を含む命令シーケンスの実行を調整するための方法に関する。プロセッサ・デバイスは、プロセッサ・キャッシュ・メモリに動作可能なように接続される。命令シーケンスの命令は、プロセッサ・デバイスによって実行される。命令の実行が、共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる。メモリ・ラインは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示す第１のフラグ情報を検知すると、プロセッサ・デバイスによってフラグを付けられる。フラグ付きメモリ・ラインは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示す第２のフラグ情報を検知すると、プロセッサ・デバイスによってフラグを外される。命令シーケンスのメモリ・バリア命令をプロセッサ・デバイスによって実行すると、プロセッサ・デバイスは、メモリ・ラインにフラグが付いている間、実行の完了を妨げる。
【０００９】
実施形態には、一貫性の伝搬がまだ確認されていない場合、メモリ・バリア命令が届けられる、すなわち実行されるとすぐ、命令シーケンスの実行が停止されることを、プロセッサ・デバイスが効率的に保証できるようになるという有益な効果があり得る。メモリ・ラインのフラグ付けは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示す。言い換えれば、フラグ付けは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性が確立されても、確立されなくても、情報が利用可能ではないことを示す。メモリ・ラインがフラグを外された場合、一貫性に関する問題はなく、むしろ、一貫性の伝搬が、明確かつはっきりと確認され、停止は必要ない。メモリ・ラインがフラグを付けられた場合、明確な確認を待たなければならず、停止が必要である。このような確認は、例えば、共有メモリ・システムのディレクトリ・ベースの一貫性を実行するディレクトリによって、または、メモリ・ラインの充填を実行するプロセッサ・デバイスによってブロードキャストされた一貫性の確立に関するリクエストに、共有メモリ・システムの残りのプロセッサ・デバイスがリプライ（応答）することによって行われてもよい。一貫性の伝搬が確認されていないメモリ・ラインだけがフラグを付けられる、すなわち、指標がフラグとして登録されるので、プロセッサ・デバイスのローカル・メモリ空間が節約される可能性がある。
【００１０】
実行は、メモリ・ラインがフラグを外されている、すなわち、共有メモリ・システム全体にメモリ一貫性が伝搬されたことが確認されたという条件の下で継続されるだけでもよい。共有メモリ・システム全体のメモリ一貫性の伝搬は、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填に関して、共有メモリ・システムの一貫性が確立されたことを意味する。命令シーケンスの実行の調整は、例えばプロセッサ・チップまたはプロセッサ・コアといった個々のプロセッサ・デバイスによって実行される。したがって、方法は、ディレクトリ・ベースの一貫性、およびブロードキャスト・ベースの一貫性のために使用可能であってもよい。
【００１１】
実施形態によれば、メモリ・バリア命令の実行の完了は、プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる。実施形態には、個々のメモリ・ラインのフラグを外すことが、メモリ・バリア命令の実行の継続の必要条件であるという有益な効果があり得る。プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されること、すなわち、プロセッサ・デバイスが、フラグ付きメモリ・ラインも、メモリ・ラインのフラグも含まないことが十分条件として実施されてもよい。したがって、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填を引き起こす命令は、メモリ・バリア命令が届けられるまでメモリ一貫性を考慮することなく、自由に実行されてもよい。メモリ・バリア命令が届けられるとすぐ、メモリ一貫性が確立され、メモリ・バリア命令が継続されると能動的に確認されなければならない。メモリ一貫性は、メモリ・バリア命令が実行される前に、共有メモリ・システム全体に伝搬されてもよい。しかし、メモリ・バリア命令は、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填全てについての共有メモリ・システム全体の一貫性の伝搬が完了していなければならないことが要求される命令シーケンス内のポイントを成す。個々の完了は、伝搬が成功したという明確な確認を要求することによって保証されてもよい。メモリ・バリアの実行の前に、一貫性の伝搬について知っていることがプロセッサによって確立されてもよいが、確立される必要はない。
【００１２】
実施形態によれば、メモリ・ラインのフラグ付けは、メモリ・ラインの識別子をプロセッサ・デバイスのバッファに追加することを含む。フラグ付きメモリ・ラインのフラグ外しは、プロセッサのバッファからメモリ・ラインの識別子を削除することを含む。実施形態には、共有メモリ・システム全体の一貫性の伝搬についての必要な確認がまだできていないメモリ・ラインがあってもなくても、バッファが直接の全体像を提供できるという有益な効果があり得る。バッファは、例えば、指標の順序付けられていないセットの形のフラグを提供することができる。メモリ・ラインを示す指標がバッファに含まれる場合、個々のメモリ・ラインに対する一貫性の伝搬は、まだ確認されていない。特定のメモリ・ラインについて、指標がバッファに含まれない場合、個々のメモリ・ラインに対する一貫性の伝搬は確認されている。フラグを付けられることになるメモリ・ラインを示す指標をバッファに追加することによってフラグがセットされてもよい。したがって、バッファは、伝搬されていないメモリ・ラインのバッファである。
【００１３】
実施形態によれば、メモリ・バリア命令の実行の完了は、プロセッサ・デバイスのバッファが空になるまで妨げられる。一貫性のチェックを必要とするメモリ・バッファ命令が実行される場合、実施形態には、一貫性のチェックを高速かつ効果的に実行するという有益な効果があり得る。バッファが指標を含まない場合、プロセッサ・デバイスによってプロセッサ・キャッシュ・メモリに以前に充填されたメモリ・ライン毎に、一貫性が確立され、確認されている。バッファがまだ指標を含んでいる場合、プロセッサ・デバイスは、これらの残りの指標に対する一貫性が確認され、バッファが空になるまで待つことになる。したがって、メモリ・バリア命令の後で実行された命令シーケンスの命令について、共有メモリ・システムは、コピーが以前にプロセッサ・キャッシュ・メモリに充填されたことがある全てのメモリ・ラインに対して一貫性があることが保証される可能性がある。
【００１４】
実施形態によれば、プロセッサ・キャッシュ・メモリの内容の修正に関するものであり、プロセッサ・デバイスによって処理されたメッセージは、一貫性伝搬フィールドを含む。一貫性伝搬フィールドは、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報、または、フラグを付けるアクションも、フラグを外すアクションも要求されていないことを示すフラグ情報のうちの１つを含む。
【００１５】
実施形態には、プロセッサ・デバイスと残りの共有メモリ・システムとの間の効率的な通信を可能にし、このことにより、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填、および、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填についての共有メモリ・システム全体の一貫性の伝搬に関するフィードバックを提供するという有益な効果があり得る。例えば、プロセッサ・デバイスは、メイン・メモリのメモリ・ラインへの排他ライト・アクセスをリクエストすることができる。プロセッサ・キャッシュ・メモリ内のリクエストがない場合、リクエストは、コヒーレンス・ディレクトリに送られても、共有メモリ・システムにわたってブロードキャストされてもよい。リクエストは、フラグを付けるアクションまたはフラグを外すアクションが必要ではないことを示すフラグ情報を含んでもよい。今まで、プロセッサ・キャッシュ・メモリへのメモリ・ラインの充填を実際に開始することなくリクエストだけが送られてきた。プロセッサ・デバイスによって受け取られるリクエストへのリプライは、受け取ったプロセッサがプロセッサ・キャッシュ・メモリに充填するリクエストしたデータのコピー、例えばライト排他コピーを含むことができる。リプライは、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を含むことができる。例えば、さらなるプロセッサ・デバイスのプロセッサ・キャッシュ・メモリに含まれるリクエストしたメモリ・ラインの共有リード・コピーを無効化することによって、共有メモリ・システム全体のメモリ一貫性が確立された後、同じことを実行するさらなるプロセッサ・デバイスによって無効化が確認されてもよい。確認は、コマンドの形のメッセージに含まれるプロセッサ・キャッシュ・メモリにメモリ・ラインのコピーを充填したプロセッサ・デバイスに送ることができ、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報を提供することによって、個々のメモリ・ラインのフラグを外すことを命令する。
【００１６】
さらなる態様において、本発明は、コヒーレント共有メモリ・システムのプロセッサ・デバイスに関する。プロセッサ・デバイスは、プロセッサ・キャッシュ・メモリに動作可能なように接続され、複数の命令を含む命令シーケンスの実行を調整するように構成される。調整は、命令シーケンスの命令の実行を含む。命令の実行が、共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる。調整は、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、個々のメモリ・ラインにフラグを付けることをさらに含む。メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報を検知すると、プロセッサ・デバイスは、メモリ・ラインのフラグを外す。命令シーケンスのメモリ・バリア命令を実行すると、プロセッサ・デバイスは、メモリ・ラインがフラグを付けられている間、メモリ・バリア命令の実行の完了を妨げる。
【００１７】
実施形態には、複数の命令を含む命令シーケンスの実行を調整するための前述の方法を効率的に実行するように構成されたコヒーレント共有メモリ・システムのプロセッサ・デバイスを提供するという有益な効果があり得る。
【００１８】
実施形態によれば、メモリ・バリア命令の実行の完了は、プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる。実施形態には、プロセッサ・デバイスによって以前に実行されたメモリ・ラインのコピーの充填全てについての共有メモリ・システムの一貫性が確認されるまで、メモリ・バリア命令が完了しないようにされることを、プロセッサ・デバイスが保証するという有益な効果があり得る。
【００１９】
実施形態によれば、プロセッサ・デバイスは、コピーがプロセッサ・キャッシュ・メモリに充填されたが、個々のコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないメモリ・ラインを登録するためのバッファを備える。メモリ・ラインのフラグ付けは、メモリ・ラインの識別子をプロセッサ・デバイスのバッファに追加することを含む。フラグ付きメモリ・ラインのフラグ外しは、プロセッサのバッファからメモリ・ラインの識別子を削除することを含む。
【００２０】
実施形態には、個々のコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないメモリ・ラインを登録するためのインフラストラクチャの使用という有益な効果があり得る。
【００２１】
実施形態によれば、メモリ・バリア命令の実行の完了は、プロセッサ・デバイスのバッファが空になるまで妨げられる。実施形態には、コピーがメモリ・バリア命令の完了前にプロセッサ・キャッシュ・メモリに充填されたが、確認がまだ必要な、いずれかのメモリ・ラインがあるかどうかという効果的な全体像がバッファによって提供され得るという有益な効果があり得る。バッファが空の場合、全ての必要な確認が行われている。バッファが空でない場合、プロセッサ・デバイスが待たなければならない未解決の確認がまだある。
【００２２】
さらなる態様において、本発明は、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための方法に関する。コヒーレンス・ディレクトリは、共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持する。共有メモリ・システムのプロセッサ・デバイスは、プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填を開始する。フラグ情報は、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す。コヒーレンス・ディレクトリは、フラグ情報をメッセージに含め、メッセージをプロセッサ・デバイスに送る。
【００２３】
実施形態には、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための効率的な方法を提供するという有益な効果があり得る。コヒーレンス・ディレクトリは、共有メモリ・システムの一貫性をチェックし、必要であれば、プロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填についての共有メモリ・システム全体の一貫性を確立するためのアクションを開始することができる。例えば、メモリ・ラインの排他ライト・コピー、または排他ライト・コピーの修正コピー、あるいはその両方がプロセッサ・キャッシュ・メモリに充填される場合、コヒーレンス・ディレクトリは、具体的には、共有メモリ・システムのさらなるプロセッサ・デバイスのプロセッサ・キャッシュ・メモリ内の、共有メモリ・システム全体のメモリ・ラインの他のコピーの無効化を開始することができる。例えば、期限切れのコピー、すなわち古くなったコピーは、共有メモリ・システムの別のプロセッサ・デバイスによってメモリ・ラインの一貫性のないコピーが将来使用されないようにするために無効化されてもよい。
【００２４】
実施形態によれば、コヒーレンス・ディレクトリは、メモリ・ラインのコピーの充填についてのメモリ一貫性を共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリに伝搬させるために、リモート・プロセッサ・キャッシュ・メモリの内容の修正が必要であると判定すると、メモリ・ラインに割り当てられたフラグ情報の維持を開始する。
【００２５】
実施形態には、処理容量が節約され、メモリ一貫性を保証するために、さらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリの内容が修正されなければならないことを、コヒーレンス・ディレクトリが判定した場合のみ、フラグ情報が生成され、維持され得るという有益な効果があり得る。例えば、共有リード・リクエストの場合、さらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリ内のリクエストしたメモリ・ラインの以前にロードされた共有リード・コピーは、追加の共有リード・リクエストによってメモリ一貫性が変更されないので、修正される必要はない。しかし、排他ライト・リクエストの場合、残りの共有リード・コピーの修正、すなわち無効化が、メモリ一貫性を確立するために必要になる可能性がある。
【００２６】
実施形態によれば、コヒーレンス・ディレクトリは、リクエストをリモート・プロセッサ・キャッシュ・メモリに送る。リクエストは、メモリ・ラインのコピーの充填についてのメモリ一貫性をリモート・プロセッサ・キャッシュ・メモリに伝搬させるために、リモート・プロセッサ・キャッシュ・メモリの内容の修正をリクエストする。
【００２７】
実施形態には、コヒーレンス・ディレクトリによってメモリ一貫性の効率的な制御を実行するという有益な効果があり得る。リクエストを送り、対応するリプライを受け取ることによって、コヒーレンス・ディレクトリが修正全ての開始または完了あるいはその両方を行うとすぐ、コヒーレンス・ディレクトリは、プロセッサ・デバイスへの一貫性の伝搬の完了を確認することができる。
【００２８】
実施形態によれば、コヒーレンス・ディレクトリは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬による、共有メモリ・システムのさらなるプロセッサ・デバイスのプロセッサ・キャッシュ・メモリの内容の修正を追跡するためのレジスタを備える。
【００２９】
実施形態には、一貫性の伝搬が完了したとき、修正を追跡し、判定するためのレジスタを効率的に実行するという有益な効果があり得る。
【００３０】
実施形態によれば、レジスタは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたとき、コヒーレンス・ディレクトリによって通知されることになる共有メモリ・システムのプロセッサ・デバイスのプロセッサ・キャッシュ・メモリを識別する一貫性伝搬通知指標を含む。
【００３１】
実施形態には、メモリ・バリア命令が実行された場合、共有メモリ・システムのどのプロセッサ・キャッシュ・メモリが一貫性について知らされなければならないかについて、すなわち、一貫性の伝搬の確認を将来明確にチェックする必要があり得るメモリ・ラインのコピーを、プロセッサ・キャッシュ・メモリのどれが充填されたかについて、コヒーレンス・ディレクトリが効率的に追跡できるようになることを保証するという有益な効果があり得る。
【００３２】
さらなる態様において、本発明は、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリに関する。コヒーレンス・ディレクトリは、共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持するように構成される。共有メモリ・システムのプロセッサ・デバイスは、プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填を開始する。フラグ情報は、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す。コヒーレンス・ディレクトリは、フラグ情報をメッセージに含め、メッセージをプロセッサ・デバイスに送るようにさらに構成される。
【００３３】
実施形態には、共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を効率的に維持するように構成された共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを提供するという有益な効果があり得る。
【００３４】
さらなる態様において、本発明は、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、メイン・メモリ、および、プロセッサ・キャッシュ・メモリに動作可能なように接続されたプロセッサ・デバイスを備えるコヒーレント共有メモリ・システムに関する。
【００３５】
プロセッサ・デバイスは、複数の命令を含む命令シーケンスの実行を調整するように構成される。調整は、命令シーケンスの命令の実行を含む。命令を実行すると、プロセッサ・デバイスは、メイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填する。メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、プロセッサ・デバイスは、個々のメモリ・ラインにフラグを付ける。メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報を検知すると、プロセッサ・デバイスは、個々のメモリ・ラインのフラグを外す。命令シーケンスのメモリ・バリア命令を実行すると、プロセッサ・デバイスは、メモリ・ラインがフラグを付けられている間、実行の完了を妨げる。
【００３６】
コヒーレンス・ディレクトリは、メモリ・ラインのコピーの充填の開始を判定すると、メイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持するように構成される。フラグ情報は、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す。最初に、コヒーレンス・ディレクトリは、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を第１のメッセージに含め、第１のメッセージをプロセッサ・デバイスに送る。コヒーレンス・ディレクトリは、伝搬の確認を得ると、フラグ情報を更新し、更新したフラグ情報を第２のメッセージに含める。更新したフラグ情報は、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを第２のメッセージの中で示す。更新したフラグ情報を伴う第２のメッセージは、コヒーレンス・ディレクトリによってプロセッサ・デバイスに送られる。
【００３７】
実施形態には、共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、メイン・メモリ、および、プロセッサ・キャッシュ・メモリに動作可能なように接続されたプロセッサ・デバイスを備えるコヒーレント共有メモリ・システムを提供するという有益な効果があり得る。共有メモリ・システムは、個々のプロセッサ・デバイスによる命令シーケンスの実行の調整を効率的に実行し、コヒーレンス・ディレクトリによる共有メモリ全体の一貫性の伝搬に対する制御を維持する。
【図面の簡単な説明】
【００３８】
【図１】コヒーレント共有メモリ・システムを実行するのに適した例示的なコンピュータ・システムの概略図である。
【図２】例示的なコヒーレント共有メモリ・システムの概略図である。
【図３】例示的なコヒーレント共有メモリ・システムの概略図である。
【図４】例示的なコヒーレント共有メモリ・システムの概略図である。
【図５】例示的なコヒーレント共有メモリ・システムの概略図である。
【図６】命令シーケンスの実行の例示的な方法の概略図である。
【図７】共有メモリ・システムの一貫性を実行する例示的な一貫性のあるディレクトリの概略図である。
【図８】共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理する例示的な方法の概略図である。
【図９】共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理する例示的な方法の概略図である。
【図１０Ａ】命令シーケンスを実行し、共有メモリ・システムのメモリ一貫性を実現する例示的な方法の流れ図である。
【図１０Ｂ】命令シーケンスを実行し、共有メモリ・システムのメモリ一貫性を実現する例示的な方法の流れ図である。
【図１１】共有メモリ・システムを実行する例示的なマルチプロセッサ・アーキテクチャを示す概略図である。
【発明を実施するための形態】
【００３９】
本発明の様々な実施形態の記述は例証のために提示されているが、網羅的であること、または開示された実施形態に限定されることを意図するものではない。記述された実施形態の範囲および思想から逸脱することなく、多くの変更形態および変形形態が当業者には明らかになるであろう。本明細書で使用される専門用語は、実施形態の原理、市場で見られる技術に対する実用的用途もしくは技術的改善を最も良く説明するように、または、本明細書で開示された実施形態を当業者が理解できるように選ばれた。
【００４０】
プロセッサ・キャッシュ・メモリは、データの将来のリクエストに、より速く対応できるようにするために、データを一時的に記憶する。プロセッサ・キャッシュに記憶されたデータは、例えばメイン・メモリといった、ほかの場所に記憶されたデータのコピー、すなわち複製であってもよい。リクエストされたデータをキャッシュ内で見つけることができたとき、キャッシュ・ヒットが発生し、一方で、リクエストされたデータをキャッシュ内で見つけることができなかったとき、キャッシュ・ミスが発生する。キャッシュ・ヒットは、例えばメイン・メモリのような、より遅いデータ・ストアからのデータの読込みよりも速い、プロセッサ・キャッシュ・メモリからのデータの読込みによって行われる。したがって、プロセッサ・キャッシュ・メモリを使用すると、コンピュータ・システムのシステム性能を高速化することができる。
【００４１】
プロセッサ・キャッシュ・メモリによってデータを提供するために、データは、例えばメイン・メモリのような補助記憶装置と、各ブロックが固定サイズである複数のブロック内のプロセッサ・キャッシュ・メモリとの間で転送される。このようなデータ・ブロックは、メモリ・ラインまたはキャッシュ・ラインと呼ばれる。メモリ・ラインがメイン・メモリからプロセッサ・キャッシュ・メモリにコピーされると、キャッシュ・エントリが作り出される。キャッシュ・エントリは、コピーされたデータ、すなわちメモリ・ライン、および、補助記憶装置内のリクエストされた位置、すなわち、メイン・メモリ内の個々のメモリ・ラインのアドレスを示すアドレス・タグを含むことができる。
【００４２】
例えばプロセッサのようなキャッシュ・クライアントが、補助記憶装置内の位置で読み書きする必要があるとき、すなわち、メモリ・ラインを読み込むか、書き込むとき、キャッシュ・クライアントは、キャッシュ・メモリ内の対応するエントリについて、まずチェックすることができる。プロセッサ・キャッシュ・メモリは、個々のメモリ・ラインのアドレスについて、全てのキャッシュ・エントリをチェックする。キャッシュ・ヒット、すなわち、捜していたアドレス・タグを含むキャッシュ・エントリが見つかった場合、プロセッサは、所望のアドレス・タグを有するプロセッサ・キャッシュ・エントリからデータをすぐに読み込むか、プロセッサ・キャッシュ・エントリに書き込むことができ、したがって、記憶されたメモリ・ラインを変更する。キャッシュ・ミスの場合、プロセッサ・キャッシュ・メモリは、新しいキャッシュ・エントリをアロケートし、例えばプロセッサといった別のキャッシュ・クライアントの別のキャッシュ・メモリから、または、補助メモリから、捜していたアドレス・タグを割り当てられたメモリ・ラインを新しいキャッシュ・エントリにコピーすることができる。次に、リクエストは、キャッシュ・メモリの新しいメモリ・ラインを有する新しいキャッシュ・エントリの内容から実現されてもよい。
【００４３】
キャッシュすると、データの、具体的には、繰り返し転送されているデータの、転送のための性能向上を実現することができる。例えば、プロセッサ・キャッシュ・メモリは、キャッシュ・メモリ内で発生するバッファリングによる、メモリ・ラインの最初の転送時の性能向上を実現することができる。さらに、プロセッサ・キャッシュ・メモリは、繰り返されるリクエストの場合、メイン・メモリではなく、より速い中間のプロセッサ・キャッシュ・メモリから個々のメモリ・ラインを取り出せるように、メイン・メモリからメモリ・ラインを取り出して、より速い中間のプロセッサ・キャッシュ・メモリに、このメモリ・ラインを記憶することによる性能向上を実現することができる。さらに、プロセッサ・キャッシュ・メモリは、中間のプロセッサ・キャッシュ・メモリにメモリ・ラインを直接記憶し、メイン・メモリへの個々のメモリ・ラインの転送を後のステージに延期することによって、修正されたメモリ・ラインを書き込む性能向上を実現することができる。代替として、メイン・メモリへの個々のメモリ・ラインの転送は、バックグラウンド処理として行われてもよい。
【００４４】
プロセッサ・キャッシュ・メモリは、複数のエントリを含むことができる。各エントリは、キャッシュ・ラインとも呼ばれるキャッシュ・データ、すなわちメモリ・ラインのコピーを含むことができ、キャッシュ・データは、例えばメイン・メモリのような、いくつかの補助記憶装置内のメモリ・ライン、すなわちメモリ・ブロックのデータのコピーである。各エントリは、アドレス・タグをさらに含むことができ、アドレス・タグは、エントリ、すなわちメモリ・ラインに含まれるデータを識別する。より正確には、アドレス・タグは、キャッシュ・エントリ内の個々のデータがそのデータのコピーである補助記憶装置に記憶されたデータを識別することができる。個々のキャッシュ・エントリへのライト・アクセスの場合、メモリ・ラインは修正され、したがって、補助記憶装置に記憶された、いくつかのデータの修正コピーを表すことができる。プロセッサ・キャッシュ・メモリ内のメモリ・ラインの修正後、個々のメモリ・ラインがそのコピーである補助記憶装置内のデータは、プロセッサ・キャッシュ・メモリに記憶されたメモリ・ラインと、補助記憶装置に記憶された対応するデータとの間の一貫性を保証するために、メモリ一貫性プロトコルを使用して更新されてもよい。さらに、各エントリは、個々のエントリ、すなわちメモリ・ラインに記憶されたデータの状態を識別する状態情報を含むことができる。
【００４５】
個々のキャッシュ・クライアントによってメモリ・ラインのコピーが修正される場合、同じアドレスを有する他のメモリ・ラインのコピー全てが旧式になる可能性がある。したがって、これらの旧式のメモリ・ラインの取扱いを管理することが必要になる可能性がある。メモリ一貫性を保証するために、メモリ・ラインの期限切れのコピーが、有効コピーとしてこれ以上使用されないことが保証されなければならない可能性がある。期限切れのコピーは、無効化されても、更新されてもよい。
【００４６】
例えばプロセッサ・コアまたはプロセッサ・チップのようなキャッシュ・クライアントが、補助記憶装置に記憶されると思われるデータにアクセスする必要があるとき、１つまたは複数のプロセッサ・キャッシュ・メモリを最初にチェックすることができる。リクエストしたメモリ・ラインのアドレス・タグにマッチするアドレス・タグを有する、これらのプロセッサ・キャッシュ・メモリのうちの１つの中でエントリを見つけることができる場合、補助記憶装置に記憶された対応するデータの代わりに、個々のプロセッサ・キャッシュ・メモリのエントリによって提供されたメモリ・ラインが使用されてもよい。この状況は、キャッシュ・ヒットと呼ばれる。キャッシュ・ミスの場合、すなわち、所望のメモリ・ラインの個々のアドレス・タグを有するエントリを、１つまたは複数のプロセッサ・キャッシュ・メモリの中で見つけることができないとき、所望のキャッシュされていないデータが、補助記憶装置から取り出される。ミス・ハンドリング中に補助記憶装置から取り出されたキャッシュされていないデータは、例えば、プロセッサ・キャッシュ・メモリにコピーされ、したがって、さらにアクセスしようとする場合にキャッシュ・ヒットできるようにすることができる。
【００４７】
１つまたは複数のプロセッサ・キャッシュ・メモリとメイン・メモリとの間、および、異なるキャッシュ・メモリ間の整合性を維持するために、キャッシュ処理は、キャッシュ一貫性プロトコルに従わなければならない可能性がある。
【００４８】
コンピュータ・アーキテクチャでは、メモリ一貫性は、共有メモリ・システムの複数のプロセッサ・キャッシュ・メモリに記憶された共有リソース・データの統一性を表す。メモリ一貫性を維持することは、共有メモリ・システムに特に重要なものであり得る。
【００４９】
例えば、各プロセッサに対して少なくとも１つの別個のプロセッサ・キャッシュ・メモリを有する共有メモリ・マルチプロセッサ・システムの形の共有メモリ・システムでは、例えば、メイン・メモリ内の１つのコピー、および、個々のメモリ・ラインのコピーをリクエストしたプロセッサのローカル・キャッシュ・メモリの１つまたは複数のそれぞれの中の１つといった、同じ共有メモリ・ラインの多くのコピーを有することができる可能性がある。コピーのうちの１つが変更されたとき、他のコピーは、この変更を反映しなければならない。メモリ一貫性は、プロセッサ・キャッシュ・メモリ内のメモリ・ラインのコピーの変更が、システムの全体にわたってタイムリに伝搬されることを保証する秩序である。
【００５０】
共有メモリ・システムは、複数のプロセッサ・キャッシュ・メモリを備えることができる。実施形態によれば、共有メモリ・システムは、例えばコンピュータのような、電子データ処理システムの形で提供されてもよい。例えば、個々の電子データ処理システムは、１つまたは複数のマルチコア・プロセッサを備える。各マルチコア・プロセッサは、プログラム命令を読み込んで実行する２つ以上の独立処理ユニット、すなわちコアを備える。これらのコアのそれぞれは、個々のコアによって使用されるデータをキャッシュするためのローカル・キャッシュ・メモリ、すなわち、個々のキャッシュ・メモリを提供されてもよい。実施形態によれば、ローカル・キャッシュ・メモリは、割り当てられたコアに提供されるだけでもよい。
【００５１】
さらなる例によれば、電子データ処理システムは、複数のプロセッサ・チップを備えることができる。プロセッサ・チップの２つ以上が、ローカル・プロセッサ・キャッシュ・メモリをそれぞれ備えることができ、すなわち、個々のキャッシュ・メモリに割り当てられたプロセッサ・チップに含まれるプロセッサを、個々のキャッシュ・メモリがサーブするだけである。
【００５２】
例えば、メモリ一貫性は、例えば、ＭＥＳＩ、または、Ｈ−ＭＥＳＩ、ＭＯＥＳＩ、ＭＥＳＩＦ、もしくはＭＥＲＳＩなどの変更形態のような、無効化ベースのメモリ一貫性プロトコルを使用して実行されてもよい。
【００５３】
ＭＥＳＩによれば、各キャッシュ・エントリは、変更（modified）、排他（exclusive）、共有（shared）、および無効（invalid）という４つの可能な状態のうちの１つを割り当てられる。状態は、例えば、２つの追加ビットを使用して示される。「変更」は、現在のキャッシュ・メモリだけに存在し、メイン・メモリに記憶された対応するデータ・ラインと比較して、汚れた、すなわち、修正されたメモリ・ラインを識別する。したがって、キャッシュ・メモリは、メイン・メモリ状態に記憶されたもはや有効ではないデータ・ラインの他の任意の読込みが許可される前に、変更されたメモリ・ラインをメイン・メモリに書き戻さなければならない。個々のメモリ・ラインの書き戻しは、変更から共有にメモリ・ラインの状態を変化させることができる。
【００５４】
「排他」は、メモリ・ラインが現在のキャッシュ・メモリだけに存在し、きれいな、すなわち、メイン・メモリに記憶された対応するデータ・ラインにまだ一致していることを識別する。排他状態は、例えば、別のキャッシュ・メモリからリード・リクエストを受け取ることに応答して、共有状態に変えられてもよい。このようなリード・リクエストを受け取ると、リクエストしたメモリ・ラインのコピーは、共有キャッシュ・メモリ・ラインとして、リクエストしているキャッシュ・メモリに送られてもよく、キャッシュ・メモリに残っているコピーされたキャッシュ・メモリ・ラインの状態は、共有に変えられてもよい。個々のメモリ・ラインの状態は、個々のメモリ・ラインに書き込まれると、例えば、排他から変更に変えられてもよい。
【００５５】
「共有」は、複数のキャッシュ・メモリに記憶される可能性があり、きれいな、メモリ・ラインを識別する。
【００５６】
「無効」は、メモリ・アクセスを満たすために使われておらず、かつ、使用される予定のないキャッシュ・エントリを識別する。キャッシュ・メモリ内のメモリ・ラインの状態は、個々のメモリ・ラインのコピーが、別のキャッシュ・メモリによって排他メモリ・ラインとしてリクエストされると、例えば、共有から無効に変えられてもよい。例えば、個々のメモリ・ラインの共有コピーは、排他コピーとして転送されてもよく、一方で、残りのコピーされたメモリ・ラインは、非一貫性、すなわち、異なるキャッシュ・メモリが、同じメモリ・ラインの異なるコピーを使用していることを避けるために無効化される。無効メモリ・ラインが読み込まれることになる場合、無効メモリ・ラインの有効コピー、すなわち共有または排他が、別のキャッシュ・メモリから、またはメイン・メモリから読み込まれなければならない。
【００５７】
４つの共通のＭＥＳＩプロトコル状態に加えてＭＯＥＳＩプロトコルは、変更と共有の両方のデータを表す第５の「所有（Owned）」状態を含む。これは、変更されたデータを共有する前にメイン・メモリに書き戻す必要性をなくすことができる。最終的にデータは書き戻されなければならないが、書き戻しは延期されてもよい。「変更」は、メモリ・ラインのただ１つの有効コピーであり、修正されたことがあるメモリ・ラインを識別する。
【００５８】
「所有」は、修正され得るただ１つのものであるメモリ・ラインのコピーを識別するが、他のプロセッサ・キャッシュ・メモリは、どうやっても修正できない有効コピーも同様に含むことができる。所有メモリ・ラインの修正は、メモリ・ラインを共有する他の全てのプロセッサ・キャッシュ・メモリにブロードキャストされなければならない。所有状態の導入は、データの汚れた共有を可能にし、すなわち、修正されたメモリ・ラインは、メイン・メモリを更新せずに様々なプロセッサ・キャッシュ・メモリを転々することができる。メモリ・ラインは、全ての共有コピーを無効化した後、変更状態に変えられてもよく、メイン・メモリに修正を書き戻すことによって共有状態に変えられてもよい。
【００５９】
メモリ・バリア命令は、メモリ・バリア命令の完了前に全てのメモリ命令が開始されること、および、メモリ・バリア命令の完了後まで、その後のメモリ命令が開始されないことを保証する順序付け機能を提供する。メモリ・バリア命令が完了すると、メモリ・バリア命令より前に開始した全てのメモリ・アクセスが完了する。
【００６０】
アウト・オブ・オーダー実行（out-of-order execution）にすることができる性能最適化を現代のプロセッサが用いることができるので、メモリ・バリア命令が必要になる可能性がある。例えばロードおよびストアのようなメモリ動作のこの並べ替えは、単一のスレッドの実行において気づかれなくなる可能性がある。しかし、同時発生のプログラムおよびデバイス・ドライバの場合、このような性能最適化は、十分に制御されない限り、挙動を予測できなくなる可能性がある。
【００６１】
共有メモリ・システムは、プロセッサ・デバイス全体のロードおよびストア・メモリ・アクセス命令の弱く順序付けられた実行を可能にするように構成される。プロセッサの命令シーケンスは、プロセッサ・デバイスによるシーケンスの以前のアクセス命令の実行、および、シーケンスのその後の命令の実行前の共有メモリ・システム全体の一貫性の伝搬を実施するメモリ・バリア命令を含む。実施形態には、コンピュータ・リソースをほとんど使用しなくても、高速実行を伴うメモリ・バリア命令を実行することという有益な効果があり得る。
【００６２】
典型的な一貫性伝搬は、メモリ・ラインの初めの方の値の１つまたは複数のキャッシュされたコピーを無効化することができる。
【００６３】
実施形態によれば、プロセッサ・デバイス全体のロードおよびストア・メモリ・アクセス命令の弱く順序付けられた実行を可能にする共有メモリ・システムは、複数のプロセッサを備える。各プロセッサは、伝搬されていないメモリ・ラインを記憶するための未伝搬バッファを備える。未伝搬バッファは、他のプロセッサへの一貫性の伝搬が不明のプロセッサによる以前のアクセスのメモリ・ライン・アドレスを追跡する。さらに、各プロセッサは、未伝搬バッファが空になるまで、プロセッサの命令シーケンスのその後のメモリ・アクセス命令の、プロセッサによる実行を停止することによって実行されるメモリ・バリア命令を含む。
【００６４】
実施形態によれば、コヒーレンス・ディレクトリによってプロセッサ・キャッシュ・メモリＮに送られることになるメモリ・ラインに関するメッセージは、メモリ・ラインについてのメモリ一貫性が伝搬されたかどうかを示す伝搬フィールドを含む。メモリ・ラインの初めの方のコピーをキャッシュした１つまたは複数のプロセッサ・キャッシュ・メモリから無効承認メッセージをコヒーレンス・ディレクトリが受け取ることを、メモリ・ラインに対するコヒーレンス・ディレクトリの一時エントリが予期する場合、コヒーレンス・ディレクトリは、メッセージの伝搬フィールドをｎｏにセットする。
【００６５】
メモリ・ラインの初めの方のコピーをキャッシュした１つまたは複数のプロセッサ・キャッシュから無効承認メッセージをコヒーレンス・ディレクトリが受け取らないことを、メモリ・ラインに対するディレクトリ・エントリ、またはディレクトリの一時エントリが予期する場合、コヒーレンス・ディレクトリは、メッセージの伝搬フィールドｙｅｓにセットする。ラインが一時エントリを有していた場合、および、メッセージの伝搬フィールドがｙｅｓにセットされた場合、コヒーレンス・ディレクトリは、ラインに対するコヒーレンス・ディレクトリの一時エントリ内のキャッシュＮに対する伝搬通知フィールドをｎｏにセットする。
【００６６】
メッセージの伝搬フィールドがｎｏにセットされた場合、コヒーレンス・ディレクトリは、メモリ・ラインに対するコヒーレンス・ディレクトリの一時エントリ内のキャッシュＮに対する伝搬通知フィールドをｙｅｓにセットする。
【００６７】
メモリ・ラインの一時エントリをコヒーレンス・ディレクトリが更新した場合、および、メモリ・ラインの初めの方のコピーをキャッシュしたプロセッサ・キャッシュ・メモリから無効承認メッセージをコヒーレンス・ディレクトリが受け取らないことを、更新した一時エントリが予期する場合、コヒーレンス・ディレクトリは、メモリ・ラインに対する一時エントリ内で伝搬通知フィールドがｙｅｓにセットされた各プロセッサ・キャッシュ・メモリに、メモリ・ラインについての伝搬メッセージを送る。
【００６８】
コヒーレンス・ディレクトリによってプロセッサ・キャッシュ・メモリに送信されたそれぞれのこのような伝搬メッセージについて、コヒーレンス・ディレクトリは、プロセッサ・キャッシュ・メモリに対する対応する伝搬通知フィールドをｎｏに、一時エントリ内でセットする。
【００６９】
実施形態によれば、コヒーレンス・ディレクトリは、メモリ・ラインに関するプロセッサ・キャッシュ・メモリからのメッセージをコヒーレンス・ディレクトリが受け取ることによって引き起こされるコヒーレンス・ディレクトリのアクションの一部として、メモリ・ラインの一時エントリを更新する。
【００７０】
実施形態によれば、バッファに記憶されたフラグ付きメモリ・ラインの識別子は、メイン・メモリ内の個々のメモリ・ラインのメモリ・アドレスを含む。実施形態には、メモリ・ラインを識別するのに効率的な識別子を提供するという有益な効果があり得る。メイン・メモリ内の、また場合によっては、同様にプロセッサ・キャッシュ・メモリ内のメモリ・ラインを識別するためにメモリ・アドレスが既に使用されているので、識別子を書き換えるまたは解釈するための追加のロジックは必要ではない。
【００７１】
実施形態によれば、共有メモリ・システムのメモリ一貫性は、コヒーレンス・ディレクトリを使用して実現される。実施形態には、共有メモリ・システム全体の一貫性の伝搬を制御、チェック、および確認することができるコヒーレンス・ディレクトリの形の中央ユニットを提供するという有益な効果があり得る。
【００７２】
実施形態によれば、第１および第２のフラグ情報のうちの少なくとも１つは、コヒーレンス・ディレクトリからプロセッサ・デバイスによって受け取られたメッセージによって提供される。実施形態には、共有メモリ・システム全体の一貫性の伝搬をコヒーレンス・ディレクトリが確認するという有益な効果があり得る。実施形態によれば、第１および第２のフラグ情報のうちの少なくとも１つは、コヒーレンス・ディレクトリにプロセッサ・デバイスによって送られたメッセージによって提供される。実施形態には、共有メモリ・システム全体の一貫性の伝搬を確認するための要件を公表するという有益な効果があり得る。
【００７３】
実施形態によれば、共有メモリ・システムのメモリ一貫性は、ブロードキャスティングを使用して実現される。実施形態には、共有メモリ・システムの一貫性を実行するためのブロードキャスト・ベースのプロトコルが、中央にあるコヒーレンス・ディレクトリを必要としないという有益な効果があり得る。さらに、中央にあるコヒーレンス・ディレクトリは、メモリ一貫性を実現するためにチェックおよび維持される必要がない。したがって、十分な帯域幅が利用できる場合、メモリ一貫性を実現するためのブロードキャスト・ベースのプロトコルは、メモリ・ラインの全てのトランザクションが、全てのプロセッサによって見られるリクエスト／リクエストを含むので、ディレクトリ・ベースのプロトコルより高速になる可能性がある。ブロードキャスト・ベースのプロトコルの欠点は、そのスケーラビリティの不足である。あらゆるリクエストは、システム内の全てのノード、すなわち、プロセッサ・キャッシュ・メモリ全てにブロードキャストされなければならず、システムが大きくなると、方法を実行するために必要な帯域幅が増大するということを意味する。
【００７４】
実施形態によれば、メモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる命令は、個々のメモリ・ラインへのライト・アクセスを指定する命令である。実施形態によれば、共有メモリ・システム全体のメモリ一貫性の伝搬は、共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリによって使用されるメモリ・ラインのさらなるコピーを無効化することを含む。実施形態には、メモリ・ラインの期限切れの共有リード・コピー、すなわち古くなったコピーをさらなるプロセッサ・デバイスが使用しないが、個々のメモリ・ラインの新しいコピーをプロセッサ・デバイスが書き込むことが保証され得るという有益な効果があり得る。
【００７５】
実施形態によれば、バッファに記憶されたフラグ付きメモリ・ラインの識別子は、メイン・メモリ内の個々のメモリ・ラインのメモリ・アドレスを含む。実施形態には、共通識別子を使用して、メイン・メモリ内、プロセッサ・キャッシュ・メモリ内、およびプロセッサ・デバイスのバッファ内のメモリ・ラインを識別するという有益な効果があり得る。
【００７６】
実施形態によれば、コヒーレンス・ディレクトリによってリクエストされた修正は、リモート・プロセッサ・キャッシュ・メモリに含まれるメモリ・ラインのさらなるコピーの無効化を含む。実施形態には、リモート・プロセッサ・キャッシュ・メモリのどれも、期限切れのメモリ・ラインのコピー、すなわち古くなったコピーを使用せず、一方で、個々のメモリ・ラインの新しいコピーをプロセッサ・キャッシュ・メモリにプロセッサ・デバイスが充填することを保証するという有益な効果があり得る。したがって、メモリ・ラインの一貫性のないコピーの使用、および、競争状態の導入は、効果的に避けることができる。
【００７７】
図１は、共有メモリ・システムを実行するのに適したコンピュータ・システム１００を描写する。本明細書に記述された方法は、コンピュータ化されたシステムによって自動化されるということが理解されよう。これらの方法は、ソフトウェア１１２、１２２（ファームウェア１２２を含む）、ハードウェア（プロセッサ）１０５、または、これらの組合せでさらに実行されてもよい。例示的な実施形態において、本明細書に記述された方法は、実行可能命令としてソフトウェアで実行され、パーソナル・コンピュータ、ワークステーション、ミニコンピュータ、またはメインフレーム・コンピュータなどの、専用または汎用デジタル・コンピュータによって使用されてもよい。最も一般的なシステム１００は、したがって、汎用コンピュータ１０１を含む。
【００７８】
例示的な実施形態において、ハードウェア・アーキテクチャの観点から、図１に示されるように、コンピュータ１０１は、プロセッサ１０５、メモリ・コントローラ１１５に連結されたメモリ（メイン・メモリ）１１０、および、ローカルな入出力コントローラ１３５を介して通信連結された１つまたは複数の入出力（Ｉ／Ｏ）デバイス（または周辺機器）１０、１４５を含む。入出力コントローラ１３５は、当技術分野で知られているような１つもしくは複数のバス、または他の有線接続もしくはワイヤレス接続であってもよいがこれらに限定されない。入出力コントローラ１３５は、コントローラ、バッファ、キャッシュ、ドライバ、リピータ、およびレシーバなどの追加の要素を、通信を可能にするために有してもよいが、簡略化のために省略される。さらに、ローカル・インターフェースは、前述の構成要素間の適切な通信を可能にするためのアドレス、制御、またはデータ接続、あるいはその組合せを含んでもよい。本明細書に記述されるように、Ｉ／Ｏデバイス１０、１４５は、一般に、当技術分野で知られた任意の一般的な暗号カードまたはスマート・カードを含んでもよい。
【００７９】
プロセッサ１０５は、特にメモリ１１０に記憶されたソフトウェアを実行するためのハードウェア・デバイスである。プロセッサ１０５は、任意のカスタム・メイドのもしくは市販のプロセッサ、中央処理装置（ＣＰＵ）、コンピュータ１０１と関連付けられたいくつかのプロセッサ間の補助プロセッサ、（マイクロチップもしくはチップ・セットの形の）半導体ベースのマイクロプロセッサ、マクロプロセッサ、または、一般に、ソフトウェア命令を実行するための任意のデバイスであってもよい。プロセッサ１０５は、１つもしくは複数のローカル・キャッシュ・メモリを備える、または、１つもしくは複数のローカル・キャッシュ・メモリと通信接続される、あるいはその両方であってもよい。プロセッサ１０５は、１つまたは複数のプロセッサ・コアを備えることができる。プロセッサ・コアのそれぞれは、１つまたは複数のローカル・プロセッサ・キャッシュ・メモリに動作可能なように接続されてもよい。プロセッサ１０５は、複数のプロセッサ・チップの形で実装されてもよく、各プロセッサ・チップは、１つまたは複数のローカル・プロセッサ・キャッシュ・メモリを備えることができる。プロセッサ・キャッシュ・メモリは、個々のキャッシュ・メモリを制御するためのキャッシュ・メモリ・コントローラをそれぞれ備えることができる。複数のプロセッサ・キャッシュ・メモリの場合、メモリ一貫性は、ディレクトリ・ベースのメモリ一貫性、またはブロードキャスト・ベースのメモリ一貫性の形で実行されてもよい。
【００８０】
メモリ１１０は、揮発性記憶素子（例えば、ランダム・アクセス・メモリ（ＤＲＡＭ、ＳＲＡＭ、ＳＤＲＡＭ、等などのＲＡＭ））、および不揮発性記憶素子（例えば、ＲＯＭ、消去可能プログラマブル・リード・オンリ・メモリ（ＥＰＲＯＭ）、電子的消去可能プログラマブル・リード・オンリ・メモリ（ＥＥＰＲＯＭ）、プログラマブル・リード・オンリ・メモリ（ＰＲＯＭ））のいずれか１つまたは組合せを含んでもよい。メモリ１１０は、分散アーキテクチャを有してもよく、ここで、様々な構成要素が互いに離れて置かれるが、プロセッサ１０５によってアクセスされてもよいということに留意されたい。
【００８１】
メモリ１１０内のソフトウェアは、１つまたは複数の別個のプログラムを含んでもよく、これらのプログラムのそれぞれが、論理機能、特に本発明の実施形態に含まれる機能を実行するための実行可能命令の順序付けられたリストを含む。図１の例では、メモリ１１０内のソフトウェアは、命令またはソフトウェア１１２を含む。
【００８２】
メモリ１１０内のソフトウェアは、典型的には、適切なオペレーティング・システム（ＯＳ）１１１も含むことになる。ＯＳ１１１は、本質的には、場合によってはソフトウェア１１２など、他のコンピュータ・プログラムの実行を制御する。
【００８３】
本明細書に記述された方法は、ソース・プログラム１１２、実行可能プログラム１１２（オブジェクト・コード）、スクリプト、または、実行されることになる命令１１２のセットを含む他の任意のエンティティの形で提供されてもよい。ソース・プログラムとして提供されるとき、個々のプログラムは、ＯＳ１１１とともに正しく動作するように、メモリ１１０に含まれても、含まれなくてもよいコンパイラ、アセンブラ、インタープリタ、または同様のものによって翻訳される必要がある。さらに、方法は、データおよびメソッドのクラスを有するオブジェクト指向プログラミング言語、あるいは、ルーチン、サブルーチン、もしくは関数、またはその組合せを有する手続き型プログラミング言語として書かれてもよい。
【００８４】
例示的な実施形態において、従来のキーボード１５０およびマウス１５５が、入出力コントローラ１３５に連結されてもよい。Ｉ／Ｏデバイス１４５などの他の出力デバイスは、入力デバイスを含んでもよく、例えば、プリンタ、スキャナ、マイクロフォン、および同様のものであるがこれらに限定されない。最終的に、Ｉ／Ｏデバイス１０、１４５は、入力と出力の両方を通信するデバイスをさらに含んでもよく、例えば、（他のファイル、デバイス、システム、またはネットワークにアクセスするための）ネットワーク・インターフェース・カード（ＮＩＣ）または変調器／復調器、無線周波数（ＲＦ）または他のトランシーバ、電話インターフェース、ブリッジ、ルータ、および同様のものであるがこれらに限定されない。Ｉ／Ｏデバイス１０、１４５は、当技術分野で知られた任意の一般的な暗号カードまたはスマート・カードであってもよい。システム１００は、ディスプレイ１３０に連結されたディスプレイ・コントローラ１２５をさらに含んでもよい。例示的な実施形態において、システム１００は、ネットワーク１６５に連結するためのネットワーク・インターフェースをさらに含んでもよい。ネットワーク１６５は、ブロードバンド接続を介した、コンピュータ１０１と、任意の外部サーバ、クライアントおよび同様のものとの間の通信のためのＩＰベースのネットワークであってもよい。ネットワーク１６５は、本明細書で論じられる方法のステップの一部または全てを実行するために含まれ得るコンピュータ１０１と外部システム３０との間でデータを送受信する。例示的な実施形態において、ネットワーク１６５は、サービス・プロバイダによって管理される、管理されたＩＰネットワークであってもよい。ネットワーク１６５は、例えば、ＷｉＦｉ、ＷｉＭａｘ等などのワイヤレス・プロトコルおよび技術を使用して、ワイヤレス式に実装されてもよい。ネットワーク１６５は、さらに、ローカル・エリア・ネットワーク、広域ネットワーク、メトロポリタン・エリア・ネットワーク、インターネット・ネットワーク、または、ネットワーク環境の他の類似のタイプなどのパケット交換型ネットワークであってもよい。ネットワーク１６５は、固定ワイヤレス・ネットワーク、ワイヤレス・ローカル・エリア・ネットワーク（ＬＡＮ）、ワイヤレス広域ネットワーク（ＷＡＮ）、パーソナル・エリア・ネットワーク（ＰＡＮ）、仮想プライベート・ネットワーク（ＶＰＮ）、イントラネット、または他の適切なネットワーク・システムであってもよく、信号を送受信するための機器を含む。
【００８５】
コンピュータ１０１がＰＣ、ワークステーション、スマート・デバイスまたは同様のものである場合、メモリ１１０内のソフトウェアは、基本入出力システム（ＢＩＯＳ：basic input output system）１２２をさらに含んでもよい。ＢＩＯＳは、始動時にハードウェアを初期化し、テストすること、ＯＳ１１１をスタートすること、および、ハードウェア・デバイス間のデータの転送をサポートすることを行う重要なソフトウェア・ルーチンのセットである。ＢＩＯＳは、コンピュータ１０１がアクティブにされるときにＢＩＯＳを実行できるように、ＲＯＭに記憶される。
【００８６】
コンピュータ１０１が動作中のとき、プロセッサ１０５は、メモリ１１０に記憶されたソフトウェア１１２を実行すること、メモリ１１０とデータを通信すること、および、ソフトウェアに従ってコンピュータ１０１の動作を全体的に制御することを行うように構成される。本明細書に記述された方法、およびＯＳ１１１は、全体的にまたは部分的に、典型的には後者であるが、プロセッサ１０５によって読み込まれ、場合によっては、プロセッサ１０５内にバッファされ、その後実行される。ストレージ１２０は、ＨＤＤストレージなどのディスク・ストレージを備えることができる。
【００８７】
図２は、コヒーレンス・ディレクトリ２１０を使用してディレクトリ・ベースの一貫性を実行するデータ処理システムの形の例示的なコヒーレント共有メモリ・システム２００を示す。コヒーレント共有メモリ・システム２００は、複数のＮ個のプロセッサ・コア２０２、２５２を備え、それぞれが、ローカル・プロセッサ・キャッシュ・メモリ２０４、２５４に接続される。相互接続ファブリック２０６を介して、プロセッサ・キャッシュ・メモリ２０４、２５４の間でデータが交換される。相互接続ファブリック２０６は、プロセッサ・キャッシュ・メモリ２０４、２５４とコヒーレンス・ディレクトリ２１０をさらに接続する。コヒーレンス・ディレクトリ２１０は、プロセッサ・キャッシュ・メモリ２０４、２５４の内容、すなわち、プロセッサ・キャッシュ・メモリ２０４、２５４に含まれるメモリ・ラインを追跡し、このようにして一貫性を実行する。さらに、相互接続ファブリック２０６は、キャッシュ・メモリ２０４、２５４をメモリ・ストレージ・インターフェース２１２に接続する。メモリ・ストレージ・インターフェース２１２を介して、例えばメイン・メモリのような、共有メモリの形の補助記憶装置との間でデータが送受信されてもよい。例えば、プロセッサ・コア１は、プロセッサ・キャッシュ・メモリ１からメモリ・ラインを取り出そうとするが、プロセッサ・キャッシュ・メモリ１が、リクエストしたメモリ・ラインの有効コピーを含まない、または、例えば、プロセッサ・コア１がライト・コピーをリクエストできるが、プロセッサ・キャッシュ・メモリ１がリード・コピーを含むことしかできないので、キャッシュ・ミスを生じる。プロセッサ・コア１は、所望のメモリ・ラインの有効コピーについてのリクエストを、相互接続ファブリック２０６を介してコヒーレンス・ディレクトリ２１０に送ることができる。コヒーレンス・ディレクトリ２１０は、さらなるプロセッサ・キャッシュ・メモリのいずれかが、リクエストしたメモリ・ラインを含むかどうかについてチェックする。さらなるプロセッサ・キャッシュ・メモリのうちの１つが、所望のメモリ・ラインを含む場合、コヒーレンス・ディレクトリ２１０は、所望のメモリ・ラインを含む個々のさらなるプロセッサ・キャッシュ・メモリにリクエストを転送することができる。さらなるプロセッサ・キャッシュ・メモリのどれも、所望のメモリ・ラインを含まない場合、コヒーレンス・ディレクトリ２１０は、メモリ・ストレージ・インターフェース２１２を介して補助記憶装置にリクエストを転送することができる。したがって、所望のメモリ・ラインの有効コピーは、個々のメモリ・ラインをキャッシュ・メモリ１に充填するリクエストしているプロセッサ・コア１に転送されてもよい。
【００８８】
図３は、ローカル・プロセッサ・キャッシュ・メモリ２０４、２５４をそれぞれが備えた複数のプロセッサ・コア２０２、２５２を備えるデータ処理システムの形の例示的なコヒーレント共有メモリ・システム２００を示す。メモリ一貫性は、ブロードキャスティングに基づいて実行される。図２の共有メモリ・システムとは対照的に、図３のコヒーレント共有メモリ・システム２００は、コヒーレンス・ディレクトリを備えていない。ブロードキャスト・ベースの一貫性の場合、プロセッサ・コア１は、キャッシュ・ミスの場合、所望のメモリ・ラインの有効コピーについてのリクエストを、相互接続ファブリック２０６を介して、コヒーレント共有メモリ・システム２００のさらなるプロセッサ・コア２からＮまでに、ブロードキャストする。所望のメモリ・ラインのリクエストした有効コピーを含むリプライをプロセッサ・コア１が受け取らない場合、プロセッサ・コア１は、相互接続２０６およびメモリ・ストレージ・インターフェース２１２を介して、補助記憶装置からコピーをリクエストすることができる。
【００８９】
図４は、複数のプロセッサ・チップ２０１、２５１を備えるデータ処理システムの形の例示的なコヒーレント共有メモリ・システム２００を示す。各プロセッサ・チップは、ローカル・プロセッサ・キャッシュ・メモリ２０４、２５４を提供される。キャッシュ・メモリ２０４のメモリ一貫性は、ブロードキャスティングに基づいて実行される。相互接続ファブリック２０６は、キャッシュ・メモリ２０４、２５４と、メモリ・ストレージ・インターフェース２１２との間の通信を可能にする。メモリ・ストレージ・インターフェース２１２は、例えば、メモリ・サブシステム・チップによって提供されてもよい。所望のメモリ・ラインの有効コピーの取り出しは、図３の方法と同様に行われてもよい。
【００９０】
図５は、複数のプロセッサ・チップ２０１、２５１を備えるデータ処理システムの形の例示的なコヒーレント共有メモリ・システム２００を示す。各プロセッサ・チップは、ローカル・プロセッサ・キャッシュ・メモリ２０４、２５４を提供される。キャッシュ・メモリ２０４のメモリ一貫性は、メモリ・サブシステム・チップ２０３によって提供されたコヒーレンス・ディレクトリ２１０を使用して実行される。メモリ・サブシステム・チップ２０３は、キャッシュ・メモリ２０４、２５４、コヒーレンス・ディレクトリ２１０と、メモリ・ストレージ・インターフェース２１２との間の通信を可能にする相互接続ファブリック２０６をさらに提供する。メモリ・ストレージ・インターフェース２１２は、例えば、メモリ・サブシステム・チップ２０３によって提供されてもよい。所望のメモリ・ラインの有効コピーの取り出しは、図２の方法と同様に行われてもよい。
【００９１】
図６は、バリア命令を使用して、例えばプロセッサ・チップ２０１のようなプロセッサ・デバイスによって命令の実行を調整する例示的な方法を示す。プロセッサ・チップ２０１は、命令を実行する命令実行ユニット２４６を備える。実行される命令は、メモリ・ラインのコピーを必要とすることもある。命令は、例えば、リード命令またはライト命令であってもよい。命令実行ユニット２４６は、プロセッサ・キャッシュ・メモリ２０４が、必要なメモリ・ラインを含むかどうかについてチェックする。キャッシュ・ミスの場合、リクエストが共有メモリ２１４に送られ、プロセッサ・キャッシュ・メモリ２０４にコピーを充填するための所望のメモリ・ラインのコピーをリクエストする。例えばリクエストまたはコマンドのような共有メモリ２１４に送られたメッセージ、および共有メモリ２１４から受け取られたメッセージは、ステップ３０２において、メモリ・ラインのコピーの充填についての共有メモリ・システム２００全体のメモリ一貫性の伝搬に関する情報についてチェックされる。例えば、メモリ・ラインのリクエストしたコピーを含む共有メモリ２１４からのリプライが受け取られてもよい。リプライによって提供されたメモリ・ラインのコピーは、例えば、前述の命令の実行を完了させるために、または、事前フェッチを使用して潜在的なその後の命令の実行を加速するために、プロセッサ・キャッシュ・メモリ２０４に充填される。ステップ３０２において、メッセージ自体、またはチェックのために生成されたメッセージのコピーが使用されてもよい。メッセージは、ステップ３０４においてチェックされる一貫性伝搬フィールドをそれぞれ含むことができる。メモリ・ラインのコピーの充填についてのメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を一貫性伝搬フィールドが含む場合、個々のメモリ・ラインの、例えばそのメモリ・アドレスのような指標は、ステップ３０６において、プロセッサ・チップ２０１のバッファ２４８に追加される。バッファ２４８は、未伝搬バッファとも呼ばれ、共有メモリ・システム２００全体のメモリ一貫性の伝搬がまだ確認されていないメモリ・ラインのアドレスの順序付けられていないセットを含むことができる。メモリ・ラインのコピーの充填についてのメモリ一貫性の伝搬が確認されたことを示すフラグ情報を一貫性伝搬フィールドが含む場合、個々のメモリ・ラインの指標は、指標が存在する場合、ステップ３０８において、プロセッサ・チップ２０１のバッファ２４８から削除される。バッファ２４８に関するアクションが必要ではないことを示す情報を一貫性伝搬フィールドが含む場合、３１０でアクションは行われない。
【００９２】
プロセッサ・チップ２０１の命令実行ユニット２４６によってメモリ・バリア命令を実行すると、バリア・リクエストはバッファ２４８に送られ、コヒーレント共有メモリ・システム２００全体の一貫性の伝搬がまだ確認されていないメモリ・ラインを示すいずれかの指標をバッファ２４８が含むかどうかについてチェックする。バッファ２４８がいずれかの指標を含む場合、ステップ３００において、バリア命令は、バッファ２４８が空になるまで待たされる。バッファ２４８が空でない限り、バリア命令の実行の完了は妨げられる。バッファ２４８が空であると判定されると、バリア・リプライが命令実行ユニット２４６に送られ、バッファ２４８が空であることを命令実行ユニット２４６に知らせる。バッファ２４８が空になるとすぐ、命令実行ユニット２４６は、バリア命令の実行を完了させる。
【００９３】
図７は、コヒーレント共有メモリ・システム２００の例示的なコヒーレンス・ディレクトリ２１０を示す。コヒーレント共有メモリ・システム２００は、複数のプロセッサ・キャッシュ・メモリ２０４、２４４を備え、これらのプロセッサ・キャッシュ・メモリは、相互接続ファブリック２０６を介して共有メモリ２１４と通信接続される。共有メモリ２１４は、複数のメモリ・ハブ２７０、２８０を備えることができる。キャッシュ・ミスの場合のプロセッサ・キャッシュ・メモリ２０４、２４４からのリクエストは、相互接続ファブリック２０６を介してコヒーレンス・ディレクトリ２１０に送られる。コヒーレンス・ディレクトリ２１０は、コヒーレンス・ディレクトリ２１０を制御するディレクトリ・コントローラ２７２を備える。コヒーレンス・ディレクトリ２１０は、ディレクトリ・テーブル２７４をさらに備えることができる。ディレクトリ・テーブル２７４は、エントリ毎に１つのメモリ・ラインを有する複数のエントリを含むことができる。言い換えれば、ディレクトリ・テーブル２７４の各エントリは、１つのメモリ・ラインに割り当てられてもよく、メモリ・ラインのコピーが、プロセッサ・キャッシュ・メモリ２０４、２４４の１つまたは複数によって使用される。エントリは、個々のエントリが割り当てられたメモリ・ラインのメモリ・アドレスを有するアドレス・タグ、ステータス情報、アクセス・タイプ情報、およびＩＤ情報を含むことができる。ステータス情報は、プロセッサ・キャッシュ・メモリ２０４、２４４内のメモリ・ラインのコピーのステータスが不変、すなわちＴ＝０であるかどうか、または、プロセッサ・キャッシュ・メモリ２０４、２４４内のメモリ・ラインのコピーが、ステータスが一時的、すなわちＴ＝１であるような変更を現在受けているかどうかを示すことができる。不変ステータスの場合、現在、変更は行われていない。エントリは、例えば共有リード・アクセス、または排他ライト・アクセスのような、プロセッサ・キャッシュ・メモリ２０４、２４４によるメモリ・ラインのアクセス・タイプをさらに識別することができる。さらに、メモリ・ラインのコピーを現在使用しているプロセッサ・キャッシュ・メモリ２０４、２４４は、ＩＤ情報によって識別されてもよく、ＩＤ情報は、例えば、識別されることになるプロセッサ・キャッシュ・メモリ２０４、２４４に動作可能なように接続されたプロセッサの識別子、または、個々のプロセッサ・キャッシュ・メモリ２０４、２４４自体の識別子、あるいはその両方を含むことができる。
【００９４】
プロセッサ・キャッシュ・メモリ２０４、２４４内のメモリ・ラインのコピーのステータスが一時的である場合、すなわちメモリ・ラインのコピーが、プロセッサ・キャッシュ・メモリ２０４、２４４を通じて一貫性を確立するために現在、変更を受けている場合、ディレクトリ・テーブルのエントリは、一時テーブル２７６内のエントリへのポインタを含むことができる。例えば、プロセッサ・キャッシュ・メモリ２０４、２４４のうちの１つによってメモリ・ラインの排他ライト・コピーがリクエストされた場合、他のプロセッサ・キャッシュ・メモリ２０４、２４４によって使用される共有リード・コピーは、無効化されなければならない。コヒーレンス・ディレクトリ２１０は、個々のメモリ・ラインについての共有メモリ・システム全体の一貫性の伝搬を追跡するための一時テーブル２７６を含むことができる。メモリ・ラインのコピーが一時的状態にある場合、一時テーブル２７６に個々のメモリ・ラインに対するエントリが生成されてもよい。一時テーブル２７６は、エントリ毎に１つのメモリ・ラインを有する複数のエントリを含むことができる。言い換えれば、一時テーブル２７６の各エントリは、プロセッサ・キャッシュ・メモリ２０４、２４４の１つまたは複数によって使用される一時的コピーを有する１つのメモリ・ラインに割り当てられてもよい。一時テーブル２７６のエントリは、個々のメモリ・ラインのコピーを現在使用しているプロセッサ・キャッシュ・メモリ２０４、２４４全てを識別することができる。これらのプロセッサ・キャッシュ・メモリ２０４、２４４のそれぞれについて、エントリは、例えば、共有リード、排他ライト、または無効のような、個々のプロセッサ・キャッシュ・メモリ２０４、２４４によって使用されるメモリ・ラインのコピーの最新状態を追跡することができる。さらに、エントリは、個々のプロセッサ・キャッシュ・メモリ２０４、２４４から受け取ったリクエスト、および、コヒーレンス・ディレクトリによって個々のプロセッサ・キャッシュ・メモリ２０４、２４４に送られた未解決のリクエスト、すなわち、リプライが必要なリクエストを、追跡することができる。最終的に、一時テーブルのエントリは、メモリ・ラインについての共有メモリ・システム全体のメモリ一貫性の伝搬の確認が、コヒーレンス・ディレクトリ２１０によって得られるとすぐ、個々のプロセッサ・キャッシュ・メモリ２０４、２４４が通知されなければならないかどうかを示す指標を、これらのプロセッサ・キャッシュ・メモリ２０４、２４４のそれぞれについて含めることができる。一時テーブル２７６は、一時テーブルのどのエントリが現在使用できるか、および、メモリ・ラインの一貫性の伝搬を追跡するためにどれが現在使用されているかを示すビット・ベクトル２７８が付属してもよい。
【００９５】
プロセッサ・キャッシュ・メモリ２０４、２４４のうちの１つからメモリ・ラインのコピーについてのリクエストを受け取ると、コヒーレンス・ディレクトリ２１０のディレクトリ・コントローラ２７２は、残りのプロセッサ・キャッシュ・メモリ２０４、２４４の１つが、リクエストしたメモリ・ラインの有効コピーを含むかどうかについて、ディレクトリ・テーブル２７４を使用して判定することができる。残りのプロセッサ・キャッシュ・メモリ２０４、２４４の１つが、リクエストしたメモリ・ラインの有効コピーを含む場合、ディレクトリ・コントローラ２７２は、リクエストしたメモリ・ラインのコピーを取り出すために、個々のプロセッサ・キャッシュ・メモリ２０４、２４４にリクエストを転送することができる。残りのプロセッサ・キャッシュ・メモリ２０４、２４４のどれも、リクエストしたメモリ・ラインの有効コピーを含まない場合、ディレクトリ・コントローラ２７２は、リクエストしたメモリ・ラインのコピーを個々のメモリ２７７から取り出すために、メモリ２７７を制御するメモリ・コントローラ２７５にリクエストを転送することができる。
【００９６】
図８は、共有メモリ・システムの一貫性を実行するコヒーレンス・ディレクトリ２１０を管理するための例示的な方法を示す。ステップ４００において、コヒーレンス・ディレクトリ２１０は、共有メモリ・システムの、例えばＣ０といったプロセッサ・キャッシュ・メモリから、相互接続ファブリック２０６を介してメッセージを受け取る。メッセージは、メモリ・ラインＬに関するものであってもよい。例えば、メッセージは、メモリ・ラインＬのコピーについてのリクエストであってもよい。コヒーレンス・ディレクトリ２１０のディレクトリ・コントローラ２７２は、ステップ４０２において、例えば、受け取ったメッセージに対するリプライの中で、プロセッサ・キャッシュ・メモリＣ０にメッセージＭを送る必要があるかどうかについてチェックすることができる。例えば、ＤＣは、リクエストしたメモリ・ラインＬを含むリプライの形のメッセージＭを、プロセッサ・キャッシュ・メモリＣ０に送らなければならない可能性がある。メッセージＭを送る必要がない場合、ディレクトリ・コントローラ２７２は、受け取ったメッセージを、その内容に応じて処理し続けることができる。メッセージＭを送る必要がある場合、方法は、ステップ４０４を続けることができる。ステップ４０４において、ディレクトリ・コントローラ２７２は、メモリ・ラインＬについての一時エントリを一時テーブル２７６が含むかどうかについてチェックする。このために、ディレクトリ・コントローラ２７２は、ディレクトリ・テーブル２７４を最初にチェックすることができる。ディレクトリ・テーブル２７４が、メモリ・ラインＬについてのエントリを有する場合、ディレクトリ・コントローラ２７２は、メモリ・ラインＬに割り当てられたエントリ一時テーブル２７６へのポインタを、ディレクトリ・テーブル２７４の個々のエントリが含むかどうかについてチェックすることができる。メモリ・ラインＬについての一時エントリを、一時テーブル２７６が含まない場合、方法は、ステップ４１０を続けることができる。ステップ４１０において、メモリ・ラインＬについての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたこと、すなわち、Prop=yesであることを示すメッセージＭに、フラグ情報が追加されてもよい。メモリ・ラインＬのコピーの一時的状態を共有メモリ・システムが含まないので、メモリ・ラインＬについてのメモリ一貫性は不変であり、伝搬は不要である。ステップ４１６において、メッセージＭは、相互接続ファブリック２０６を介してプロセッサ・キャッシュ・メモリＣ０に送られる。ステップ４１８において、プロセッサ・キャッシュ・メモリＣ０は、コヒーレンス・ディレクトリ２１０からメッセージＭを受け取る。
【００９７】
ステップ４０４において、メモリ・ラインＬについての一時エントリを一時テーブル２７６が含むと判定された場合、方法は、ステップ４０６を続けることができる。メモリ・ラインＬについての一時エントリは、メモリ・ラインＬについての一貫性が、共有メモリ・システム全体に伝搬しなければならないことを意味する。ステップ４０６において、一貫性を確立するために、共有メモリ・システムのプロセッサ・キャッシュ・メモリの１つまたは複数によって行われるべきアクションがあるかどうかが、一時テーブル２７６を使用してチェックされる。例えば、メモリ・ラインＬの１つまたは複数の有効コピーは、一貫性を確立するために、無効化されなければならないということが予期されてもよい。行われるべき残りのアクションがない場合、方法は、ステップ４０８において続くことができる。メモリ・ラインＬが一時的状態にある、すなわち一貫性が、メモリ・ラインＬについて、まだ確認されていないので、一時テーブル２７６におけるメモリ・ラインＬの一時エントリ内のプロセッサ・キャッシュ・メモリＣ０についての一貫性伝搬通知指標は、コヒーレンス・ディレクトリ２１０のディレクトリ・コントローラ２７２によって一貫性の伝搬の確認が得られるとすぐ、プロセッサ・キャッシュ・メモリＣ０が一貫性の伝搬の確認を提供されなければならないことを示すことができる。残りのアクションは、一貫性の伝搬が成功裏に完了された、すなわち、伝搬についての確認を提供したことを示さない。ステップ４０８において、プロセッサ・キャッシュ・メモリＣ０が、確認について知らされた場合、プロセッサ・キャッシュ・メモリＣ０についての伝搬通知指標は、プロセッサ・キャッシュ・メモリＣ０が、一貫性の伝搬の確認を提供される必要がないことを指標が示すように修正されてもよく、一方で、ステップ４１０において、個々の確認がメッセージＭに追加される。メッセージＭは、次に、ステップ４１６および４１８に示されるように、プロセッサ・キャッシュ・メモリＣ０に送られる。
【００９８】
行われるべきアクションがまだあることをステップ４０６のチェックが示す場合、方法は、ステップ４１２を続けられてもよい。行われるべきこのようなアクションは、メモリ・ラインＬの一時エントリに記録された未解決のリクエストによって示されてもよく、すなわち、まだ実行または確認されていないリクエストを識別する。ステップ４１２において、コヒーレンス・ディレクトリ２１０のディレクトリ・コントローラ２７２によって一貫性の伝搬の確認が得られるとすぐに、プロセッサ・キャッシュ・メモリＣ０が一貫性の伝搬の確認を提供されなければならないことを、一時テーブル２７６におけるメモリ・ラインＬの一時エントリ内のプロセッサ・キャッシュ・メモリＣ０についての一貫性伝搬通知指標が示すということが保証される。ステップ４１４において、フラグ情報がメッセージＭに追加されてもよく、メモリ・ラインＬについての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されなかったこと、すなわち、Prop=noであることを示す。メッセージＭは、次に、ステップ４１６および４１８に示されるようにプロセッサ・キャッシュ・メモリＣ０に送られる。
【００９９】
図９は、図８に示されたものと同じインフラストラクチャを使用して、共有メモリ・システムの一貫性を実行するコヒーレンス・ディレクトリ２１０を管理するための例示的な方法を示す。ステップ５００において、コヒーレンス・ディレクトリ２１０は、共有メモリ・システムの、例えばＣ０といったプロセッサ・キャッシュ・メモリから、相互接続ファブリック２０６を介してメッセージを受け取る。メッセージは、メモリ・ラインＬに関するものであってもよい。例えば、メッセージは、メモリ・ラインＬのコピーについてのリクエストであってもよい。ステップ５０２において、コヒーレンス・ディレクトリ２１０のディレクトリ・コントローラ２７２は、ディレクトリ・テーブル２７４および一時テーブル２７６を使用して、一時テーブル２７６内のメモリ・ラインＬについての一時エントリを、ディレクトリ・コントローラ２７２が更新したかどうかについてチェックする。一時テーブル２７６内のメモリ・ラインＬについての一時エントリの更新がないことを、ディレクトリ・コントローラ２７２が判定した場合、ディレクトリ・コントローラ２７２は、受け取ったメッセージを、その内容に応じて処理し続ける。一時テーブル２７６内のメモリ・ラインＬについての一時エントリを、ディレクトリ・コントローラ２７２が更新した場合、方法は、ステップ５０４を続けることができる。ステップ５０４において、一貫性を確立するために、共有メモリ・システムのプロセッサ・キャッシュ・メモリの１つまたは複数によって行われるべきアクションがあるかどうかが、一時テーブル２７６を使用してチェックされる。例えば、メモリ・ラインＬの一時エントリに応じて、共有メモリ・システムのプロセッサ・キャッシュ・メモリの１つによって使用されるメモリ・ラインＬのコピーの無効化を承認するリプライが期待されるかどうかがチェックされる。一貫性を確立するために、実行されるべきアクションが期待されることを、ディレクトリ・コントローラ２７２が判定した場合、ディレクトリ・コントローラ２７２は、例えば図８の方法に従って、受け取ったメッセージを、その内容に応じて処理し続けることができる。一貫性を確立するために、実行されるべきアクションが期待されないことを、ディレクトリ・コントローラ２７２が判定した場合、方法は、ステップ５０６を続けることができる。ステップ５０６において、メモリ・ラインＬについての共有メモリ・システム全体の一貫性の伝搬が確認された場合に通知されることになる、共有メモリ・システムのいずれかのプロセッサ・キャッシュ・メモリＣＸ（X∈{0, 1, ..., N}）を識別する一貫性伝搬通知指標を、メモリ・ラインＬの一時エントリが含むかどうかが、ディレクトリ・コントローラ２７２によってチェックされる。１つまたは複数のプロセッサ・キャッシュ・メモリＣＸをディレクトリ・コントローラ２７２が判定した場合、ステップ５０８において、コマンド「D2Ccmd.Propagated(addr A, Prop=yes)」の形のメッセージがプロセッサ・キャッシュ・メモリＣＸのそれぞれに送信され、メモリ・アドレスＡを有するメモリ・ラインＬについての共有メモリ・システム全体の一貫性の伝搬が確認されたこと、すなわち、Prop=yesであることを示す。ステップ５��２において、プロセッサ・キャッシュ・メモリＣＸによってメッセージが受け取られる。ステップ５１０において、通知されたプロセッサ・キャッシュ・メモリＣＸについての一貫性伝搬通知指標は、プロセッサ・キャッシュ・メモリＣＸについての情報要件がこれ以上ないことを指標が示すように変えられる。
【０１００】
図１０Ａおよび図１０Ｂは、コヒーレント共有メモリ・システムのプロセッサによるバリア命令を使用して命令シーケンスの実行を調整するための例示的な方法を示す。共有メモリ・システムの一貫性は、コヒーレンス・ディレクトリを使用して実行されてもよい。共有メモリ・システムのプロセッサ、すなわちＰ０は、命令シーケンスの命令を実行することができる。命令の実行は、メモリ・アドレスＡをメモリ・ラインに書き込むこと、すなわち、メモリ・アドレスＡを有するメモリ・ラインの修正コピーをＰ０のプロセッサ・キャッシュ・メモリに充填することを含むことができる。命令シーケンスに含まれるメモリ・バリア命令は、Ｐ０によって実行される。メモリ・バリア命令の実行は、メモリ・アドレスＡを有するメモリ・ラインの修正コピーについての共有メモリ・システム全体のメモリ一貫性の伝搬が完了され、確認されるまで、完了しないようにされる。例えば、Ｐ０ライトの効果は、例えばＰ１といった、共有メモリ・システムのさらなるプロセッサに伝搬しなければならない。最初に、プロセッサ・キャッシュ・メモリのどれも、アドレスＡを有するメモリ・ラインのコピーを保持することができない。したがって、コヒーレンス・ディレクトリを有するメモリ・ハブ上のディレクトリ・テーブルは、メモリ・ライン・メモリ・アドレスＡを参照するエントリを含まなくてもよい。
【０１０１】
ステップ６００において、プロセッサＰ１は、「ロードＡ」というリード命令を実行することができ、「ロードＡ」というリード命令は、Ｐ１のローカル・プロセッサ・キャッシュ・メモリＣ１においてミスする。したがって、Ｃ１は、例えば、C2Dreq.I2S(Addr=A, Prop=NA)といった、コヒーレンス・ディレクトリへのリクエストを発行し、このリクエストは、Ｐ１の未伝搬バッファＵＢ１に対するアクション（ＮＡ）が必要でないことを示す情報を含む。C2Dreq.I2S(Addr=A, Prop=NA)というリクエストは、プロセッサ・キャッシュ・メモリ（Ｃ）からコヒーレンス・ディレクトリ（Ｄ）に送られるリクエスト（ｒｅｑ）であり、アドレスＡを有するメモリ・ラインの共有リード・コピー（Ｓ）をリクエストする。ステップ６０２において、コヒーレンス・ディレクトリのディレクトリ・コントローラ、すなわちＤＣは、C2Dreq.I2S(Addr=A, Prop=NA)というリクエストを受け取る。ＤＣは、コヒーレンス・ディレクトリのディレクトリ・テーブル、すなわちＤＴ内で、メモリ・アドレスＡについてのエントリを見つけない。したがって、ＤＣは、不変タイプ、すなわちＴ＝０、および、共有リード・タイプ、すなわちＷ＝０の新しいエントリをＤＴ内に作る。ＤＴ内に結果として生じるエントリは、例えば、[Addr=A. T=0. W=0. P1 set in ID field]という形のものであってもよい。ＤＣは、メモリ・コントローラを使用して、リクエストされたデータ、すなわち、アドレスＡを有するメモリ・ラインのコピーを、メイン・メモリから得る。ステップ６０４において、ＤＣは、D2Creply.I2S(Addr=A, data, Prop=yes)というリプライをＰ１に送る。ステップ６０６において、Ｐ１は、存在する場合、アドレスＡをＵＢ１から削除するD2Creply.I2S(Addr=A, data, Prop=yes)というリプライを受け取る。D2Creply.I2S(Addr=A, data, Prop=yes)というリプライは、メモリ・ライン・アドレスＡの共有リード・コピーについてのエントリを作ること、および、メモリ・ライン・アドレスＡの受け取った共有リード・コピーをＣ１に充填することによって「ロードＡ」命令を満たすことを、ローカル・プロセッサ・キャッシュ・メモリＣ１に行わせる。
【０１０２】
ステップ６０８において、前述のアクションの完了後、Ｐ０は、「store A,value」という命令、すなわち、アドレスＡを有するメモリ・ラインに値を書き込む命令を実行し、この命令は、Ｐ０のＣ０においてミスすると仮定される。したがって、Ｃ０は、Ｐ０の未伝搬バッファＵＢ０に対するアクションがない（ＮＡ）C2Dreq.I2E(Addr=A, Prop=NA)というリクエストを発行し、リクエストをコヒーレンス・ディレクトリに送る。ステップ６１０において、ＤＣは、メモリ・アドレスＡを有するメモリ・ラインの排他ライト・コピーについてのC2Dreq.I2E(Addr=A, Prop=NA)というリクエストを受け取る。メモリ・アドレスＡを有するメモリ・ラインについて、ＤＣは、[Addr=A. T=0. W=0. P1 set in ID field]という上記で作った不変の共有リード・エントリをＤＴ内で見つける。ステップ６１２において、ＤＣは、Ｃ１内のメモリ・アドレスＡを有するメモリ・ラインの共有リード・コピーをＰ１に無効化させるために、D2Creq.S2I(Addr=A, Prop=yes)というリクエストをＰ１に送る。さらに、ＤＣは、一時テーブル、すなわちＴＴ内の未使用エントリのうちのいずれか１つを選び、例えば、そのインデックスをTTindexAと表す。ＤＣは、ＤＴエントリを一時的タイプ、すなわちＴ＝１に変え、[Addr=A.T=1. Pointer=TTindexA.]というエントリを生じる。さらに、ＤＣは、各プロセッサ・キャッシュ・メモリに対して、（LATEST_STATE, RECEIVED_REQUEST, SENT_REQUEST, PropNotify?）という構文に従って一時的状態をエンコードするために、TTindexAにおけるＴＴエントリを、[P0(E, -, -, yes). P1(S,-, S2I, no). P2(I, -, -, no)]にセットする。ＴＴエントリは、Ｐ０のＣ０が排他ライト・コピーを含み、Ｃ０への排他ライト・コピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬の確認が完了されるとすぐに知らされなければならないということを示す。Ｐ１は共有リード・コピーを含むが、コヒーレンス・ディレクトリは、Ｐ１のＣ１に送られた無効化リクエストの実行の確認を待つ。Ｃ０への排他ライト・コピーの充填についての一貫性の伝搬をＰ１のＣ１に知らせる必要はない。最終的に、共有メモリ・システムのさらなるプロセッサＰ２のプロセッサ・キャッシュ・メモリＣ２は、アドレスＡを有するメモリ・ラインの無効コピーを含み、一貫性の伝搬について知らされる必要はない。ＤＣは、メモリ・コントローラを使用して、リクエストされたデータ、すなわち、アドレスＡを有するメモリ・ラインのコピーを、メイン・メモリから得る。ステップ６１４において、ＤＣは、D2Creply.I2E(Addr=A, data, Prop=no)というリプライをプロセッサＰ０に送る。アドレスＡを有するメモリ・ラインについての一時エントリは、未解決のSENT_REQUESTを伴うＰ０以外の少なくとも１つのプロセッサ、すなわちＰ１を識別するので、Ｐ０へのリプライは、Prop=noを含み、Ｐ０についての一時エントリは、PropNotify=yesを含む。このシナリオでは、Ｐ１は、SENT_REQUEST=S2Iを含む。
【０１０３】
ステップ６１６において、Ｐ１は、存在する場合、ＵＢ１からアドレスＡを削除するD2Creq.S2I(Addr=A,Prop=yes)というリクエストを受け取る。D2Creq.S2I(Addr=A, Prop=yes)というリクエストは、アドレスＡを有するメモリ・ラインの共有リード・コピーを無効化することを、プロセッサ・キャッシュ・メモリＣ１にさらに行わせる。ステップ６１８において、Ｐ１は、アドレスＡを有するメモリ・ラインの共有リード・コピーの無効化を確認するC2Dreply.S2I(Addr=A, Prop=NA)というリプライを発行して、コヒーレンス・ディレクトリに送る。リプライは、ＵＢ１に対するアクションが必要でないこと、すなわちＮＡを示す。
【０１０４】
ステップ６２０において、Ｐ０は、アドレスＡを有するメモリ・ラインの排他ライト・コピーをＵＢ０に追加するD2Creply.I2E(Addr=A, data, Prop=no)というリプライを受け取る。D2Creply.I2E(Addr=A, data, Prop=no)というリプライは、アドレスＡを有するメモリ・ラインの排他ライト・コピーについてのエントリを作ること、および、個々のメモリ・ラインをＣ０に充填することをＣ０に行わせる。さらに、「store A, value」という命令は、アドレスＡを有するメモリ・ラインのコピーに個々の値を記憶させることによって実行される。一方では次のステップ６１２、６１６、および６１８、ならびに、その一方では次のステップ６１４および６２０は、並行に、または任意の順序で行われてもよい。
【０１０５】
ステップ６２２において、ディレクトリ・コントローラＤＣは、C2Dreply.S2I(Addr=A,Prop=NA)というリプライをプロセッサＰ１から受け取る。メモリ・アドレスＡについて、ＤＣは、[P0(E,-, -, yes). P1(S, -, S2I, no). P2(I, -, -, no)]というＴＴエントリへのポインタを有する[Addr=A. T=1. Pointer=TTindexA]という形の一時的タイプ、すなわちＴ＝１のエントリをＤＴ内で見つける。プロセッサＰ１からのC2Dreply.S2I(Addr=A, Prop=NA)というリプライは、ＴＴエントリにおけるＰ１の値をＤＣに更新させる。更新されたＴＴエントリは、[P0(E, -, -, yes). P1(I, -, -, no). P2(I, -, -, no)]になる。更新されたＴＴエントリは、共有メモリ・システムのプロセッサのいずれかへの未解決のSENT_REQUESTを含まず、したがって、共有メモリ・システム全体の一貫性の伝搬を確認する。さらに、更新されたＴＴエントリは、一貫性の伝搬が確認されたときにＰ０の通知をリクエストするP0(E, -, -, yes)という値を含む。
【０１０６】
ステップ６２４において、ＤＣは、D2Ccmd.Propagated(Addr=A,Prop=yes)というコマンドをプロセッサＰ０に送る。さらに、ＤＣは、Ｐ０についてのPropNotifyをクリアする、すなわち、ＴＴエントリを、[P0(E, -, -, no). P1(I, -, -, no). P2(I, -, -, no)]にセットする。このＴＴエントリは、共有メモリ・システムのプロセッサのいずれかへの未解決のSENT_REQUESTを含んでいないので、いずれの一時的状態も記述していない。言い換えれば、個々のＴＴエントリは、不変状態を記述している。したがって、ＤＣは、アドレスＡを有するメモリ・ラインについてのＤＴ内のエントリを、不変タイプ、すなわちＴ＝０、および、排他ライト・タイプ、すなわちＷ＝１にセットする。結果として生じるＤＴエントリは、[Addr=A. T=0. W=1. P0 set in ID field]である。最終的に、ＤＣは、ＴＴエントリをTTindexAでクリアし、一時テーブル内の未使用エントリ２７８にTTindexAを返す。
【０１０７】
ステップ６２６において、Ｐ０は、メモリ・バリア命令を実行する。メモリ・バリア命令は、例えば、完了予定の命令シーケンスによるよりも前に発行された全てのライト命令を要求してもよい。メモリ・バリア命令は、ＵＢ０が空になるまで完了されないようにされる。Ｐ０は、D2Ccmd.Propagated(Addr=A, Prop=yes)をコヒーレンス・ディレクトリからまだ受け取っていないので、ＵＢ０は、アドレスＡをまだ含んでおり、メモリ・バリア命令は、実行を完了しないようにされる。ステップ６２８において、Ｃ０は、アドレスＡをＵＢ０から削除するD2Ccmd.Propagated(Addr=A, Prop=yes)というリプライを受け取る。したがって、ステップ６２８において、Ｐ０上のＵＢ０は空であり、メモリ・バリア命令は完了する。ステップ６３０において、Ｐ０に対する命令シーケンスの実行が続く。
【０１０８】
例示的なディレクトリからキャッシュへの（Ｄ２Ｃ）メッセージは、例えば、「D2Creq()」というリクエスト、「D2Creply()」というリプライ、および「D2Ccmd()」というコマンドを含むことができる。D2Creq()というリクエストは、C2Dreply()というその後のリプライを要求する。D2Creply()というリプライは、C2Dreq()という前のリクエストに応答して送られる。D2Ccmd()というコマンドには、その後のリプライがない。
【０１０９】
例示的なキャッシュからディレクトリへの（Ｃ２Ｄ）メッセージは、例えば、「C2Dreq()」というリクエスト、「C2Dreply()」というリプライ、および「C2Dcmd()」というコマンドを含むことができる。C2Dreq()というリクエストは、C2Dreply()というその後のリプライを要求する。C2Dreply()というリプライは、C2Dreq()という前のリクエストに応答して送られる。C2Dcmd()というコマンドには、その後のリプライがない。
【０１１０】
メモリ・アクセス・タイプのメッセージ、すなわち、メモリ・ラインをプロセッサ・キャッシュ・メモリに充填することに関するメッセージが、プロセッサ・デバイスによって送られるか、受け取られたとき、プロセッサ・デバイスの一貫性伝搬チェック・ユニットは、プロセッサ・デバイスの未伝搬バッファに対して行う必要があるかどうか、また、どのアクションが必要であるかについて判定するために、メッセージの一貫性伝搬通知フィールドをチェックすることができる。メモリ・アクセス・タイプのメッセージは、プロセッサ・キャッシュ・メモリ内のメモリ・ラインの無効化に関するメッセージをさらに含んでもよい。メモリ・アクセス・タイプ・メッセージ内の一貫性伝搬通知フィールドの可能な値は以下の値を含むことができ、「Prop=yes」は、存在する場合、個々のメッセージ内のメモリ・ラインのメモリ・アドレスを未伝搬バッファから削除する。「Prop=no」は、個々のメッセージ内のメモリ・ラインのメモリ・アドレスを未伝搬バッファに追加する。「Prop=NA」は、未伝搬バッファに対するアクションを行わない。
【０１１１】
以下のテーブルには、例示的なディレクトリからキャッシュへの（Ｄ２Ｃ）リクエストが示される。
【０１１２】
【表１】
2021519456.tif 000003
【０１１３】
以下のテーブルには、例示的なディレクトリからキャッシュへの（Ｄ２Ｃ）リプライが示される。
【０１１４】
【表２】
2021519456.tif 000004
【０１１５】
【表３】
2021519456.tif 000005
【０１１６】
以下のテーブルには、例示的なディレクトリからキャッシュへの（Ｄ２Ｃ）コマンドが示される。
【０１１７】
【表４】
2021519456.tif 000006
【０１１８】
以下のテーブルには、例示的なキャッシュからディレクトリへの（Ｃ２Ｄ）リクエストが示される。
【０１１９】
【表５】
2021519456.tif 000007
【０１２０】
以下のテーブルには、例示的なキャッシュからディレクトリへの（Ｃ２Ｄ）リプライが示される。
【０１２１】
【表６】
2021519456.tif 000008
【０１２２】
以下のテーブルには、例示的なキャッシュからディレクトリへの（Ｃ２Ｄ）コマンドが示される。
【０１２３】
【表７】
2021519456.tif 000009
【０１２４】
図１１は、複数のプロセッサ・チップ２０１を備えるマルチプロセッサ・サーバ２００の形のマルチプロセッサ・コンピュータ・システムの形の例示的なコヒーレント共有メモリ・アーキテクチャを示す。マルチプロセッサ・サーバ２００は、メモリ・ハブ・チップ２０３のセットを備える。各プロセッサ・チップ２０１は、複数のポート２２４を備えてもよい。１つの実施形態によれば、プロセッサ・チップ２０１毎に用意されるポート２２４の数は、メモリ・ハブ・チップ２０３の数に等しくてもよい。各プロセッサ・チップ２０１は、プロセッサ・チップ２０１によって処理されることになるメモリ・ライン、すなわちメモリ・ラインをキャッシュするためのローカル・キャッシュ・メモリ２０４を提供される。サーバ２００のプロセッサ・チップ２０１は、全く同じに構成されても、されなくてもよい。アプリケーション・ソフトウェアは、１つまたは複数のプロセッサ・チップ２０１上で実行されてもよく、したがって、所与のアプリケーションは、類似のまたは異なるプロセッサ・チップ２０１を暗黙的にまたは明示的に活用し、類似のまたは異なるプロセッサ・チップ２０１から利益を受けることができる。
【０１２５】
各メモリ・ハブ・チップ２０３は、例えば、一連のダイナミック・ランダム・アクセス・メモリ集積回路を備えるデュアル・インライン・メモリ・モジュール（ＤＩＭＭ）といった、複数のローカル・メモリ・モジュール２３４を提供されてもよい。したがって、各メモリ・ハブ・チップ２０３は、メモリ・ハブ・デバイスを実現する。さらに、各メモリ・ハブ・チップ２０３は、複数のポート２２２を備えることができる。例えば、メモリ・ハブ・チップ２０３毎のポート２２２の数は、プロセッサ・チップ２０１の数に等しくてもよい。さらに、個々のメモリ・ハブ・チップ２０３に対してローカルなメモリ・モジュール２３４に記憶されたメモリ・ラインについて、各メモリ・ハブ・チップ２０３は、１つまたは複数のプロセッサ・チップ２０１のキャッシュ・メモリ２０４に記憶されたメモリ・ラインについてのディレクトリ・ベースの一貫性を実現するためのコヒーレンス・ディレクトリ２１０を備えることができる。サーバ２００のメモリ・ハブ・チップ２０３のセットについて、メモリ・ハブ・チップ２０３全てが、類似の機能を実行する各メモリ・ハブ・チップ２０３と全く同じにまたは同様に構成されてもよい。アプリケーション・ソフトウェアは、１つまたは複数のプロセッサ・チップ２０１上で実行されてもよく、したがって、所与のアプリケーションの性能は、典型的には、多くのかつ類似のメモリ・ハブ・チップ２０３によってサーブされているメモリから利益を受け、各特定のメモリ・アドレスは、単一の所定のメモリ・ハブ・チップ２０３によってサーブされている。
【０１２６】
各プロセッサ・チップ２０１は、例えば、シリアル通信接続といった、例えば、双方向ポイント・ツー・ポイント通信接続２３０を介して、各メモリ・ハブ・チップ２０３と通信連結されてもよい。したがって、各プロセッサ・チップ２０１は、メモリ・ハブ・チップ２０３の１つに対してローカルなメモリ・モジュール２３４のそれぞれへのメモリ・アクセスを提供されてもよい。メモリ・モジュール２３４へのアクセスは、ユニフォーム・メモリ・アクセス（ＵＭＡ）アーキテクチャに基づいて提供されてもよい。所与のメモリ・ライン、すなわちメモリ・ラインは、同じメモリ・ハブ・チップ２０３に対してローカルな、補助記憶装置、すなわちメイン・メモリとしての１つまたは複数のメモリ・モジュール２３４に記憶されてもよい。複数のメモリ・ラインを含む所与のメモリ・ページは、例えば、全てのメモリ・ハブ・チップ２０３のメモリ・モジュール２３４全体にインターリーブされてもよい。
【０１２７】
コンピュータ・システムは、例えば、１６個のプロセッサ・チップ２０１、および１２８個のメモリ・ハブ・チップ２０３を備えてもよい。この場合、各プロセッサ・チップ２０１は、メモリ・ハブ・チップ２０３のそれぞれに通信連結するために、１２８個のポート２２４を備えることができる。さらに、メモリ・ハブ・チップ２０３のそれぞれは、各メモリ・ハブ・チップ２０３が別個のポイント・ツー・ポイント通信接続２３０を介して各プロセッサ・チップ２０１に通信連結され得るように１６個のポート２２２を提供されてもよい。
【０１２８】
本発明の態様は、本発明の実施形態による方法、装置（システム）、およびコンピュータ・プログラム製品の流れ図またはブロック図あるいはその両方を参照しながら本明細書に記述される。流れ図またはブロック図あるいはその両方の各ブロック、および、流れ図またはブロック図あるいはその両方におけるブロックの組合せは、コンピュータ可読プログラム命令によって実行することができるということが理解されよう。
【０１２９】
本発明は、システム、方法、またはコンピュータ・プログラム製品、あるいはその組合せであってもよい。コンピュータ・プログラム製品は、本発明の態様をプロセッサに実行させるためのコンピュータ可読プログラム命令を有するコンピュータ可読ストレージ媒体（または複数の媒体）を含むことができる。
【０１３０】
コンピュータ可読ストレージ媒体は、命令実行デバイスによる使用のための命令を保持し、記憶することができる有形デバイスであることが可能である。コンピュータ可読ストレージ媒体は、例えば、電子ストレージ・デバイス、磁気ストレージ・デバイス、光ストレージ・デバイス、電磁気ストレージ・デバイス、半導体ストレージ・デバイス、または前述の任意の適切な組合せであってもよいがこれらに限定されない。コンピュータ可読ストレージ媒体のより具体的な例の完全に網羅されていないリストは、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、リード・オンリ・メモリ（ＲＯＭ）、消去可能プログラマブル・リード・オンリ・メモリ（ＥＰＲＯＭまたはフラッシュ・メモリ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、ポータブル・コンパクト・ディスク・リード・オンリ・メモリ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）、メモリ・スティック、フロッピー（Ｒ）・ディスク、命令が記録されたパンチ・カードまたは溝内隆起構造などの機械的にエンコードされたデバイス、および前述の任意の適切な組合せを含む。コンピュータ可読ストレージ媒体は、本明細書で使用されるように、電波もしくは他の自由に伝搬する電磁波、導波路もしくは他の伝送媒体を通じて伝搬する電磁波（例えば、光ファイバ・ケーブルを通過する光パルス）、またはワイヤを通じて伝送される電気信号など、本質的に過渡信号であると解釈されるべきではない。
【０１３１】
本明細書で記述されるコンピュータ可読プログラム命令は、コンピュータ可読ストレージ媒体から個々のコンピューティング・デバイス／処理デバイスに、あるいは、例えば、インターネット、ローカル・エリア・ネットワーク、広域ネットワーク、もしくはワイヤレス・ネットワーク、またはその組合せといったネットワークを介して外部コンピュータまたは外部ストレージ・デバイスに、ダウンロードされることが可能である。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、またはエッジ・サーバ、あるいはその組合せを備えることができる。各コンピューティング・デバイス／処理デバイス内のネットワーク・アダプタ・カードまたはネットワーク・インターフェースは、コンピュータ可読プログラム命令をネットワークから受信し、個々のコンピューティング・デバイス／処理デバイス内のコンピュータ可読ストレージ媒体に記憶するためにコンピュータ可読プログラム命令を転送する。
【０１３２】
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、インストラクション・セット・アーキテクチャ（ＩＳＡ）命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、または、Ｓｍａｌｌｔａｌｋ（Ｒ）、Ｃ＋＋、もしくは同様のものなどのオブジェクト指向プログラミング言語、および、「Ｃ」プログラミング言語もしくは類似のプログラミング言語などの従来の手続き型プログラミング言語を含む１つもしくは複数のプログラミング言語の任意の組合せで書かれたソース・コードもしくはオブジェクト・コードであってもよい。コンピュータ可読プログラム命令は、スタンド・アロン・ソフトウェア・パッケージとして全面的にユーザのコンピュータ・システムのコンピュータ上で、部分的にユーザのコンピュータ・システムのコンピュータ上で実行することができ、部分的にユーザのコンピュータ・システムのコンピュータおよび部分的にリモート・コンピュータ上で、または全面的にリモート・コンピュータもしくはサーバ上で実行することができる。後者のシナリオにおいて、リモート・コンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）もしくは広域ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを介して、ユーザのコンピュータ・システムのコンピュータに接続されてもよく、または（例えば、インターネット・サービス・プロバイダを使用してインターネットを介して）外部コンピュータに接続されてもよい。いくつかの実施形態において、例えば、プログラム可能論理回路機器、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、またはプログラマブル・ロジック・アレイ（ＰＬＡ）を含む電子回路機器は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用して電子回路機器を個別化にすることによって、コンピュータ可読プログラム命令を実行することができる。
【０１３３】
本発明の態様は、本発明の実施形態による方法、装置（システム）、およびコンピュータ・プログラム製品の流れ図またはブロック図あるいはその両方を参照しながら本明細書に記述される。流れ図またはブロック図あるいはその両方の各ブロック、ならびに流れ図またはブロック図あるいはその両方におけるブロックの組合せは、コンピュータ可読プログラム命令によって実行されることが可能であるということが理解されよう。
【０１３４】
これらのコンピュータ可読プログラム命令は、コンピュータまたは他のプログラム可能データ処理装置のプロセッサによって実行する命令が、流れ図またはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能／作用を実行するための手段を作り出すべく、汎用コンピュータ、専用コンピュータ、または機械を生み出す他のプログラム可能データ処理装置のプロセッサに提供されてもよい。コンピュータ、プログラム可能データ処理装置、または他のデバイス、あるいはその組合せに、特定の手法で機能するように指図できるこれらのコンピュータ可読プログラム命令は、命令が記憶されたコンピュータ可読ストレージ媒体が、流れ図またはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能／作用の態様を実行する命令を含む製品を含むべく、コンピュータ可読ストレージ媒体にさらに記憶されてもよい。
【０１３５】
コンピュータ可読プログラム命令は、コンピュータ、他のプログラム可能装置、または他のデバイス上で実行する命令が、流れ図またはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能／作用を実行するべく、コンピュータ実行処理を生み出すために、コンピュータ、他のプログラマブル装置、または他のデバイス上で一連の動作ステップが行われるように、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスにさらにロードされてもよい。
【０１３６】
図中の流れ図およびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータ・プログラム製品の可能な実装形態のアーキテクチャ、機能、および動作を示す。この点に関して、流れ図またはブロック図中の各ブロックは、指定された論理機能を実行するための１つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部を表すことができる。いくつかの代替実装形態において、ブロックに記された機能は、図に記された順序と異なる順序で行われてもよい。例えば、連続して示された２つのブロックは、実際には、実質的に並行に実行されてもよく、または、ブロックは、時には、含まれる機能に応じて逆の順序で実行されてもよい。ブロック図または流れ図あるいはその両方の各ブロック、ならびに、ブロック図または流れ図あるいはその両方におけるブロックの組合せは、指定された機能もしくは作用を実行する、または特殊用途のハードウェアおよびコンピュータ命令の組合せを実行する、特殊用途のハードウェア・ベースのシステムによって実行されることが可能であるということにも留意されたい。
【０１３７】
上述の特徴の可能な組合せは、以下であることが可能である。
１．コヒーレント共有メモリ・システムのプロセッサ・デバイスによる複数の命令を含む命令シーケンスの実行を調整するための方法であって、プロセッサ・デバイスが、プロセッサ・キャッシュ・メモリに動作可能なように接続され、方法が、
・  プロセッサ・デバイスによって命令シーケンスの命令を実行することであって、命令の実行が、共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる、実行すること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示す第１のフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインにフラグを付けること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示す第２のフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインのフラグを外すこと、
・  命令シーケンスのメモリ・バリア命令を実行すると、メモリ・ラインがフラグを付けられている間、プロセッサ・デバイスによって、メモリ・バリア命令の実行の完了を妨げること
を含む、方法。
２．メモリ・バリア命令の実行の完了が、プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる、項目１に記載の方法。
３．メモリ・ラインのフラグ付けが、メモリ・ラインの識別子をプロセッサ・デバイスのバッファに追加することを含み、フラグ付きメモリ・ラインのフラグ外しが、プロセッサのバッファからメモリ・ラインの識別子を削除することを含む、項目１または２のいずれかに記載の方法。
４．バッファに記憶されたフラグ付きメモリ・ラインの識別子が、メイン・メモリ内の個々のメモリ・ラインのメモリ・アドレスを含む、項目３に記載の方法。
５．メモリ・バリア命令の実行の完了が、プロセッサ・デバイスのバッファが空になるまで妨げられる、項目３または４のいずれかに記載の方法。
６．共有メモリ・システムのメモリ一貫性が、コヒーレンス・ディレクトリを使用して実現される、項目１ないし５のいずれかに記載の方法。
７．第１および第２のフラグ情報のうちの少なくとも１つが、コヒーレンス・ディレクトリからプロセッサ・デバイスによって受け取られたメッセージによって提供される、項目６に記載の方法。
８．第１および第２のフラグ情報のうちの少なくとも１つが、コヒーレンス・ディレクトリにプロセッサ・デバイスによって送られたメッセージによって提供される、項目６または７のいずれかに記載の方法。
９．共有メモリ・システムのメモリ一貫性が、ブロードキャスティングを使用して実現される、項目１ないし５のいずれかに記載の方法。
１０．メモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる命令が、個々のメモリ・ラインへのライト・アクセスを指定する命令である、項目１ないし９のいずれかに記載の方法。
１１．共有メモリ・システム全体のメモリ一貫性の伝搬が、共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリによって使用されるメモリ・ラインのさらなるコピーを無効化することを含む、項目１ないし１０のいずれかに記載の方法。
１２．プロセッサ・キャッシュ・メモリの内容の修正に関するものであり、プロセッサ・デバイスによって処理されたメッセージが、一貫性伝搬フィールドを含み、一貫性伝搬フィールドが、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報、修正についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報、または、フラグを付けるアクションも、フラグを外すアクションも要求されていないことを示すフラグ情報のうちの１つを含む、項目１ないし１１のいずれかに記載の方法。
１３．コヒーレント共有メモリ・システムのプロセッサ・デバイスであって、プロセッサ・キャッシュ・メモリに動作可能なように接続され、複数の命令を含む命令シーケンスの実行を調整するように構成され、調整することが、
・  命令シーケンスの命令を実行することであって、命令の実行が、共有メモリ・システムのメイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる、実行すること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインにフラグを付けること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインのフラグを外すこと、
・  命令シーケンスのメモリ・バリア命令を実行すると、メモリ・ラインがフラグを付けられている間、メモリ・バリア命令の実行の完了を妨げること
を含む、プロセッサ・デバイス。
１４．メモリ・バリア命令の実行の完了が、プロセッサ・デバイスによって以前にフラグを付けられた全てのメモリ・ラインがフラグを外されるまで妨げられる、項目１３に記載のプロセッサ・デバイス。
１５．プロセッサ・デバイスが、コピーがプロセッサ・キャッシュ・メモリに充填されたが、個々のコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないメモリ・ラインを登録するためのバッファを備え、メモリ・ラインのフラグ付けが、メモリ・ラインの識別子をプロセッサ・デバイスのバッファに追加することを含み、フラグ付きメモリ・ラインのフラグ外しが、プロセッサのバッファからメモリ・ラインの識別子を削除することを含む、項目１３または１４のいずれかに記載のプロセッサ・デバイス。
１６．バッファに記憶されたフラグ付きメモリ・ラインの識別子が、メイン・メモリ内の個々のメモリ・ラインのメモリ・アドレスを含む、項目１５に記載のプロセッサ・デバイス。
１７．メモリ・バリア命令の実行の完了が、プロセッサ・デバイスのバッファが空になるまで妨げられる、項目１５または１６のいずれかに記載のプロセッサ・デバイス。
１８．共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリを管理するための方法であって、
・  コヒーレンス・ディレクトリによって、共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持することであって、共有メモリ・システムのプロセッサ・デバイスが、プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填を開始し、フラグ情報が、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す、維持すること、
・  プロセッサ・デバイスにコヒーレンス・ディレクトリによって送られることになるメッセージにフラグ情報を含めること、
・  コヒーレンス・ディレクトリによってメッセージをプロセッサ・デバイスに送ること
を含む、方法。
１９．コヒーレンス・ディレクトリが、メモリ・ラインのコピーの充填についてのメモリ一貫性を共有メモリ・システムのさらなるプロセッサ・デバイスのリモート・プロセッサ・キャッシュ・メモリに伝搬させるために、リモート・プロセッサ・キャッシュ・メモリの内容の修正が必要であると判定すると、メモリ・ラインに割り当てられたフラグ情報の維持を開始する、項目１８に記載の方法。
２０．コヒーレンス・ディレクトリが、メモリ・ラインのコピーの充填についてのメモリ一貫性をリモート・プロセッサ・キャッシュ・メモリに伝搬させるために、リモート・プロセッサ・キャッシュ・メモリの内容の修正をリクエストするリクエストをリモート・プロセッサ・キャッシュ・メモリに送る、項目１９に記載の方法。
２１．コヒーレンス・ディレクトリによってリクエストされた修正が、リモート・プロセッサ・キャッシュ・メモリに含まれるメモリ・ラインのさらなるコピーの無効化を含む、項目２０に記載の方法。
２２．コヒーレンス・ディレクトリが、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬による、共有メモリ・システムのさらなるプロセッサ・デバイスのプロセッサ・キャッシュ・メモリの内容の修正を追跡するためのレジスタを備える、項目１９に記載の方法。
２３．レジスタが、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたとき、コヒーレンス・ディレクトリによって通知されることになる共有メモリ・システムのプロセッサ・デバイスのプロセッサ・キャッシュ・メモリを識別する一貫性伝搬通知指標を含む、項目２２に記載の方法。
２４．共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリであって、
・  共有メモリ・システムのメイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持することであって、共有メモリ・システムのプロセッサ・デバイスが、プロセッサ・デバイスに動作可能なように接続されたプロセッサ・キャッシュ・メモリへのメモリ・ラインのコピーの充填を開始し、フラグ情報が、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示す、維持すること、
・  メッセージにフラグ情報を含めること、
・  メッセージをプロセッサ・デバイスに送ること
を行うように構成された、コヒーレンス・ディレクトリ。
２５．共有メモリ・システムのメモリ一貫性を実現するコヒーレンス・ディレクトリ、メイン・メモリ、および、プロセッサ・キャッシュ・メモリに動作可能なように接続されたプロセッサ・デバイスを備えるコヒーレント共有メモリ・システムであって、
プロセッサ・デバイスが、複数の命令を含む命令シーケンスの実行を調整するように構成され、調整することが、
・  命令シーケンスの命令を実行することであって、命令の実行が、メイン・メモリのメモリ・ラインのコピーをプロセッサ・キャッシュ・メモリに充填することをプロセッサ・デバイスに行わせる、実行すること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインにフラグを付けること、
・  メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示すフラグ情報を検知すると、プロセッサ・デバイスによって、個々のメモリ・ラインのフラグを外すこと、
・  命令シーケンスのメモリ・バリア命令を実行すると、メモリ・ラインがフラグを付けられている間、メモリ・バリア命令の実行の完了を妨げること
を含み、
コヒーレンス・ディレクトリが、メモリ・ラインのコピーの充填の開始を判定すると、メイン・メモリのメモリ・ラインに割り当てられたフラグ情報を維持するように構成され、フラグ情報が、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたかどうかを示し、維持することが、
・  最初に、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されていないことを示すフラグ情報を第１のメッセージに含めること、
・  第１のメッセージをプロセッサ・デバイスに送ること、
・  伝搬の確認を得ると、フラグ情報を更新し、メモリ・ラインのコピーの充填についての共有メモリ・システム全体のメモリ一貫性の伝搬が確認されたことを示す更新したフラグ情報を第２のメッセージに含めること、
・  第２のメッセージをプロセッサ・デバイスに送ること
を含む、
コヒーレント共有メモリ・システム。
【図１】
2021519456.tif 000010
【図２】
2021519456.tif 000011
【図３】
2021519456.tif 000012
【図４】
2021519456.tif 000013
【図５】
2021519456.tif 000014
【図６】
2021519456.tif 000015
【図７】
2021519456.tif 000016
【図８】
2021519456.tif 000017
【図９】
2021519456.tif 000018
【図１０Ａ】
2021519456.tif 000019
【図１０Ｂ】
2021519456.tif 000020
【図１１】
2021519456.tif 000021
【国際調査報告】
2021519456.tif 000022
2021519456.tif 000023
2021519456.tif 000024