並列コンピュータ・システムの性能を改良するための装置、方法及びコンピュータ・プログラム
【課題】並列コンピュータ・システムの性能を改良するための装置、方法及びコンピュータ・プログラムを提供する。
【解決手段】第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラは、プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有(false sharing)の発生を検出し且つ第2プロセッサによる第1キャッシュ・ラインの偽共有を許可する。第1キャッシュ・ラインの偽共有が発生するのは、第1ローカル・キャッシュ・コントローラによって第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新する場合である。
【解決手段】第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラは、プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有(false sharing)の発生を検出し且つ第2プロセッサによる第1キャッシュ・ラインの偽共有を許可する。第1キャッシュ・ラインの偽共有が発生するのは、第1ローカル・キャッシュ・コントローラによって第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新する場合である。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、並列コンピュータ・システムに係り、さらに詳細に説明すれば、並列コンピュータ・システム内で動作するキャッシュ・コヒーレンス・プロトコルに係る。
【背景技術】
【0002】
従来の並列コンピュータ・システムは、一度に2つ以上のスレッド又はプロセッサによって同じキャッシュ・ライン・アドレスを更新することを許可しない。もし、プロセッサが関連するローカル・キャッシュ・メモリ装置(以下「ローカル・キャッシュ」と略記)内のキャッシュ・ラインを更新することを望んでいれば、従来の並列コンピュータ・システムは、先ず、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化しなければならない。従って、キャッシュ・コヒーレント機構は、ローカル・キャッシュを更新するように(例えば、ローカル・キャッシュ内のキャッシュ・ラインを無効化するように)、コンピュータ・システム内で実装される。従って、従来の並列コンピュータ・システム内の2つ以上の別個のスレッド又はプロセッサは、ローカル・キャッシュ間でキャッシュ・コヒーレンス動作を実行する場合、同じキャッシュ・ライン・アドレスを同時に更新することができない。
【発明の概要】
【発明が解決しようとする課題】
【0003】
2つ以上の別個のスレッド又はプロセッサによってアクセスされるときに同じキャッシュ・ライン・アドレスの同時的な更新を阻止するために、従来の並列コンピュータ・システムは、ローカル・キャッシュ間のより頻繁な通信(例えば、他のローカル・キャッシュへの無効化通知のブロードキャスト)を必要とし、ローカル・キャッシュ内のキャッシュ・ラインを頻繁に無効化する。
【課題を解決するための手段】
【0004】
本明細書は、複数のプロセッサ及び少なくとも1つの共有キャッシュ・メモリ装置(以下「共有キャッシュ」と略記)を備える、並列コンピュータ・システムの性能を改良するための装置、方法及びコンピュータ・プログラムを開示する。各プロセッサは、少なくとも1つのローカル・キャッシュ(例えば、L1キャッシュ)を含む。
【0005】
一側面では、並列コンピュータ・システムの性能を改良するための装置を提供する。本装置は、複数のプロセッサを備え、各プロセッサは、ローカル・キャッシュを有する。各プロセッサは、データ従属性(data dependency)を含まないソフトウェア・プログラム領域のプログラム・コードを実行する。各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するハードウェア・ローカル・キャッシュ・コントローラ(以下「ローカル・キャッシュ・コントローラ」と略記)に関連する。第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラは、プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有(false sharing)の発生を検出し且つ第2プロセッサによる第1キャッシュ・ラインの偽共有を許可する。第1キャッシュ・ラインの偽共有は、第1ローカル・キャッシュ・コントローラによって第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新するときに発生する。
【0006】
他の側面では、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットする。
【0007】
他の側面では、第2ローカル・キャッシュ・コントローラが第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新するとき、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットし、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、第2ローカル・キャッシュ・コントローラは、第2ローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットする。
【0008】
他の側面では、複数のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラ及び第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている第1ローカル・キャッシュ及び第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0009】
他の側面では、ローカル・キャッシュへの任意の書き込みが、複数のプロセッサによって共有される共有キャッシュにライトスルーされる。
【0010】
他の側面では、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される。
【0011】
他の側面では、第1キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に、当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない。
【0012】
他の側面では、複数のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。
【0013】
他の側面では、2つ以上のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する。
【0014】
他の側面では、2つ以上のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する。
【0015】
他の側面では、偽共有の発生を検出するために、第1ローカル・キャッシュ・コントローラ及び第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する。
【発明の効果】
【0016】
本発明は、並列コンピュータ・システムにおいて偽共有を許可することにより、ローカル・キャッシュへの書き込み動作が発生する都度の、キャッシュ・ラインを無効化するためのローカル・キャッシュ間の通信オーバーヘッドを減少させることができる。
【図面の簡単な説明】
【0017】
【図1】一実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【図2】一実施形態に従った、データ従属性を含まないソフトウェア・プログラム領域を例示する図である。
【図3】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図4】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図5】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図6】一実施形態に従った、偽共有を許可する状態図である。
【図7】一実施形態に従った、状態遷移を例示する図である。
【図8】一実施形態に従った、状態遷移を例示する図である。
【図9】一実施形態に従った、状態遷移を要約するテーブルである。
【図10】一実施形態に従った、図1及び図12〜図13に示すフローチャートを実装するための並列コンピュータ・システムを例示する図である。
【図11】一実施形態に従った、フラグ・ビットを示す図である。
【図12】一実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【図13】他の実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【発明を実施するための形態】
【0018】
図10は、複数のプロセッサ705〜715(例えば、IBM(R)PowerPC(R)プロセッサ)及び共有キャッシュ720を備える、一実施形態に従った並列コンピュータ・システム700を示す。各プロセッサは、ローカル・キャッシュ、例えば、プロセッサ705内のローカル・キャッシュ730、プロセッサ710内のローカル・キャッシュ735及びプロセッサ715内のローカル・キャッシュ740を含む。また、各プロセッサは、ローカル・キャッシュに関連するローカル・キャッシュ・コントローラを備える。ローカル・キャッシュ・コントローラは、ローカル・キャッシュ・メモリの読み取り及び書き込み動作を制御する。例えば、プロセッサ705に関連するローカル・キャッシュ・コントローラ745は、例えば、ローカル・キャッシュ730内のキャッシュ・ラインを無効化するためのフラグ・ビットをセットすることにより、ローカル・キャッシュ730を制御する。同様に、ローカル・キャッシュ・コントローラ750は、ローカル・キャッシュ735を制御し、ローカル・キャッシュ・コントローラ755は、ローカル・キャッシュ740を制御する。任意のローカル・キャッシュ・メモリ内の任意の更新は、例えば、バス又はネットワーク725を介して、共有キャッシュ720にライトスルーされる。また、共有キャッシュ720は、共有キャッシュ720を制御するキャッシュ・コントローラ722を含む。コンパイラ760は、高水準のプログラミング・コードを機械コードに変換するために設けられる。
【0019】
並列コンピュータ・システム700は、その性能を改良するために図1の方法ステップを実施する。図1のステップ100では、ソフトウェア・プログラム領域(例えば、図2に示すソフトウェア・ループ200)に入るときに、コンパイラ760は、当該ソフトウェア・プログラム領域がデータ従属性を含むか否かを決定する。コンパイラ760は、当該ソフトウェア・プログラムのどの部分を並列に実行可能であるかを知っている。なぜなら、ユーザが当該ソフトウェア・プログラムの特定のサブセットを並列に実行するように明示的に要求するか、又はコンパイラ760が対応するプログラム・コードを分析し且つ当該ソフトウェア・プログラムの特定のサブセットを並列に実行可能であると決定したからである。一旦、コンパイラ760が、当該プログラム・コードの一部を並列に実行可能であることを知ると、コンパイラ760は、並列タスク(即ち、複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域)の作成を扱うランタイム・ライブラリへの機能呼び出しを挿入する。コンパイラ760は、これらの並列タスクが開始する位置及び終了する位置に特殊命令を挿入する。一実施形態では、コンパイラ760は、並列に実行すべきソフトウェア・プログラム領域を作成する、ランタイム・ライブラリを呼び出す。従って、ランタイム・ライブラリは、ソフトウェア・プログラム領域を実行する直前に特殊命令を呼び出すとともに、ソフトウェア・プログラム領域を並列に実行した直後に特殊命令を呼び出す。他の実施形態では、コンパイラ760は、並列に実行されるソフトウェア・プログラム領域の最初の命令が1つの特殊命令であり、並列に実行されるソフトウェア・プログラム領域の最後の命令が他の特殊命令であるように、並列に実行すべきプログラム・コードを装備化(instrument)する。例えば、ソフトウェア・ループ200がデータ従属性を含むか否かを決定するために、コンパイラ760は、ソフトウェア・ループ200内の先行するソフトウェア・プログラム・ラインの出力がソフトウェア・ループ200内の後続するソフトウェア・プログラム・ラインの入力として使用されるか否かを評価する。図2のソフトウェア・ループ200において、アレイ「b」内の2つの別個の要素が同じデータ値を含んでいなければ、データ従属性は存在しない。なぜなら、先行するループ反復の出力は、後続するループ反復の入力として使用されないからである。さらに、コンパイラ760は、例えば、図2のソフトウェア・ループ200のループ出口条件に基づいて、データ従属性を含まないソフトウェア・プログラム領域の開始及び終了境界を決定する。図1のステップ110では、コンパイルの後、ソフトウェア・プログラム領域がデータ従属性を含まないことをコンパイラ760が決定することに応答して、全て又は一部のプロセッサは、データ従属性を含まないソフトウェア・プログラム領域を並列に実行する。例えば、少なくとも2つの異なるプロセッサが、図2のソフトウェア・ループ200を実行する。もし、ソフトウェア・プログラム領域内にデータ従属性があれば、単一のプロセッサが、データ従属性を含むソフトウェア・プログラム領域を実行することができる。データ従属性を含まないソフトウェア・プログラム領域を並列に実行する間、各プロセッサは、そのローカル・キャッシュを変更することができる。しかし、本実施形態によれば、各プロセッサがバリア(即ち、全ての参加プロセッサが到達しなければならないポイントであって、そのポイントの後にだけ、各プロセッサがその後続の実行を継続することができる)に到達するまで、ローカル・キャッシュ内の変更を他のローカル・キャッシュが観察する必要はない。
【0020】
図1のステップ120に示すように、全て又は一部のプロセッサが、データ従属性を含まないソフトウェア・プログラム領域を並列に実行することを開始するとき、各プロセッサのローカル・キャッシュに関連するローカル・キャッシュ・コントローラは、ソフトウェア・プログラム領域内の偽共有を許可する。偽共有とは、少なくとも2つの異なるローカル・キャッシュ・メモリ内の同じキャッシュ・ライン・アドレスの異なる部分を更新することを意味する。
【0021】
以下、図3〜図5を参照して、偽共有を許可する一実施形態を詳述する。ローカル・キャッシュ内のキャッシュ・ラインへの書き込み動作が発生するときには、対応するローカル・キャッシュ・コントローラは、当該ローカル・キャッシュ内の対応するキャッシュ・ライン330の偽共有ビット(図3の偽共有ビット300)をセットする。一実施形態では、全てのローカル・キャッシュ・コントローラは、全てのローカル・キャッシュをスヌープ(即ち、モニタ)する。従って、単一のローカル・キャッシュへの書き込み動作が発生するとき、他のローカル・キャッシュ・コントローラは、例えば、スヌーピングを通して、当該書き込み動作の発生を検出し且つ他のローカル・キャッシュ内の対応するキャッシュ・ラインの対応する偽共有ビットをセットする。従って、一実施形態では、ローカル・キャッシュ内の更新は、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化しない。並列コンピュータ・システム700が偽共有を許可するので、他のプロセッサは、その後に同じキャッシュ・ラインの異なる部分に書き込みを行うことができる。また、同じキャッシュ・ラインへのこの後続の書き込みは、他のローカル・キャッシュ内の同じキャッシュ・ラインを無効化しない。偽共有を許可することにより、並列コンピュータ・システム700は、ローカル・キャッシュへの書き込み動作が発生する都度の、キャッシュ・ラインを無効化するためのローカル・キャッシュ間の通信オーバーヘッドを減少させることができる。
【0022】
図1に戻って説明を続ける。ステップ130では、コンパイラ760は、各プロセッサがデータ従属性を含まないソフトウェア・プログラム領域の実行を完了する、プログラム・コード内の位置を決定する。例えば、図2では、コンパイラ760は、例えば、各プロセッサに関連するループ出口条件を評価することにより、各プロセッサがソフトウェア・プログラム領域の実行を完了することを決定する。具体的には、コンパイラ760は、各プロセッサが並列実行領域(parallel region)を完了するプログラム・コード内の位置(例えば、図2の位置210)が、各プロセッサに割り当てられた元のループ反復「N−1」のサブセクションの計算を各プロセッサが完了する直後のコードに対応することを決定する。図1のステップ140では、プロセッサがデータ従属性を含まないソフトウェア・プログラム領域の実行を完了することを検出するとき、コンパイラ760は、当該プロセッサに関連するローカル・キャッシュ・コントローラに対し、偽共有ビットがセットされているその関連するローカル・キャッシュ内のキャッシュ・ラインを無効化することを指示するための特殊命令(又は一連の特殊命令)を挿入する。従って、一実施形態では、並列コンピュータ・システム700は、バリアに到達するとき又はデータ従属性を含まないソフトウェア・プログラム領域を出るときに、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0023】
図3〜図5は、一実施形態における偽共有を例示する。最初に、ローカル・キャッシュ305及び他のローカル・キャッシュ310は、同じキャッシュ・ライン330を有する。図3に示すように、プロセッサ0上のスレッド0は、ローカル・キャッシュ305内のキャッシュ・ライン330にある第1部分335を変更する。また、ローカル・キャッシュ305内のこの変更は、共有キャッシュ315にライトスルーされる。ローカル・キャッシュ305のこの変更を(例えば、スヌーピングを通して)検出するとき、ローカル・キャッシュ310のローカル・キャッシュ・コントローラは、ローカル・キャッシュ310内のキャッシュ・ライン330の偽共有ビット350をセットする。偽共有ビット350は、プロセッサ又はスレッドがデータ従属性を含まないソフトウェア・プログラム領域を実行する間に、その対応するローカル・キャッシュ内のその対応するキャッシュ・ラインが変更されたことを示す。プロセッサ又はスレッドがデータ従属性を含まないソフトウェア・プログラム領域を実行する間、ローカル・キャッシュ間のコヒーレンス・トラフィック(例えば、キャッシュ・コヒーレンス動作等)は阻止される。任意のローカル・キャッシュは、最新のデータを有さないことがあるが、各ローカル・キャッシュは、それ自体の値を有することができる。図4に示すように、その後暫くして、プロセッサ・コア1上のスレッド1は、ローカル・キャッシュ310内のキャッシュ・ライン330にある第2部分340を変更する。この変更は、ローカル・キャッシュ305内のキャッシュ・ライン330の偽共有ビット300をセットすることを含む。また、ローカル・キャッシュ310内の変更は、共有キャッシュ315にライトスルーされる。ローカル・キャッシュ305及び310内で行われるこれらのローカル変更は、キャッシュ・コヒーレンス動作(例えば、キャッシュ・ライン330を無効化する動作)を呼び出さない。
【0024】
プロセッサがデータ従属性を含まないソフトウェア・プログラム領域を実行する間、どのローカル・キャッシュも最新のデータを有さない。各ローカル・キャッシュは、それ自体のデータ値を有する。ローカル・キャッシュ・コントローラを備える並列コンピュータ・システム700は、偽共有を許可する(即ち、同じキャッシュ・ライン内の異なる部分における書き込みを許可する)が、並列コンピュータ・システム700は、データ従属性を含まないソフトウェア・プログラム領域にある同じキャッシュ・ライン内の同じ部分を対象とする任意の後続書き込みを阻止する。そのようにするため、例えば、コンパイラ760に当該同じ部分を対象とする任意の後続書き込みを検出させる。一実施形態では、ローカル・キャッシュ内のキャッシュ・ラインにつき1つの偽共有ビットがある。偽共有ビットは、最初に0にセットされるが、偽共有及び/又はローカル書き込みが発生するときは常に、1にセットされる。他の実施形態では、キャッシュ・ラインにつき2以上の偽共有ビットを設けることができる。例えば、キャッシュ・ラインを幾つかのサブセクタに分割し、各サブセクタをそれ自体の偽共有ビットに関連付けることができる。
【0025】
図5に示すように、一実施形態では、バリアに到達するとき、各ローカル・キャッシュ・コントローラは、その関連するローカル・キャッシュにおいて、偽共有ビットがセットされているキャッシュ・ラインを無効化する。例えば、ローカル・キャッシュ305に関連するローカル・キャッシュ・コントローラは、例えば、対応する無効ビット320をセットすることにより、ローカル・キャッシュ305内のキャッシュ・ライン330を無効化する。同様に、ローカル・キャッシュ310に関連するローカル・キャッシュ・コントローラは、例えば、対応する無効ビット320をセットすることにより、ローカル・キャッシュ310内のキャッシュ・ライン330を無効化する。一実施形態では、ローカル・キャッシュ・コントローラは、例えば、共有キャッシュ315からデータを取り出すことにより、その関連するローカル・キャッシュ内の無効キャッシュ・ラインを有効化する。というのは、共有キャッシュ315は、キャッシュ「ライトスルー」方式に起因して、常に有効データを有するからである。
【0026】
図6は、一実施形態におけるローカル・キャッシュ内のキャッシュ・ラインの状態を示す状態遷移図400である。「R」は、ローカル・キャッシュ内のローカル読み取りイベントを表す。「W」は、ローカル・キャッシュ内のローカル書き込みイベントを表す。「oR」は、リモート読み取りイベント(他のスレッドが他のローカル・キャッシュ内の当該キャッシュ・ラインの読み取りを要求していること)を表す。「oW」は、リモート書き込みイベント(他のスレッドが他のローカル・キャッシュ内の当該キャッシュ・ラインへの書き込みを要求していること)を表す。「EOP」は、並列実行領域の終端(即ち、データ従属性を含まないソフトウェア・プログラム領域の終端)を表す。最初に、ローカル・キャッシュ・メモリ内のキャッシュ・ラインは、有効状態410(即ち、当該キャッシュ・ライン内の全てのデータが有効であることを表す状態)にあることがある。キャッシュ・ラインが有効であるか否かは、例えば、共有キャッシュ315から有効データを取り出すときに対応するローカル・キャッシュ・コントローラによりセットされる、有効ビット(例えば、図3の有効ビット345)によって表すことができる。ローカル・キャッシュ内のキャッシュ・ラインが有効状態にある間は、ローカル読み取りイベント、リモート読み取りイベント(oR)、ローカル書き込みイベント又はEOPが発生しようとも、ローカル・キャッシュ内のキャッシュ・ラインは、如何なる状態遷移も行わない。ローカル書き込みイベントは、常に他のローカル・キャッシュ内の同じキャッシュ・ラインを対象とするリモート書き込みイベント(oW)を生成する。もし、ローカル・キャッシュ・コントローラが、例えば、スヌーピングを通して、「oW」イベントの発生を検出すれば、その対応するローカル・キャッシュ・メモリ内の対応する有効キャッシュ・ラインは、偽共有状態415(即ち、偽共有ビットがセットされる状態)に遷移する。従来の並列コンピュータ・システムと異なり、リモート書き込みイベント(oW)は、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化させない。ローカル・キャッシュ内のキャッシュ・ラインの更新は、例えば、偽共有ビット(図3を参照)をセットすることにより、他のローカル・キャッシュ内の対応するキャッシュ・ラインを偽共有状態415に遷移させる。
【0027】
ローカル・キャッシュ内のキャッシュ・ラインが偽共有状態415にある間は、ローカル読み取りイベント、他のローカル・キャッシュへの「oW」イベントを生成するローカル書き込みイベント、リモート読み取りイベント(oR)又はリモート書き込みイベント(oW)が発生しようとも、そのローカル・キャッシュ内の当該キャッシュ・ラインは、依然として偽共有状態415に留まる。ローカル・キャッシュ内のキャッシュ・ラインが偽共有状態415にある間に、「EOP」イベントが発生すると(例えば、バリアに到達すると)、そのローカル・キャッシュ内の当該キャッシュ・ラインは、無効状態405(即ち、当該キャッシュ・ライン内のデータが無効であることを表す状態)に遷移する。ローカル・キャッシュ内のキャッシュ・ラインが無効状態405にある間は、リモート読み取りイベント、リモート書き込みイベント又は「EOP」イベントが発生しようとも、依然として無効状態405に留まる。ローカル・キャッシュ内のキャッシュ・ラインが無効状態405にある間に、他のローカル・キャッシュへのリモート読み取りイベントを引き起こすローカル読み取りイベントが発生するか、又は他のローカル・キャッシュへのリモート書き込みイベントを引き起こすローカル書き込みイベントが発生すると、そのローカル・キャッシュ内の当該キャッシュ・ラインは、例えば、共有キャッシュ315から有効データを取り出すことにより、有効状態410に遷移する。
【0028】
図7及び図8は、一実施形態において、偽共有を許可する2つのローカル・キャッシュ内の状態遷移を例示する。この実施形態では、ステージ500に示すように、所与のキャッシュ・ラインについて、第1ローカル・キャッシュ520及び第2ローカル・キャッシュ525は、最初に有効状態にある。その後、第1ローカル・キャッシュ520に関連する第1プロセッサは、第1ローカル・キャッシュ520内のキャッシュ・ラインに書き込み505を行う。また、この書き込み505は、他のローカル・キャッシュへのリモート書き込みイベントを生成する。従って、ステージ510に示すように、書き込み505が発生するとき、第1ローカル・キャッシュ520は、依然として有効状態に留まるが、第2ローカル・キャッシュ525は、偽共有状態に遷移する。書き込み505が発生するときに、第2ローカル・キャッシュ525が無効状態に遷移しないことに留意されたい。図8のステージ515に示すように、「EOP」イベント530が発生するとき、第1ローカル・キャッシュ520は、依然として有効状態に留まるが、第2ローカル・キャッシュ525は、無効状態に遷移する。
【0029】
図9は、ローカル・キャッシュ内の状態遷移を要約するテーブル600を示す。そのローカル・キャッシュに関連するプロセッサが、非並列実行領域(即ち、複数のプロセッサがプログラムを並列に実行しないソフトウェア・プログラム領域)を実行する間に、ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、有効状態410から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、非並列実行領域内でリモート書き込みイベントが発生するときに、有効状態410から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、無効状態405から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、リモート書き込みイベントが発生するときに、無効状態405から無効状態405に遷移する。
【0030】
ローカル・キャッシュに関連するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域を実行しており且つ当該ソフトウェア・プログラム領域が他のプロセッサと並列に実行されている間に、当該ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、有効状態410から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、非並列実行領域内でリモート書き込みイベントが発生するときに、有効状態410から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内でリモート書き込みイベントが発生するときに、有効状態410から偽共有事態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、無効状態405から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、リモート書き込みイベントが発生するときに、無効状態405から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生し且つその後にリモート書き込みイベントが発生するときに、無効状態405から偽共有状態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、共有キャッシュ315から有効データを取り出すことにより、偽共有状態415から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内でローカル読み取りイベントが発生するときに、偽共有状態415から偽共有状態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内で「EOP」イベントが発生するときに、偽共有状態415から無効状態405に遷移する。
【0031】
一実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行可能であるソフトウェア・プログラム領域では、ローカル読み取りミスが発生すると、対応するプロセッサに共有キャッシュ315から有効データを取り出させ、そして他のローカル・キャッシュ内の対応するキャッシュ・ラインを降格させない(例えば、無効化又は偽共有状態に低下させない)。そのソフトウェア・プログラム領域内では、ローカル書き込みミスが発生すると、対応するプロセッサに共有キャッシュ315から有効データを取り出させ、そして他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化させない。そのソフトウェア・プログラム領域内では、ローカル読み取りイベントが発生すると、プロセッサに対応するローカル・キャッシュからデータを読み取らせる。そのソフトウェア・プログラム領域内では、ローカル書き込みイベントが発生すると、プロセッサに対応するローカル・キャッシュにデータを書き込ませ、そして共有キャッシュ315に同じデータを書き込ませる。そのソフトウェア・プログラム領域では、ローカル・キャッシュ・コントローラは、例えば、既知のLRU(最長未使用時間)アルゴリズム又は他のキャッシュ・ライン追い出しアルゴリズムに基づいて、そのローカル・キャッシュ内のキャッシュ・ラインを追い出す。
【0032】
データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域を出る直前に、各ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているそのキャッシュ内のキャッシュ・ラインを無効化する。代替的に、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインに対応する有効データを、共有キャッシュ315から取り出すことができる。
【0033】
一実施形態では、並列コンピュータ・システム700は、3つの異なるイベントを表す、3つの異なるフラグ・ビット(図示せず)を利用する。第1フラグ・ビットは、データ従属性を含まず且つ複数のプロセッサによって並列に実行可能であるソフトウェア・プログラム領域の始端を表す。コンパイラ760は、ソフトウェア・プログラム領域がデータ従属性を含まず且つ複数のプロセッサによって並列に実行可能であることを決定するときに、この第1フラグ・ビットをセットすることができる。第2フラグ・ビットは、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域の終端を表す。コンパイラ760は、プロセッサ又はスレッドがそのソフトウェア・プログラム領域を出ることを決定するときに、この第2フラグ・ビットをセットすることができる。第3のフラグ・ビット(即ち、偽共有ビット)は、偽共有状態への遷移を表す。ローカル・キャッシュ内の1キャッシュ・ラインにつき1ビットの偽共有ビットを設けることができる。偽共有が発生するとき、ローカル・キャッシュ・コントローラは、そのローカル・キャッシュの対応するキャッシュ・ラインのこの偽共有ビットをセットすることができる。
【0034】
一実施形態では、ローカル・キャッシュ・コントローラは、その対応するローカル・キャッシュの状態を表すための専用ビットを使用する代わりに、2ビット以上を使用して幾つかの状態を表すことができる。例えば、図6の3つの状態を表すためには、第1ビットを使用してキャッシュ・ラインの状態が無効であるか否かを示し、第2ビットを使用してキャッシュ・ラインの状態が有効であるか否かを示し、第3のビットを使用してキャッシュ・ラインの状態が偽共有であるか否かを示すことができる。代替的に、ローカル・キャッシュ・コントローラは、例えば、2ビットを使用することにより、これらの3つの状態を実装することができる。即ち、「00」はキャッシュ・ラインの状態が無効であることを示し、「01」はキャッシュ・ラインの状態が有効であることを示し、「10」はキャッシュ・ラインの状態が偽共有であることを示す。従って、一実施形態では、有効/無効/偽共有状態について別個のビットを設けることができる。他の実施形態では、これらの3つの状態は、ローカル・キャッシュ内で追跡中の他のデータと共有される複数ビットの組み合わせによって実装することができる。
【0035】
一実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域では、ローカル書き込みイベントが発生するときに、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、有効状態に留まる。もし、このキャッシュ・ライン内で偽共有が発生すれば、ソフトウェア・プログラム領域の終端に対応するローカル・キャッシュ内の対応するキャッシュ・ラインを無効化する必要はない。しかし、当該対応するキャッシュ・ライン内で偽共有が発生すれば、例えば、2つの異なるプロセッサがそれらのローカル・キャッシュ内の同じキャッシュ・ラインの異なる部分に対して書き込みを行うならば、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、偽共有状態に遷移する。
【0036】
他の実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域では、他のローカル・キャッシュへの偽共有イベントを構成するローカル書き込みイベントが発生するときに、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、偽共有状態に遷移する。この実施形態では、当該キャッシュ・ラインにおける後続の偽共有が発生するときに、ローカル書き込みイベントが最初に発生する場合を除き、ローカル・キャッシュ間で当該後続の偽共有の発生を通信する必要はない。この実施形態では、ソフトウェア・プログラム領域の終端において、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているそれらのローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0037】
一実施形態では、図12は、偽共有ビットをセットし且つ偽共有ビットがセットされているキャッシュ・ラインを無効化するための方法ステップを示す。ステップ900では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する。ステップ910では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。しかし、ステップ920に示すように、キャッシュ・ラインを更新した後は、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットすることを阻止される。ステップ930では、ローカル・キャッシュ・コントローラは、対応するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することをコンパイラ760が検出するときに、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインを無効化する。しかし、ステップ940に示すように、対応するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達するときに、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化しない。
【0038】
他の実施形態では、図13は、偽共有ビットをセットし且つ偽共有ビットがセットされているキャッシュ・ラインを無効化するための方法ステップを示す。ステップ1000では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する。ステップ1010では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。ステップ1020では、キャッシュ・ラインを更新した後に、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットする。そのため、ステップ1030に示すように、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、対応するキャッシュ・ライン上の後続の偽共有が発生するときに、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は必要とされない。
【0039】
一実施形態では、データ従属性を含まないソフトウェア・プログラム領域の終端に複数のプロセッサが到達するときに、ローカル・キャッシュ・コントローラは、共有キャッシュ・メモリ315から有効データを取り出すことにより、偽共有ビットがセットされているキャッシュ・ラインのうちの幾つか(例えば、1つ、2つ又は3つ)の部分を選択的に更新する。データ従属性を含まないソフトウェア・プログラム領域の終端に対応するプロセッサが到達することをコンパイラ760が検出するときに、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているキャッシュ・ラインのうちの幾つか(例えば、残り)の部分を選択的に無効化する。例えば、既知のLRUアルゴリズムを使用することにより、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている最近に使用されたキャッシュ・ラインのための有効データを共有キャッシュ315からローカル・キャッシュに取り出す。ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている残りのキャッシュ・ラインを無効化する。これらの残りのキャッシュ・ラインについては、ローカル・キャッシュ・コントローラは、どのような処置を講じる必要もなく、これらの残りのキャッシュ・ラインに関するローカル読み取りイベント又はローカル書き込みイベントが発生するときに、共有キャッシュ315から有効データを取り出すことができる。
【0040】
データ従属性を含むか又は並列に実行できないソフトウェア・プログラム領域では、ローカル・キャッシュ内の有効キャッシュ・ラインへのローカル書き込みは、共有キャッシュ315にライトスルーされる。このソフトウェア・プログラム領域内では、共有キャッシュ315にライトスルーされている間、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の同じキャッシュ・ラインを無効化する。この無効化を完了し且つライトスルー動作を発行するとき、このローカル書き込みは完了する。
【0041】
データ従属性を含まず且つ並列に実行可能であるソフトウェア・プログラム領域では、ローカル・キャッシュ内の有効キャッシュ・ラインへのローカル書き込みは、共有キャッシュ315にライトスルーされる。このソフトウェア・プログラム領域では、共有キャッシュ315にライトスルーされている間、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の同じキャッシュ・ラインを偽共有状態に遷移させる。偽共有状態への遷移を完了し且つライトスルー動作を発行するとき、このローカル書き込みは完了する。
【0042】
代替的に、偽共有状態への遷移が完了する前又はライトスルー動作が完了する前に、ローカル書き込みを完了することができる。換言すれば、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内のキャッシュ・ラインを更新する場合、第1ローカル・キャッシュ・コントローラが、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する動作を完了する後に、他のローカル・キャッシュ・コントローラのうちの幾つか(例えば、1つ又は2つ等)は、他のローカル・キャッシュ・メモリ内の対応するキャッシュ・ラインの偽共有ビットをセットする。他のローカル・キャッシュ・コントローラは、データ従属性を含まないソフトウェア・プログラム領域を出る前に、他のローカル・キャッシュ・メモリ内の対応するキャッシュ・ラインの偽共有ビットのセッティングを完了する。この方式を実装するために、特定の一連のステップが実行される。即ち、各スレッドは、(1)データ従属性を含まないソフトウェア・プログラム領域を開始し、(2)そのローカル・キャッシュ・コントローラがそのキャッシュ・ラインを更新する後に他の幾つかのローカル・キャッシュ・コントローラが対応するキャッシュ・ラインの偽共有ビットをセットすることができるように計算を実行し、(3)当該並列実行領域の計算を完了し、(4)そのローカル・キャッシュ・コントローラから生じる全ての偽共有通知が完了した(即ち、他の全てのキャッシュ・コントローラが、このスレッドの計算に起因して偽共有が生じた全ての対応するキャッシュ・ラインを通知された)ことを保証し、(5)このソフトウェア・プログラム領域に参加する全てのスレッドが当該ソフトウェア・プログラム領域の終端に到達したとき、同期バリアを実行し、(6)並列実行領域の終了動作を実行する。この一連の動作(1)〜(6)を使用すると、並列実行領域の終了動作を実行するとき、データ従属性を含まない当該並列実行領域に参加する任意のスレッドによる偽共有の保留中通知が存在しないことが保証される。動作(4)を実装するために、ローカル・キャッシュ・コントローラは、当該ローカル・キャッシュ・コントローラによる他の任意のキャッシュ・コントローラへの任意の保留中通知を追跡し、対応するキャッシュ・ラインに関連する偽共有ビットをセットしようと試みる。
【0043】
一実施形態では、並列コンピュータ・システム700は、全てのローカル・キャッシュ及び共有キャッシュ315を制御するために、中央ディレクトリ又はスヌーピング技術を使用する。スヌーピング技術は、各ローカル・キャッシュ・コントローラが全てのプロセッサに関連する全てのローカル・キャッシュをモニタするように実装されたシステムを表す。従って、ローカル書き込みイベントが発生するとき、スヌーピング技術を使用することにより、ローカル・キャッシュ・コントローラは、全てのローカル書き込みイベントの発生を検出することができる。中央ディレクトリは、そのデータが有効である1つのキャッシュIDに対応する、1つのタグ・フィールドを有することができる。このタグ・フィールドに記述されているローカル・キャッシュが有効データを有するのに対し、他のローカル・キャッシュ内の対応するキャッシュ・ラインは偽共有状態にあることがある。対応するキャッシュ・ライン上の偽共有がその後に発生するときに、並列コンピュータ・システム700は、このタグ・フィールドを使用し、例えば、有効キャッシュ・ラインの偽共有ビットをセットすることにより、当該有効キャッシュ・ラインを偽共有状態に移行させることができる。換言すれば、並列コンピュータ・システム700は、このタグ・フィールドに基づいて、有効キャッシュ・ラインのみの状態を変更させる。代替的に、各ローカル・キャッシュ内の各キャッシュ・ラインは、そのデータが有効であるか否かを示す、有効ビットを有する。偽共有イベントが発生するとき、並列コンピュータ・システム700は、有効ビットがセットされているキャッシュ・ラインのみの状態を変更させる。例えば、並列コンピュータ・システム700は、これらのキャッシュ・ラインの有効ビットをオフに転じ且つこれらのキャッシュ・ラインの偽共有ビットをセットする。
【0044】
本発明の諸側面は、システム、方法又はコンピュータ・プログラムとして具体化することができる。従って、本発明の諸側面は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコード等を含む)又はソフトウェア及びハードウェア要素の両方を含む実施形態の形式を取ることができ、これらの全てを一般に「回路」、「モジュール」又は「システム」と呼ぶことができる。さらに、本発明の諸側面は、コンピュータ可読プログラム・コードを1つ以上のコンピュータ可読媒体内に具体化した、コンピュータ・プログラムの形式を取ることができる。
【0045】
1つ以上のコンピュータ可読媒体の任意の組み合わせを利用することができる。コンピュータ可読媒体は、コンピュータ可読信号媒体又はコンピュータ可読ストレージ媒体とすることができる。例えば、コンピュータ可読ストレージ媒体は、電子、磁気、光学、電磁気、赤外線、半導体システム、装置若しくはデバイス、又はこれらの任意の適切な組み合わせとすることができる。コンピュータ可読ストレージ媒体の特定の例は、1つ以上の線を有する電気接続、フレキシブル・ディスク、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み取り専用メモリ(ROM)、消去可能プログラマブル読み取り専用メモリ(EPROM又はフラッシュ・メモリ)、光ファイバ、読み取り専用CD−ROM、光ストレージ装置、磁気ストレージ装置、又はこれらの任意の適切な組み合わせとすることができる。本明細書の文脈では、コンピュータ可読ストレージ媒体は、命令を実行するシステム、装置又はデバイスに関連して又はこれらによって使用するためのプログラムを保持又は格納する、任意の有形的媒体とすることができる。
【0046】
コンピュータ可読信号媒体は、伝搬されるデータ信号の形式を有することもあるが、その場合には、ベースバンド内に又は搬送波の一部として、コンピュータ可読プログラム・コードを具体化することができる。かかる伝搬される信号は、電磁気、光学、又はこれらの任意の適切な組み合わせ等を含む、種々の形式のうち任意の形式を取る。コンピュータ可読信号媒体は、コンピュータ可読ストレージ媒体ではなく、命令を実行するシステム、装置又はデバイスに関連して又はこれらによって使用するためのプログラムを通信し、伝搬し、移送する、任意のコンピュータ可読媒体とすることができる。
【0047】
コンピュータ可読媒体上に具体化されたプログラム・コードは、無線、有線、光ファイバ・ケーブル、RF、又はこれらの任意の適切な組み合わせ等を含む、適切な任意の媒体を使用して伝送することができる。
【0048】
本発明の諸側面に従った動作を実施するためのコンピュータ・プログラム・コードは、Java(R)、Smalltalk、C++等のようなオブジェクト指向プログラミング言語及び「C」プログラミング言語又は同様のプログラミング言語のような通常の手続き的プログラミング言語を含む、1つ以上のプログラミング言語の任意の組み合わせで書くことができる。プログラム・コードは、独立のソフトウェア・パッケージとしてユーザ・コンピュータ上で完全に実行することができ、その一部をユーザ・コンピュータ上で且つ他の一部をリモート・コンピュータ上で実行することができ、又はリモート・コンピュータ若しくはサーバ上で完全に実行することができる。後者のシナリオでは、リモート・コンピュータは、ローカル・エリア・ネットワーク(LAN)又は広域ネットワーク(WAN)を含む任意のタイプのネットワークを通してユーザ・コンピュータに接続することができ、或いはその接続を(例えば、インターネット・サービス・プロバイダを使用するインターネットを通して)外部コンピュータに行うことができる。
【0049】
以上では、本発明の実施形態に従った、方法、装置(システム)及びコンピュータ・プログラムのフローチャート又はブロック図を参照して、本発明の諸側面を説明した。フローチャート又はブロック図の各ブロック、複数ブロックの組み合わせは、コンピュータ・プログラム命令によって実装することができる。これらのコンピュータ・プログラム命令を、汎用コンピュータ、専用コンピュータ又は他のプログラム可能なデータ処理装置のプロセッサに提供すると、当該コンピュータ又は他のプログラム可能なデータ処理装置のプロセッサを介して実行される諸命令は、フローチャート又はブロック図のブロックで指定された機能/行為を実装するための手段を作成する。また、これらのコンピュータ・プログラム命令をコンピュータ可読媒体内に格納すると、当該コンピュータ可読媒体内に格納された諸命令が、フローチャート又はブロック図のブロックで指定された機能/行為を実装するための諸命令を含む製品を生産することを目的として、コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイスに対し特定の態様で機能するように指示することができる。
【0050】
また、これらのコンピュータ・プログラム命令を、コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイスにロードすると、当該コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイス上で実行される諸命令が、フローチャート又はブロック図のブロックで指定された機能/行為を実装するためのプロセスを提供することを目的として、一のコンピュータ実装プロセスを生成するように当該コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイス上で一連の動作ステップを実行させることができる。
【0051】
諸図面のうちフローチャート及びブロック図は、本発明の種々の実施形態に従った、システム、方法及びコンピュータ・プログラムの可能な実装のアーキテクチャ、機能性及び動作を示す。この点に関連して、フローチャート又はブロック図内の各ブロックは、指定された論理機能を実装するための1つ以上の動作可能命令から成る、モジュール、セグメント又はコード部分を表すことがある点に留意されたい。また、幾つかの代替的実装では、ブロック内に表記された機能を図面に示した順序とは異なる順序で実施することができる点にも留意されたい。例えば、特定の機能性に依存して、連続的に示した2つのブロックを実質的に並列に実施したり、これらのブロックを反対の順序で実施することができる。さらに、ブロック図又はフローチャートの各ブロック及び複数ブロックの組み合わせは、指定された機能又は行為を実行する専用のハードウェア・ベースのシステム又は専用ハードウェア及びコンピュータ命令の組み合わせによって実装することができる点にも留意されたい。
【符号の説明】
【0052】
300、350・・・偽共有ビット」
305、310・・・ローカル・キャッシュ
315・・・共有キャッシュ
330・・・キャッシュ・ライン
335・・・キャッシュ・ライン330にある第1部分
345・・・有効ビット
405・・・無効状態
410・・・有効状態
415・・・偽共有状態
705、710、715・・・プロセッサ
720・・・共有キャッシュ
722・・・キャッシュ・コントローラ
730、735、740・・・ローカル・キャッシュ
745、750、755・・・ローカル・キャッシュ・コントローラ
760・・・コンパイラ
【技術分野】
【0001】
本発明は、並列コンピュータ・システムに係り、さらに詳細に説明すれば、並列コンピュータ・システム内で動作するキャッシュ・コヒーレンス・プロトコルに係る。
【背景技術】
【0002】
従来の並列コンピュータ・システムは、一度に2つ以上のスレッド又はプロセッサによって同じキャッシュ・ライン・アドレスを更新することを許可しない。もし、プロセッサが関連するローカル・キャッシュ・メモリ装置(以下「ローカル・キャッシュ」と略記)内のキャッシュ・ラインを更新することを望んでいれば、従来の並列コンピュータ・システムは、先ず、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化しなければならない。従って、キャッシュ・コヒーレント機構は、ローカル・キャッシュを更新するように(例えば、ローカル・キャッシュ内のキャッシュ・ラインを無効化するように)、コンピュータ・システム内で実装される。従って、従来の並列コンピュータ・システム内の2つ以上の別個のスレッド又はプロセッサは、ローカル・キャッシュ間でキャッシュ・コヒーレンス動作を実行する場合、同じキャッシュ・ライン・アドレスを同時に更新することができない。
【発明の概要】
【発明が解決しようとする課題】
【0003】
2つ以上の別個のスレッド又はプロセッサによってアクセスされるときに同じキャッシュ・ライン・アドレスの同時的な更新を阻止するために、従来の並列コンピュータ・システムは、ローカル・キャッシュ間のより頻繁な通信(例えば、他のローカル・キャッシュへの無効化通知のブロードキャスト)を必要とし、ローカル・キャッシュ内のキャッシュ・ラインを頻繁に無効化する。
【課題を解決するための手段】
【0004】
本明細書は、複数のプロセッサ及び少なくとも1つの共有キャッシュ・メモリ装置(以下「共有キャッシュ」と略記)を備える、並列コンピュータ・システムの性能を改良するための装置、方法及びコンピュータ・プログラムを開示する。各プロセッサは、少なくとも1つのローカル・キャッシュ(例えば、L1キャッシュ)を含む。
【0005】
一側面では、並列コンピュータ・システムの性能を改良するための装置を提供する。本装置は、複数のプロセッサを備え、各プロセッサは、ローカル・キャッシュを有する。各プロセッサは、データ従属性(data dependency)を含まないソフトウェア・プログラム領域のプログラム・コードを実行する。各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するハードウェア・ローカル・キャッシュ・コントローラ(以下「ローカル・キャッシュ・コントローラ」と略記)に関連する。第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラは、プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有(false sharing)の発生を検出し且つ第2プロセッサによる第1キャッシュ・ラインの偽共有を許可する。第1キャッシュ・ラインの偽共有は、第1ローカル・キャッシュ・コントローラによって第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新するときに発生する。
【0006】
他の側面では、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットする。
【0007】
他の側面では、第2ローカル・キャッシュ・コントローラが第2ローカル・キャッシュ内の第1キャッシュ・ラインの第2部分を更新するとき、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットし、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、第2ローカル・キャッシュ・コントローラは、第2ローカル・キャッシュ内の第1キャッシュ・ラインに対応する偽共有ビットをセットする。
【0008】
他の側面では、複数のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラ及び第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている第1ローカル・キャッシュ及び第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0009】
他の側面では、ローカル・キャッシュへの任意の書き込みが、複数のプロセッサによって共有される共有キャッシュにライトスルーされる。
【0010】
他の側面では、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される。
【0011】
他の側面では、第1キャッシュ・コントローラが第1ローカル・キャッシュ内の第1キャッシュ・ラインの第1部分を更新するとき、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に、当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない。
【0012】
他の側面では、複数のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内の第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。
【0013】
他の側面では、2つ以上のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する。
【0014】
他の側面では、2つ以上のプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することに応答して、第1ローカル・キャッシュ・コントローラは、共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する。
【0015】
他の側面では、偽共有の発生を検出するために、第1ローカル・キャッシュ・コントローラ及び第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する。
【発明の効果】
【0016】
本発明は、並列コンピュータ・システムにおいて偽共有を許可することにより、ローカル・キャッシュへの書き込み動作が発生する都度の、キャッシュ・ラインを無効化するためのローカル・キャッシュ間の通信オーバーヘッドを減少させることができる。
【図面の簡単な説明】
【0017】
【図1】一実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【図2】一実施形態に従った、データ従属性を含まないソフトウェア・プログラム領域を例示する図である。
【図3】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図4】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図5】一実施形態に従った、偽共有を許可するインスタンスを示す図である。
【図6】一実施形態に従った、偽共有を許可する状態図である。
【図7】一実施形態に従った、状態遷移を例示する図である。
【図8】一実施形態に従った、状態遷移を例示する図である。
【図9】一実施形態に従った、状態遷移を要約するテーブルである。
【図10】一実施形態に従った、図1及び図12〜図13に示すフローチャートを実装するための並列コンピュータ・システムを例示する図である。
【図11】一実施形態に従った、フラグ・ビットを示す図である。
【図12】一実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【図13】他の実施形態に従った、並列コンピュータ・システムの性能を改良するための方法ステップを示すフローチャートである。
【発明を実施するための形態】
【0018】
図10は、複数のプロセッサ705〜715(例えば、IBM(R)PowerPC(R)プロセッサ)及び共有キャッシュ720を備える、一実施形態に従った並列コンピュータ・システム700を示す。各プロセッサは、ローカル・キャッシュ、例えば、プロセッサ705内のローカル・キャッシュ730、プロセッサ710内のローカル・キャッシュ735及びプロセッサ715内のローカル・キャッシュ740を含む。また、各プロセッサは、ローカル・キャッシュに関連するローカル・キャッシュ・コントローラを備える。ローカル・キャッシュ・コントローラは、ローカル・キャッシュ・メモリの読み取り及び書き込み動作を制御する。例えば、プロセッサ705に関連するローカル・キャッシュ・コントローラ745は、例えば、ローカル・キャッシュ730内のキャッシュ・ラインを無効化するためのフラグ・ビットをセットすることにより、ローカル・キャッシュ730を制御する。同様に、ローカル・キャッシュ・コントローラ750は、ローカル・キャッシュ735を制御し、ローカル・キャッシュ・コントローラ755は、ローカル・キャッシュ740を制御する。任意のローカル・キャッシュ・メモリ内の任意の更新は、例えば、バス又はネットワーク725を介して、共有キャッシュ720にライトスルーされる。また、共有キャッシュ720は、共有キャッシュ720を制御するキャッシュ・コントローラ722を含む。コンパイラ760は、高水準のプログラミング・コードを機械コードに変換するために設けられる。
【0019】
並列コンピュータ・システム700は、その性能を改良するために図1の方法ステップを実施する。図1のステップ100では、ソフトウェア・プログラム領域(例えば、図2に示すソフトウェア・ループ200)に入るときに、コンパイラ760は、当該ソフトウェア・プログラム領域がデータ従属性を含むか否かを決定する。コンパイラ760は、当該ソフトウェア・プログラムのどの部分を並列に実行可能であるかを知っている。なぜなら、ユーザが当該ソフトウェア・プログラムの特定のサブセットを並列に実行するように明示的に要求するか、又はコンパイラ760が対応するプログラム・コードを分析し且つ当該ソフトウェア・プログラムの特定のサブセットを並列に実行可能であると決定したからである。一旦、コンパイラ760が、当該プログラム・コードの一部を並列に実行可能であることを知ると、コンパイラ760は、並列タスク(即ち、複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域)の作成を扱うランタイム・ライブラリへの機能呼び出しを挿入する。コンパイラ760は、これらの並列タスクが開始する位置及び終了する位置に特殊命令を挿入する。一実施形態では、コンパイラ760は、並列に実行すべきソフトウェア・プログラム領域を作成する、ランタイム・ライブラリを呼び出す。従って、ランタイム・ライブラリは、ソフトウェア・プログラム領域を実行する直前に特殊命令を呼び出すとともに、ソフトウェア・プログラム領域を並列に実行した直後に特殊命令を呼び出す。他の実施形態では、コンパイラ760は、並列に実行されるソフトウェア・プログラム領域の最初の命令が1つの特殊命令であり、並列に実行されるソフトウェア・プログラム領域の最後の命令が他の特殊命令であるように、並列に実行すべきプログラム・コードを装備化(instrument)する。例えば、ソフトウェア・ループ200がデータ従属性を含むか否かを決定するために、コンパイラ760は、ソフトウェア・ループ200内の先行するソフトウェア・プログラム・ラインの出力がソフトウェア・ループ200内の後続するソフトウェア・プログラム・ラインの入力として使用されるか否かを評価する。図2のソフトウェア・ループ200において、アレイ「b」内の2つの別個の要素が同じデータ値を含んでいなければ、データ従属性は存在しない。なぜなら、先行するループ反復の出力は、後続するループ反復の入力として使用されないからである。さらに、コンパイラ760は、例えば、図2のソフトウェア・ループ200のループ出口条件に基づいて、データ従属性を含まないソフトウェア・プログラム領域の開始及び終了境界を決定する。図1のステップ110では、コンパイルの後、ソフトウェア・プログラム領域がデータ従属性を含まないことをコンパイラ760が決定することに応答して、全て又は一部のプロセッサは、データ従属性を含まないソフトウェア・プログラム領域を並列に実行する。例えば、少なくとも2つの異なるプロセッサが、図2のソフトウェア・ループ200を実行する。もし、ソフトウェア・プログラム領域内にデータ従属性があれば、単一のプロセッサが、データ従属性を含むソフトウェア・プログラム領域を実行することができる。データ従属性を含まないソフトウェア・プログラム領域を並列に実行する間、各プロセッサは、そのローカル・キャッシュを変更することができる。しかし、本実施形態によれば、各プロセッサがバリア(即ち、全ての参加プロセッサが到達しなければならないポイントであって、そのポイントの後にだけ、各プロセッサがその後続の実行を継続することができる)に到達するまで、ローカル・キャッシュ内の変更を他のローカル・キャッシュが観察する必要はない。
【0020】
図1のステップ120に示すように、全て又は一部のプロセッサが、データ従属性を含まないソフトウェア・プログラム領域を並列に実行することを開始するとき、各プロセッサのローカル・キャッシュに関連するローカル・キャッシュ・コントローラは、ソフトウェア・プログラム領域内の偽共有を許可する。偽共有とは、少なくとも2つの異なるローカル・キャッシュ・メモリ内の同じキャッシュ・ライン・アドレスの異なる部分を更新することを意味する。
【0021】
以下、図3〜図5を参照して、偽共有を許可する一実施形態を詳述する。ローカル・キャッシュ内のキャッシュ・ラインへの書き込み動作が発生するときには、対応するローカル・キャッシュ・コントローラは、当該ローカル・キャッシュ内の対応するキャッシュ・ライン330の偽共有ビット(図3の偽共有ビット300)をセットする。一実施形態では、全てのローカル・キャッシュ・コントローラは、全てのローカル・キャッシュをスヌープ(即ち、モニタ)する。従って、単一のローカル・キャッシュへの書き込み動作が発生するとき、他のローカル・キャッシュ・コントローラは、例えば、スヌーピングを通して、当該書き込み動作の発生を検出し且つ他のローカル・キャッシュ内の対応するキャッシュ・ラインの対応する偽共有ビットをセットする。従って、一実施形態では、ローカル・キャッシュ内の更新は、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化しない。並列コンピュータ・システム700が偽共有を許可するので、他のプロセッサは、その後に同じキャッシュ・ラインの異なる部分に書き込みを行うことができる。また、同じキャッシュ・ラインへのこの後続の書き込みは、他のローカル・キャッシュ内の同じキャッシュ・ラインを無効化しない。偽共有を許可することにより、並列コンピュータ・システム700は、ローカル・キャッシュへの書き込み動作が発生する都度の、キャッシュ・ラインを無効化するためのローカル・キャッシュ間の通信オーバーヘッドを減少させることができる。
【0022】
図1に戻って説明を続ける。ステップ130では、コンパイラ760は、各プロセッサがデータ従属性を含まないソフトウェア・プログラム領域の実行を完了する、プログラム・コード内の位置を決定する。例えば、図2では、コンパイラ760は、例えば、各プロセッサに関連するループ出口条件を評価することにより、各プロセッサがソフトウェア・プログラム領域の実行を完了することを決定する。具体的には、コンパイラ760は、各プロセッサが並列実行領域(parallel region)を完了するプログラム・コード内の位置(例えば、図2の位置210)が、各プロセッサに割り当てられた元のループ反復「N−1」のサブセクションの計算を各プロセッサが完了する直後のコードに対応することを決定する。図1のステップ140では、プロセッサがデータ従属性を含まないソフトウェア・プログラム領域の実行を完了することを検出するとき、コンパイラ760は、当該プロセッサに関連するローカル・キャッシュ・コントローラに対し、偽共有ビットがセットされているその関連するローカル・キャッシュ内のキャッシュ・ラインを無効化することを指示するための特殊命令(又は一連の特殊命令)を挿入する。従って、一実施形態では、並列コンピュータ・システム700は、バリアに到達するとき又はデータ従属性を含まないソフトウェア・プログラム領域を出るときに、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0023】
図3〜図5は、一実施形態における偽共有を例示する。最初に、ローカル・キャッシュ305及び他のローカル・キャッシュ310は、同じキャッシュ・ライン330を有する。図3に示すように、プロセッサ0上のスレッド0は、ローカル・キャッシュ305内のキャッシュ・ライン330にある第1部分335を変更する。また、ローカル・キャッシュ305内のこの変更は、共有キャッシュ315にライトスルーされる。ローカル・キャッシュ305のこの変更を(例えば、スヌーピングを通して)検出するとき、ローカル・キャッシュ310のローカル・キャッシュ・コントローラは、ローカル・キャッシュ310内のキャッシュ・ライン330の偽共有ビット350をセットする。偽共有ビット350は、プロセッサ又はスレッドがデータ従属性を含まないソフトウェア・プログラム領域を実行する間に、その対応するローカル・キャッシュ内のその対応するキャッシュ・ラインが変更されたことを示す。プロセッサ又はスレッドがデータ従属性を含まないソフトウェア・プログラム領域を実行する間、ローカル・キャッシュ間のコヒーレンス・トラフィック(例えば、キャッシュ・コヒーレンス動作等)は阻止される。任意のローカル・キャッシュは、最新のデータを有さないことがあるが、各ローカル・キャッシュは、それ自体の値を有することができる。図4に示すように、その後暫くして、プロセッサ・コア1上のスレッド1は、ローカル・キャッシュ310内のキャッシュ・ライン330にある第2部分340を変更する。この変更は、ローカル・キャッシュ305内のキャッシュ・ライン330の偽共有ビット300をセットすることを含む。また、ローカル・キャッシュ310内の変更は、共有キャッシュ315にライトスルーされる。ローカル・キャッシュ305及び310内で行われるこれらのローカル変更は、キャッシュ・コヒーレンス動作(例えば、キャッシュ・ライン330を無効化する動作)を呼び出さない。
【0024】
プロセッサがデータ従属性を含まないソフトウェア・プログラム領域を実行する間、どのローカル・キャッシュも最新のデータを有さない。各ローカル・キャッシュは、それ自体のデータ値を有する。ローカル・キャッシュ・コントローラを備える並列コンピュータ・システム700は、偽共有を許可する(即ち、同じキャッシュ・ライン内の異なる部分における書き込みを許可する)が、並列コンピュータ・システム700は、データ従属性を含まないソフトウェア・プログラム領域にある同じキャッシュ・ライン内の同じ部分を対象とする任意の後続書き込みを阻止する。そのようにするため、例えば、コンパイラ760に当該同じ部分を対象とする任意の後続書き込みを検出させる。一実施形態では、ローカル・キャッシュ内のキャッシュ・ラインにつき1つの偽共有ビットがある。偽共有ビットは、最初に0にセットされるが、偽共有及び/又はローカル書き込みが発生するときは常に、1にセットされる。他の実施形態では、キャッシュ・ラインにつき2以上の偽共有ビットを設けることができる。例えば、キャッシュ・ラインを幾つかのサブセクタに分割し、各サブセクタをそれ自体の偽共有ビットに関連付けることができる。
【0025】
図5に示すように、一実施形態では、バリアに到達するとき、各ローカル・キャッシュ・コントローラは、その関連するローカル・キャッシュにおいて、偽共有ビットがセットされているキャッシュ・ラインを無効化する。例えば、ローカル・キャッシュ305に関連するローカル・キャッシュ・コントローラは、例えば、対応する無効ビット320をセットすることにより、ローカル・キャッシュ305内のキャッシュ・ライン330を無効化する。同様に、ローカル・キャッシュ310に関連するローカル・キャッシュ・コントローラは、例えば、対応する無効ビット320をセットすることにより、ローカル・キャッシュ310内のキャッシュ・ライン330を無効化する。一実施形態では、ローカル・キャッシュ・コントローラは、例えば、共有キャッシュ315からデータを取り出すことにより、その関連するローカル・キャッシュ内の無効キャッシュ・ラインを有効化する。というのは、共有キャッシュ315は、キャッシュ「ライトスルー」方式に起因して、常に有効データを有するからである。
【0026】
図6は、一実施形態におけるローカル・キャッシュ内のキャッシュ・ラインの状態を示す状態遷移図400である。「R」は、ローカル・キャッシュ内のローカル読み取りイベントを表す。「W」は、ローカル・キャッシュ内のローカル書き込みイベントを表す。「oR」は、リモート読み取りイベント(他のスレッドが他のローカル・キャッシュ内の当該キャッシュ・ラインの読み取りを要求していること)を表す。「oW」は、リモート書き込みイベント(他のスレッドが他のローカル・キャッシュ内の当該キャッシュ・ラインへの書き込みを要求していること)を表す。「EOP」は、並列実行領域の終端(即ち、データ従属性を含まないソフトウェア・プログラム領域の終端)を表す。最初に、ローカル・キャッシュ・メモリ内のキャッシュ・ラインは、有効状態410(即ち、当該キャッシュ・ライン内の全てのデータが有効であることを表す状態)にあることがある。キャッシュ・ラインが有効であるか否かは、例えば、共有キャッシュ315から有効データを取り出すときに対応するローカル・キャッシュ・コントローラによりセットされる、有効ビット(例えば、図3の有効ビット345)によって表すことができる。ローカル・キャッシュ内のキャッシュ・ラインが有効状態にある間は、ローカル読み取りイベント、リモート読み取りイベント(oR)、ローカル書き込みイベント又はEOPが発生しようとも、ローカル・キャッシュ内のキャッシュ・ラインは、如何なる状態遷移も行わない。ローカル書き込みイベントは、常に他のローカル・キャッシュ内の同じキャッシュ・ラインを対象とするリモート書き込みイベント(oW)を生成する。もし、ローカル・キャッシュ・コントローラが、例えば、スヌーピングを通して、「oW」イベントの発生を検出すれば、その対応するローカル・キャッシュ・メモリ内の対応する有効キャッシュ・ラインは、偽共有状態415(即ち、偽共有ビットがセットされる状態)に遷移する。従来の並列コンピュータ・システムと異なり、リモート書き込みイベント(oW)は、他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化させない。ローカル・キャッシュ内のキャッシュ・ラインの更新は、例えば、偽共有ビット(図3を参照)をセットすることにより、他のローカル・キャッシュ内の対応するキャッシュ・ラインを偽共有状態415に遷移させる。
【0027】
ローカル・キャッシュ内のキャッシュ・ラインが偽共有状態415にある間は、ローカル読み取りイベント、他のローカル・キャッシュへの「oW」イベントを生成するローカル書き込みイベント、リモート読み取りイベント(oR)又はリモート書き込みイベント(oW)が発生しようとも、そのローカル・キャッシュ内の当該キャッシュ・ラインは、依然として偽共有状態415に留まる。ローカル・キャッシュ内のキャッシュ・ラインが偽共有状態415にある間に、「EOP」イベントが発生すると(例えば、バリアに到達すると)、そのローカル・キャッシュ内の当該キャッシュ・ラインは、無効状態405(即ち、当該キャッシュ・ライン内のデータが無効であることを表す状態)に遷移する。ローカル・キャッシュ内のキャッシュ・ラインが無効状態405にある間は、リモート読み取りイベント、リモート書き込みイベント又は「EOP」イベントが発生しようとも、依然として無効状態405に留まる。ローカル・キャッシュ内のキャッシュ・ラインが無効状態405にある間に、他のローカル・キャッシュへのリモート読み取りイベントを引き起こすローカル読み取りイベントが発生するか、又は他のローカル・キャッシュへのリモート書き込みイベントを引き起こすローカル書き込みイベントが発生すると、そのローカル・キャッシュ内の当該キャッシュ・ラインは、例えば、共有キャッシュ315から有効データを取り出すことにより、有効状態410に遷移する。
【0028】
図7及び図8は、一実施形態において、偽共有を許可する2つのローカル・キャッシュ内の状態遷移を例示する。この実施形態では、ステージ500に示すように、所与のキャッシュ・ラインについて、第1ローカル・キャッシュ520及び第2ローカル・キャッシュ525は、最初に有効状態にある。その後、第1ローカル・キャッシュ520に関連する第1プロセッサは、第1ローカル・キャッシュ520内のキャッシュ・ラインに書き込み505を行う。また、この書き込み505は、他のローカル・キャッシュへのリモート書き込みイベントを生成する。従って、ステージ510に示すように、書き込み505が発生するとき、第1ローカル・キャッシュ520は、依然として有効状態に留まるが、第2ローカル・キャッシュ525は、偽共有状態に遷移する。書き込み505が発生するときに、第2ローカル・キャッシュ525が無効状態に遷移しないことに留意されたい。図8のステージ515に示すように、「EOP」イベント530が発生するとき、第1ローカル・キャッシュ520は、依然として有効状態に留まるが、第2ローカル・キャッシュ525は、無効状態に遷移する。
【0029】
図9は、ローカル・キャッシュ内の状態遷移を要約するテーブル600を示す。そのローカル・キャッシュに関連するプロセッサが、非並列実行領域(即ち、複数のプロセッサがプログラムを並列に実行しないソフトウェア・プログラム領域)を実行する間に、ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、有効状態410から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、非並列実行領域内でリモート書き込みイベントが発生するときに、有効状態410から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、無効状態405から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、リモート書き込みイベントが発生するときに、無効状態405から無効状態405に遷移する。
【0030】
ローカル・キャッシュに関連するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域を実行しており且つ当該ソフトウェア・プログラム領域が他のプロセッサと並列に実行されている間に、当該ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、有効状態410から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、非並列実行領域内でリモート書き込みイベントが発生するときに、有効状態410から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内でリモート書き込みイベントが発生するときに、有効状態410から偽共有事態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生するときに、無効状態405から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、リモート書き込みイベントが発生するときに、無効状態405から無効状態405に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、ローカル読み取りイベントが発生し且つその後にリモート書き込みイベントが発生するときに、無効状態405から偽共有状態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、共有キャッシュ315から有効データを取り出すことにより、偽共有状態415から有効状態410に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内でローカル読み取りイベントが発生するときに、偽共有状態415から偽共有状態415に遷移する。ローカル・キャッシュ内のキャッシュ・ラインは、例えば、並列に実行されるソフトウェア・プログラム領域内で「EOP」イベントが発生するときに、偽共有状態415から無効状態405に遷移する。
【0031】
一実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行可能であるソフトウェア・プログラム領域では、ローカル読み取りミスが発生すると、対応するプロセッサに共有キャッシュ315から有効データを取り出させ、そして他のローカル・キャッシュ内の対応するキャッシュ・ラインを降格させない(例えば、無効化又は偽共有状態に低下させない)。そのソフトウェア・プログラム領域内では、ローカル書き込みミスが発生すると、対応するプロセッサに共有キャッシュ315から有効データを取り出させ、そして他のローカル・キャッシュ内の対応するキャッシュ・ラインを無効化させない。そのソフトウェア・プログラム領域内では、ローカル読み取りイベントが発生すると、プロセッサに対応するローカル・キャッシュからデータを読み取らせる。そのソフトウェア・プログラム領域内では、ローカル書き込みイベントが発生すると、プロセッサに対応するローカル・キャッシュにデータを書き込ませ、そして共有キャッシュ315に同じデータを書き込ませる。そのソフトウェア・プログラム領域では、ローカル・キャッシュ・コントローラは、例えば、既知のLRU(最長未使用時間)アルゴリズム又は他のキャッシュ・ライン追い出しアルゴリズムに基づいて、そのローカル・キャッシュ内のキャッシュ・ラインを追い出す。
【0032】
データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域を出る直前に、各ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているそのキャッシュ内のキャッシュ・ラインを無効化する。代替的に、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインに対応する有効データを、共有キャッシュ315から取り出すことができる。
【0033】
一実施形態では、並列コンピュータ・システム700は、3つの異なるイベントを表す、3つの異なるフラグ・ビット(図示せず)を利用する。第1フラグ・ビットは、データ従属性を含まず且つ複数のプロセッサによって並列に実行可能であるソフトウェア・プログラム領域の始端を表す。コンパイラ760は、ソフトウェア・プログラム領域がデータ従属性を含まず且つ複数のプロセッサによって並列に実行可能であることを決定するときに、この第1フラグ・ビットをセットすることができる。第2フラグ・ビットは、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域の終端を表す。コンパイラ760は、プロセッサ又はスレッドがそのソフトウェア・プログラム領域を出ることを決定するときに、この第2フラグ・ビットをセットすることができる。第3のフラグ・ビット(即ち、偽共有ビット)は、偽共有状態への遷移を表す。ローカル・キャッシュ内の1キャッシュ・ラインにつき1ビットの偽共有ビットを設けることができる。偽共有が発生するとき、ローカル・キャッシュ・コントローラは、そのローカル・キャッシュの対応するキャッシュ・ラインのこの偽共有ビットをセットすることができる。
【0034】
一実施形態では、ローカル・キャッシュ・コントローラは、その対応するローカル・キャッシュの状態を表すための専用ビットを使用する代わりに、2ビット以上を使用して幾つかの状態を表すことができる。例えば、図6の3つの状態を表すためには、第1ビットを使用してキャッシュ・ラインの状態が無効であるか否かを示し、第2ビットを使用してキャッシュ・ラインの状態が有効であるか否かを示し、第3のビットを使用してキャッシュ・ラインの状態が偽共有であるか否かを示すことができる。代替的に、ローカル・キャッシュ・コントローラは、例えば、2ビットを使用することにより、これらの3つの状態を実装することができる。即ち、「00」はキャッシュ・ラインの状態が無効であることを示し、「01」はキャッシュ・ラインの状態が有効であることを示し、「10」はキャッシュ・ラインの状態が偽共有であることを示す。従って、一実施形態では、有効/無効/偽共有状態について別個のビットを設けることができる。他の実施形態では、これらの3つの状態は、ローカル・キャッシュ内で追跡中の他のデータと共有される複数ビットの組み合わせによって実装することができる。
【0035】
一実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域では、ローカル書き込みイベントが発生するときに、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、有効状態に留まる。もし、このキャッシュ・ライン内で偽共有が発生すれば、ソフトウェア・プログラム領域の終端に対応するローカル・キャッシュ内の対応するキャッシュ・ラインを無効化する必要はない。しかし、当該対応するキャッシュ・ライン内で偽共有が発生すれば、例えば、2つの異なるプロセッサがそれらのローカル・キャッシュ内の同じキャッシュ・ラインの異なる部分に対して書き込みを行うならば、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、偽共有状態に遷移する。
【0036】
他の実施形態では、データ従属性を含まず且つ複数のプロセッサによって並列に実行されるソフトウェア・プログラム領域では、他のローカル・キャッシュへの偽共有イベントを構成するローカル書き込みイベントが発生するときに、対応するローカル・キャッシュ内の対応するキャッシュ・ラインは、偽共有状態に遷移する。この実施形態では、当該キャッシュ・ラインにおける後続の偽共有が発生するときに、ローカル書き込みイベントが最初に発生する場合を除き、ローカル・キャッシュ間で当該後続の偽共有の発生を通信する必要はない。この実施形態では、ソフトウェア・プログラム領域の終端において、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているそれらのローカル・キャッシュ内のキャッシュ・ラインを無効化する。
【0037】
一実施形態では、図12は、偽共有ビットをセットし且つ偽共有ビットがセットされているキャッシュ・ラインを無効化するための方法ステップを示す。ステップ900では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する。ステップ910では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。しかし、ステップ920に示すように、キャッシュ・ラインを更新した後は、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットすることを阻止される。ステップ930では、ローカル・キャッシュ・コントローラは、対応するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達することをコンパイラ760が検出するときに、偽共有ビットがセットされているローカル・キャッシュ内のキャッシュ・ラインを無効化する。しかし、ステップ940に示すように、対応するプロセッサがデータ従属性を含まないソフトウェア・プログラム領域の終端に到達するときに、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化しない。
【0038】
他の実施形態では、図13は、偽共有ビットをセットし且つ偽共有ビットがセットされているキャッシュ・ラインを無効化するための方法ステップを示す。ステップ1000では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する。ステップ1010では、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする。ステップ1020では、キャッシュ・ラインを更新した後に、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、第1ローカル・キャッシュ・コントローラは、第1ローカル・キャッシュの偽共有ビットをセットする。そのため、ステップ1030に示すように、データ従属性を含まないソフトウェア・プログラム領域を複数のプロセッサが並列に実行する間に、対応するキャッシュ・ライン上の後続の偽共有が発生するときに、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は必要とされない。
【0039】
一実施形態では、データ従属性を含まないソフトウェア・プログラム領域の終端に複数のプロセッサが到達するときに、ローカル・キャッシュ・コントローラは、共有キャッシュ・メモリ315から有効データを取り出すことにより、偽共有ビットがセットされているキャッシュ・ラインのうちの幾つか(例えば、1つ、2つ又は3つ)の部分を選択的に更新する。データ従属性を含まないソフトウェア・プログラム領域の終端に対応するプロセッサが到達することをコンパイラ760が検出するときに、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされているキャッシュ・ラインのうちの幾つか(例えば、残り)の部分を選択的に無効化する。例えば、既知のLRUアルゴリズムを使用することにより、ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている最近に使用されたキャッシュ・ラインのための有効データを共有キャッシュ315からローカル・キャッシュに取り出す。ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている残りのキャッシュ・ラインを無効化する。これらの残りのキャッシュ・ラインについては、ローカル・キャッシュ・コントローラは、どのような処置を講じる必要もなく、これらの残りのキャッシュ・ラインに関するローカル読み取りイベント又はローカル書き込みイベントが発生するときに、共有キャッシュ315から有効データを取り出すことができる。
【0040】
データ従属性を含むか又は並列に実行できないソフトウェア・プログラム領域では、ローカル・キャッシュ内の有効キャッシュ・ラインへのローカル書き込みは、共有キャッシュ315にライトスルーされる。このソフトウェア・プログラム領域内では、共有キャッシュ315にライトスルーされている間、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の同じキャッシュ・ラインを無効化する。この無効化を完了し且つライトスルー動作を発行するとき、このローカル書き込みは完了する。
【0041】
データ従属性を含まず且つ並列に実行可能であるソフトウェア・プログラム領域では、ローカル・キャッシュ内の有効キャッシュ・ラインへのローカル書き込みは、共有キャッシュ315にライトスルーされる。このソフトウェア・プログラム領域では、共有キャッシュ315にライトスルーされている間、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の同じキャッシュ・ラインを偽共有状態に遷移させる。偽共有状態への遷移を完了し且つライトスルー動作を発行するとき、このローカル書き込みは完了する。
【0042】
代替的に、偽共有状態への遷移が完了する前又はライトスルー動作が完了する前に、ローカル書き込みを完了することができる。換言すれば、第1ローカル・キャッシュ・コントローラが第1ローカル・キャッシュ内のキャッシュ・ラインを更新する場合、第1ローカル・キャッシュ・コントローラが、第1ローカル・キャッシュ内のキャッシュ・ラインを更新する動作を完了する後に、他のローカル・キャッシュ・コントローラのうちの幾つか(例えば、1つ又は2つ等)は、他のローカル・キャッシュ・メモリ内の対応するキャッシュ・ラインの偽共有ビットをセットする。他のローカル・キャッシュ・コントローラは、データ従属性を含まないソフトウェア・プログラム領域を出る前に、他のローカル・キャッシュ・メモリ内の対応するキャッシュ・ラインの偽共有ビットのセッティングを完了する。この方式を実装するために、特定の一連のステップが実行される。即ち、各スレッドは、(1)データ従属性を含まないソフトウェア・プログラム領域を開始し、(2)そのローカル・キャッシュ・コントローラがそのキャッシュ・ラインを更新する後に他の幾つかのローカル・キャッシュ・コントローラが対応するキャッシュ・ラインの偽共有ビットをセットすることができるように計算を実行し、(3)当該並列実行領域の計算を完了し、(4)そのローカル・キャッシュ・コントローラから生じる全ての偽共有通知が完了した(即ち、他の全てのキャッシュ・コントローラが、このスレッドの計算に起因して偽共有が生じた全ての対応するキャッシュ・ラインを通知された)ことを保証し、(5)このソフトウェア・プログラム領域に参加する全てのスレッドが当該ソフトウェア・プログラム領域の終端に到達したとき、同期バリアを実行し、(6)並列実行領域の終了動作を実行する。この一連の動作(1)〜(6)を使用すると、並列実行領域の終了動作を実行するとき、データ従属性を含まない当該並列実行領域に参加する任意のスレッドによる偽共有の保留中通知が存在しないことが保証される。動作(4)を実装するために、ローカル・キャッシュ・コントローラは、当該ローカル・キャッシュ・コントローラによる他の任意のキャッシュ・コントローラへの任意の保留中通知を追跡し、対応するキャッシュ・ラインに関連する偽共有ビットをセットしようと試みる。
【0043】
一実施形態では、並列コンピュータ・システム700は、全てのローカル・キャッシュ及び共有キャッシュ315を制御するために、中央ディレクトリ又はスヌーピング技術を使用する。スヌーピング技術は、各ローカル・キャッシュ・コントローラが全てのプロセッサに関連する全てのローカル・キャッシュをモニタするように実装されたシステムを表す。従って、ローカル書き込みイベントが発生するとき、スヌーピング技術を使用することにより、ローカル・キャッシュ・コントローラは、全てのローカル書き込みイベントの発生を検出することができる。中央ディレクトリは、そのデータが有効である1つのキャッシュIDに対応する、1つのタグ・フィールドを有することができる。このタグ・フィールドに記述されているローカル・キャッシュが有効データを有するのに対し、他のローカル・キャッシュ内の対応するキャッシュ・ラインは偽共有状態にあることがある。対応するキャッシュ・ライン上の偽共有がその後に発生するときに、並列コンピュータ・システム700は、このタグ・フィールドを使用し、例えば、有効キャッシュ・ラインの偽共有ビットをセットすることにより、当該有効キャッシュ・ラインを偽共有状態に移行させることができる。換言すれば、並列コンピュータ・システム700は、このタグ・フィールドに基づいて、有効キャッシュ・ラインのみの状態を変更させる。代替的に、各ローカル・キャッシュ内の各キャッシュ・ラインは、そのデータが有効であるか否かを示す、有効ビットを有する。偽共有イベントが発生するとき、並列コンピュータ・システム700は、有効ビットがセットされているキャッシュ・ラインのみの状態を変更させる。例えば、並列コンピュータ・システム700は、これらのキャッシュ・ラインの有効ビットをオフに転じ且つこれらのキャッシュ・ラインの偽共有ビットをセットする。
【0044】
本発明の諸側面は、システム、方法又はコンピュータ・プログラムとして具体化することができる。従って、本発明の諸側面は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコード等を含む)又はソフトウェア及びハードウェア要素の両方を含む実施形態の形式を取ることができ、これらの全てを一般に「回路」、「モジュール」又は「システム」と呼ぶことができる。さらに、本発明の諸側面は、コンピュータ可読プログラム・コードを1つ以上のコンピュータ可読媒体内に具体化した、コンピュータ・プログラムの形式を取ることができる。
【0045】
1つ以上のコンピュータ可読媒体の任意の組み合わせを利用することができる。コンピュータ可読媒体は、コンピュータ可読信号媒体又はコンピュータ可読ストレージ媒体とすることができる。例えば、コンピュータ可読ストレージ媒体は、電子、磁気、光学、電磁気、赤外線、半導体システム、装置若しくはデバイス、又はこれらの任意の適切な組み合わせとすることができる。コンピュータ可読ストレージ媒体の特定の例は、1つ以上の線を有する電気接続、フレキシブル・ディスク、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み取り専用メモリ(ROM)、消去可能プログラマブル読み取り専用メモリ(EPROM又はフラッシュ・メモリ)、光ファイバ、読み取り専用CD−ROM、光ストレージ装置、磁気ストレージ装置、又はこれらの任意の適切な組み合わせとすることができる。本明細書の文脈では、コンピュータ可読ストレージ媒体は、命令を実行するシステム、装置又はデバイスに関連して又はこれらによって使用するためのプログラムを保持又は格納する、任意の有形的媒体とすることができる。
【0046】
コンピュータ可読信号媒体は、伝搬されるデータ信号の形式を有することもあるが、その場合には、ベースバンド内に又は搬送波の一部として、コンピュータ可読プログラム・コードを具体化することができる。かかる伝搬される信号は、電磁気、光学、又はこれらの任意の適切な組み合わせ等を含む、種々の形式のうち任意の形式を取る。コンピュータ可読信号媒体は、コンピュータ可読ストレージ媒体ではなく、命令を実行するシステム、装置又はデバイスに関連して又はこれらによって使用するためのプログラムを通信し、伝搬し、移送する、任意のコンピュータ可読媒体とすることができる。
【0047】
コンピュータ可読媒体上に具体化されたプログラム・コードは、無線、有線、光ファイバ・ケーブル、RF、又はこれらの任意の適切な組み合わせ等を含む、適切な任意の媒体を使用して伝送することができる。
【0048】
本発明の諸側面に従った動作を実施するためのコンピュータ・プログラム・コードは、Java(R)、Smalltalk、C++等のようなオブジェクト指向プログラミング言語及び「C」プログラミング言語又は同様のプログラミング言語のような通常の手続き的プログラミング言語を含む、1つ以上のプログラミング言語の任意の組み合わせで書くことができる。プログラム・コードは、独立のソフトウェア・パッケージとしてユーザ・コンピュータ上で完全に実行することができ、その一部をユーザ・コンピュータ上で且つ他の一部をリモート・コンピュータ上で実行することができ、又はリモート・コンピュータ若しくはサーバ上で完全に実行することができる。後者のシナリオでは、リモート・コンピュータは、ローカル・エリア・ネットワーク(LAN)又は広域ネットワーク(WAN)を含む任意のタイプのネットワークを通してユーザ・コンピュータに接続することができ、或いはその接続を(例えば、インターネット・サービス・プロバイダを使用するインターネットを通して)外部コンピュータに行うことができる。
【0049】
以上では、本発明の実施形態に従った、方法、装置(システム)及びコンピュータ・プログラムのフローチャート又はブロック図を参照して、本発明の諸側面を説明した。フローチャート又はブロック図の各ブロック、複数ブロックの組み合わせは、コンピュータ・プログラム命令によって実装することができる。これらのコンピュータ・プログラム命令を、汎用コンピュータ、専用コンピュータ又は他のプログラム可能なデータ処理装置のプロセッサに提供すると、当該コンピュータ又は他のプログラム可能なデータ処理装置のプロセッサを介して実行される諸命令は、フローチャート又はブロック図のブロックで指定された機能/行為を実装するための手段を作成する。また、これらのコンピュータ・プログラム命令をコンピュータ可読媒体内に格納すると、当該コンピュータ可読媒体内に格納された諸命令が、フローチャート又はブロック図のブロックで指定された機能/行為を実装するための諸命令を含む製品を生産することを目的として、コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイスに対し特定の態様で機能するように指示することができる。
【0050】
また、これらのコンピュータ・プログラム命令を、コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイスにロードすると、当該コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイス上で実行される諸命令が、フローチャート又はブロック図のブロックで指定された機能/行為を実装するためのプロセスを提供することを目的として、一のコンピュータ実装プロセスを生成するように当該コンピュータ、他のプログラム可能なデータ処理装置又は他のデバイス上で一連の動作ステップを実行させることができる。
【0051】
諸図面のうちフローチャート及びブロック図は、本発明の種々の実施形態に従った、システム、方法及びコンピュータ・プログラムの可能な実装のアーキテクチャ、機能性及び動作を示す。この点に関連して、フローチャート又はブロック図内の各ブロックは、指定された論理機能を実装するための1つ以上の動作可能命令から成る、モジュール、セグメント又はコード部分を表すことがある点に留意されたい。また、幾つかの代替的実装では、ブロック内に表記された機能を図面に示した順序とは異なる順序で実施することができる点にも留意されたい。例えば、特定の機能性に依存して、連続的に示した2つのブロックを実質的に並列に実施したり、これらのブロックを反対の順序で実施することができる。さらに、ブロック図又はフローチャートの各ブロック及び複数ブロックの組み合わせは、指定された機能又は行為を実行する専用のハードウェア・ベースのシステム又は専用ハードウェア及びコンピュータ命令の組み合わせによって実装することができる点にも留意されたい。
【符号の説明】
【0052】
300、350・・・偽共有ビット」
305、310・・・ローカル・キャッシュ
315・・・共有キャッシュ
330・・・キャッシュ・ライン
335・・・キャッシュ・ライン330にある第1部分
345・・・有効ビット
405・・・無効状態
410・・・有効状態
415・・・偽共有状態
705、710、715・・・プロセッサ
720・・・共有キャッシュ
722・・・キャッシュ・コントローラ
730、735、740・・・ローカル・キャッシュ
745、750、755・・・ローカル・キャッシュ・コントローラ
760・・・コンパイラ
【特許請求の範囲】
【請求項1】
並列コンピュータ・システムの性能を改良するための装置であって、
複数のプロセッサを備え、
各プロセッサは、ローカル・キャッシュを有し、各プロセッサは、データ従属性を含まないソフトウェア・プログラム領域のプログラム・コードを実行し、各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するローカル・キャッシュ・コントローラに関連しており、
前記プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有の発生を検出し且つ前記第2プロセッサによる前記第1キャッシュ・ラインの前記偽共有を許可するための、第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラを備え、
前記第1キャッシュ・ラインの前記偽共有は、前記第1ローカル・キャッシュ・コントローラによって前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの第2部分を更新するときに発生する、装置。
【請求項2】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項1記載の装置。
【請求項3】
前記第2ローカル・キャッシュ・コントローラが前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第2部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットし、前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第2ローカル・キャッシュ・コントローラは、前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項1記載の装置。
【請求項4】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている前記第1ローカル・キャッシュ及び前記第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する、請求項3記載の装置。
【請求項5】
データ従属性を含まない前記ソフトウェア・プログラム領域は、データ従属性を含まない少なくとも1つのループを含む、請求項1記載の装置。
【請求項6】
前記ループがデータ従属性を含まないか否かを決定するために、コンパイラは、先行する反復の出力が後続する反復の入力として使用されるか否かを評価する、請求項5記載の装置。
【請求項7】
ローカル・キャッシュへの任意の書き込みが、前記複数のプロセッサによって共有される共有キャッシュにライトスルーされる、請求項1記載の装置。
【請求項8】
前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される、請求項1記載の装置。
【請求項9】
前記第1キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない、請求項1記載の装置。
【請求項10】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする、請求項4記載の装置。
【請求項11】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の前記終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する、請求項4記載の装置。
【請求項12】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する、請求項7記載の装置。
【請求項13】
前記偽共有の発生を検出するために、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する、請求項1記載の装置。
【請求項14】
並列コンピュータ・システムの性能を改良するための方法であって、
複数のプロセッサを提供するステップを有し、
各プロセッサは、ローカル・キャッシュを有し、各プロセッサは、データ従属性を含まないソフトウェア・プログラム領域のプログラム・コードを実行し、各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するローカル・キャッシュ・コントローラに関連しており、
第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラによって、前記プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有の発生を検出し且つ前記第2プロセッサによる前記第1キャッシュ・ラインの前記偽共有を許可するステップを有し、
前記第1キャッシュ・ラインの前記偽共有は、前記第1ローカル・キャッシュ・コントローラによって前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの第2部分を更新するときに発生する、方法。
【請求項15】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項14記載の方法。
【請求項16】
前記第2ローカル・キャッシュ・コントローラが前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第2部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットし、前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第2ローカル・キャッシュ・コントローラは、前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項14記載の方法。
【請求項17】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている前記第1ローカル・キャッシュ及び前記第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する、請求項16記載の方法。
【請求項18】
ローカル・キャッシュへの任意の書き込みが、前記複数のプロセッサによって共有される共有キャッシュにライトスルーされる、請求項14記載の方法。
【請求項19】
前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される、請求項14記載の方法。
【請求項20】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない、請求項14記載の方法。
【請求項21】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする、請求項17記載の方法。
【請求項22】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の前記終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する、請求項17記載の方法。
【請求項23】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する、請求項18記載の方法。
【請求項24】
偽共有の発生を検出するために、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する、請求項14記載の方法。
【請求項25】
請求項14ないし請求項24の何れか1項に記載の方法の各ステップをコンピュータに実行させるためのコンピュータ・プログラム。
【請求項1】
並列コンピュータ・システムの性能を改良するための装置であって、
複数のプロセッサを備え、
各プロセッサは、ローカル・キャッシュを有し、各プロセッサは、データ従属性を含まないソフトウェア・プログラム領域のプログラム・コードを実行し、各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するローカル・キャッシュ・コントローラに関連しており、
前記プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有の発生を検出し且つ前記第2プロセッサによる前記第1キャッシュ・ラインの前記偽共有を許可するための、第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラを備え、
前記第1キャッシュ・ラインの前記偽共有は、前記第1ローカル・キャッシュ・コントローラによって前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの第2部分を更新するときに発生する、装置。
【請求項2】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項1記載の装置。
【請求項3】
前記第2ローカル・キャッシュ・コントローラが前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第2部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットし、前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第2ローカル・キャッシュ・コントローラは、前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項1記載の装置。
【請求項4】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている前記第1ローカル・キャッシュ及び前記第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する、請求項3記載の装置。
【請求項5】
データ従属性を含まない前記ソフトウェア・プログラム領域は、データ従属性を含まない少なくとも1つのループを含む、請求項1記載の装置。
【請求項6】
前記ループがデータ従属性を含まないか否かを決定するために、コンパイラは、先行する反復の出力が後続する反復の入力として使用されるか否かを評価する、請求項5記載の装置。
【請求項7】
ローカル・キャッシュへの任意の書き込みが、前記複数のプロセッサによって共有される共有キャッシュにライトスルーされる、請求項1記載の装置。
【請求項8】
前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される、請求項1記載の装置。
【請求項9】
前記第1キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない、請求項1記載の装置。
【請求項10】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする、請求項4記載の装置。
【請求項11】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の前記終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する、請求項4記載の装置。
【請求項12】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する、請求項7記載の装置。
【請求項13】
前記偽共有の発生を検出するために、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する、請求項1記載の装置。
【請求項14】
並列コンピュータ・システムの性能を改良するための方法であって、
複数のプロセッサを提供するステップを有し、
各プロセッサは、ローカル・キャッシュを有し、各プロセッサは、データ従属性を含まないソフトウェア・プログラム領域のプログラム・コードを実行し、各プロセッサのローカル・キャッシュは、当該ローカル・キャッシュ内のキャッシュ・ラインを更新するローカル・キャッシュ・コントローラに関連しており、
第1プロセッサの第1ローカル・キャッシュに関連する第1ローカル・キャッシュ・コントローラによって、前記プログラム・コードを実行中の第2プロセッサによる第1キャッシュ・ラインの偽共有の発生を検出し且つ前記第2プロセッサによる前記第1キャッシュ・ラインの前記偽共有を許可するステップを有し、
前記第1キャッシュ・ラインの前記偽共有は、前記第1ローカル・キャッシュ・コントローラによって前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの第1部分を更新し、その後に、第2ローカル・キャッシュ・コントローラによって第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの第2部分を更新するときに発生する、方法。
【請求項15】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項14記載の方法。
【請求項16】
前記第2ローカル・キャッシュ・コントローラが前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第2部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットし、前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第2ローカル・キャッシュ・コントローラは、前記第2ローカル・キャッシュ内の前記第1キャッシュ・ラインに対応する偽共有ビットをセットする、請求項14記載の方法。
【請求項17】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている前記第1ローカル・キャッシュ及び前記第2ローカル・キャッシュ内のキャッシュ・ラインを無効化する、請求項16記載の方法。
【請求項18】
ローカル・キャッシュへの任意の書き込みが、前記複数のプロセッサによって共有される共有キャッシュにライトスルーされる、請求項14記載の方法。
【請求項19】
前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュの偽共有ビットをセットすることを阻止され、他のローカル・キャッシュ・コントローラは、偽共有ビットがセットされていないローカル・キャッシュ内のキャッシュ・ラインを無効化することを阻止される、請求項14記載の方法。
【請求項20】
前記第1ローカル・キャッシュ・コントローラが前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの前記第1部分を更新するとき、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインの偽共有ビットをセットし、他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットし、その後に当該対応するキャッシュ・ラインについて偽共有が発生するときは、ローカル・キャッシュ・メモリ・コントローラ間で更なる通信は行われない、請求項14記載の方法。
【請求項21】
前記複数のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記第1ローカル・キャッシュ内の前記第1キャッシュ・ラインを更新する動作を完了し、その後に、1つ以上の他のローカル・キャッシュ・コントローラは、他のローカル・キャッシュ内の対応するキャッシュ・ラインの偽共有ビットをセットする、請求項17記載の方法。
【請求項22】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の前記終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に無効化する、請求項17記載の方法。
【請求項23】
2つ以上のプロセッサがデータ従属性を含まない前記ソフトウェア・プログラム領域の終端に到達することに応答して、前記第1ローカル・キャッシュ・コントローラは、前記共有キャッシュから有効データを取り出すことにより、偽共有ビットがセットされている1つ以上のキャッシュ・ラインを選択的に更新する、請求項18記載の方法。
【請求項24】
偽共有の発生を検出するために、前記第1ローカル・キャッシュ・コントローラ及び前記第2ローカル・キャッシュ・コントローラは、中央ディレクトリ又はスヌーピング技術を使用する、請求項14記載の方法。
【請求項25】
請求項14ないし請求項24の何れか1項に記載の方法の各ステップをコンピュータに実行させるためのコンピュータ・プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【公開番号】特開2012−168930(P2012−168930A)
【公開日】平成24年9月6日(2012.9.6)
【国際特許分類】
【出願番号】特願2012−6116(P2012−6116)
【出願日】平成24年1月16日(2012.1.16)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】
【公開日】平成24年9月6日(2012.9.6)
【国際特許分類】
【出願日】平成24年1月16日(2012.1.16)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】
[ Back to top ]