(57)【特許請求の範囲】
【請求項１】
それぞれが固有のキャッシュメモリを持つ複数のプロセッサで構成され、逐次的な実行順序関係が規定された複数のスレッドを並列に実行するマルチプロセッサシステムにおけるキャッシュメモリ制御方法において、或るスレッドを実行するプロセッサがデータの書き込みを行った際に、前記或るスレッドを実行するプロセッサに固有のキャッシュメモリに前記データを書き込むのに加えて、前記或るスレッドより実行順序が後のスレッドを実行するプロセッサに固有のキャッシュメモリに前記データの書き込み対象アドレスのキャッシュラインが存在した場合にはそのキャッシュメモリに対する更新処理を行うと共に、前記或るスレッドより実行順序が先のスレッドを実行するプロセッサに固有のキャッシュメモリに前記データの書き込み対象アドレスのキャッシュラインが存在した場合には常に、当該キャッシュラインに前記或るスレッドを実行するプロセッサが書き込みを行った旨を記憶するものであり、且つ、
前記キャッシュメモリを構成するキャッシュライン毎に、プログラム順序で後に位置するスレッドを実行するプロセッサ毎にそのプロセッサによりデータの書き込みが実行された旨を記憶する更新対象フラグと、該更新対象フラグが有効であるか否かを示す更新有効フラグとを備え、
或るスレッドを実行するプロセッサが自プロセッサ固有のキャッシュメモリの或るキャッシュラインをアクセスした際に前記更新対象フラグ及び前記更新有効フラグが共に有効であった場合、前記更新対象フラグによって判明する前記データの書き込みを実行したプロセッサに固有のキャッシュメモリに該書き込みの対象アドレスのキャッシュラインが存在するか否かを参照することによって該キャッシュラインが有効であるか無効であるかを判断し、無効である場合には、有効なデータをメインメモリまたは他のプロセッサに固有のキャッシュメモリから転送し、該キャッシュラインへ格納し、
或るスレッドを実行するプロセッサに固有のキャッシュメモリの或るキャッシュラインを他プロセッサがアクセスした際に前記更新対象フラグ及び前記更新有効フラグが共に有効であった場合、前記更新対象フラグによって判明する前記データの書き込みを実行したプロセッサに固有のキャッシュメモリに該書き込みの対象アドレスのキャッシュラインが存在するか否かを参照することによって該キャッシュラインが有効であるか無効であるかを判断し、無効である場合には、該キャッシュラインを無効化することを特徴とするキャッシュメモリ制御方法。
【請求項２】
前記キャッシュメモリを構成するキャッシュライン毎に、該キャッシュメモリに固有のプロセッサが書き込みを実行した旨を書き込みのデータ幅単位で管理するフラグであって書き込み時にセットされ且つ当該プロセッサにおけるスレッド終了時にリセットされるストア・フラグを備え、前記更新処理においては、更新処理の対象となるキャッシュメモリにおけるキャッシュラインの前記ストア・フラグの内容と、実行順序が前記或るスレッドから更新処理の対象となるキャッシュメモリを持つプロセッサで実行しているスレッドまでの間に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに存在するキャッシュラインの前記ストア・フラグの内容とを参照して、更新処理の対象とするキャッシュラインの更新可否及び更新対象データ部分を決定する請求項１記載のキャッシュメモリ制御方法。
【請求項３】
或るプロセッサが実行するスレッドよりもプログラム順序で後に位置するスレッドを実行するプロセッサによりデータの書き込みが実行された際に、該書き込みの対象アドレスと該書き込みデータを格納するバッファ装置を前記或るプロセッサに備え、スレッドの実行が終了した際には、前記バッファ装置に格納されているアドレスに対応するキャッシュラインが前記或るプロセッサに固有のキャッシュメモリに存在する場合、前記バッファ装置に格納されている該アドレスのデータを該キャッシュラインに書き込みを行う請求項１記載のキャッシュメモリ制御方法。
【請求項４】
前記キャッシュメモリを構成するキャッシュライン毎に、どのプロセッサとデータを共有しているかを記憶する共有フラグを備え、或るプロセッサがバス要求を出力する際に、前記共有フラグを参照して、データを共有しているプロセッサを特定し、前記データを共有しているプロセッサのみに前記バス要求を出力することを特徴とする請求項１記載のキャッシュメモリ制御方法。
【請求項５】
前記キャッシュメモリを構成するキャッシュライン毎に、該キャッシュラインのデータが投機的なデータである場合に、投機的である旨及び投機的にならしめた原因のプロセッサを特定する投機フラグを備え、或るプロセッサでスレッドの実行の取り消しが発生した場合に、該プロセッサに固有のキャッシュメモリに存在する投機的なキャッシュラインのうち、該キャッシュラインを投機的にならしめた原因のプロセッサでもスレッドの実行の取り消しが行われた場合、該キャッシュラインを無効化する請求項１記載のキャッシュメモリ制御方法。
【請求項６】
前記キャッシュメモリ毎にキャッシュ制御部を備え、前記キャッシュ制御部どうし及び前記キャッシュ制御部と前記プロセッサで共有されるメインメモリ間をバスによって相互に接続し、且つ、
前記キャッシュメモリの各キャッシュライン毎に、当該キャッシュラインが有効か否かを示す有効フラグと、当該キャッシュラインがメインメモリと相違しているか否かを示す変更フラグと、当該キャッシュラインが他のどのプロセッサと共有しているか否かを示す共有フラグと、当該キャッシュラインが投機的なデータを含むか否か及び含む場合には投機的にならしめた原因のプロセッサを示す投機フラグと、当該キャッシュラインが実行順序で後に位置するスレッドを実行するプロセッサ毎にそのプロセッサによりデータの書き込みが実行された旨を記憶する更新対象フラグと、何れかの前記更新対象フラグがセットされている場合には、セットされている更新対象フラグに対応するプロセッサによって当該キャッシュラインが更新されて無効になっている可能性があることを示す更新有効フラグと、当該キャッシュラインへの自プロセッサによる書き込みの有無を、あらかじめ定めたデータ幅の単位毎に示すストア・フラグと、当該キャッシュラインへの自プロセッサによる投機的なデータの読み出しの有無をあらかじめ定めたデータ幅の単位毎に示す投機ロード・フラグとを備え、
前記キャッシュ制御部は、リード及びライトにかかるバス要求の入出力時に、前記有効フラグ、前記変更フラグ、前記共有フラグ、前記投機フラグ、前記更新対象フラグ、前記更新有効フラグ及び前記ストア・フラグを含むキャッシュライン状態を互いに交換することによって得た他キャッシュメモリのキャッシュライン状態と、自キャッシュメモリのキャッシュライン状態と、自プロセッサで実行されているスレッドと他プロセッサで実行されているスレッドとの実行順序関係とに基づいて、前記キャッシュメモリのデータの整合性を維持する処理を行うものである請求項１乃至５の何れか１項に記載のキャッシュメモリ制御方法。
【請求項７】
それぞれが固有のキャッシュメモリ及びキャッシュ制御部を持ち且つメインメモリを共有する複数のプロセッサで構成され、前記キャッシュ制御部どうし及び前記キャッシュ制御部と前記メインメモリ間がバスで相互に接続され、逐次的な実行順序関係が規定された複数のスレッドを並列に実行するマルチプロセッサシステムにおいて、
前記キャッシュメモリの各キャッシュライン毎に、当該キャッシュラインが有効か否かを示す有効フラグと、当該キャッシュラインがメインメモリと相違しているか否かを示す変更フラグと、当該キャッシュラインが他のどのプロセッサと共有しているか否かを示す共有フラグと、当該キャッシュラインが投機的なデータを含むか否か及び含む場合には投機的にならしめた原因のプロセッサを示す投機フラグと、当該キャッシュラインが実行順序で後に位置するスレッドを実行するプロセッサ毎にそのプロセッサによりデータの書き込みが実行された旨を記憶する更新対象フラグと、何れかの前記更新対象フラグがセットされている場合には、セットされている更新対象フラグに対応するプロセッサによって当該キャッシュラインが更新されて無効になっている可能性があることを示す更新有効フラグと、当該キャッシュラインへの自プロセッサによる書き込みの有無をあらかじめ定めたデータ幅の単位毎に示すストア・フラグと、当該キャッシュラインへの自プロセッサによる投機的なデータの読み出しの有無をあらかじめ定めたデータ幅の単位毎に示す投機ロード・フラグとを備え、
前記キャッシュ制御部は、リード及びライトにかかるバス要求の入出力時に、前記有効フラグ、前記変更フラグ、前記共有フラグ、前記投機フラグ、前記更新対象フラグ、前記更新有効フラグ及び前記ストア・フラグを含むキャッシュライン状態を互いに交換することによって得た他キャッシュメモリのキャッシュライン状態と、自キャッシュメモリのキャッシュライン状態と、自プロセッサで実行されているスレッドと他プロセッサで実行されているスレッドとの実行順序関係とに基づいて、自キャッシュメモリのキャッシュライン状態を適宜変更するものであり、
前記キャッシュ制御部は、或るスレッドを実行するプロセッサがそのプロセッサに固有のキャッシュメモリを更新した場合、同アドレスのデータが、実行順序で後のスレッドを実行するプロセッサに固有のキャッシュメモリにあれば同時に更新処理を行うが、実行順序で先行するスレッドを実行するプロセッサに固有のキャッシュメモリにあっても書き換えず、書き換えがあった旨を常に前記更新対象フラグに記録する構成を有し、且つ、或るプロセッサでスレッドが終了した際、すべてのキャッシュラインあるいは前記更新対象フラグの何れかがセットされているキャッシュラインは前記更新有効フラグをセットし、前記更新有効フラグがセットされていてかつ前記更新対象フラグの何れかがセットされているキャッシュラインは無効である可能性があることを示し、前記更新有効フラグがリセットされているか前記更新対象フラグの全てがリセットされているキャッシュラインは有効であることを示し、前記無効の可能性があることが示されているキャッシュラインは、次のスレッドの実行中に実際に無効か否かを調べる構成を有し、
前記キャッシュ制御部は、或るスレッドを実行するプロセッサが自プロセッサ固有のキャッシュメモリの或るキャッシュラインをアクセスした際に前記更新対象フラグ及び前記更新有効フラグが共に有効であった場合、前記更新対象フラグによって判明する前記データの書き込みを実行したプロセッサに固有のキャッシュメモリに該書き込みの対象アドレスのキャッシュラインが存在するか否かを参照することによって該キャッシュラインが有効であるか無効であるかを判断し、無効である場合には、有効なデータをメインメモリまたは他のプロセッサに固有のキャッシュメモリから転送し、該キャッシュラインへ格納するものであり、且つ、或るスレッドを実行するプロセッサに固有のキャッシュメモリの或るキャッシュラインを他プロセッサがアクセスした際に前記更新対象フラグ及び前記更新有効フラグが共に有効であった場合、前記更新対象フラグによって判明する前記データの書き込みを実行したプロセッサに固有のキャッシュメモリに該書き込みの対象アドレスのキャッシュラインが存在するか否かを参照することによって該キャッシュラインが有効であるか無効であるかを判断し、無効である場合には、該キャッシュラインを無効化するものであることを特徴とするマルチプロセッサシステム。
【請求項８】
前記キャッシュ制御部は、前記更新処理においては、更新処理の対象となるキャッシュメモリにおけるキャッシュラインの前記ストア・フラグの内容と、実行順序が前記或るスレッドから更新処理の対象となるキャッシュメモリを持つプロセッサで実行しているスレッドまでの間に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに存在するキャッシュラインの前記ストア・フラグの内容とを参照して、更新処理の対象とするキャッシュラインの更新可否及び更新対象データ部分を決定する請求項７記載のマルチプロセッサシステム。
【請求項９】
或るプロセッサが実行するスレッドよりもプログラム順序で後に位置するスレッドを実行するプロセッサによりデータの書き込みが実行された際に、該書き込みの対象アドレスと該書き込みデータを格納するバッファ装置を前記或るプロセッサに備え、スレッドの実行が終了した際には、前記バッファ装置に格納されているアドレスに対応するキャッシュラインが前記或るプロセッサに固有のキャッシュメモリに存在する場合、前記バッファ装置に格納されている該アドレスのデータを該キャッシュラインに書き込みを行う請求項７記載のマルチプロセッサシステム。
【請求項１０】
前記キャッシュ制御部は、バス要求を出力する際に、前記共有フラグを参照して、データを共有しているプロセッサを特定し、前記データを共有しているプロセッサのみに前記バス要求を出力することを特徴とする請求項７記載のマルチプロセッサシステム。
【請求項１１】
前記キャッシュ制御部は、或るプロセッサでスレッドの実行の取り消しが発生した場合に、該プロセッサに固有のキャッシュメモリに存在する投機的なキャッシュラインのうち、該キャッシュラインを投機的にならしめた原因のプロセッサでもスレッドの実行の取り消しが行われた場合、該キャッシュラインを無効化する請求項７記載のマルチプロセッサシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、マイクロプロセッサ等のデータ処理装置に関し、特にマイクロプロセッサの性能向上に関する。より詳細には、複数のスレッドを同時に実行するマイクロプロセッサのキャッシュメモリ制御方法に関する。
【０００２】
【従来の技術】
従来より、マイクロプロセッサの性能向上技術として、マイクロプロセッサが実行するプログラム中の命令の順序とは異なる順序で命令の実行を行う非プログラム順序実行（アウトオブオーダ実行）技術が広く使われている。プロセッサが非プログラム順序実行を行う場合、実行可能になった命令から実行を行うため、プログラム中の命令の順序で実行を行うプログラム順序実行（インオーダ実行）を行うのに比べて、プロセッサの性能を向上させることが可能となる。
【０００３】
しかしながら、非プログラム順序実行は無条件に行えるわけではない。特にメモリに対して操作を行う命令（メモリ操作命令）に対しては、非プログラム順序実行に際して、メモリに関する依存関係に対して考慮が必要となる。通常、メモリ操作命令にはメモリからデータを読み出すロード命令と、メモリへデータを書き込むストア命令が含まれる。プログラム中に出現するある２つのロード命令またはストア命令が対象とするアドレスが互いに異なれば、メモリの異なる位置が読み出しまたは書き込みの対象となるため、それら２つのロード命令またはストア命令の間にはメモリに関して依存関係は存在しない。すなわち、それら２つの命令は非プログラム順序で実行することが可能である。
【０００４】
一方、プログラム中に出現するある２つのロード命令またはストア命令が対象とするアドレスが同じ場合、メモリの同じ位置が読み出しまたは書き込みの対象となるため、それら２つのロード命令またはストア命令間には、メモリに関して依存関係が存在する。例えば、プログラム順序で前にあるストア命令が書き込みを行うアドレスに対して、プログラム順序でそれより後にあるロード命令が読み出しを行う場合、前にあるストア命令から後にあるロード命令へメモリに関する正依存関係があるという。この場合、それら２つのロード命令、ストア命令をプログラム順序とは逆の順序で実行を行うと、プログラムの意味が変わってしまい、正しいプログラムの実行結果を得ることができない。すなわち、メモリに関して正依存関係がある場合、非プログラム順序で実行を行うことができない。同様にして、プログラム順序で前にあるロード命令が読み出しを行うアドレスに対して、プログラム順序でそれより後にあるストア命令が書き込みを行う場合、前にあるロード命令から後にあるストア命令へメモリに関する逆依存関係があるという。また、プログラム順序で前にあるストア命令が書き込みを行うアドレスに対して、プログラム順序でそれより後にあるストア命令も書き込みを行う場合、前にあるストア命令から後にあるストア命令へメモリに関する出力依存関係があるという。いずれの場合も、それら２つのロード・ストア命令をプログラム順序とは逆の順序で、そのまま実行してしまうと、プログラムの意味が変わってしまい、正しいプログラムの実行結果を得ることができない。
【０００５】
メモリに関する逆依存関係及び出力依存関係に対しては、ストア命令が書き込みを行うデータを一時的なバッファ（通常ストアバッファと呼ばれる）に一時的に格納するなどの対応で、逆依存関係あるいは出力依存関係を解消し、非プログラム順序実行を可能とする技術が従来より知られている。一方、正依存関係が存在する場合は、本質的に非プログラム順序で実行を行うことができず、プログラム順序で実行を行うことになる。しかしながら、ロード・ストア命令が対象とするアドレスは実行時まで不明である場合が多いため、非プログラム順序で実行を行えないことによる性能への影響が大きいという問題がある。
【０００６】
この問題に対して、正依存関係の有無が判明するよりも以前に、正依存関係が存在しないと仮定して、投機的に非プログラム順序で実行する、データ依存投機実行が従来より知られている。データ依存投機実行においては、実際に正依存関係が存在せず投機実行が成功する場合と、実際に正依存関係が存在して投機実行が失敗する場合があり、正依存関係の有無が判明した時点で、そのいずれであるかを判定する必要がある。実際に正依存関係が存在せず投機実行が成功した場合、そのまま後続の命令実行を継続することが可能であり、データ依存投機実行による非プログラム順序実行を行った分だけ、実行性能の向上が期待できる。一方、実際に正依存関係が存在して投機実行が失敗した場合、プログラムの意味が変わってしまうため、プログラムの正しい実行結果が保証できなくなる。そのため、データ依存投機実行による非プログラム順序実行を行った命令の結果を取り消して、再びプログラム順序で再実行するなどのデータ依存投機実行の失敗に対する回復処理が必要となる。投機実行が失敗した場合、失敗した命令の取り消しや回復処理のために、プログラム順序実行するよりも性能が低下することが多い。しかし、投機実行に失敗する場合よりも成功する場合の確率が十分に高ければ、プログラム全体としての実行性能の向上が期待できることになる。なお、非プログラム順序実行については、マイク・ジョンソンによる文献、“スーパースカラ・プロセッサ”、日経ＢＰ出版センター、１９９４年、に詳しい。また、投機実行の失敗による回復処理方法については、例えば、特開平５−２２４９２７号公報に開示されている方法がある。
【０００７】
さらに近年、単一のプログラムあるいは複数のプログラムをスレッドと呼ぶ複数のプログラムの部分単位に分割し、それぞれのスレッドを複数のプロセッサなどで並列に処理することでプログラム実行を高速化するスレッド並列処理が注目されている。スレッドはプログラムの一部分単位であり、複数の命令からなる命令列なので、複数のスレッド間で順序関係が定義される場合がある。例えば、同一のプログラムに属する２つのスレッドをそれぞれＴ０、Ｔ１としたとき、Ｔ０とＴ１の間にはそのプログラム中の位置関係により、明確に順序関係が存在する。仮に、プログラムにおいてＴ０がＴ１よりも前に位置しているならば、プログラムの意味上、Ｔ０がＴ１よりも前に実行されることを期待されていることになる。逆に、プログラムにおいてＴ１がＴ０よりも前に位置しているならば、プログラムの意味上、Ｔ１がＴ０よりも前に実行されることを期待されていることになる。スレッド並列処理では、スレッド間の順序関係に起因するメモリ依存関係に考慮し、プログラムの正しい実行結果を保証しつつ、スレッド間の順序関係によらずにスレッドの実行を並列に行うことで、プログラム実行を高速化する。命令単位の非プログラム順序実行と対比して、スレッド単位の非プログラム順序実行と位置づけられる。
【０００８】
スレッド単位の非プログラム順序実行においても、正しいプログラムの実行結果を得るためには、スレッドが含む命令間の依存関係の解消や保証が必要である。しかしながら、命令単位の非プログラム順序実行と同様に、特にメモリに関する正依存関係に対しては、本質的にプログラム順序で実行する必要があり、かつ、確定的にプログラム順序実行を行うと、非プログラム順序実行の実行性能向上の効果が十分得られないという問題がある。特に、スレッド単位の非プログラム順序実行では、複数の命令からなるスレッド単位で、非プログラム順序実行が妨げられるので、より問題は深刻である。この問題への対応としては、命令単位の非プログラム順序実行と同様に、データ依存投機実行が有効である。すわなち、スレッドが含む命令間の正依存関係の有無が判明するよりも以前に、正依存関係が存在しないと仮定して、投機的にスレッドの非プログラム順序実行を行う、スレッド単位のデータ依存投機実行である。
【０００９】
一方、メモリに関する逆依存関係及び出力依存関係に対しては、命令単位の非プログラム順序実行と同様に、ストア命令が書き込みを行うデータを、プロセッサに固有のバッファやメモリに一時的に格納するなどの対応で、逆依存関係あるいは出力依存関係を解消して、非プログラム順序実行することが可能となる。
【００１０】
例えば、それぞれが固有のキャッシュメモリを備える複数のプロセッサから構成されるマルチプロセッサシステムにおけるスレッド並列処理に関して、例えば特許第３１３９３９２号公報（以下、文献１と称す）に、メモリに関する逆依存関係及び出力依存関係を解消するキャッシュメモリの制御方式が開示されている。
【００１１】
図１１は、上記文献１によるマルチプロセッサシステムの構成例を示す図である。図１１を参照すると、文献１によるマルチプロセッサシステムは、４つのスレッド実行部＃０〜＃３（符号１００）、４つのキャッシュメモリ＃０〜＃３（符号１０１）、４つの整合性維持部＃０〜＃３（符号１０２）、共有バス（符号１０３）、及びメインメモリ（符号１０４）、から構成される。
【００１２】
スレッド実行部＃０は、キャッシュメモリ＃０、及び整合性維持部＃０と、スレッド実行部＃１は、キャッシュメモリ＃１、及び整合性維持部＃１と、スレッド実行部＃２は、キャッシュメモリ＃２、及び整合性維持部＃２と、スレッド実行部＃３は、キャッシュメモリ＃３、及び整合性維持部＃３とそれぞれ接続され、それぞれ並列にスレッドを実行する。さらに、整合性維持部＃０〜＃３は共有バス１０３を通じて、互いに、及びメインメモリ１０４と接続され、他の整合性維持部及びメインメモリとメモリ操作命令が対象とするメモリデータの受渡しをなどを制御する。このとき、メモリに関する逆依存関係、及び出力依存関係を考慮して、メモリデータ間の整合性の維持が図られる。
【００１３】
メモリデータ間の整合性の維持方法をより詳細に説明する。まず、あるスレッド実行部がストア命令を実行した際には、該スレッド実行部に固有のキャッシュメモリに、該ストア命令のストア・データを格納するとともに、該スレッド実行部が実行するスレッドよりも、プログラム順序で後に位置するスレッドを実行するスレッド実行部に固有のキャッシュメモリに、該ストア命令のストア・データを格納する。
【００１４】
また、あるスレッド実行部が実行するスレッドよりもプログラム順序で前に位置するスレッドが、他のいずれかのスレッド実行部で実行されている場合には、該スレッド実行部に固有のキャッシュメモリに格納したストア命令のストア・データの、メインメモリへの書き戻しを禁止する。
【００１５】
また、あるスレッド実行部が実行するスレッド（自スレッド）が、他のいずれのスレッド実行部で実行されているスレッドよりもプログラム順序で前に位置し、かつ自スレッドの実行が終了したならば、該スレッド実行部に固有のキャッシュメモリに格納したすべてのストア命令のストア・データをメインメモリへ書き戻した後、キャッシュメモリ上のすべてのデータを無効化する。
【００１６】
また、あるスレッド実行部に固有のキャッシュメモリでキャッシュミスが発生した場合、該スレッド実行部が実行するスレッドよりもプログラム順序で前に位置するスレッドを実行するスレッド実行部に固有のキャッシュメモリに、発生したキャッシュミスと同じアドレスのデータが存在すれば、そのデータを前記キャッシュミスが発生したキャッシュメモリに転送し、発生したキャッシュミスと同じアドレスのデータが存在しなければ、データをメインメモリから前記キャッシュミスが発生したキャッシュメモリに転送する。
【００１７】
整合性維持部＃０〜３は、上記した操作を行うよう制御を行うことで、メモリに関する逆依存関係、及び出力依存関係を解消し、スレッド単位の非プログラム順序実行を実現する。一方、上記文献１によるマルチプロセッサシステムは、正依存関係には対応しておらず、正依存関係が存在する可能性のある場合、非プログラム順序でスレッド実行を行うことはできない。
【００１８】
また、それぞれが固有のキャッシュメモリを備える複数のプロセッサから構成されるマルチプロセッサシステムにおけるスレッド並列処理に関して、メモリに関する逆依存関係及び出力依存関係に加えて、正依存関係にも対応するキャッシュメモリの制御方式の例として、S.Gopal,T.N.Vijaykumar, J.E.Smith, G.S.Sohi らによる論文 "Speculative Versioning Cache", In Proceedings of the 4th InternationalSymposium on High-Performance Computer Architecture, February 1998. （以下、文献２と称す）があげられる。
【００１９】
図１２は、上記文献２によるマルチプロセッサシステムの構成例を示す図である。図１２を参照すると、文献２によるマルチプロセッサシステムは、４つのプロセッサ＃０〜＃３（符号１１０）、４つのキャッシュメモリであるＳＶＣ＃０〜＃３（符号１１１）、スヌープ・バス（符号１１２）、バス・アービタ／バージョン制御論理（符号１１３）、及びメインメモリ（符号１１４）、から構成される。
【００２０】
プロセッサ＃０はＳＶＣ＃０と、プロセッサ＃１はＳＶＣ＃１と、プロセッサ＃２はＳＶＣ＃２と、プロセッサ＃３はＳＶＣ＃３と、それぞれ接続され、それぞれ並列にスレッドを実行する。さらに、各ＳＶＣ＃０〜３は、バス・アービタ／バージョン制御論理１１３の制御下で、スヌープ・バス１１２を通じ、他のＳＶＣ及びメインメモリとメモリ操作命令が対象とするメモリデータの受渡しを行う。このとき、メモリに関する逆依存関係、及び出力依存関係を考慮して、メモリデータ間の整合性の維持が図られる。また、ＳＶＣはメモリに関する正依存関係を検出する機能、及び投機的なスレッド実行の結果を取り消す機能を有し、正依存関係が検出された場合には、スレッドを再実行することにより、データ依存投機実行を実現する。
【００２１】
ＳＶＣを構成するキャッシュラインは、他のＳＶＣを指し示すポインタを記憶するエントリを含み、各ＳＶＣが同アドレスのデータを保持する場合、それらデータ間のプログラム順序における前後関係を線形リストの構造で記憶することを特徴とする。バス・アービタ／バージョン制御論理１１３はこの線形リスト構造を参照して、メモリに関する依存関係の制御を行う。
【００２２】
上記文献２による、ＳＶＣを含むマルチプロセッサシステムの動作の特徴をより詳細に説明する。まず、あるプロセッサが正依存関係に関して投機的なロード命令を実行した際には、該プロセッサに固有のＳＶＣに存在する、該ロード命令のデータを含むキャッシュラインに、投機的なロード命令を実行したことを示すフラグをセットする。
【００２３】
また、あるプロセッサＰ０がストア命令を実行した際には、プロセッサＰ０に固有のＳＶＣに該ストア命令のストア・データを格納する。同時に、プロセッサＰ０が実行するスレッドＳ０よりもプログラム順序で後に位置するスレッドＳ１を実行するプロセッサＰ１に固有のＳＶＣに該ストア命令と同アドレスのデータが存在し、かつスレッドＳ０よりもプログラム順序で後に位置するスレッドにより更新されていないならば、プロセッサＰ１のＳＶＣにある前記該ストア命令と同アドレスのデータを含むキャッシュラインを無効化する。さらに、そのキャッシュラインに前記投機的なロード命令を実行したことを示すフラグがセットされていたならば、ロード命令の投機実行は失敗したと判定し、プロセッサＰ１へスレッド実行の取り消し及び再実行を要求する機能を有する。
【００２４】
また、あるプロセッサが実行するスレッドよりもプログラム順序で前に位置するスレッドが、他のいずれかのプロセッサで実行されている場合には、該プロセッサに固有のＳＶＣに格納したストア命令のストア・データの、メインメモリへの書き戻しを禁止する。
【００２５】
また、あるプロセッサが実行するスレッドが、他のいずれのプロセッサで実行されているスレッドよりも、プログラム順序で前に位置し、かつ該スレッドの実行が終了したならば、該プロセッサに固有のＳＶＣに格納されているすべてのキャッシュラインに、データが確定されたことを示すフラグをセットする。一方、あるメモリ操作命令がＳＶＣをアクセスした際に、アクセス対象のキャッシュラインの前記データが確定されたことを示すフラグがセットされていたならば、バス・アービタ／バージョン制御論理１１３により、すべてのＳＶＣを参照して、有効なキャッシュラインを得ることを特徴とする。
【００２６】
また、あるプロセッサに固有のＳＶＣでキャッシュミスが発生した場合、該プロセッサが実行するスレッドよりもプログラム順序で前に位置するスレッドを実行するプロセッサに固有のＳＶＣに、発生したキャッシュミスと同じアドレスのデータが存在すれば、そのデータを前記キャッシュミスが発生したＳＶＣに転送し、発生したキャッシュミスと同じアドレスのデータが存在しなければ、データをメインメモリから前記キャッシュミスが発生したＳＶＣに転送する。
【００２７】
すなわち、上記文献２によるＳＶＣは、各ＳＶＣが保持するデータのプログラム順序上の前後関係を線形リスト構造の形で、明示的に、キャッシュライン単位で記憶及び管理を行い、バス・アービタ／バージョン制御論理１１３がそれに基づいて、メモリ依存関係に関する制御を行うことを特徴としている。
【００２８】
【発明が解決しようとする課題】
しかしながら、上記した文献１に開示されたキャッシュメモリ制御方式は、スレッドの実行が終了してデータが確定した際に、該スレッドが更新したすべてのデータのメインメモリへの書き戻しが集中して発生する為、特にスレッドの大きさが小さい場合にプログラムの実行性能が低下するという問題がある。また、キャッシュメモリ上のすべてのデータが無効化されるため、次に実行されるスレッドでキャッシュミスが多発し、プログラムの実行性能が低下するという問題がある。さらに、メモリに正依存関係が存在する場合、スレッドを非プログラム順序で並列に実行することができないため、プログラムの実行性能が低下するという問題がある。
【００２９】
また、上記した文献２に記載されているキャッシュメモリ制御方式は、文献１の上記問題は回避されているものの、ストア命令等の書き込みを実行した際には、プログラム順序で後に位置するスレッドを実行するプロセッサのＳＶＣが保持しているデータが無効化される為、スレッド間で通信が多い場合、キャッシュミスが多発し、プログラムの実行性能が低下するという問題がある。さらに、前記無効化を実行するためには、ストア命令による書き込みのデータ単位で、データの状態を示すフラグや、データ間の順序関係を示す線形リスト構造の保持や管理をする必要がある為、必要なハードウェア量が大きいという問題がある。また、データのプログラム順序上の前後関係を線形リスト構造で保持する為、特にスレッド実行の取り消しなどでリストが切断された時などに、依存関係の処理が複雑であり、高速化が困難であるという問題がある。
【００３０】
【発明の目的】
本発明は上述の問題に鑑みてなされたものであり、その目的は、それぞれが固有のキャッシュメモリを備える複数のプロセッサから構成されるマルチプロセッサシステムにおけるスレッド並列処理に関して、メモリに関する依存関係を解消するキャッシュメモリ制御方法であって、スレッドの大きさが小さく、スレッド間の通信が多い場合であっても、高速にスレッド並列処理が可能なキャッシュメモリ制御方法を提供することにある。
【００３１】
また、本発明の別の目的は、必要なハードウェア量が小さくなるキャッシュメモリ制御方法を提供することにある。
【００３２】
また、本発明の更に別の目的は、消費電力が小さく、制御が単純で高速化が容易なキャッシュメモリ制御方法を提供することにある。
【００３３】
【課題を解決するための手段】
上記の目的を達成する為に、本発明は、それぞれが固有のキャッシュメモリを備える複数のプロセッサから構成されるマルチプロセッサシステムにおいて、スレッド間のメモリに関する依存関係を効率的に解消するキャッシュメモリ制御方法及びマルチプロセッサシステムを提供する。
【００３４】
具体的には、キャッシュメモリを構成するキャッシュライン毎に、そのキャッシュラインを更新したプロセッサを特定する更新フラグを具備し、キャッシュメモリのあるキャッシュラインをアクセスした際には、前記更新フラグ及び必要であれば他のキャッシュメモリが保持するキャッシュラインの状態を参照して、前記アクセスしたキャッシュラインが有効か否かを判定する。また、あるプロセッサがストア命令を実行した際には、該プロセッサに固有のキャッシュメモリに該ストア命令のストア・データを格納するのに加えて、該プロセッサが実行するスレッドよりもプログラム順序で後に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、ストア・データのなかの有効なデータ部分の更新を行う。一方、該プロセッサが実行するスレッドよりもプログラム順序で前に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、前記更新フラグに該ストア命令を実行したプロセッサにより更新された旨を記憶する。
【００３５】
【作用】
本発明にあっては、キャッシュメモリを構成するキャッシュラインに、どのプロセッサが更新したかを示す更新フラグを具備し、キャッシュメモリをアクセスする際には、前記更新フラグ及び必要であれば他のキャッシュメモリが保持するキャッシュラインの状態を参照して、そのキャッシュラインが有効か否かを判定する。また、あるプロセッサがストア命令を実行した際には、該プロセッサに固有のキャッシュメモリに、該ストア命令のストア・データを格納するのに加えて、該プロセッサが実行するスレッドよりも、プログラム順序で後に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、同アドレスのデータを保持するすべてのキャッシュラインを参照して、有効なデータ部分を算出し、有効なデータ部分のみ更新を行う。一方、該プロセッサが実行するスレッドよりも、プログラム順序で前に位置するスレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、該ストア命令を実行したプロセッサに対応する前記更新フラグをセットする。さらに、スレッドの実行が終了し、該スレッドにより生成されたデータが確定した際には、前記更新フラグの効果を有効にする。
【００３６】
【発明の実施の形態】
図面を参照しながら、本発明の実施の形態について詳細に説明する。
【００３７】
図１は、本実施形態によるキャッシュメモリ装置を含むマルチプロセッサシステムの構成を示すブロック図である。図１を参照すると、本実施形態によるマルチプロセッサシステムは、４つのプロセッサ＃０〜＃３（符号１０）、４つのキャッシュメモリ＃０〜＃３（符号１１）、４つのキャッシュ制御部＃０〜＃３（符号１２）、要求バス（符号１３）、応答バス（符号１４）、データバス（符号１５）、スレッド制御バス（符号１６）、バス制御部（符号１７）、及びメインメモリ（符号１８）から構成される。
【００３８】
プロセッサ＃０は、キャッシュメモリ＃０、及びキャッシュ制御部＃０と、プロセッサ＃１は、キャッシュメモリ＃１、及びキャッシュ制御部＃１と、プロセッサ＃２は、キャッシュメモリ＃２、及びキャッシュ制御部＃２と、プロセッサ＃３は、キャッシュメモリ＃３、及びキャッシュ制御部＃３と、それぞれ接続され、それぞれ並列にスレッドを実行する。さらに、各プロセッサ＃０〜＃３は、互いにスレッド制御バス１６により接続され、スレッドの生成、スレッド実行の終了や取り消し、スレッド間の順序関係、等のスレッド実行に関する制御情報が伝達される。各プロセッサ＃０〜＃３は、前記スレッド制御バス１６により伝達されるスレッド制御情報を参照して、自身が実行しているスレッドと他のプロセッサが実行しているスレッドとの順序関係を知ることができる。また、各キャッシュ制御部＃０〜＃３は、要求バス１３、応答バス１４、データバス１５を通じて、他のプロセッサ及びメインメモリとメモリ操作命令が対象とするメモリデータの受渡しを制御する。このとき、プロセッサより通知されるスレッドの順序関係を参照し、メモリに関する正依存関係、逆依存関係、及び出力依存関係を考慮して、メモリデータ間の整合性の維持を図る。要求バス１３、応答バス１４、データバス１５はそれぞれ一本のバスを各プロセッサで共有してもよいし、プロセッサ数分だけ固有のバスを備えてもよい。以下では、要求バス１３、応答バス１４、及びデータバス１５を総称して単にバスとも表記する。
【００３９】
図２は、キャッシュメモリ１１を構成するキャッシュラインの詳細を示す説明図である。一つのキャッシュラインは、アドレスタグ２５によって示されるアドレス範囲にあるデータを保持する。図２を参照すると、キャッシュメモリを構成するキャッシュラインは、有効フラグ（符号２０）、変更フラグ（符号２１）、共有フラグ（符号２２）、投機フラグ（符号２３）、更新フラグ（符号２４）、アドレスタグ（符号２５）、複数のデータエントリ（符号２６）、複数のストア・フラグ（符号２７）、複数の投機ロード・フラグ（符号２８）、から構成される。
【００４０】
有効フラグ２０は、そのキャッシュラインが有効であることを示す。有効フラグ２０は、キャッシュミスが発生した時など、データをキャッシュメモリに転送し、キャッシュラインを生成する（リフィルする）際にセットし、キャッシュラインを入れ換える時など、キャッシュラインを無効化する際にリセットする。
【００４１】
変更フラグ２１は、そのキャッシュラインのデータをストア命令等で変更しており、メインメモリにあるデータと異なっていることを示す。変更フラグ２１は、ストア命令等のデータの書き込みを実行した際にセットし、キャッシュラインのメインメモリへの書き戻し（ライトバック）を行った際にリセットする。
【００４２】
共有フラグ２２は、そのキャッシュラインと同アドレスのキャッシュラインを、他のプロセッサに固有のキャッシュメモリも保持し、データを共有していることを示す。本実施形態による共有フラグは、マルチプロセッサシステムが備えるプロセッサ数分のフラグを備えることを特徴とする。すなわち、それぞれのフラグ部分が各プロセッサに対応しており、フラグがセットされている場合、該フラグに対応するプロセッサとデータを共有していることを示し、フラグがリセットされている場合、該フラグに対応するプロセッサとデータを共有していないことを示す。したがって、共有フラグ２２を参照すると、共有対象のプロセッサを特定することが可能である。共有フラグ２２はバスアクセスが行われた際にセットまたはリセットされる。詳細には、あるプロセッサがキャッシュ制御部１２を通じてバスアクセスを行った際には、全てのプロセッサのキャッシュ制御部１２には、応答バス１４を通じてすべてのキャッシュメモリ１１のキャッシュライン状態が通知される。このとき、どのプロセッサと共有しているかが判明するので、共有フラグ２２を構成するフラグのうち、共有しているプロセッサに対応するフラグをセットし、共有していないプロセッサに対応するフラグをリセットする。
【００４３】
投機フラグ２３は、そのキャッシュラインのデータが投機的なデータを含んでいることを示す。本実施形態による投機フラグは、マルチプロセッサシステムが備えるプロセッサ数分のフラグを備えることを特徴とする。すなわち、それぞれのフラグ部分が各プロセッサに対応しており、フラグがセットされている場合、該フラグに対応するプロセッサが、データが投機的である原因であることを示す。したがって、投機フラグ２３を参照すると、該キャッシュラインのデータを投機的にならしめた原因のプロセッサを特定することが可能である。投機フラグ２３は、キャッシュラインをリフィルする際、他のプロセッサのキャッシュメモリが保持している投機的なキャッシュラインからリフィル・データを得た場合、投機フラグ２３の前記他のプロセッサに対応するフラグをセットする。また、自プロセッサが実行するスレッド（以下では、自スレッドと表記する）が含む投機的なストア命令により、投機的なデータでキャッシュラインを更新した場合、投機フラグ２３の自プロセッサに対応するフラグをセットする。また、プログラム順序で先行するスレッド（以下では、親スレッドと表記する）が含む投機的なストア命令により、投機的なデータでキャッシュラインを更新した場合、投機フラグ２３の前記親スレッドを実行するプロセッサに対応するフラグ部分をセットする。一方、投機フラグ２３は、自スレッドの投機的な実行が確定して、そのキャッシュラインのデータが確定した際にリセットされる。
【００４４】
更新フラグ２４は、プログラム順序で後に位置するスレッド（以下、子スレッドと表記する）により、そのキャッシュラインのデータが更新されたことを示す。すなわち、そのキャッシュラインのデータは、該プロセッサが実行する現スレッドには有効であるが、該プロセッサに次に割り当てられるスレッドには有効でない可能性があることを意味する。更新フラグ２４は、１ビットの更新有効フラグ２４ａと、マルチプロセッサシステムが備える、自プロセッサを除くプロセッサ数ビット分の更新対象フラグ２４ｂとから構成される。更新有効フラグ２４ａは更新フラグ２４全体が有効であることを示す。スレッドが終了した際には、すべての更新有効フラグ２４ａがセットされるが、別の実施形態として、更新対象フラグ２４ｂのいずれかがセットされている更新フラグ２４の更新有効フラグ２４ａのみをセットしてもよい。更新有効フラグ２４ａがセットされていて、かつ、更新対象フラグ２４ｂのいずれかがセットされている場合、当該キャッシュラインは次に実行されるスレッドでは有効でない可能性があることが示される。実際に当該キャッシュラインが有効か否かは、キャッシュミス時などに伴うバス要求の入出力時にキャッシュ制御部どうしで交換されるキャッシュライン状態によって調べられ、若し有効であれば更新対象フラグ２４ｂと共に更新有効フラグ２４ａがリセットされる。他方、更新有効フラグ２４ａがリセットされているか、更新対象フラグ２４ｂの全てがリセットされていれば、当該キャッシュラインは次に実行されるスレッドでも有効であることが示される。各更新対象フラグ２４ｂは、それぞれが他のプロセッサに対応し、対応するプロセッサにより該キャッシュラインが更新されたことを示す。
【００４５】
データエントリ２６は、そのキャッシュラインのメモリデータを保持する。通常、一つのキャッシュラインは、アドレスタグ２５が指定するアドレス範囲を構成する複数のデータエントリを備え、それぞれのデータエントリは、ストア命令等による書き込みの最小のデータ単位である。図２においては、複数のデータエントリ２６のそれぞれをデータエントリ２６ａ、データエントリ２６ｂ、データエントリ２６ｃ、データエントリ２６ｄ、…、と表記して区別している。
【００４６】
ストア・フラグ２７は、対応するデータエントリに、自プロセッサがストア命令などで書き込みを行ったことを示す。図２においては、ストア・フラグ２７ａはデータエントリ２６ａに、ストア・フラグ２７ｂはデータエントリ２６ｂに、ストア・フラグ２７ｃはデータエントリ２６ｃに、ストア・フラグ２７ｄはデータエントリ２６ｄに、それぞれ対応する。ストア・フラグは自プロセッサが書き込みを行った際にセットし、スレッドの実行が終了した際にリセットされる。
【００４７】
投機ロード・フラグ２８は、対応するデータエントリに、自プロセッサが投機的な読み出しを行ったことを示す。図２においては、投機ロード・フラグ２８ａはデータエントリ２６ａに、投機ロード・フラグ２８ｂはデータエントリ２６ｂに、投機ロード・フラグ２８ｃはデータエントリ２６ｃに、投機ロード・フラグ２８ｄはデータエントリ２６ｄに、それぞれ対応する。投機ロード・フラグは投機的な読み出しを行い、かつ読み出し対象のデータに対して先に書き込みを行っていない、すなわち対応するストア・フラグ２７がセットされていないならばセットされる。一方、スレッドの投機実行が確定した際にはリセットされる。
【００４８】
図２に示したキャッシュラインの実施例では、書き込みの最小データ単位に対応するデータエントリ２６ａ、２６ｂ、…、のそれぞれに固有のストア・フラグ２７ａ、２７ｂ、…、及び投機ロード・フラグ２８ａ、２８ｂ、…、を備えたが、複数のデータエントリに対して単一のストア・フラグまたは投機ロード・フラグを代表させてもよい。例えば、図３は４つのデータエントリ２６ａ、２６ｂ、２６ｃ、２６ｄ、に対して、一つの投機ロード・フラグ２８ａを備えたキャッシュラインの第２の実施形態である。データエントリ２６、ストア・フラグ２７、投機ロード・フラグ２８以外の構成要素は省略している。投機ロード・フラグ２８ａは、４つのデータエントリ２６ａ、２６ｂ、２６ｃ、２６ｄ、のいずれかに投機的な読み出しを行ったことを示す。この場合、データエントリそれぞれに固有の投機ロード・フラグを備えるのに比べて、キャッシュメモリの実装に必要なハードウェア量が小さくなるという効果がある。
【００４９】
図４は、キャッシュ制御部１２の第1の実施例の詳細を示すブロック図である。図４を参照すると、キャッシュ制御部１２は少なくとも、バス要求制御部（符号３０）、キャッシュ要求制御部（符号３１）、バス要求出力バッファ（符号３２）、バス要求入力バッファ（符号３３）、から構成される。
【００５０】
バス要求制御部３０は、キャッシュメモリ１１からのキャッシュミス通知、ストア通知やその対象アドレス、ストア・データ、キャッシュライン状態等を受け取り、それらを参照してバス要求を生成し、バス要求出力バッファ３２に登録する。ここで、キャッシュライン状態は、図２に示したキャッシュラインを構成する、有効フラグ２０、変更フラグ２１、共有フラグ２２、投機フラグ２３、更新フラグ２４、ストア・フラグ２７、を含み、キャッシュミスした場合は、そのミスによるリフィル処理対象のキャッシュラインの状態、キャッシュヒットした場合は、そのヒットしたキャッシュラインの状態を示す。
【００５１】
バス要求出力バッファ３２は、バス要求制御部３０によって生成されたバス要求を格納し、順次バスを通じて他のプロセッサやメインメモリに出力する。より詳細には、バス要求はコマンド、アドレス、キャッシュライン状態、データ等から構成され、コマンド、アドレスは要求バス１３、キャッシュライン状態は応答バス１４、データはデータバス１５に出力する。バス要求出力バッファ３２は同時に、要求バス１３に出力したコマンド、アドレス、及び応答バス１４に出力したキャッシュライン状態を、バス要求入力バッファ３３にも転送する。本実施形態は、バス要求を出力する際には、キャッシュライン状態に含まれる共有フラグ２２を参照して、データを共有しているプロセッサにのみ宛てて、バス要求を出力することを特徴とする。すなわち、データを共有していないプロセッサでは、該バス要求によるキャッシュメモリへのアクセスが発生せず、キャッシュメモリのアクセス競合による性能低下が小さく、またキャッシュメモリにおいて消費される電力を削減することができるという効果がある。
【００５２】
バス要求入力バッファ３３は、他プロセッサやメインメモリから要求バス１３を通じて伝達されるバス要求のコマンド、アドレスや、応答バス１４を通じて伝達されるキャッシュライン状態や、データバス１５を通じて伝達されるデータなどを格納する。バス要求入力バッファ３３はまた、バス要求出力バッファ３２から要求バス１３に出力されたバス要求のコマンド、アドレス、及び応答バス１４に出力されたキャッシュライン状態を格納し、さらに、バス要求に応じて他プロセッサが応答バス１４に出力するキャッシュライン状態を、その到着を待って格納する。同時にバス要求入力バッファ３３は、格納しているバスから入力したバス要求、より詳細には、コマンド、アドレス、キャッシュライン状態、及びデータ、をキャッシュ要求制御部３１に順次出力していく。
【００５３】
キャッシュ要求制御部３１は、バス要求入力バッファ３３が保持し、順次入力されるバス要求を順次解釈する。まず、バスから入力された他プロセッサからのバス要求に対しては、キャッシュメモリ１１にアクセスして、バス要求の対象のキャッシュラインを保持しているか否かを判定し、保持していなければその旨が、保持していればそのキャッシュラインの状態が、バス要求制御部３０及びバス要求出力バッファ３２を通じて、応答バス１４に出力される。同時に、その自身のキャッシュメモリのキャッシュライン状態は、バス要求入力バッファ３３の該当エントリに格納される。バス要求入力バッファ３３において、自身のキャッシュライン状態も含めて、他プロセッサからのキャッシュライン状態の応答もすべて到着したら、再び、キャッシュ要求制御部３１において、バス要求のコマンドと、自身のキャッシュライン状態、及び他プロセッサのキャッシュライン状態をすべて参照して、キャッシュラインの次の状態を決定し、対象のキャッシュラインの更新を行う。
【００５４】
一方、自身が出力したバス要求に対しては、そのコマンド、アドレス、及びキャッシュライン状態が、バス要求入力バッファ３３に格納されるので、バス要求入力バッファ３３において、他プロセッサからのキャッシュライン状態の応答もすべて到着したら、キャッシュ要求制御部３１において、バス要求のコマンドと、自身のキャッシュライン状態、及び他プロセッサのキャッシュライン状態をすべて参照して、キャッシュラインの次の状態を決定し、対象のキャッシュラインの更新を行う。
【００５５】
次にフローチャートを参照しつつ、キャッシュメモリ１１及びキャッシュ制御部１２の動作の詳細を説明する。図５は、ロード命令が発行された場合のキャッシュメモリ１１及びキャッシュ制御部１２の動作を示すフローチャートである。まず、プロセッサ１０でロード命令が発行されると（図５のステップ２００）、キャッシュメモリ１１がアクセスされ、キャッシュメモリにヒットするか、ミスするかが判定される（図５のステップ２０１）。キャッシュメモリにヒットした場合、ヒットしたキャッシュラインが読み出され、キャッシュライン内の更新フラグ２４が参照される（図５のステップ２０２）。更新フラグ２４がセットされていない、すなわち、更新有効フラグ２４ａがセットされていないか、更新対象フラグ２４ｂのいずれもがセットされていない場合、そのキャッシュラインは子スレッドにより更新されておらず、そのキャッシュラインは有効であると判断される。その場合、キャッシュメモリ１１からプロセッサ１０にロード対象のデータが転送される（図５のステップ２０６）。次に、該ロード命令がスレッド間の正依存関係に関して投機的な実行である場合、ロード対象のデータを格納したデータエントリ２６に対応する投機ロード・フラグ２８をセットして（図５のステップ２０７）、ロード命令の実行は終了する。発行されたロード命令が投機的であるか、確定的であるかはプロセッサ１０からキャッシュメモリ１１に通知される。
【００５６】
一方、更新フラグ２４の参照（図５のステップ２０２）で、更新フラグ２４がセットされていた、すなわち、更新有効フラグ２４ａがセットされていて、かつ、更新対象フラグ２４ｂのいずれかがセットされている場合、そのキャッシュラインは子スレッドにより更新されていて、そのキャッシュラインは既に無効である可能性があると判断される。ここで確定的に無効であると判定できないのは、子スレッドによる更新が投機的であって、かつ取り消されている場合があり、実際には有効である可能性もあるからである。確定的な判断は、子スレッドを実行したプロセッサのキャッシュメモリのキャッシュライン状態を参照する必要がある。そこで、バス要求制御部３０は他のプロセッサのキャッシュメモリを参照するリード要求を生成し、バス要求出力バッファ３２を通じて、要求バス１３にリード要求を発行する（図５のステップ２０３）。同時にそのリード要求、リード要求の対象アドレス、及び自身のキャッシュライン状態は、バス要求入力バッファ３３に格納され、他のプロセッサのキャッシュ制御部から、リード要求に対する応答である、キャッシュライン状態が応答バス１４を通じて到着するのを待機する（図５のステップ２０４）。
【００５７】
リード要求に対して、すべてのプロセッサからの応答が到着すると、前記した自身のキャッシュラインが実際に無効であるか、それとも有効であるかを判定する（図５のステップ２０５）。より詳細には、セットされている更新対象フラグ２４ｂに対応するプロセッサのキャッシュライン状態を参照し、ヒットしていた場合は、実際にそのプロセッサに更新されていたと判断する。一方、セットされているすべての更新対象フラグ２４ｂに対して、いずれのプロセッサでもミスしていた場合、その更新は投機実行の失敗により取り消されていて、実際には更新されていないと判断する。
【００５８】
実際には更新されていなかった場合、該キャッシュラインは有効であるので、ただちに、読み出し処理を実行することができる。この場合、リフィル処理は必要なく、先に発行したリード要求を受信したプロセッサでは、そのリード要求に対する処理は行われない。読み出し処理では、キャッシュメモリ１１からプロセッサ１０にロード対象のデータを転送する（図５のステップ２０６）。次に、キャッシュライン状態を更新して、ロード命令の実行を終了する（図５のステップ２０７）。具体的には、まず、更新フラグ２４をリセットし、次に、該ロード命令が投機的な実行である場合、ロード対象のデータを格納したデータエントリ２６に対応する投機ロード・フラグ２８をセットする。
【００５９】
一方、実際に更新されていた場合、該キャッシュラインは無効であるので、他のプロセッサのキャッシュメモリ、またはメインメモリから、有効なデータをリフィルする必要がある。まず、リフィル処理の前に、該キャッシュラインのデータをライトバックする必要性を判断する（図５のステップ２１１）。該キャッシュラインは、自プロセッサが現在実行しているスレッドに対しては無効であるが、親スレッドに対しては有効である場合がある。より詳細には、該キャッシュラインを更新したプロセッサのキャッシュメモリに、確定したキャッシュライン、すわなち投機フラグ２３がセットされていないキャッシュラインが存在しなければ、該キャッシュラインは唯一の確定したデータを保持しているため、ライトバックが必要であると判断する。一方、該キャッシュラインの更新元のプロセッサのキャッシュラインに、確定したキャッシュラインが存在すれば、ライトバックは必要ないと判断する。
【００６０】
ライトバックが必要であると判断した場合、バス要求制御部３０はライトバック要求を生成し、それをバス要求出力バッファ３２を通じて、要求バス１３に出力し（図５のステップ２１６）、次にデータバス１５にライトバック対象のデータを出力する（図５のステップ２１７）。次に、先に発行しているリード要求に対して、他のキャッシュメモリまたはメインメモリからデータバス１５を通じて伝達されるリフィル・データの到着を待つ（図５のステップ２１２）。次に、キャッシュ要求制御部３１は到着したリフィル・データをキャッシュメモリ１１へリフィルを行い（図５のステップ２１３）、次に、キャッシュメモリ１１からプロセッサ１０にロード対象のデータを転送し（図５のステップ２０６）、キャッシュライン状態を更新して、ロード命令の実行を終了する（図５のステップ２０７）。
【００６１】
一方、図５のステップ２１１でライトバックが必要でないと判断した場合、そのままリフィル・データの到着を待ち（図５のステップ２１２）、キャッシュメモリ１１へのリフィルを行う（図５のステップ２１３）。次に、キャッシュメモリ１１からプロセッサ１０にロード対象のデータを転送し（図５のステップ２０６）、キャッシュライン状態を更新して、ロード命令の実行を終了する（図５のステップ２０７）。
【００６２】
以上、図５のステップ２０１において、ロード命令がキャッシュメモリにヒットした場合の動作について説明した。一方、ロード命令がキャッシュメモリにミスした場合は、スレッド実行が確定的か投機的かで動作が異なる（図５のステップ２０８）。スレッド実行が投機的で、すなわち発行されたロード命令は投機的である場合、キャッシュメモリ１１にリフィル可能か否かを判断する（図５のステップ２１４）。キャッシュメモリ１１のリフィル先の候補のエントリに空きがなく、かつ、それらエントリに格納されているすべてのキャッシュラインの投機フラグ２３及びストア・フラグ２７のいずれかがセットされているか、あるいは投機ロード・フラグ２８のいずれかがセットされている場合、リフィルすることができない。この場合、スレッドが確定するまで待機した後に（図５のステップ２１５）、図５のステップ２０９よりリフィル処理を開始する。
【００６３】
一方、キャッシュメモリ１１のリフィル先の候補のエントリに少なくとも１つの空きがあれば、リフィルは可能である。また、空きが無い場合でも、それらリフィル先候補のエントリに格納されているいずれかのキャッシュラインの投機フラグ２３かストア・フラグ２７のいずれかがセットされてなく、かつ投機ロード・フラグ２８のいずれもセットされていない場合、そのエントリにリフィルすることが可能である。この場合、図５のステップ２０９よりリフィル処理を開始する。
【００６４】
一方、スレッド実行が確定的で、すなわち発行されたロード命令は確定的である場合（図５のステップ２０８、Ｙｅｓ）、常にリフィルは可能であるので、図５のステップ２０９よりリフィル処理を開始する。具体的には、まず、要求バス１３にリード要求を出力し（図５のステップ２０９）、それに対する他プロセッサからの応答を待つ（図５のステップ２１０）。
【００６５】
次に、ライトバックが必要か否かを判定する（図５のステップ２１１）。リフィル先のエントリにストア命令により変更されたキャッシュライン、すわなち変更フラグ２１がセットされているキャッシュラインが存在すれば、ライトバックが必要である。その場合、ライトバック要求を要求バス１３に出力し（図５のステップ２１６）、次にデータバス１５にライトバック対象のデータを出力する（図５のステップ２１７）。次に、リフィル・データの到着を待ち（図５のステップ２１２）、キャッシュメモリ１１へのリフィルを行う（図５のステップ２１３）。次に、キャッシュメモリ１１からプロセッサ１０にロード対象のデータを転送し（図５のステップ２０６）、キャッシュライン状態を更新して、ロード命令の実行を終了する（図５のステップ２０７）。
【００６６】
ライトバックが必要でない場合は、そのままリフィル・データの到着を待ち（図５のステップ２１２）、キャッシュメモリ１１へのリフィルを行う（図５のステップ２１３）。次に、キャッシュメモリ１１からプロセッサ１０にロード対象のデータを転送し（図５のステップ２０６）、キャッシュライン状態を更新して、ロード命令の実行を終了する（図５のステップ２０７）。
【００６７】
以上、ロード命令が発行された場合のキャッシュメモリ１１及びキャッシュ制御部１２の動作を説明した。次に、図６を参照して、ストア命令が発行された場合のキャッシュメモリ１１及びキャッシュ制御部１２の動作を説明する。
【００６８】
まず、プロセッサ１０でストア命令が発行されると（図６のステップ２２０）、キャッシュメモリ１１がアクセスされ、キャッシュメモリにヒットするか、ミスするかが判定される（図６のステップ２２１）。キャッシュメモリにヒットした場合、ヒットしたキャッシュラインが読み出され、キャッシュライン内の更新フラグ２４が参照される（図６のステップ２２２）。更新フラグ２４がセットされていない、すなわち、更新有効フラグ２４ａがセットされていないか、更新対象フラグ２４ｂのいずれもがセットされていない場合、そのキャッシュラインは子スレッドにより更新されておらず、そのキャッシュラインは有効であると判断される。その場合、バス要求制御部３０は、ライト要求を生成し、バス要求出力バッファ３２を通じて、要求バス１３にライト要求を出力する（図６のステップ２２６）。ライト要求は、ストア命令を実行したこと、及びそのストア・データを他のプロセッサやキャッシュメモリに通知し、それに対する処理を要求するバス要求である。
【００６９】
次に、該ストア命令による書き込みの前に、以前のデータのメインメモリへのライトバックが必要か否かを判定する（図６のステップ２２７）。該ストア命令がヒットしたキャッシュラインが確定的である、すなわち投機フラグ２３がセットされてなく、かつ該ストア命令が投機的な実行である場合、投機的なデータを書き込む前に、確定的なデータをメインメモリへライトバックを行う。具体的には、要求バス１３にライトバック要求を出力し（図６のステップ２３０）、続いてデータバス１５を通じてライトバックするデータを転送する（図６のステップ２３１）。その後、該ストア命令が書き込みの対象とするキャッシュラインのデータエントリ２６に、ストア・データの書き込みを行う（図６のステップ２２８）。次に、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。具体的には、まず、変更フラグ２１、及びストア対象のデータを格納したデータエントリに対応するストア・フラグ２７をセットする。さらに、該ストア命令が投機的な実行である場合、投機フラグ２３の自プロセッサに対応するフラグ部分をセットする。
【００７０】
一方、ライトバックが必要なかった場合（図６のステップ２２７、Ｎｏ）、そのまま該ストア命令が書き込みの対象とするキャッシュラインのデータエントリに、ストア・データの書き込みを行う（図６のステップ２２８）。次に、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。
【００７１】
一方、更新フラグの参照（図６のステップ２２２）で、更新フラグ２４がセットされていた、すなわち、更新有効フラグ２４ａがセットされていて、かつ、更新対象フラグ２４ｂのいずれかがセットされている場合、そのキャッシュラインは子スレッドにより更新されていて、そのキャッシュラインは既に無効である可能性があると判断される。その場合、バス要求制御部３０はリード・ライト要求を生成し、要求バス１３にリード・ライト要求を発行する（図６のステップ２２３）。リード・ライト要求は、同時に要求バスに出力する対象のアドレスに対して、リード要求に対する処理の後、ライト要求に対する処理を要求するバス要求である。
【００７２】
次に、他のキャッシュ制御部からリード・ライト要求に対する応答の到着を待機し（図６のステップ２２４）、その応答を参照して、該キャッシュラインが子スレッドにより実際に更新されているか否かを判定する（図６のステップ２２５）。実際には更新されていなかった場合、該キャッシュラインは有効であるので、ただちにライト処理を開始することができる。この場合、リフィル処理は必要なく、先に発行したリード・ライト要求を受信したプロセッサでは、そのリード要求部分に対する処理は行われない。ライト処理では、まず、ライトバックが必要か否かの判断を行う（図６のステップ２２７）。ライトバックが必要な場合、ライトバック要求の発行（図６のステップ２３０）及び、ライトバック・データの転送（図６のステップ２３１）を行う。次に、該ストア命令が書き込みの対象とするキャッシュラインのデータエントリに、ストア・データの書き込みを行う（図６のステップ２２８）。次に、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。
【００７３】
一方、図６のステップ２２５における子スレッドによる更新の有無の判断で、実際に更新されていた場合、該キャッシュラインは無効であるので、ロード命令の場合と同様に、他のプロセッサのキャッシュメモリ、またはメインメモリから、有効なデータをリフィルする必要がある。まず、リフィル処理の前に、該キャッシュラインのデータをライトバックする必要性を判断する（図６のステップ２３５）。該キャッシュラインは、自プロセッサが現在実行するスレッドに対しては無効であるが、親スレッドに対しては有効である場合がある。より詳細には、該キャッシュラインを更新したプロセッサのキャッシュラインに、確定したキャッシュライン、すわなち投機フラグ２３がセットされていないキャッシュラインが存在しなければ、該キャッシュラインは唯一の確定したデータを保持しているため、ライトバックが必要であると判断する。一方、該キャッシュラインの更新元のプロセッサのキャッシュラインに、確定したキャッシュラインが存在すれば、ライトバックは必要ないと判断する。
【００７４】
ライトバックが必要であると判断した場合は、ライトバック要求の発行（図６のステップ２４０）及び、ライトバック・データの転送（図６のステップ２４１）を行う。次に、先に発行しているリード・ライト要求に対して、他のキャッシュメモリまたはメインメモリからデータバス１５を通じて伝達されるリフィル・データの到着を待つ（図６のステップ２３６）。次に、キャッシュ要求制御部３１は到着したリフィル・データをキャッシュメモリ１１へリフィルを行う（図６のステップ２３７）。次に、該ストア命令が書き込みの対象とするキャッシュラインのデータエントリに、ストア・データの書き込みを行う（図６のステップ２２８）。次に、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。
【００７５】
一方、ライトバックが必要でないと判断した場合は、そのまま、リフィル・データの到着を待ち（図６のステップ２３６）、キャッシュメモリ１１へリフィルを行う（図６のステップ２３７）。次に、該ストア命令のストア・データの書き込みを行い（図６のステップ２２８）、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。
【００７６】
以上、図６のステップ２２１において、ストア命令がキャッシュメモリにヒットした場合の動作について説明した。一方、ストア命令がキャッシュメモリにミスした場合は、ロード命令の場合と同様に、スレッド実行が確定的か投機的かで動作が異なる（図６のステップ２３２）。スレッド実行が投機的で、すなわち発行されたストア命令は投機的である場合、キャッシュメモリ１１にリフィル可能か否かを判断する（図６のステップ２３８）。キャッシュメモリ１１のリフィル先の候補のエントリに空きがなく、かつ、それらエントリに格納されているすべてのキャッシュラインの投機フラグ２３及びストア・フラグ２７のいずれかがセットされているか、あるいは投機ロード・フラグ２８のいずれかがセットされている場合、リフィルすることができない。この場合、スレッドが確定するまで待機した後に（図６のステップ２３９）、リフィル処理を開始する。
【００７７】
一方、キャッシュメモリ１１のリフィル先の候補のエントリに少なくとも１つの空きがあれば、リフィルは可能である。また、空きが無い場合でも、それらリフィル先候補のエントリに格納されているいずれかのキャッシュラインの投機フラグ２３かストア・フラグ２７のいずれかがセットされてなく、かつ投機ロード・フラグ２８のいずれもセットされていない場合、そのエントリにリフィルすることが可能である。この場合、そのままリフィル処理を開始する。
【００７８】
一方、スレッド実行が確定的で、すなわち発行されたストア命令は確定的である場合（図６のステップ２３２、Ｙｅｓ）、常にリフィルは可能であるので、そのままリフィル処理を開始する。具体的には、まず、要求バス１３にリード・ライト要求を出力し（図６のステップ２３３）、それに対する他プロセッサからの応答を待つ（図６のステップ２３４）。
【００７９】
次に、ライトバックが必要か否かを判定する（図６のステップ２３５）。リフィル先のエントリに変更されたキャッシュライン、すわなち変更フラグ２１がセットされているキャッシュラインが存在すれば、ライトバックが必要であると判断する。ライトバックが必要であると判断した場合は、ライトバック要求の発行（図６のステップ２４０）及び、ライトバック・データの転送（図６のステップ２４１）を行った後、リフィル処理を続行する。一方、ライトバックが必要でないと判断した場合は、そのままリフィル処理を続行する。リフィル処理は、先に発行しているリード・ライト要求に対して、他のキャッシュメモリまたはメインメモリからデータバス１５を通じて伝達されるリフィル・データの到着を待つ（図６のステップ２３６）。次に、キャッシュ要求制御部３１は到着したリフィル・データのキャッシュメモリ１１へのリフィルを行う（図６のステップ２３７）。次に、該ストア命令が書き込みの対象とするキャッシュラインのデータエントリに、ストア・データの書き込みを行う（図６のステップ２２８）。次に、キャッシュライン状態を更新して、ストア命令の実行を終了する（図６のステップ２２９）。
【００８０】
以上、ストア命令が発行された場合のキャッシュメモリ１１及びキャッシュ制御部１２の動作を説明した。次に、図７を参照して、他のプロセッサからバスを通じてリード要求を受信した場合、及びリード・ライト要求を受信した場合のリード要求部分に対する、キャッシュメモリ１１及びキャッシュ制御部１２の動作を説明する。リード・ライト要求を受信した場合は、リード要求に対する処理を行った後、後述するライト要求に対する処理を行う。以下の説明ではリード要求またはリード・ライト要求のリード要求部分を、単にリード要求と表記する。
【００８１】
まず、他プロセッサのキャッシュ制御部１２からのリード要求を、要求バス１３を通じて受信すると、バス要求入力バッファ３３は、該リード要求のコマンド、アドレス、リード要求を発行したプロセッサのキャッシュライン状態などを格納し、キャッシュ要求制御部３１に通知する（図７のステップ２４５）。キャッシュ要求制御部３１はリード要求を解釈すると、キャッシュメモリ１１にアクセスし、リード要求の対象アドレスがキャッシュメモリにヒットするかミスするかを判定する（図７のステップ２４６）。
【００８２】
リード要求がキャッシュメモリ１１にミスした場合、その旨を、バス要求制御部３０、バス要求出力バッファ３２、及び応答バス１４を通じて、他プロセッサに通知し、リード要求に対する処理を終了する（図７のステップ２４７）。
【００８３】
一方、リード要求がキャッシュメモリ１１にヒットした場合、ヒットしたキャッシュラインの状態を、バス要求制御部３０、バス要求出力バッファ３２、及び応答バス１４を通じて、その旨を他プロセッサに通知し（図７のステップ２４８）、他プロセッサからの応答である他のキャッシュメモリのキャッシュライン状態が到着するのを待機する（図７のステップ２４９）。次に、ヒットした自身のキャッシュライン状態の更新フラグ２４を参照して、更新フラグ２４がセットされているか否かを判定する（図７のステップ２５０）。
【００８４】
更新フラグ２４がセットされていない、すなわち、更新有効フラグ２４ａがセットされていないか、更新対象フラグ２４ｂのいずれもがセットされていない場合、そのキャッシュラインは子スレッドにより更新されておらず、そのキャッシュラインは有効であると判断される。その場合、自身のキャッシュラインのデータをリフィル・データとして供給するか否かの判定を行う（図７のステップ２５６）。
【００８５】
一方、更新フラグ２４がセットされていた、すなわち、更新有効フラグ２４ａがセットされていて、かつ、更新対象フラグ２４ｂのいずれかがセットされている場合、そのキャッシュラインは子スレッドにより更新されていて、そのキャッシュラインは既に無効である可能性があると判断される。その場合、他プロセッサからのキャッシュライン状態の応答を参照して、前記した自身のキャッシュラインが実際に無効であるか、それとも有効であるかを判定する（図７のステップ２５１）。より詳細には、セットされている更新対象フラグ２４ｂに対応するプロセッサのキャッシュライン状態を参照し、ヒットしていた場合は、実際にそのプロセッサに更新されていたと判断する。一方、セットされているすべての更新対象フラグ２４ｂに対して、いずれのプロセッサでもミスしていた場合、その更新は投機実行の失敗に取り消されていて、実際には更新されていないと判断する。
【００８６】
子スレッドにより、実際には更新されていなかった場合、自身のキャッシュラインのデータをリフィル・データとして供給するか否かの判定を行う（図７のステップ２５６）。判定は、まず、リード要求を発行したプロセッサが、実際にリフィル処理を必要としているか否かを判断する。これは、リード要求を発行したが（図５の２０３、または図６の２２３）、実際にはキャッシュラインが有効でリフィル処理が必要ない場合（図５の２０５、Ｎｏ、または図６の２２５、Ｎｏ）があるからである。リード要求を受信したプロセッサでも、すべてのキャッシュメモリのキャッシュライン状態が参照できるので、リード要求を発行したプロセッサと同様の判断が可能である。
【００８７】
リード要求を発行したプロセッサで、実際にリフィル処理を必要としていない場合は、リフィル・データの供給は行わない。一方、リード要求を発行したプロセッサで、実際にリフィル処理を必要としている場合、次に、プログラム順序の上で、自プロセッサが実行するスレッドと、リード要求を発行したプロセッサが実行するスレッドの間に位置するスレッドを実行するプロセッサのキャッシュライン状態を参照する。リフィル・データを供給するか否かは、それらの間のスレッドのキャッシュライン状態と自身のキャッシュライン状態により決定される。なお、スレッドの順序関係は、自身のプロセッサ１０から各キャッシュ制御部１２へ通知される。
【００８８】
まず、前記間のスレッドのキャッシュラインの中に、投機的な（投機フラグ２３がセットされた）キャッシュラインが存在する場合、自身のキャッシュラインのデータはリフィル・データとして無効であり、自プロセッサはリフィル・データの供給は行わない。
【００８９】
次に、前記間のスレッドのキャッシュラインの中に、投機的なキャッシュラインは存在しないが、確定的なキャッシュラインは存在し、かつ自身のキャッシュラインも確定的である場合、自プロセッサはリフィル・データの供給は行わない。
【００９０】
次に、間のスレッドのキャッシュラインの中に、投機的なキャッシュラインは存在しないが、確定的なキャッシュラインは存在し、かつ自身のキャッシュラインは投機的である場合、自プロセッサは自身のキャッシュラインからリフィル・データの供給を行う。
【００９１】
次に、間のスレッドを実行するプロセッサではすべてキャッシュメモリにミスし、有効なキャッシュラインが存在しない場合、自プロセッサは自身のキャッシュラインからリフィル・データの供給を行う。
【００９２】
リフィル・データの供給を行わない場合、キャッシュライン状態の更新、具体的には更新フラグ２４のリセットを行い、リード要求に対する処理を終了する（図７のステップ２５７）。一方、リフィル・データの供給を行う場合、データバス１５を通じて、自身のキャッシュラインが保持しているデータを転送し（図７のステップ２５８）、次に、キャッシュライン状態の更新を行い、リード要求に対する処理を終了する（図７のステップ２５７）。
【００９３】
一方、子スレッドによる更新の有無判定で（図７のステップ２５１）、実際に更新されていた場合、該キャッシュラインは既に無効であるので、キャッシュラインの無効化を行う。まず、無効化処理の前に、該キャッシュラインのデータをライトバックする必要性を判断する（図７のステップ２５２）。該キャッシュラインは、自プロセッサが現在実行するスレッドに対しては無効であるが、親スレッドに対しては有効である場合がある。より詳細には、該キャッシュラインの更新元のプロセッサのキャッシュラインに、確定したキャッシュライン、すわなち投機フラグ２３がセットされていないキャッシュラインが存在しなければ、該キャッシュラインは唯一の確定したデータを保持しているため、ライトバックが必要であると判断する。一方、該キャッシュラインの更新元のプロセッサのキャッシュラインに、確定したキャッシュラインが存在すれば、ライトバックは必要ないと判断する。
【００９４】
ライトバックが必要であると判断した場合、要求バス１３にライトバック要求を出力し（図７のステップ２５４）、次にデータバス１５にライトバック対象のデータを出力する（図７のステップ２５５）。その後、キャッシュラインの有効フラグ２０をリセットしてキャッシュラインの無効化を行い、リード要求に対する処理を終了する（図７のステップ２５３）。一方、ライトバックが必要でないと判断した場合は、そのままキャッシュラインの有効フラグ２０をリセットしてキャッシュラインの無効化を行い、リード要求に対する処理を終了する（図７のステップ２５３）。
【００９５】
以上、他のプロセッサからバスを通じてリード要求を受信した場合、及びリード・ライト要求を受信した場合のリード要求部分に対する、キャッシュメモリ１１及びキャッシュ制御部１２の動作を説明した。次に、図８を参照して、他のプロセッサからバスを通じてライト要求を受信した場合、及びリード・ライト要求を受信した場合のライト要求部分に対する、キャッシュメモリ１１及びキャッシュ制御部１２の動作を説明する。リード・ライト要求を受信した場合は、上述したリード要求に対する処理を行った後、ライト要求に対する処理を行う。以下の説明では、ライト要求、及びリード・ライト要求におけるライト要求部分を、単にライト要求と表記する。
【００９６】
まず、他プロセッサのキャッシュ制御部１２からのライト要求を、要求バス１３を通じて受信すると、バス要求入力バッファ３３は、該ライト要求のコマンド、アドレス、ライト要求を発行したプロセッサのキャッシュライン状態、ライト・データなどを格納し、キャッシュ要求制御部３１に通知する（図８のステップ２６０）。キャッシュ要求制御部３１はライト要求を解釈すると、キャッシュメモリ１１にアクセスし、ライト要求の対象アドレスがキャッシュメモリにヒットするかミスするかを判定する（図８のステップ２６１）。
【００９７】
ライト要求がキャッシュメモリ１１にミスした場合、その旨を、バス要求制御部３０、バス要求出力バッファ３２、及び応答バス１４を通じて、他プロセッサに通知し、ライト要求に対する処理を終了する（図８のステップ２６２）。
【００９８】
一方、ライト要求がキャッシュメモリ１１にヒットした場合、ヒットしたキャッシュラインの状態を、バス要求制御部３０、バス要求出力バッファ３２、及び応答バス１４を通じて、その旨を他プロセッサに通知し（図８のステップ２６３）、他プロセッサからの応答である他のキャッシュメモリのキャッシュライン状態が到着するのを待機する（図８のステップ２６４）。次に、ヒットした自身のキャッシュライン状態の更新フラグ２４を参照して、更新フラグ２４がセットされているか否かを判定する（図８のステップ２６５）。
【００９９】
更新フラグ２４がセットされていない、すなわち、更新有効フラグ２４ａがセットされていないか、更新対象フラグ２４ｂのいずれもがセットされていない場合、そのキャッシュラインは子スレッドにより更新されておらず、そのキャッシュラインは有効であると判断される。その場合、自身のキャッシュラインへのライト処理を開始する（図８のステップ２６５、Ｎｏ）。
【０１００】
一方、更新フラグ２４がセットされていた、すなわち、更新有効フラグ２４ａがセットされていて、かつ、更新対象フラグ２４ｂのいずれかがセットされている場合、そのキャッシュラインは子スレッドにより更新されていて、そのキャッシュラインは既に無効である可能性があると判断される。その場合、他プロセッサからのキャッシュライン状態の応答を参照して、前記した自身のキャッシュラインが実際に無効であるか、それとも有効であるかを判定する（図８のステップ２６６）。より詳細には、セットされている更新対象フラグ２４ｂに対応するプロセッサのキャッシュライン状態を参照し、ヒットしていた場合は、実際にそのプロセッサに更新されていたと判断する。一方、セットされているすべての更新対象フラグ２４ｂに対して、いずれのプロセッサでもミスしていた場合、その更新は投機実行の失敗に取り消されていて、実際には更新されていないと判断する。
【０１０１】
子スレッドにより、実際には更新されていなかった場合、自身のキャッシュラインへのライト処理を開始する（図８のステップ２６６、Ｎｏ）。ライト処理はまず、ライト要求が親スレッドからの要求か否かを判断する（図８のステップ２７１）。スレッドの順序関係は、自身のプロセッサ１０から各キャッシュ制御部１２へ通知される。子スレッドからのライト要求であった場合、それはプログラム順序の上で後に位置する書き込みなので、実際にデータの更新は行わず、子スレッドによって更新されたことを示す、キャッシュラインの更新フラグ２４のうち、ライト要求を発行したプロセッサに対応する更新対象フラグ２４ｂをセットして、ライト要求に対する処理を終了する（図８のステップ２７３）。
【０１０２】
一方、親スレッドからのライト要求であった場合、次に有効なライト・データ部分が存在するか否かを判定する（図８のステップ２７２）。判定には、まず、プログラム順序の上で、ライト要求を発行したプロセッサが実行するスレッドと自プロセッサが実行するスレッドの間に位置するスレッドを実行するプロセッサのキャッシュライン状態を参照する。有効なライト・データ部分が存在するか否かは、それらの間のスレッドのキャッシュライン状態と自身のキャッシュライン状態により決定される。具体的には、ライト・データに対し、間のスレッドのキャッシュラインの中で、ストア・フラグ２７がセットされているライト・データ部分が存在する場合、そのライト・データ部分は自スレッドに対して無効である。逆に、間のスレッドのキャッシュラインのいずれにも、ストア・フラグ２７がセットされていないライト・データ部分が存在する場合、そのライトデータ部分は自スレッドに対して有効である。
【０１０３】
有効なライト・データ部分が存在しない場合、キャッシュライン状態を更新して、ライト要求に対する処理を終了する（図８のステップ２７３）。一方、有効なライト・データ部分が存在する場合、そのライト・データ部分の書き込み処理を行う。まず、実際に書き込みを行う前に、以前のデータのメインメモリへのライトバックが必要か否かを判定する（図８のステップ２７４）。該ライト要求がヒットしたキャッシュラインが確定的である、すなわち投機フラグ２３がセットされてなく、かつ該ライト要求が投機的な要求である場合、投機的なデータを書き込む前に、確定的なデータをメインメモリへライトバックを行う。具体的には、要求バス１３にライトバック要求を出力し（図８のステップ２７５）、続いてデータバス１５を通じてライトバックするデータを転送する（図８のステップ２７６）。その後、実際の書き込み処理を開始する。一方、ライトバックが必要なかった場合（図８のステップ２７４、Ｎｏ）、そのまま実際の書き込み処理を開始する。ライト要求が投機的であるか、確定的であるかは、ライト要求の要因のストア命令が投機的であるか、確定的であるかにより、ライト要求と同時に要求を発行したプロセッサから与えられる。
【０１０４】
実際の書き込み処理では（図８のステップ２７７）、前記した有効なライト・データ部分を自身のキャッシュラインの対応するデータエントリ２６へ書き込みを行う。ただし、自プロセッサが先に書き込みを行い、ストア・フラグ２７がセットされている、データエントリに対しては書き込みを行わない。
【０１０５】
次に、受信したライト要求のストア命令から、自プロセッサが先に実行した正依存関係に対して投機的なロード命令への、正依存関係の検出を行う（図８のステップ２７８）。上記した有効なライト・データ部分に対応するデータエントリの投機ロード・フラグ２８のいずれかがセットされていた場合、正依存関係が存在し、投機的なロード命令の実行は失敗であったと判断できる。その場合、キャッシュメモリ１１はプロセッサ１０に投機実行失敗を通知し、プロセッサ１０はスレッド実行の取消しを行う（図８のステップ２８０）。
【０１０６】
一方、上記した有効なライト・データ部分に対応するデータエントリの投機ロード・フラグ２８のいずれもセットされていない場合、正依存関係は存在せず、投機的なロード命令の実行は成功したと判断できる。その場合、キャッシュライン状態を更新して、ライト要求に対する処理を終了する（図８のステップ２７９）。
【０１０７】
一方、子スレッドによる更新の有無判定で（図８のステップ２６６）、実際に更新されていた場合、該キャッシュラインは既に無効であるので、キャッシュラインの無効化を行う。まず、無効化処理の前に、該キャッシュラインのデータをライトバックする必要性を判断する（図８のステップ２６７）。該キャッシュラインは、自プロセッサが現在実行するスレッドに対しては無効であるが、親スレッドに対しては有効である場合がある。より詳細には、該キャッシュラインを更新したプロセッサのキャッシュラインに、確定したキャッシュライン、すわなち投機フラグ２３がセットされていないキャッシュラインが存在しなければ、該キャッシュラインは唯一の確定したデータを保持しているため、ライトバックが必要であると判断する。一方、該キャッシュラインの更新元のプロセッサのキャッシュラインに、確定したキャッシュラインが存在すれば、ライトバックは必要ないと判断する。
【０１０８】
ライトバックが必要であると判断した場合、要求バス１３にライトバック要求を出力し（図８のステップ２６９）、次にデータバス１５にライトバック対象のデータを出力する（図８のステップ２７０）。その後、キャッシュラインの有効フラグ２０をリセットしてキャッシュラインの無効化を行い、ライト要求に対する処理を終了する（図８のステップ２６８）。一方、ライトバックが必要でないと判断した場合は、そのままキャッシュラインの有効フラグ２０をリセットしてキャッシュラインの無効化を行い、ライト要求に対する処理を終了する（図８のステップ２６８）。
【０１０９】
以上、他のプロセッサからバスを通じてライト要求を受信した場合、及びリード・ライト要求を受信した場合のライト要求部分に対する、キャッシュメモリ１１及びキャッシュ制御部１２の動作を説明した。上記したように、本実施形態の特徴の一つに、同じアドレスに対するバス要求を結合して同時に発行することがある。さらに更新されて無効である可能性のあるキャッシュラインへの処理を、前記バス要求により暗黙的に実行することがある。これにより、発行されるバス要求を少なくすることができ、バスの競合による性能低下が小さく、バスで消費される電力が小さいという効果がある。上記説明では、同じアドレスに対するリード要求及びライト要求を統合してリード・ライト要求としたが、さらに同じアドレスに対するライトバック要求を統合しても良い。
【０１１０】
投機的なロード命令の実行に失敗した場合など、スレッドの実行が取り消された場合には、まず、キャッシュメモリ１１を構成するすべてのキャッシュラインのすべての投機ロード・フラグ２７をリセットすることで、投機実行したロード命令の記録を破棄する。次に、キャッシュメモリ１１を構成するキャッシュラインのうち、投機的なキャッシュラインの無効化を行うことで、投機実行に失敗して無効であるデータの破棄を行う。具体的には、投機的なキャッシュラインのうち、該キャッシュラインが投機的である原因のプロセッサでも、スレッドの実行の取り消しが行われた場合、該キャッシュラインの有効フラグ２０をリセットして無効化する。本実施形態によれば、キャッシュラインが投機的なことを示す投機フラグ２３を、複数のビットから構成しており、該キャッシュラインを投機的にならしめた原因のプロセッサを特定することが可能である。このため、投機フラグを１ビットで構成する従来の方法では、厳密には無効化が不必要なキャッシュラインも無効化されてしまうのに対して、本実施形態によれば、厳密に無効化が必要なキャッシュラインのみが無効化されるため、キャッシュミスが発生する確率が小さく、高速なスレッド並列処理が可能であるという効果がある。
【０１１１】
一方、投機的なスレッドの実行が確定した場合には、キャッシュメモリ１１を構成するキャッシュラインのうち、投機的なキャッシュラインの確定を行うことで、投機実行に成功して確定したデータの有効化を行う。この処理は、投機フラグ２３、ストア・フラグ２７、及び投機ロード・フラグ２８をリセットすることで実現できる。各プロセッサで実行されているスレッドのうち、少なくともプログラム順序で最も先に位置するスレッドは、実行が確定している。それ以外のスレッドの実行は確定している場合と、投機的である場合があるが、いずれにしても、先行するすべてのスレッドの実行が終了し、自スレッドが実行中の最も先行するスレッドになった時点で、実行が確定する。
【０１１２】
次に、上記した本実施形態による動作の具体例を図５〜図８、及び図９を参照して説明する。図９は、４つのプロセッサ＃０〜＃３を備えるマルチプロセッサシステム上で、ある実行サイクル（サイクル０〜サイクル１９）における、スレッド実行の状態と、あるキャッシュラインの状態を示した説明図であり、左からサイクル番号、スレッド実行状態、キャッシュライン状態を示している。
【０１１３】
スレッド実行状態（図９（ａ））を参照すると、８つのスレッド、スレッド０〜スレッド７（ｔｈ＃０〜ｔｈ＃７）が実行されるとする。まず、０サイクル目においてプロセッサ＃０で実行されているスレッド０からスレッド１が生成され、プロセッサ＃１において実行が開始される。次に、１サイクル目においてスレッド１からスレッド２が生成され、プロセッサ＃２において実行が開始される。次に、２サイクル目においてスレッド２からスレッド３が生成され、プロセッサ＃３において実行が開始される。また、１０サイクル目においてスレッド３からスレッド４が生成され、スレッド０の実行が終了して空いているプロセッサ＃０において実行が開始される。次に、１１サイクル目においてスレッド４からスレッド５が生成され、プロセッサ＃１において実行が開始される。次に、１２サイクル目においてスレッド５からスレッド６が生成され、プロセッサ＃２において実行が開始される。次に、１３サイクル目においてスレッド６からスレッド７が生成され、プロセッサ＃３において実行が開始される。すなわち、プログラム上の順序は、スレッド０が最も先であり、その後にスレッド１、スレッド２、スレッド３、スレッド４、スレッド５、スレッド６、の順序であり、最も後がスレッド７である。
【０１１４】
これらのスレッド上で、ある同じアドレスを対象とする５つのストア命令、ストア０〜ストア４（ＳＴ＃０〜ＳＴ＃４）、及び６つのロード命令、ロード０〜ロード５（ＬＤ＃０〜ＬＤ＃５）が実行されるとする。これらストア命令及びロード命令が対象とするアドレスに対するキャッシュラインの状態をキャッシュライン状態（図９（ｂ））に示す。左からプロセッサ＃０に固有のキャッシュメモリ＃０の該キャッシュライン状態、次に、プロセッサ＃１に固有のキャッシュメモリ＃１の該キャッシュライン状態、次に、プロセッサ＃２に固有のキャッシュメモリ＃２の該キャッシュライン状態、次に、プロセッサ＃３に固有のキャッシュメモリ＃３の該キャッシュライン状態である。各キャッシュライン状態は、左から投機フラグ２３、更新フラグ２４、ストア・フラグ２７、投機ロード・フラグ２８、データエントリ２６のみを表記し、他のフラグやエントリは省略している。また、図のキャッシュライン状態において、実線で表記しているキャッシュラインは有効である（有効フラグ２０がセットされている）ことを示し、破線で表記しているキャッシュラインは無効である（有効フラグ２０がセットされていない）ことを示す。
【０１１５】
０サイクル目においては、いずれのキャッシュメモリでも、投機フラグ２３、更新フラグ２４、ストア・フラグ２７、及び投機ロード・フラグ２８はリセットされていて、同一の確定的なデータ“Ｘ”を保持しているとする。
【０１１６】
再び、スレッド実行状態（図９（ａ））を参照すると、まず、３サイクル目においてプロセッサ＃０でストア０が実行される。ストア０の書き込み値が“０”であるとすると、まず、該アドレスのデータを共有している他のプロセッサ、プロセッサ＃１、＃２、＃３に対してライト要求を発行し（図６のステップ２２６）、自身のキャッシュメモリ＃０に“０”を書き込む（図６のステップ２２８）。どのプロセッサとデータを共有しているかは、キャッシュラインの共有フラグ２２を参照して判断する。
【０１１７】
一方、ライト要求を受信したプロセッサ＃１、＃２、＃３では、ライト要求に対する処理が行われる。具体的には、いずれのプロセッサにとっても親スレッドからのライト要求で、かつ有効なライト・データなので、“０”の書き込みを行う（図８のステップ２７７）。
【０１１８】
次に、４サイクル目において、プロセッサ＃３でストア３が実行される。ここでスレッド３は投機的なスレッドであり、従って、ストア３は投機的な実行であるとする。ストア３の書き込み値が“３”であるとすると、まず、データを共有している他のプロセッサ、プロセッサ＃０、＃１、＃２に対してライト要求を発行し（図６のステップ２２６）、自身のキャッシュメモリ＃３に“３”を書き込む（図６のステップ２２８）。また、投機フラグ２３の自プロセッサに対応するフラグ部分、及びストア・フラグ２８をセットする。
【０１１９】
一方、ライト要求を受信したプロセッサ＃０、＃１、＃２では、ライト要求に対する処理が行われる。具体的には、いずれのプロセッサにとっても子スレッドからのライト要求でなので、更新フラグ２４の更新対象フラグ２４ｂのうち、更新の原因のプロセッサであるプロセッサ＃３に対応するフラグ部分をセットする（図８のステップ２７３）。
【０１２０】
次に、５サイクル目において、プロセッサ＃１でストア１が実行される。ここでスレッド１は投機的なスレッドであり、従って、ストア１は投機的な実行であるとする。ストア１の書き込み値が“１”であるとすると、まず、データを共有している他のプロセッサ、プロセッサ＃０、＃２、＃３に対してライト要求を発行し（図６のステップ２２６）、自身のキャッシュメモリ＃１に“１”を書き込む（図６のステップ２２８）。また、投機フラグ２３の自プロセッサに対応するフラグ部分、及びストア・フラグ２８をセットする。
【０１２１】
一方、ライト要求を受信したプロセッサ＃０、＃２、＃３では、ライト要求に対する処理が行われる。まず、プロセッサ＃０にとっては、子スレッドからのライト要求なので、更新フラグ２４の更新対象フラグ２４ｂのうち、更新の原因のプロセッサであるプロセッサ＃１に対応するフラグ部分をセットする（図８のステップ２７３）。プロセッサ＃２にとっては、親スレッドからのライト要求で、かつ有効なライト・データなので、“１”の書き込みを行う（図８のステップ２７７）。また、投機的なデータの書き込みを行ったので、投機フラグ２３のうち、書き込みの原因のプロセッサであるプロセッサ＃１に対応するフラグ部分をセットする（図８のステップ２８０）。一方、プロセッサ＃３にとっては、親スレッドからのライト要求で、かつ有効なライト・データなのであるが、自スレッドが先に投機的な書き込みを行っている（ストア・フラグ２８がセットされている）ので、“１”の書き込みは行わない（図８のステップ２７７）。
【０１２２】
次に、６サイクル目において、プロセッサ＃０でロード０が実行される。ロード０はキャッシュメモリ＃０にヒットし、データ“０”が読み出される（図５のステップ２０６）。ロード０からストア１及びストア３には逆依存関係が存在している。すなわち、ロード０は、時間上で先に実行されたがプログラム順序上は後に位置するストア１やストア３のデータではなく、ストア０の値を参照する必要がある。上記したように、本実施形態により、逆依存関係の解消が達成され、正しくストア０の値である“０”が参照された。
【０１２３】
同様に、７サイクル目においては、プロセッサ＃１でロード１が実行される。ロード１はキャッシュメモリ＃１にヒットし、データ“１”が読み出される（図５のステップ２０６）。また、ロード１は投機的な実行であるので、投機ロード・フラグ２７がセットされる。
【０１２４】
同様に、８サイクル目においては、プロセッサ＃２でロード２が実行される。ロード２はキャッシュメモリ＃２にヒットし、プロセッサ＃１が実行したストア１のデータ“１”が正しく読み出される（図５のステップ２０６）。また、ロード２は投機的な実行であるので、投機ロード・フラグ２７がセットされる。このように本実施形態によれば、ストア命令を実行した際、子スレッド側のキャッシュメモリにも同時に書き込みを行うので、子スレッド側ではキャッシュメモリにミスすることなく、そのデータを参照することができる。すなわち、ストア命令を実行した際に、子スレッド側のキャッシュメモリを無効化する従来の方法にくらべて、スレッド間の通信コストが小さいため、スレッド間の通信が多い場合でも性能の低下が小さいという効果がある。
【０１２５】
次に、９サイクル目において、プロセッサ＃３でロード３が実行される。ロード３はキャッシュメモリ＃３にヒットし、データ“３”が正しく読み出される（図５のステップ２０６）。ストア１とストア３には出力依存関係が存在している。すなわち、ストア１は時間上で後に実行されたにもかかわらず、プログラム順序上は先に位置するストア１のデータではなくストア３の値が、後続のロード命令であるロード３等に参照される必要がある。上記したように、本実施形態により、出力依存関係の解消が達成され、正しくストア３の値である“３”が参照された。
【０１２６】
また、７サイクル目でスレッド０の実行が終了したため、キャッシュメモリ＃０においては、更新フラグ２４の何れかの更新対象フラグ２４ｂがセットされているので、更新有効フラグ２４ａがセットされる。これにより、該キャッシュラインは、キャッシュメモリ＃１やキャッシュメモリ＃３が保持するデータにより更新されている為に、無効である可能性があることが示される。一方、スレッド０の実行の完了により、投機的な実行を行っていたスレッド１の実行が確定する。キャッシュメモリ＃１では、投機フラグ２３、投機ロード・フラグ２７、及びストア・フラグ２８がリセットされ、データ“１”が確定する。
【０１２７】
同様に、８サイクル目でスレッド１の実行が終了したため、キャッシュメモリ＃１においては、更新フラグ２４の何れかの更新対象フラグ２４ｂがセットされているので、更新有効フラグ２４ａがセットされる。これにより、該キャッシュラインは、キャッシュメモリ＃３が保持するデータにより更新されている為に、無効である可能性があることが示される。一方、スレッド１の実行の完了により、投機的な実行を行っていたスレッド２の実行が確定する。キャッシュメモリ＃２では、投機フラグ２３、及び投機ロード・フラグ２７がリセットされ、データ“１”が確定する。
【０１２８】
同様に、９サイクル目でスレッド２の実行が終了したため、キャッシュメモリ＃２においては、更新フラグ２４の何れかの更新対象フラグ２４ｂがセットされているので、更新有効フラグ２４ａがセットされる。これにより、該キャッシュラインは、キャッシュメモリ＃３が保持するデータにより更新されている為に、無効である可能性があることが示される。一方、スレッド２の実行の完了により、投機的な実行を行っていたスレッド３の実行が確定する。キャッシュメモリ＃３では、投機フラグ２３、及び投機ロード・フラグ２７がリセットされ、データ“３”が確定する。
【０１２９】
次に、１１サイクル目にスレッド３の実行が終了するが、キャッシュメモリ＃３は子スレッドにより更新されていない為（更新対象フラグ２４ｂがセットされていない）、更新有効フラグ２４ａはセットしなくてもよい。すなわち、キャッシュメモリ＃３のデータ“３”は該アドレスのデータとして確定する。このように、本実施形態によれば、スレッドが終了した際には、更新対象フラグ２４ｂのセット、リセット状態に応じて更新フラグ２４ａをセットするのみであり、ライトバックの集中やキャッシュラインの無効化が発生する従来の方法に比べて、スレッドの終了のコストが著しく小さく、スレッド並列処理の実行性能が高いという効果がある。
【０１３０】
次に、１０サイクル目からプロセッサ＃０において、スレッド４の実行が開始される。まず、１３サイクル目において、ロード４が実行される。この時点において、スレッド４は実行中のスレッドのなかで、プログラム順序で最も先に位置しているスレッドなので、スレッド実行は確定しており、従って、ロード４も確定的に実行される。ロード４はキャッシュメモリ＃０にヒットするが、更新フラグ２４がセットされている為、データを共有している他のプロセッサ、プロセッサ＃１、＃２、＃３にリード要求を発行する（図５のステップ２０３）。他プロセッサからの応答を参照すると、キャッシュメモリ＃１及びキャッシュメモリ＃３により、実際に更新されていることが判明するので、キャッシュメモリ＃０へのリフィルが行われる（図５のステップ２１３）。この場合、キャッシュメモリ＃３より、データ“３”を含むキャッシュラインのデータが提供され、データ“３”が読み出される（図５のステップ２０６）。
【０１３１】
一方、リード要求を受信したプロセッサ＃１、＃２、＃３のうち、プロセッサ＃１、及びプロセッサ＃２では、更新フラグ２４がセットされていて、かつキャッシュメモリ＃３により実際に更新されていることが判明するので、キャッシュラインが無効化される（図７のステップ２５３）。一方、プロセッサ＃３では、キャッシュメモリ＃３が有効なリフィル・データを保持しており、データ“３”を含むリフィル・データをプロセッサ＃０に供給する（図７のステップ２５８）。
【０１３２】
次に、１４サイクル目において、プロセッサ＃１でスレッド５に含まれるロード５が実行される。ここで、スレッド５は投機的なスレッドであるとする。ロード５はキャッシュメモリ＃１にミスするので、他のすべてのプロセッサ、プロセッサ＃０、＃２、＃３に対してリード要求を発行し（図５のステップ２０９）、リフィル・データの到着を待って、キャッシュメモリ＃１へのリフィルを行う。この場合、キャッシュメモリ＃０より、データ“３”を含むキャッシュラインのデータが提供され、データ“３”が読み出される（図５のステップ２０６）。また、ロード５は投機的な実行であるので、投機ロード・フラグ２７がセットされる（図５のステップ２０７）。
【０１３３】
一方、リード要求を受信したプロセッサ＃０、＃２、＃３のうち、プロセッサ＃０は、キャッシュメモリ＃０が有効なリフィル・データを保持しており、データ“３”を含むリフィル・データをプロセッサ＃１に供給する（図７のステップ２５８）。一方、プロセッサ＃２は、リード要求がキャッシュメモリ＃２にミスするので、その旨を応答する（図７のステップ２４７）。また、プロセッサ＃３は、キャッシュメモリ＃３が有効なリフィル・データを保持しているが、プログラム順序で間のスレッドを実行しているプロセッサ＃０のキャッシュメモリ＃０も有効なデータを保持していることが判明するので、リフィル・データの供給は行わない。
【０１３４】
次に、１５サイクル目において、プロセッサ＃０でストア４が実行される。ストア４の書き込み値が“４”であるとすると、まず、データを共有している他のプロセッサ、プロセッサ＃１、＃３に対してライト要求を発行し（図６のステップ２２６）、自身のキャッシュメモリ＃０に“４”を書き込む（図６のステップ２２８）。
【０１３５】
ライト要求を受信したプロセッサ＃１、＃３では、ライト要求に対する処理が行われる。まず、プロセッサ＃１にとっては、親スレッドからのライト要求で、かつ有効なライト・データなので、“４”の書き込みを行う（図８のステップ２７７）。次に、正依存関係の検出処理において（図８のステップ２７８）、キャッシュメモリ＃１のキャッシュラインは、ライト要求に対して、投機ロード・フラグ２８がセットされているので、正依存関係の存在が検出される。すなわち、先にプロセッサ＃１が実行した投機的なロード５は、ライト要求の要因であるプロセッサ＃０が実行したストア４から、正依存関係が存在し、かつそれに違反している為、ロード５の投機実行は失敗したことが判明する。具体的には、ロード５はプログラム順序でストア４の後に位置する為、ストア４の書き込みデータ“４”を読み出すべきが、誤った値であるストア３の書き込みデータ“３”を読み出している。正依存関係の存在が検出された旨は、プロセッサ＃１に通知され、投機実行失敗の回復処理が開始される。
【０１３６】
一方、ライト要求を受信したプロセッサ＃３では、親スレッドからのライト要求で、かつ有効なライト・データなので、“４”の書き込みを行う（図８のステップ２７７）。
【０１３７】
プロセッサ＃１がロード５の投機実行を失敗したことによる回復処理は、まず、その失敗したスレッド、及びそのスレッドのすべての子スレッドの実行を取り消して、スレッドの再実行を行うなどで、スレッドの正常な実行を回復する。具体的には、投機実行の失敗が判明した１５サイクル目で、失敗したスレッド５、及びその子スレッドであるスレッド６とスレッド７の実行が取り消され、１６サイクル目から再びスレッド５が、続いてスレッド６及びスレッド７が再実行される。スレッドの取り消し処理の際には、キャッシュメモリを構成するすべてのキャッシュラインのすべての投機ロード・フラグ２７をリセットと、無効化が必要な投機的なキャッシュラインの無効化を行う。例えば、キャッシュメモリ＃１では、投機ロード・フラグ２８をリセットする。キャッシュラインは確定的なので、無効化は行われない。キャッシュメモリ＃３でも、キャッシュラインは確定的なので、無効化は行われない。スレッド５、及びスレッド６、７の再実行が行われた結果、１９サイクル目でプロセッサ＃１はロード５を再び実行し、正しいデータ“４”の読み出しが行われる。
【０１３８】
以上、本実施形態による動作の具体例を説明した。本実施形態によれば、あるスレッドを実行するプロセッサがストア命令を実行した際には、該プロセッサに固有のキャッシュメモリに、該ストア命令のストア・データを格納するのに加えて、該スレッドの子スレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、同アドレスのデータを保持するすべてのキャッシュラインのストア・フラグ２７を参照して、有効なデータ部分を算出し、有効なデータ部分のみ更新を行うことを特徴とする。このため、子スレッド側ではキャッシュメモリにミスすることなく、親スレッドが生成したデータを参照することができる。すなわち、ストア命令を実行した際に、子スレッド側のキャッシュメモリを無効化する従来の方法に比べて、スレッド間の通信コストが小さいため、スレッド間の通信が多い場合でも性能の低下が小さいという効果がある。
【０１３９】
さらに、親スレッドの書き込み処理によるキャッシュラインの無効化が発生しないことは、複数のデータエントリ２６を一つのキャッシュライン内に備えることを可能にする。すなわち、ストア命令等の最小の書き込み単位であるデータエントリ毎に、アドレスタグや各フラグが必要な従来のキャッシュラインに比べ、本実施形態は、複数のデータエントリに対して、一組のアドレスタグや各フラグを設置すれば充分なので、実装に必要なハードウエア量が小さいという効果がある。
【０１４０】
一方、ストア命令を実行したスレッドに対して、プログラム順序で前に位置する親スレッドを実行するプロセッサに固有のキャッシュメモリに、該ストア命令と同アドレスのキャッシュラインが存在した場合、データの更新は行えず、更新フラグ２４をセットすることで、次に実行されるスレッドではデータは無効である可能性があることを記憶するのみである。そのため、実行されるスレッドにおいて、該アドレスをアクセスした場合、リフィル処理が発生する可能性が大きいため、スレッドの大きさが特に小さく、スレッド間の通信量が特に多い状況では、スレッドの実行性能が低下する場合がある。
【０１４１】
この問題に対して、本発明によるキャッシュメモリにおいては、差分バッファと呼ぶバッファを設置してもよい。差分バッファを具備する本発明の第２の実施形態を図１０に示す。図１０を参照すると、キャッシュ制御部１９は少なくとも、バス要求制御部（符号３０）、キャッシュ要求制御部（符号３１）、バス要求出力バッファ（符号３２）、バス要求入力バッファ（符号３３）、に加えて差分バッファ３４から構成される。
【０１４２】
差分バッファ３４はキャッシュ制御部１９において、キャッシュ要求制御部３１に接続される。差分バッファ３４はアドレス及びそのデータを保持可能なバッファであり、自スレッドに対してプログラム順序で後に位置する子スレッドがストア命令を実行した際に、自身のキャッシュメモリに該ストア命令と同アドレスのキャッシュラインが存在した場合、該キャッシュラインの更新フラグ２４をセットするとともに、差分バッファ３４に該ストア命令のアドレス及びそのストア・データを格納するものである。
【０１４３】
次に、スレッドの実行が終了した際に、差分バッファ３４に格納されているアドレスに対するキャッシュラインがキャッシュメモリ１１に存在する場合、差分バッファ３４に格納されている該アドレスのデータを該キャッシュラインへ書き込み、さらに該キャッシュラインの更新フラグ２４のリセットを行う。この処理により、自プロセッサに次に割り当てられるスレッドの該アドレスへのアクセスは、キャッシュメモリにヒットすることになる。すなわち、差分バッファ３４を設置することにより、スレッドの大きさが特に小さく、スレッド間の通信量が特に多い状況においても、スレッドの実行性能が低下しないという顕著な効果がある。
【０１４４】
以上、本発明の実施形態について説明した。上記説明では、プロセッサ数が４つの場合について説明したが、本発明はプロセッサ数が４つに限るものではなく、２つ以上の任意の数のプロセッサを備えるマルチプロセッサシステムに同様に適用することができる。なお、本発明が対象とするスレッドは、プログラムのコンパイル時等に静的に生成してもよいし、プログラムの実行時に動的に生成してもよく、スレッドの大きさは１命令以上の任意の大きさである。
【０１４５】
【発明の効果】
以上説明したように、本発明によれば、親スレッドが書き換えたデータと同じアドレスのキャッシュラインが子スレッド側のキャッシュメモリに存在すればそれも書き換えるようにしたので、子スレッド側ではキャッシュメモリにミスすることなく、親スレッドが生成したデータを参照することが可能となった。従って、ストア命令を実行した際に、子スレッド側のキャッシュメモリを無効化する文献２の従来の方法にくらべて、スレッド間の通信コストが小さいため、スレッド間の通信が多い場合でも性能の低下が小さく、高速なスレッド並列処理が可能であるという効果がある。
【０１４６】
また、スレッドの終了時には更新フラグをセットする操作を行えば良く、文献１の従来の方法のようにスレッドの終了時にキャッシュメモリにおいて、データの書き戻し処理の集中や、キャッシュラインの無効化が発生しない為、高速なスレッド並列処理が可能であるという効果がある。さらに、キャッシュミスにともなうリフィル処理の回数が少なく、スレッド終了時に書き戻し処理が発生しないので、キャッシュメモリにおいて消費される電力が小さいという効果がある。
【０１４７】
さらに、文献２のように親スレッドの書き込み処理によるキャッシュラインの無効化が発生しないので、ストア命令等の最小の書き込み単位であるデータエントリを複数、一つのキャッシュライン内に備えることができる。すなわち、データエントリ毎に、アドレスタグや各フラグが必要な従来のキャッシュラインに比べ、本発明は、複数のデータエントリに対して、一組のアドレスタグや各フラグを設置すれば充分なので、実装に必要なハードウエア量が小さいという効果がある。
【０１４８】
また、本発明の差分バッファ３４によれば、スレッドの大きさが特に小さく、スレッド間の通信量が特に多いという状況においても、スレッドの実行性能が低下せず、高速なスレッド並列処理が可能であるという効果がある。
【０１４９】
また、本発明によるキャッシュラインにおいて、プロセッサ間でデータが共有されていることを示す共有フラグ２２は、複数ビットから構成され、データを共有しているプロセッサを個別に保持可能であり、バス要求を出力するときには、共有しているプロセッサのみにバス要求を出力するので、共有していないプロセッサでは、キャッシュメモリへのアクセスが発生せず、キャッシュメモリのアクセス競合による性能低下が小さく、またキャッシュメモリにおいて消費される電力が小さいという効果がある。
【０１５０】
また、本発明によるキャッシュラインにおいて、該キャッシュラインのデータは投機的であることを示す投機フラグ２３は、複数ビットから構成され、該キャッシュラインを投機的にならしめた原因のプロセッサを特定することが可能である。このため、投機フラグを１ビットで構成する従来の方法では、厳密には無効化が不必要なキャッシュラインも無効化されてしまうのに対して、本発明によれば、厳密に無効化が必要なキャッシュラインのみが無効化されるため、キャッシュミスが発生する確立が小さく、高速なスレッド並列処理が可能であるという効果がある。
【０１５１】
また、本発明によれば、同じアドレスに対するバス要求を結合して同時に発行し、さらに更新されて無効である可能性のあるキャッシュラインへの処理を、前記バス要求により暗黙的に実行するので、発行されるバス要求を少なくすることができ、バスの競合による性能低下が小さく、バスで消費される電力が小さいという効果がある。
【０１５２】
また、本発明によれば、データのプログラム順序上の前後関係を直接記憶や管理を行うのではなく、更新フラグによる子スレッドにより更新されたか否かの情報で管理する為、制御が単純で高速化が容易であり、必要なハードウエア量も小さいという効果がある。
【図面の簡単な説明】
【図１】本発明によるキャッシュメモリ装置を含むマルチプロセッサシステムの構成を示すブロック図である。
【図２】キャッシュメモリを構成するキャッシュラインの第１の実施形態の詳細を示す説明図である。
【図３】キャッシュメモリを構成するキャッシュラインの第２の実施形態の詳細を示す説明図である。
【図４】キャッシュ制御部の第１の実施形態の詳細を示すブロック図である。
【図５】ロード命令が発行された場合のキャッシュメモリ及びキャッシュ制御部の動作を示すフローチャートである。
【図６】ストア命令が発行された場合のキャッシュメモリ及びキャッシュ制御部の動作を示すフローチャートである。
【図７】リード要求を受信した場合のキャッシュメモリ及びキャッシュ制御部の動作を示すフローチャートである。
【図８】ライト要求を受信した場合のキャッシュメモリ及びキャッシュ制御部の動作を示すフローチャートである。
【図９】４つのプロセッサを備えるマルチプロセッサシステムにおける、スレッド実行とキャッシュラインの状態を示した説明図である。
【図１０】キャッシュ制御部の第２の実施形態の詳細を示すブロック図である。
【図１１】従来のキャッシュメモリ装置を含むマルチプロセッサシステムの構成を示すブロック図である。
【図１２】従来のキャッシュメモリ装置を含むマルチプロセッサシステムの構成を示すブロック図である。
【符号の説明】
１０ プロセッサ
１１ キャッシュメモリ
１２ キャッシュ制御部
１３ 要求バス
１４ 応答バス
１５ データバス
１６  スレッド制御バス
１７ バス制御部
１８ メインメモリ
１９ キャッシュ制御部
２０ 有効フラグ
２１ 変更フラグ
２２ 共有フラグ
２３ 投機フラグ
２４ 更新フラグ
２４ａ 更新有効フラグ
２４ｂ 更新対象フラグ
２５ アドレスタグ
２６、２６ａ、２６ｂ、２６ｃ、２６ｄ データエントリ
２７、２７ａ、２７ｂ、２７ｃ、２７ｄ ストア・フラグ
２８、２８ａ、２８ｂ、２８ｃ、２８ｄ 投機ロード・フラグ
３０ バス要求制御部
３１ キャッシュ要求制御部
３２ バス要求出力バッファ
３３ バス要求入力バッファ
３４ 差分バッファ
１００ スレッド実行部
１０１ キャッシュメモリ
１０２ 整合性維持部
１０３ 共有バス
１０４ メインメモリ
１１０ プロセッサ
１１１ ＳＶＣ
１１２ スヌープ・バス
１１３ バス・アービタ／バージョン制御論理
１１４ メインメモリ
【図１】
0003661614.tif 000002
【図２】
0003661614.tif 000003
【図３】
0003661614.tif 000004
【図４】
0003661614.tif 000005
【図５】
0003661614.tif 000006
【図６】
0003661614.tif 000007
【図７】
0003661614.tif 000008
【図８】
0003661614.tif 000009
【図９】
0003661614.tif 000010
【図１０】
0003661614.tif 000011
【図１１】
0003661614.tif 000012
【図１２】
0003661614.tif 000013