まず、図面を参照しつつ、本発明に関連する一般的な技術を詳細に説明する。
マルチプロセッサでは、マスタ側プロセッサからスレーブ側プロセッサへのデータの受け渡し方法として、メインメモリにおける共有領域にデータを用意し、全てのデータが更新されたことを、メインメモリのフラグを更新することで通知する方法が一般的に用いられている。
このような受け渡し方法では、スレーブ側プロセッサがフラグの更新を認識して共有領域のデータを参照したときに、マスタ側プロセッサによる全てのデータの更新が反映されていることが不可欠である。
そこで、マスタ側プロセッサは、共有領域のデータ更新処理と、フラグの更新処理との順序保証のために、フラグの更新処理の前に、共有領域のデータ更新処理の完了を待ち合わせるための完了待ち合わせ処理を行っている。一般的には、メモリフェンス等の機能、又はメモリフェンス機能付き命令により、先行する共有領域のデータ更新処理の全処理完了を待ち合わせてから、フラグを更新する。
このように、マルチプロセッサでは、プロセッサ間のデータコヒーレンシを保証するために完了待ち合わせ処理が不可欠となる。しかしながら、キャッシュの記憶階層が深い構成や、プロセッサが多い構成では、完了待ち合わせ処理に必要な時間が増大し、システム全体の処理性能を悪化させる。
以下の説明では、各プロセッサに最も近い位置に実装されているキャッシュを「L1(Level 1)キャッシュ」と称し、複数のプロセッサで共有可能に設けられたキャッシュのうち最も上位に位置するキャッシュを「LL(Last Level)キャッシュ」と称する。キャッシュの記憶階層は、メインメモリ側に近いほど上位のキャッシュ、プロセッサ側に近いほど下位のキャッシュである。LLキャッシュは、任意のアドレスに対するキャッシュ・コヒーレンシが成立するポイントを有している。以下の説明では、キャッシュ・コヒーレンシが成立するポイントを「コヒーレンシポイント」と称する。唯一のアドレスに対しては、唯一のコヒーレンシポイントが存在する。
なお、マルチプロセッサと複数の記憶階層のキャッシュとを備える計算機システムは、L1キャッシュからLLキャッシュまでの間に、更に複数の記憶階層のキャッシュを備えていてもよい。そのような計算機システムでは、コヒーレンシポイントも任意のアドレス毎に物理的に複数箇所に分散して実装することも可能である。また、そのような計算機システムでは、キャッシュ構造もアドレスに応じてインタリーブし、複数バンク構成とすることも可能である。キャッシュ構造は、ストアスルー、ストアインのいずれであってもよく、キャッシュ状態制御のプロトコルも特別な制約はない。
また、マスタ側プロセッサが更新する共有領域のデータは、マスタ側プロセッサのL1キャッシュだけでなく、スレーブ側プロセッサを含む他のプロセッサのL1キャッシュにも存在している可能性がある。そのため、マルチプロセッサでは、マスタ側プロセッサによる共有領域のデータ更新処理を保証するために、スレーブ側プロセッサを含む他のプロセッサの全てのL1キャッシュに対する無効化処理を実行し、その全てが完了することを保証する必要がある。
以下の説明では、このようなマスタ側プロセッサによる共有領域のデータ更新に伴う一般的な動作の完了保証について述べる。
マスタ側プロセッサは、例えばストア命令等を実行することにより共有領域のデータを更新すると、コヒーレンシポイントであるLLキャッシュに対して、共有領域のデータ更新が発生したことを通知する。通知を受けたLLキャッシュは、スレーブ側プロセッサを含む他のプロセッサのL1キャッシュが、該当するデータをL1キャッシュに持っているかを判定し、持っているL1キャッシュに対して、無効化指示を発行する。無効化指示を受けたスレーブ側プロセッサを含むプロセッサのL1キャッシュは、該当するデータを無効化し、無効化完了を、コヒーレンシポイントであるLLキャッシュに通知する。コヒーレンシポイントであるLLキャッシュは、発行した全ての無効化指示に対応する無効化完了を受け取ったことに応じて、マスタ側プロセッサに対して完了通知を発行する。
したがって、マスタ側プロセッサは、共有領域のデータ更新に伴う動作の完了を待ち合わせる場合、共有領域のデータ更新処理のみならず、無効化指示、無効化完了、完了通知に係る全ての処理の完了を待ち合わせる必要がある。
図3は、複数のプロセッサ間のデータ受け渡しに係る一般的な動作シーケンスの一例を示す図である。以下の説明では、実際に共有領域のデータを参照するスレーブ側プロセッサの動作を加えて述べる。
この動作シーケンスでは、説明が煩雑になることを防ぐことを目的として、共有領域にアサインされたメモリのコヒーレンシポイントはスレーブ側LLキャッシュに実装され、フラグ領域にアサインされたメモリのコヒーレンシポイントはマスタ側LLキャッシュに実装されているものとして説明する。
まず、マスタ側プロセッサは、共有領域のデータを更新するにあたり、その旨のストア命令を、マスタ側L1キャッシュに対して実行する(ステップS601)。そして、マスタ側プロセッサは、完了待ち合わせ処理を開始する(ステップS602)。
マスタ側L1キャッシュは、ストア命令に応じて、対象装置毎に決められたキャッシュ・コヒーレンシに応じたストア処理を実行し、共有領域にアサインされたメモリのコヒーレンシポイントであるスレーブ側LLキャッシュに対して、ストア処理リクエストを実行する(ステップS603)。
スレーブ側LLキャッシュは、共有領域にアサインされたメモリのコヒーレンシポイントであるため、共有領域に対するストア処理リクエストの対象アドレスをチェックし、他のキャッシュで保持されていないかを確認し、保持しているキャッシュに対して無効化指示を発行する(ステップS604)。この動作シーケンスでは、説明が煩雑になることを防ぐことを目的として、ストア対象アドレスの内容がスレーブ側L1キャッシュで保持されている例について説明する。しかしながら、ストア対象のアドレスの内容を保持しているキャッシュは、存在していない場合もあるし、複数存在している場合もある。ストア対象アドレスの内容を保持しているキャッシュが複数存在する場合、スレーブ側LLキャッシュは、対象となる全てのキャッシュに対して無効化指示を発行する。
無効化指示を受けたL1キャッシュは、ストア対象のアドレスの内容を無効化して(ステップS605)、無効化が完了した旨の完了通知を、共有領域のコヒーレンシポイントであるスレーブ側LLキャッシュに通知する(ステップS606)。
共有領域のコヒーレンシポイントであるスレーブ側LLキャッシュは、発行した無効化指示に対応する全ての完了通知を受け取ると、共有領域に対するストア処理リクエストを受けたマスタ側L1キャッシュに対して完了通知を通知する(ステップS607)。
マスタ側L1キャッシュは、スレーブ側LLキャッシュからの完了通知を受けると、共有領域に対するストア命令を実行したマスタ側プロセッサに対して、同様に完了通知を通知する(ステップS608)。
マスタ側プロセッサは、完了通知を受けたことにより完了待ち合わせ処理を終了すると、フラグを更新するにあたり、その旨のストア命令を、マスタ側L1キャッシュに対して実行する(ステップS701)。
マスタ側L1キャッシュは、ストア命令に応じて、フラグ領域にアサインされたメモリのコヒーレンシポイントであるマスタ側LLキャッシュに対して、ストア処理リクエストを実行する(ステップS702)。
マスタ側LLキャッシュは、フラグ領域にアサインされたコヒーレンシポイントであるため、フラグ領域に対するストア処理リクエストの対象のフラグを更新して、フラグの更新処理が完了した旨の完了通知を、マスタ側L1キャッシュに通知する(ステップS703)。
マスタ側L1キャッシュは、マスタ側LLキャッシュからの完了通知を受けると、フラグ領域に対するストア命令を実行したマスタ側プロセッサに対して、同様に完了通知を通知する(ステップS704)。
一方、スレーブ側プロセッサは、フラグを参照するにあたり、その旨のロード命令を、L1キャッシュに対して実行する(ステップS801)。
この動作シーケンスでは、スレーブ側L1キャッシュにはフラグ領域の内容が存在せず、フラグ領域のコヒーレンシポイントであるマスタ側LLキャッシュを参照する例について説明する。
スレーブ側L1キャッシュは、ロード命令を受けると、フラグ領域のコヒーレンシポイントであるマスタ側LLキャッシュに対してロード処理を要求する(ステップS802)。
マスタ側LLキャッシュは、ロード処理の要求を受けると、フラグ領域の最新の内容をロードリプライデータとして、スレーブ側L1キャッシュに返却する(ステップS803)。
スレーブ側L1キャッシュは、マスタ側LLキャッシュからのロードリプライデータを受けると、フラグ領域に対するロード命令を実行したスレーブ側プロセッサに対して、そのリプライデータを返却する(ステップS804)。
フラグ領域に対するロード命令を実行したスレーブ側プロセッサは、フラグの内容が更新されていることが確認された場合、共有領域の参照を行うにあたり、その旨のロード命令を、スレーブ側L1キャッシュに対して実行する(ステップS901)。
この動作シーケンスでは、スレーブ側L1キャッシュには共有領域の内容が存在せず、共有領域のコヒーレンシポイントであるスレーブ側LLキャッシュを参照する例について説明する。
スレーブ側L1キャッシュは、ロード命令を受けると、共有領域のコヒーレンシポイントであるスレーブ側LLキャッシュに対してロード処理を要求する(ステップS902)。
スレーブ側LLキャッシュは、ロード処理の要求を受けると、共有領域の最新の内容をロードリプライデータとして、スレーブ側L1キャッシュに返却する(ステップS903)。
スレーブ側L1キャッシュは、スレーブ側LLキャッシュからのロードリプライデータを受けると、共有領域に対するロード命令を実行したスレーブ側プロセッサに対して、そのリプライデータを返却する(ステップS904)。
このように、マスタ側プロセッサは、共有領域のデータを更新するにあたり、その完了を待ち合わせてフラグを更新する。そして、スレーブ側プロセッサは、フラグを参照することにより、マスタ側プロセッサによる更新が反映された最新のデータの内容を参照することができる。
しかしながら、コヒーレンシを保証するための待ち合わせ時間は、例えば大規模なシステムになるほど、あるいはキャッシュの記憶階層が深くなるほど、長くなる。
マスタ側プロセッサによる共有領域のデータ更新処理では、スレーブ側のLLキャッシュからの無効化指示がスレーブ側のL1キャッシュに到達するまでの処理時間が遅延することがある。例えば、L1キャッシュを多数実装する大規模なシステムでは、LLキャッシュとL1キャッシュとの物理的な距離が遠くなってしまうことから、LLキャッシュからの無効化指示がL1キャッシュに届くまでの時間が必然的に長くなってしまい、遅延が発生し易い。また、キャッシュの記憶階層が深いシステムの場合には、LLキャッシュとL1キャッシュとの間にL2(Level 2)キャッシュ、L3(Level 3)キャッシュといった、複数の記憶階層のキャッシュを実行することになるため、やはり、LLキャッシュからの無効化指示がL1キャッシュに届くまでの時間が必然的に長くなってしまい、遅延が発生し易い。
コヒーレンシを保証するための待ち合わせ時間は、このような無効化指示に係る遅延の影響により長くなる。このような状況下では、マスタ側プロセッサの処理緩衝時間とスレーブ側プロセッサの処理完了時間とが大きく遅れることになり、システムの処理性能が低下してしまう。
したがって、大規模なシステムやキャッシュの記憶階層が深いシステムでは、性能の低下を抑制するために、コヒーレンシ保証の高速化が不可欠である。
以下、図面を参照しつつ、本発明の一実施形態を詳細に説明する。
上述したように、マスタ側プロセッサは、共有領域のデータ更新処理とフラグ更新処理との順序保証のために、フラグ更新処理の前に完了待ち合わせ処理を行う。一般的に、マスタ側プロセッサは、メモリフェンス等の機能、又はメモリフェンス機能付き命令で先行する共有領域のデータ更新処理に係る全ての処理の完了を待ち合わせてから、フラグを更新する。以下の説明では、このような、先行する共有領域のデータ更新に係る全ての処理の完了を待ち合わせる動作を「SYNC動作」と称し、SYNC動作を要求する命令を「SYNC動作命令」と称する。なお、SYNC動作命令は、例えば、専用の命令形態や、他の命令にSYNC動作の命令を付加した命令形態といった、どのような形態であってもよい。この実施の形態では、一般的に使用されているメモリフェンス機能はSYNC動作に含まれ、メモリフェンス機能付き命令はSYNC動作命令に含まれる。
また、上述したように、各コヒーレンシポイントは、ストア処理リクエストの対象アドレスをチェックし、各L1キャッシュが該当するデータを持っているかを判定し、持っているキャッシュに対して無効化指示を発行する。以下の説明では、このような無効化指示をL1キャッシュに反映させる動作を「FLUSH動作」と称し、FLUSH動作を要求する命令を「FLUSH動作命令」と称する。なお、FLUSH動作命令は、例えば、専用の命令形態や、他の命令にFLUSH動作の命令を付加した命令形態といった、どのような形態であってもよい。
この実施の形態では、スレーブ側プロセッサがフラグを参照する際にFLUSH動作を行う。FLUSH動作、又はFLUSH動作命令を指示するプロセッサは、全てのコヒーレンシポイントに対して無効化指示を押し出す要求を発行する。以下の説明では、これを「FLUSHリクエスト」と称する。各コヒーレンシポイントは、FLUSHリクエストを受けると、要求元のプロセッサとL1キャッシュに対して、経路上の無効化指示を含む、先行する全ての無効化指示を押し出して、L1キャッシュに全ての無効化指示が到達したことを保証する。以下の説明では、これを「FLUSHリプライ」と称する。要求元のプロセッサは、全てのコヒーレンシポイントからのFLUSHリプライを待ち合わせて、FLUSH動作完了と判定する。
図1は、この実施の形態における計算機システムに搭載されたプロセッサ等を示す構成図である。図1では、メモリアクセス機能とL1キャッシュ機能を有するプロセッサの構成と、LLキャッシュ機能を有するLLキャッシュ制御部の構成とを示す。以下の説明では、この実施の形態の特徴や固有の動作に関連する部分の構成要素のみを取り上げて説明する。その他の機能に関しては、一般的な計算機システムで使用している機能があればよい。
また、図1では、説明が煩雑になることを防ぐことを目的として、この実施の形態の説明に必要な部分にのみ矢印線を示している。実際の構成では、複数のプロセッサの各々、複数のLLキャッシュ制御部の各々は、同じハードウェアで構成されていればよい。
計算機システム100は、マスタ側プロセッサ110Aと、スレーブ側プロセッサ110Bと、マスタ側LLキャッシュ制御部120Aと、スレーブ側LLキャッシュ制御部120Bとを備える。以下の説明では、マスタ側プロセッサ110Aとスレーブ側プロセッサ110Bとを区別せずにプロセッサ110と総称する場合がある。また、以下の説明では、マスタ側LLキャッシュ制御部120Aとスレーブ側LLキャッシュ制御部120Bとを区別せずにLLキャッシュ制御部120と総称する場合がある。
この実施の形態では、説明が煩雑になることを防ぐことを目的として、マスタ側プロセッサ110Aと、スレーブ側プロセッサ110Bとを区別して説明する。しかしながら、マスタ側プロセッサとスレーブ側プロセッサとの関係は、実行するプログラムによって適宜入れ替わる。
また、この実施の形態では、マスタ側LLキャッシュ制御部120AのLLキャッシュと、スレーブ側LLキャッシュ制御部120BのLLキャッシュとが、コヒーレンシポイントになる。より具体的に説明すると、この実施の形態では、マスタ側LLキャッシュ制御部120AのLLキャッシュが、フラグ領域にアサインされたメモリのコヒーレンシポイントを実装しているものとして説明する。また、この実施の形態では、スレーブ側LLキャッシュ制御部120BのLLキャッシュが、共有領域にアサインされたメモリのコヒーレンシポイントを実装しているものとして説明する。
また、この実施の形態では、説明が煩雑になることを防ぐことを目的として、共有領域のコヒーレンシポイントと、フラグ領域のコヒーレンシポイントとを区別して説明する。しかしながら、共有領域のコヒーレンシポイントと、フラグ領域のコヒーレンシポイントとの関係は、実行するプログラムによって適宜入れ替わる。
また、この実施の形態では、説明が煩雑になることを防ぐことを目的として、マスタ側プロセッサ110Aとスレーブ側プロセッサ110BとにL1キャッシュが実装され、マスタ側LLキャッシュ制御部120Aとスレーブ側LLキャッシュ制御部120BとにLLキャッシュが実装されているものとして説明する。しかしながら、L1キャッシュやLLキャッシュの実装位置は、これに限られない。
また、この実施の形態では、説明が煩雑になることを防ぐことを目的として、L1キャッシュの上位にLLキャッシュが存在するものとして説明する。しかしながら、L1キャッシュとLLキャッシュとの間には、更に複数の記憶階層のキャッシュが存在していてもよい。
また、L1キャッシュ、複数の記憶階層のキャッシュ、LLキャッシュのキャッシュ構造は、アドレスに応じてインタリーブし、複数バンク構成とすることも可能である。
マスタ側プロセッサ110Aは、命令デコード部111Aと、命令実行待ち合わせ部112Aと、SYNC完了判定部113Aと、SYNCカウンタ部114Aと、FLUSH生成部115Aと、L1キャッシュ116Aと、FLUSH完了判定部117Aと、リクエスト生成部118Aと、ロードリプライ待ち合わせ部119Aとを有する。
なお、スレーブ側プロセッサ110Bも、マスタ側プロセッサ110Aが有する構成要素と同じ構成要素を有する。以下の説明では、プロセッサ110が有する構成要素がいずれのプロセッサ110の構成要素であるかを区別する場合には、各構成要素を有するプロセッサ110と同じ添え字(A、B)を各構成要素の末尾に付して区別する。例えば、命令デコード部111Aは、マスタ側プロセッサ110Aの構成要素であることを示す。同様に、命令デコード部111Bは、スレーブ側プロセッサ110Bの構成要素であることを示す。
また、以下の説明では、添え字が付されていない構成要素の機能及び動作は、同じ符号が付されたいずれの構成要素の機能及び動作を示す。例えば、命令デコード部111で説明された機能及び動作は、命令デコード部111A、命令デコード部111Bの機能及び動作を示す。
命令デコード部111は、プロセッサ110が実行する命令をデコードし、必要な動作を判定する。例えば、命令デコード部111は、SYNC動作とFLUSH動作とを識別する。また、命令デコード部111は、一般的なプロセッサが有しているそれ以外の機能を有していてもよい。
命令実行待ち合わせ部112は、SYNC動作とFLUSH動作とを実行する場合に、後続命令の処理を一時的に停止し、後続命令を実行可能な特定条件が成立するまで後続命令の実行を待ち合わせる。この実施の形態では、SYNC動作命令により後続命令を停止している場合、SYNC完了判定部113からの指示により特定条件が成立したものとする。また、この実施の形態では、FLUSH動作命令により後続命令を停止している場合、FLUSH完了判定部117からの指示により特定条件が成立したものとする。
SYNC完了判定部113は、SYNC動作の完了を待ち合わせる。例えば、SYNC完了判定部113は、SYNCカウンタ部114の値がゼロになったことでSYNC動作の完了と判定する。なお、SYNC完了判定部113は、L1キャッシュ116やLLキャッシュを複数バンクで構成する装置にも対応し得るように、複数バンクに跨いでSYNC動作の完了を待ち合わせる機能を実装していてもよい。
SYNCカウンタ部114は、メインメモリのデータを更新するストア処理リクエスト数をカウントする。例えば、SYNCカウンタ部114は、ストア処理リクエストをL1キャッシュ116に対して発行した時点でカウント値を1加算し、完了通知を受けるとカウント値を1減算する。したがって、カウント値がゼロであるということは、発行した全てのストア処理リクエストが完了したことを意味する。なお、SYNCカウンタ部114は、L1キャッシュ116やLLキャッシュを複数バンクで構成する装置にも対応し得るように、バンク毎に実装していてもよい。
FLUSH生成部115は、FLUSH動作を行う。例えば、FLUSH生成部115は、FLUSH動作を必要とする命令が実行された場合に、全てのコヒーレンシポイントに対してFLUSHリクエストを発行する。
L1キャッシュ116は、プロセッサ110に最も近い位置にあるキャッシュである。L1キャッシュ116は、一般的なキャッシュであれば、キャッシュ構造もアドレスに応じてインタリーブし、複数バンク構成とすることも可能である。
FLUSH完了判定部117は、全てのコヒーレンシポイントからのFLUSHリプライを待ち合わせて、FLUSH動作完了と判定する。
リクエスト生成部118は、プロセッサ110からLLキャッシュ制御部120に対して発行するリクエストを生成する。この実施の形態では、ストア処理リクエスト、ロード処理リクエスト、FLUSHリクエストについてのみ説明する。
ところで、FLUSH動作において、要求元のプロセッサ110は、全てのコヒーレンシポイントからのFLUSHリプライを待ち合わせて、FLUSH動作完了と判定する。しかしながら、FLUSH動作では、FLUSH動作完了よりも先にLLキャッシュからロードリプライデータが戻ってくる場合がある。この実施の形態では、スレーブ側プロセッサ110Bによるフラグ参照のロード命令に対するリプライデータが該当する。したがって、この実施の形態では、全てのコヒーレンシポイントからのFLUSHリプライを待ち合わせてから、フラグ参照のリプライデータを、スレーブ側プロセッサ110Bが実行したロード命令のリプライデータとして返却する必要がある。そこで、ロードリプライ待ち合わせ部119は、FLUSH動作完了を待ち合わせてから、ロード命令に対してリプライデータとして返却する。なお、ロードリプライ待ち合わせ部119は、待ち合わせが不要なロードリプライについては、ロードリプライを停滞することなく処理してもよい。
マスタ側LLキャッシュ制御部120Aは、更新完了通知部121Aと、無効化指示部122Aと、LLキャッシュ123Aと、ロードリプライ生成部124Aと、FLUSHリプライ生成部125Aとを有する。
なお、スレーブ側LLキャッシュ制御部120Bも、マスタ側LLキャッシュ制御部120Aが有する構成要素と同じ構成要素を有する。以下の説明では、LLキャッシュ制御部120が有する構成要素がいずれのLLキャッシュ制御部120の構成要素であるかを区別する場合には、各構成要素を有するLLキャッシュ制御部120と同じ添え字(A、B)を各構成要素の末尾に付して区別する。例えば、更新完了通知部121Aは、マスタ側LLキャッシュ制御部120Aの構成要素であることを示す。同様に、更新完了通知部121Bは、スレーブ側LLキャッシュ制御部120Bの構成要素であることを示す。
また、以下の説明では、添え字が付されていない構成要素の機能及び動作は、同じ符号が付されたいずれの構成要素の機能及び動作を示す。例えば、更新完了通知部121で説明された機能及び動作は、更新完了通知部121A、更新完了通知部121Bの機能及び動作を示す。
更新完了通知部121は、プロセッサ110から受けたストア処理リクエストが、LLキャッシュ123のコヒーレンシポイントに受け付けられたことを、要求元のプロセッサ110に通知する。この実施の形態では、コヒーレンシポイントに受け付けられたことにより、スレーブ側プロセッサ110Bを含む他のプロセッサのキャッシュが、該当するデータをキャッシュに持っているかを判定し、持っているキャッシュに対して無効化指示を発行した状態を保証する。
無効化指示部122は、プロセッサ110から受け付けたストア処理リクエストが、LLキャッシュ123のコヒーレンシポイントで受け付けられ、スレーブ側プロセッサ110Bを含む他のプロセッサのキャッシュが、該当するデータをキャッシュに持っているかを判定し、持っているキャッシュに対して、無効化指示を発行する。また、無効化指示部122は、FLUSHリプライ生成部125からFLUSHリプライを受け取った場合、先行する無効化指示の有無を確認して、先行する無効化指示があればその後ろにFLUSHリプライを格納し、先行する無効化指示がなければ先頭にFLUSHリプライを格納し、無効化指示と同じ経路でFLUSHリプライを発行する。無効化指示部122は、無効化指示の経路上で、FLUSHリプライが先行する無効化指示を追い越さないように制御する。なお、無効化指示部122は、このような処理を、FLUSHリクエストを発行したプロセッサ110に対してのみ行えばよく、それ以外のプロセッサ110に対しては何もしない。
LLキャッシュ123は、コヒーレンシポイントを有している。なお、LLキャッシュ123は、一般的なキャッシュであれば、キャッシュ構造もアドレスに応じてインタリーブし、複数バンク構成とすることも可能である。
ロードリプライ生成部124は、LLキャッシュ123に対するロード処理リクエストを処理して得られる最新のリプライデータを生成する。実際には、LLキャッシュ123に最新データが存在するケースや存在しないケースがあり、最新のリプライデータが、LLキャッシュにあることや、メインメモリにあることや、他のLLキャッシュにあることもある。これらの処理や動作は、各装置が採用するキャッシュ状態制御のプロトコルに依存し、一般的に知られている各々のプロトコルに従えばよい。
FLUSHリプライ生成部125は、FLUSHリプライを生成し、無効化指示部122に通知する。
図2は、この実施の形態における複数のプロセッサ間のデータ受け渡しに係る動作シーケンスの一例を示す図である。この実施の形態では、説明が煩雑になることを防ぐことを目的として、共有領域にアサインされたメモリのコヒーレンシポイントはスレーブ側のLLキャッシュ123Bに実装され、フラグ領域にアサインされたメモリのコヒーレンシポイントはマスタ側のLLキャッシュ123Aに実装されているものとして説明する。
まず、マスタ側プロセッサ110Aは、共有領域のデータを更新するにあたり、その旨のストア命令を、マスタ側のL1キャッシュ116Aに対して実行する(ステップS101)。ステップS101の処理では、命令デコード部111Aは、ストア命令であることを識別し、L1キャッシュ116Aに対してストア処理リクエストを発行する。また、命令デコード部111Aは、SYNCカウンタ部114Aに対してストア処理リクエストを発行したことを通知する。
SYNCカウンタ部114Aは、命令デコード部111Aからの通知を受けてカウント値を1加算する。なお、L1キャッシュ116やLLキャッシュ123を複数バンクで構成する装置にも対応するようにカウンタがバンク毎に実装されている場合、SYNCカウンタ部114Aは、対応するバンクのカウント値のみを1加算すればよい。
マスタ側のL1キャッシュ116Aは、ストア命令に応じて、対象装置毎に決められたキャッシュ・コヒーレンシに応じたストア処理を実行し、共有領域にアサインされたメモリのコヒーレンシポイントであるスレーブ側のLLキャッシュ123Bに対して、ストア処理リクエストを実行する(ステップS103)。ステップS103の処理では、L1キャッシュ116Aは、リクエスト生成部118Aに対して、ストア処理リクエストを発行する。リクエスト生成部118Aは、ストア処理リクエストを受けて、共有領域にアサインされたメモリのコヒーレンシポイントであるスレーブ側のLLキャッシュ123Bに対してストア処理リクエストを発行する。
スレーブ側のLLキャッシュ123Bは、共有領域にアサインされたメモリのコヒーレンシポイントであるため、共有領域に対するストア処理リクエストの対象アドレスをチェックし、他のキャッシュで保持されていないかを確認し、保持しているキャッシュに対して無効化指示を発行する(ステップS104)。ステップS104の処理では、LLキャッシュ123Bは、共有領域にアサインされたメモリのコヒーレンシポイントであるため、共有領域に対するストア処理リクエストの対象アドレスをチェックし、他のキャッシュで保持されていないかを確認する。そして、LLキャッシュ123Bは、共有領域データを保持しているキャッシュに対して無効化指示を発行するために、無効化指示部122Bに対して無効化指示の発行要求を行う。無効化指示部122Bは、無効化指示の発行要求を受けて、共有領域データを保持しているキャッシュに対して、無効化指示を発行する。この実施の形態では、スレーブ側のL1キャッシュ116Bが共有領域データを保持しているものとして説明する。
無効化指示を受けたスレーブ側のL1キャッシュ116Aは、ストア対象のアドレスの内容を無効化する(ステップS107)。
一方、スレーブ側のLLキャッシュ123Bは、ステップS104の処理を実行したときには、共有領域に対するストア処理リクエストを受けたマスタ側のL1キャッシュ116Aに対して完了通知を通知する(ステップS105)。ステップS105の処理では、LLキャッシュ123Bは、共有領域にアサインされたメモリのコヒーレンシポイントをストア処理リクエストが通過し、キャッシュ・コヒーレンシの状態遷移が確定したとして、更新完了通知部121Bに対して、更新完了通知を通知する。更新完了通知部121Bは、更新完了通知を受けて、ストア処理リクエストを発行したマスタ側プロセッサ110AのSYNCカウンタ部114Aに対して、完了通知を発行する。
マスタ側のL1キャッシュ116Aは、スレーブ側のLLキャッシュ123Bからの完了通知を受けると、共有領域に対するストア命令を実行したマスタ側プロセッサ110Aに対して、同様に完了通知を通知する(ステップS106)。
一方、マスタ側プロセッサ110Aは、ステップS101の処理の後、完了待ち合わせ処理を行っている(ステップS102)。この完了待ち合わせ処理は、SYNC動作となるが、一般的に使用されているメモリフェンス機能付き命令のような専用のSYNC動作命令を用意しても構わないし、フラグ更新の命令にSYNC動作の命令を付加しても構わない。この実施の形態では、専用のSYNC動作命令を用意した例について説明する。
ステップS102の処理では、命令デコード部111Aは、SYNC動作命令であることを検出すると、その旨をSYNC完了判定部113Aに通知すると共に、後続の命令を命令実行待ち合わせ部112Aに格納する。この実施の形態では、フラグ更新の命令が後続の命令である。
SYNC完了判定部113Aは、SYNCカウンタ部114Aの全てのカウント値をチェックし、全てのカウント値がゼロになるまで監視する。ここで、全てのカウント値がゼロになっているということは、先行する全てのストア処理リクエストが各々のコヒーレンシポイントであるLLキャッシュ123で処理され、必要な無効化指示が対象のキャッシュに対して発行されたことを意味する。なお、この実施の形態では、必要な無効化指示が発行される対象のキャッシュはスレーブ側のL1キャッシュ116Bである。SYNC完了判定部113Aは、全てのカウント値がゼロになったことを確認すると、命令実行待ち合わせ部112Aに対して、待ち合わせの解除通知を送る。
命令実行待ち合わせ部112Aは、SYNC完了判定部113Aからの解除通知を受けるまでは、後続命令の実行を一時停止している。そして、命令実行待ち合わせ部112Aは、解除通知を受けて、停止状態を解除し、後続の命令を処理する。この実施の形態では、このようにしてフラグ更新の命令が処理されることになる。
マスタ側プロセッサ110Aは、完了通知を受けたことにより完了待ち合わせ処理を終了すると、フラグを更新するにあたり、その旨のストア命令を、L1キャッシュ116Aに対して実行する(ステップS201)。ステップS201の処理では、命令実行待ち合わせ部112Aは、停止が解除されたフラグの更新命令のストア処理リクエストをL1キャッシュ116Aに発行する。
マスタ側のL1キャッシュ116Aは、ストア命令に応じて、フラグ領域にアサインされたメモリのコヒーレンシポイントであるマスタ側のLLキャッシュ123Aに対して、ストア処理リクエストを実行する(ステップS202)。ステップS202の処理では、L1キャッシュ116Aは、リクエスト生成部118Aに対して、ストア処理リクエストを発行する。リクエスト生成部118Aは、ストア処理リクエストを受けて、フラグ領域にアサインされたメモリのコヒーレンシポイントであるマスタ側のLLキャッシュ123Aに対してストア処理リクエストを発行する。
マスタ側のLLキャッシュ123Aは、フラグ領域にアサインされたコヒーレンシポイントであるため、フラグ領域に対するストア処理リクエストの対象のフラグを更新して、フラグの更新処理が完了した旨の完了通知を、マスタ側のL1キャッシュ116Aに通知する(ステップS203)。ステップS203の処理では、LLキャッシュ123Aは、フラグ領域にアサインされたメモリのコヒーレンシポイントであるため、フラグ領域に対するストア処理リクエストの対象アドレスをチェックし、対象装置毎に決められたキャッシュ・コヒーレンシに応じたストア処理を実行する。そして、LLキャッシュ123Aは、更新完了通知部121Aに対して、更新完了を通知する。更新完了通知部121Aは、更新完了の通知を受けて、ストア処理リクエストを発行したマスタ側プロセッサ110AのSYNCカウンタ部114Aに対して、完了通知を発行する。
マスタ側のL1キャッシュ116Aは、マスタ側のLLキャッシュ123Aからの完了通知を受けると、フラグ領域に対するストア命令を実行したマスタ側プロセッサ110Aに対して、同様に完了通知を通知する(ステップS204)。
一方、スレーブ側プロセッサ110Bは、フラグを参照するにあたり、その旨のロード命令にFLUSH動作の命令を付加した命令を、L1キャッシュ116Bに対して実行する(ステップS301)。ステップS301の処理では、スレーブ側プロセッサ110Bの命令デコード部111Bは、ロード命令、且つ、FLUSH動作命令であることを識別し、L1キャッシュ116Bに対してロード処理リクエストを発行すると共に、FLUSH生成部115Bに対してFLUSH動作命令であることを通知する。また、命令デコード部111Bは、FLUSH動作命令の後続命令の実行を一時停止させるために、命令実行待ち合わせ部112Bに後続命令を格納する。この実施の形態では、共有領域の参照の命令が、後続の命令である。
スレーブ側のL1キャッシュ116Bは、FLUSH動作の命令が付加されたロード命令を受けると、フラグ領域のコヒーレンシポイントであるマスタ側のLLキャッシュ123Aに対してロード処理を要求する(ステップS302)。ステップS302の処理では、L1キャッシュ116Bは、リクエスト生成部118Bに対して、ロード処理リクエストを発行する。この際に、L1キャッシュ116Bは、FLUSH完了待ち合わせが必要なロード処理リクエストであることをロードリプライ待ち合わせ部119Bに対して通知する。リクエスト生成部118Bは、ロード処理リクエストを受けて、フラグ領域にアサインされたメモリのコヒーレンシポイントであるマスタ側のLLキャッシュ123Aに対してロード処理リクエストを発行する。
ステップS302の処理と並行して、コヒーレンシポイントである全てのLLキャッシュ123には、FLUSHリクエストが発行される(ステップS303)。ステップS303の処理では、FLUSH生成部115Bは、命令デコード部111BからのFLUSH動作命令の通知を受け、リクエスト生成部118Bに対してFLUSHリクエスト生成を指示する。リクエスト生成部118Bは、コヒーレンシポイントである全てのLLキャッシュ123に対してFLUSHリクエストを発行する。FLUSHリクエストは、全てのLLキャッシュ制御部120のFLUSHリプライ生成部125が受け取る。また、FLUSH生成部115Bは、FLUSH完了判定部117Bに対して、FLUSHリクエストを発行したことを通知する。FLUSH完了判定部117Bは、通知を受けて、FLUSHリクエストに対応する全てのFLUSHリプライが通知されるのを待ち合わせる。
マスタ側のLLキャッシュ123Aは、ロード処理の要求を受けると、フラグ領域の最新の内容をロードリプライデータとして、スレーブ側のL1キャッシュに返却する(ステップS304)。ステップS304の処理では、LLキャッシュ123Aは、対象装置毎に決められたキャッシュ・コヒーレンシに応じたロード処理を実行する。そして、LLキャッシュ123Aは、フラグ領域の最新の内容をロードリプライデータとしてロードリプライ生成部124Aに格納する。ロードリプライ生成部124Aは、ロードリプライデータが格納されると、ロード処理リクエストの発行元であるスレーブ側プロセッサ110Bのロードリプライ待ち合わせ部119Bにロードリプライデータを出力する。ロードリプライ待ち合わせ部119Bは、L1キャッシュ116Bから通知されたFLUSH完了待ち合わせが必要なロードリクエストに対するロードリプライデータであることを識別すると、FLUSH完了判定部117Bからの完了通知が発行されるまで、要求元であるフラグ参照のロード命令に対するリプライデータの返却を待ち合わせる。
一方、コヒーレンシポイントである全てのLLキャッシュ123は、FLUSHリクエストに対するFLUSHリプライを発行する(ステップS305)。ステップS305の処理では、各LLキャッシュ制御部120のFLUSHリプライ生成部125は、FLUSHリクエストを受けると、FLUSHリプライを生成し、無効化指示部122に対して、FLUSHリプライを発行する。無効化指示部122は、FLUSHリプライ生成部125からFLUSHリプライを受け取った場合、先行する無効化指示の有無を確認して、先行する無効化指示があればその後ろにFLUSHリプライを格納し、先行する無効化指示がなければ先頭にFLUSHリプライを格納し、無効化指示と同じ経路でFLUSHリプライを発行する。無効化指示部122は、無効化指示の経路上で、FLUSHリプライが先行する無効化指示を追い越さないように制御する。このようにして、FLUSHリプライは、先行する全ての無効化指示を押し出す形で、FLUSHリクエストを発行したスレーブ側プロセッサ110BのFLUSH完了判定部117Bに届く。FLUSH完了判定部117Bは、FLUSHリクエストに対応する全てのFLUSHリプライが全ての無効化指示部122Bから通知されたのを確認して、ロードリプライ待ち合わせ部119Bと命令実行待ち合わせ部112Bとに、FLUSH完了を通知する。
そして、スレーブ側プロセッサ110Bには、ロード命令のリプライデータが返却される(ステップS306)。ステップS306の処理では、ロードリプライ待ち合わせ部119Bは、FLUSH完了通知を受けると、フラグ参照のリプライデータをスレーブ側プロセッサ110Bが実行したロード命令のリプライデータとして返却する。
また、命令実行待ち合わせ部112Bは、FLUSH完了通知を受けると、一時停止していた命令の処理を開始する。このようにして、この実施の形態では、ステップS401〜S404に示す共有領域の参照の命令が実行可能となる。共有領域の参照処理は、図3に示す一般的な処理であるため、その詳細な説明は省略する。
このようにして、この実施の形態では、フラグ参照処理にて最新のリプライデータを参照する時点で、マスタ側プロセッサ110Aが実行した共有領域に対する全ての更新に対する無効化処理が、スレーブ側のL1キャッシュ116Bに反映されていることが保証することができる。
また、この実施の形態では、複数のプロセッサ110におけるデータの受け渡し処理そのものにかかる時間を短縮することができ、ひいては、マスタ側プロセッサ110Aとスレーブ側プロセッサ110Bとが当該処理に高速される時間を短縮することができる。
なお、このような効果は、キャッシュの記憶階層が深くなるにつれて、あるいは、システムの構成が大きくなるにつれて顕著となる。したがって、この実施の形態のようなキャッシュ・コヒーレンス方法は、LSI(Large−Scale Integration)製造プロセスの微細化に伴い、より大規模な装置の構築が進む状況に鑑みれば、今後の装置開発に対して欠かすことのできない方法となり得る。
この発明は、上記実施の形態に限定されず、様々な変形及び応用が可能である。例えば、計算機システム100では、上記実施の形態で示した全ての技術的特徴を備えるものでなくてもよく、少なくとも1つの課題を解決できるように、上記実施の形態で説明した一部の構成を備えたものであってもよい。
上記の実施の形態では、この発明における「計算機システム」について分かり易く説明することを目的として、この発明における「計算機システム」にて採用し得る全ての構成を含む実施の形態について説明した。しかしながら、この発明における最小構成の「計算機システム」に対応する実施の形態の計算機システム100は、図4に示すように、複数のプロセッサ110A、110Bと、キャッシュ制御部120とを備え、各プロセッサ1110A、110Bがそれぞれ1次キャッシュ116A、116Bを有し、キャッシュ制御部120が共有キャッシュ123を制御するものであればよい。