(57)【特許請求の範囲】
【請求項１】
複数のコアと、
前記複数のコアのそれぞれがアクセスする複数のキャッシュメモリを有するマルチコアプロセッサシステムであって、前記複数のコアのいずれか一つは、
前記複数のコアのうち第１のコアによって実行された第１のスレッドを検出した場合に、前記複数のコアのうち前記第１のコア以外の第２のコアにより実行中の第２のスレッドを検出し、前記複数のコアのいずれかの記憶領域に記憶された、データを共有しないスレッドの依存情報に基づいて前記第１のスレッドおよび前記第２のスレッドの実行時に共通してアクセスする共有データが無いと判定した場合には、前記複数のキャッシュメモリのうち前記第１のコアに対応する第１のキャッシュメモリと前記第２のコアに対応する第２のキャッシュメモリとのコヒーレンシ処理を停止させる、
ことを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記複数のコアのいずれか一つは、
前記第１のスレッドの起動に応じて、前記第１のスレッドと共通してアクセスする共有データが無いスレッドを特定する情報を前記第１のスレッドの前記依存情報に追加することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
複数のコアのそれぞれがアクセスする複数のキャッシュメモリを有するマルチコアプロセッサシステムのキャッシュコヒーレンシ制御方法であって、前記複数のコアのいずれか一つは、
前記複数のコアのうち第１のコアによって実行された第１のスレッドを検出した場合に、前記複数のコアのうち前記第１のコア以外の第２のコアにより実行中の第２のスレッドを検出し、前記複数のコアのいずれかの記憶領域に記憶された、データを共有しないスレッドの依存情報に基づいて前記第１のスレッドおよび前記第２のスレッドの実行時に共通してアクセスする共有データが無いと判定した場合には、前記複数のキャッシュメモリのうち前記第１のコアに対応する第１のキャッシュメモリと前記第２のコアに対応する第２のキャッシュメモリとのコヒーレンシ処理を停止させる、
処理を実行することを特徴とするキャッシュコヒーレンシ制御方法。
【請求項４】
前記複数のコアのいずれか一つは、
前記第１のスレッドの起動に応じて、前記第１のスレッドと共通してアクセスする共有データが無いスレッドを特定する情報を前記第１のスレッドの前記依存情報に追加することを特徴とする請求項３に記載のキャッシュコヒーレンシ制御方法。
【請求項５】
複数のコアのそれぞれがアクセスする複数のキャッシュメモリを有するマルチコアプロセッサシステムのキャッシュコヒーレンシ制御プログラムであって、前記複数のコアのいずれか一つに、
前記複数のコアのうち第１のコアによって実行された第１のスレッドを検出した場合に、前記複数のコアのうち前記第１のコア以外の第２のコアにより実行中の第２のスレッドを検出し、前記複数のコアのいずれかの記憶領域に記憶された、データを共有しないスレッドの依存情報に基づいて前記第１のスレッドおよび前記第２のスレッドの実行時に共通してアクセスする共有データが無いと判定した場合には、前記複数のキャッシュメモリのうち前記第１のコアに対応する第１のキャッシュメモリと前記第２のコアに対応する第２のキャッシュメモリとのコヒーレンシ処理を停止させる、
処理を実行させることを特徴とするキャッシュコヒーレンシ制御プログラム。
【請求項６】
前記複数のコアのいずれか一つに、
前記第１のスレッドの起動に応じて、前記第１のスレッドと共通してアクセスする共有データが無いスレッドを特定する情報を前記第１のスレッドの前記依存情報に追加することを特徴とする請求項５に記載のキャッシュコヒーレンシ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、キャッシュコヒーレンシ機構を制御するマルチコアプロセッサシステム、キャッシュコヒーレンシ制御方法、およびキャッシュコヒーレンシ制御プログラムに関する。
【背景技術】
【０００２】
近年、マルチコアプロセッサシステムでは、コアごとに独立したキャッシュメモリを搭載しており、キャッシュコヒーレンシ機構によりキャッシュメモリの一貫性を維持する、といった形態がとられている。キャッシュコヒーレンシ機構を利用したマルチコアプロセッサシステムでは、キャッシュメモリに格納された共有データの一貫性の維持をハードウェアで行うために、マルチコアプロセッサ向けの並列ソフトウェアを容易に作成することができる。
【０００３】
キャッシュコヒーレンシ機構は、キャッシュメモリの動作を監視するために、キャッシュメモリアクセス時の遅延が発生する。遅延を防止する技術として、ＳＭＰ（Ｓｙｍｍｅｔｒｉｃ  Ｍｕｌｔｉ  Ｐｒｏｃｅｓｓｉｎｇ）かＡＳＭＰ（ＡＳｙｍｍｅｔｒｉｃ  Ｍｕｌｔｉ  Ｐｒｏｃｅｓｓｉｎｇ）に基づいて、キャッシュコヒーレンシ機構を制御する技術が開示されている（たとえば、下記特許文献１を参照。）。特許文献１では、複数のコアが複数のプロセスを実行する場合をＳＭＰとし、複数のコアが単一のプロセスを実行する場合をＡＳＭＰとしている。プロセスとはプログラムの実行単位であり、一つのプロセスには、一つ以上のスレッドが属している。同じプロセスに属するスレッドは、同じメモリ空間にアクセスする。
【０００４】
また、別の技術として、複数のコアが、同一のプロセスに属するスレッドを実行する場合にコヒーレンシを実行し、異なるプロセスに属するスレッドを実行する場合にはコヒーレンシを実行しないという技術が開示されている（たとえば、下記特許文献２を参照。）。
【０００５】
また、スレッド間の依存関係を解析する技術として、各スレッドを１ステートメントごとに実行することにより、共有データへのアクセスを表す情報を作成し、スレッドのステートメントごとの依存関係を解析する技術が開示されている（たとえば、下記特許文献３を参照。）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１０−９７４６５号公報
【特許文献２】特開２００４−１３３７５３号公報
【特許文献３】特開２０００−２０７２４８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上述した従来技術において、特許文献１、２にかかる技術では、プロセスの単位にてコヒーレンシを実行するか否かを判断している。また、組み込み機器など、多くの機能を同時に使用しない場合は、単一のプロセスにて実行されることが多い。したがって、組み込み機器に特許文献１、２にかかる技術を適用しても、コヒーレンシを常に実行することになり、キャッシュコヒーレンシ機構の動作が増加し、キャッシュメモリへの遅延発生や、消費電力の増大を招くという問題があった。
【０００８】
また、特許文献３にかかる技術を用いると、ステートメントごとに共有データのアクセス情報を解析するため、ステートメントごとにキャッシュコヒーレンシ機構を制御することになり、制御の回数が非常に増大してしまうという問題があった。
【０００９】
本発明は、上述した従来技術による問題点を解消するため、キャッシュコヒーレンシ機構の動作を削減できるマルチコアプロセッサシステム、キャッシュコヒーレンシ制御方法、およびキャッシュコヒーレンシ制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、開示のマルチコアプロセッサシステムは、複数のコアのそれぞれがアクセスする複数のキャッシュメモリを有するマルチコアプロセッサシステムであって、複数のコアのいずれか一つは、複数のコアのうち第１のコアによって実行された第１のスレッドを検出した場合に、複数のコアのうち第１のコア以外の第２のコアにより実行中の第２のスレッドを検出し、第１のスレッドおよび第２のスレッドの実行時に共通してアクセスする共有データが無い場合には、複数のキャッシュメモリのうち第１のコアに対応する第１のキャッシュメモリと第２のコアに対応する第２のキャッシュメモリとのコヒーレンシ処理を停止させる。
【発明の効果】
【００１１】
本マルチコアプロセッサシステム、キャッシュコヒーレンシ制御方法、およびキャッシュコヒーレンシ制御プログラムによれば、キャッシュコヒーレンシ機構内の動作を削減し、消費電力の削減や、遅延の防止を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】実施の形態にかかるマルチコアプロセッサシステム１００のハードウェアを示すブロック図である。
【図２】マルチコアプロセッサシステム１００のハードウェアの一部とソフトウェアを示すブロック図である。
【図３】スヌープ対応キャッシュ＃０の内部を示すブロック図である。
【図４】スヌープ対応したバス１１０の詳細を示す説明図である。
【図５】マルチコアプロセッサシステム１００の機能を示すブロック図である。
【図６】キャッシュコヒーレンシの実行状態と停止状態を示す説明図である。
【図７】マルチコアプロセッサシステム１００の動作概要である。
【図８】依存情報５０１の登録方法を示す説明図である。
【図９】拡張されたスレッドデータ構造９０１のメンバー一覧と記憶内容の一例を示す説明図である。
【図１０】スヌープ制御部＃０によるラインフェッチ処理を示すフローチャートである。
【図１１】スヌープ制御部＃０によるラインへの書き込み処理を示すフローチャートである。
【図１２】コヒーレンシ制御処理を示すフローチャートである。
【図１３】コヒーレンシ対象ＣＰＵ決定処理を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、本発明にかかるマルチコアプロセッサシステム、キャッシュコヒーレンシ制御方法、およびキャッシュコヒーレンシ制御プログラムの好適な実施の形態を詳細に説明する。
【００１４】
（マルチコアプロセッサシステム１００のハードウェア）
図１は、実施の形態にかかるマルチコアプロセッサシステム１００のハードウェアを示すブロック図である。図１において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ１０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０３と、を備えている。また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ１０４と、フラッシュＲＯＭコントローラ１０５と、フラッシュＲＯＭ１０６と、を備えている。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ１０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１０８と、キーボード１０９と、を備えている。また、各部はバス１１０によってそれぞれ接続されている。
【００１５】
ここで、ＣＰＵｓ１０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ１０１は、シングルコアのプロセッサを並列して接続したすべてのＣＰＵを指している。ＣＰＵｓ１０１の詳細は、図２にて後述する。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００１６】
ＲＯＭ１０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ１０３は、ＣＰＵｓ１０１のワークエリアとして使用される。フラッシュＲＯＭ１０４は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ１０８によって新しいＯＳを受信し、フラッシュＲＯＭ１０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００１７】
フラッシュＲＯＭコントローラ１０５は、ＣＰＵｓ１０１の制御に従ってフラッシュＲＯＭ１０６に対するデータのリード／ライトを制御する。フラッシュＲＯＭ１０６は、フラッシュＲＯＭコントローラ１０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ１０８を通して取得した画像データ、映像データなどである。フラッシュＲＯＭ１０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００１８】
ディスプレイ１０７は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ１０７は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００１９】
Ｉ／Ｆ１０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク１１１に接続され、ネットワーク１１１を介して他の装置に接続される。そして、Ｉ／Ｆ１０８は、ネットワーク１１１と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ１０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。キーボード１０９は、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、キーボード１０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００２０】
図２は、マルチコアプロセッサシステム１００のハードウェアの一部とソフトウェアを示すブロック図である。図２で示されるハードウェアは、キャッシュコヒーレンシ機構２０１と、共有メモリ２０２と、ＣＰＵｓ１０１に含まれるＣＰＵ＃０〜ＣＰＵ＃３とである。共有メモリ２０２と、ＣＰＵ＃０〜ＣＰＵ＃３はキャッシュコヒーレンシ機構２０１によって接続されている。また、ＣＰＵ＃０〜ＣＰＵ＃３は、共有メモリ２０２のデータに高速にアクセス可能とするため、共有メモリ２０２のデータをコピーしたキャッシュメモリを保持する。本実施の形態におけるＣＰＵ＃０〜ＣＰＵ＃３のキャッシュメモリは、キャッシュコヒーレンシ機構２０１の内部に存在する。
【００２１】
キャッシュコヒーレンシ機構２０１は、ＣＰＵ＃０〜ＣＰＵ＃３がアクセスするキャッシュメモリの整合性をとる装置である。キャッシュコヒーレンシ機構の方式としては、大別してスヌープ方式とディレクトリ方式とがある。
【００２２】
スヌープ方式とは、キャッシュメモリが自身のキャッシュメモリや他ＣＰＵのキャッシュメモリの更新状態を管理し、他のキャッシュメモリと更新状態の情報を交換する方式である。更新状態の情報を交換することで、スヌープ方式をとるキャッシュコヒーレンシ機構は、どのキャッシュメモリに最新のデータが存在するかを判断する。また、各キャッシュメモリが最新のデータを取得できるように、スヌープ方式をとるキャッシュコヒーレンシ機構は、自身のキャッシュメモリの状態を変更したりキャッシュメモリの無効化を行う。
【００２３】
ディレクトリ方式とは、キャッシュメモリの一貫性をディレクトリと呼ぶ専用領域にて一元管理する方式である。ディレクトリ方式をとるキャッシュコヒーレンシ機構では、キャッシュメモリからディレクトリへデータを送り、すべてのキャッシュメモリがデータを共有する。
【００２４】
いずれの方式においても、キャッシュコヒーレンシ機構２０１は、各ＣＰＵのキャッシュメモリが主記憶となる共有メモリ２０２と一致するかを判断する。不一致が発生した場合、キャッシュコヒーレンシ機構２０１は、一致をとるためキャッシュメモリのコピー、更新、無効化などを行うことで、不一致を解消する。本実施の形態におけるキャッシュコヒーレンシ機構２０１は、スヌープ方式にて説明を行うが、ディレクトリ方式であっても本実施の形態を適用することができる。
【００２５】
また、キャッシュコヒーレンシ機構２０１の内部としては、スヌープ対応キャッシュ＃０〜スヌープ対応キャッシュ＃３とスヌープ対応したバス１１０が存在する。ＣＰＵ＃０〜ＣＰＵ＃３は、対応するスヌープ対応キャッシュ＃０〜スヌープ対応キャッシュ＃３にそれぞれアクセスする。たとえば、ＣＰＵ＃０は、スヌープ対応キャッシュ＃０にアクセスする。スヌープ対応キャッシュの詳細については、図３にて後述する。
【００２６】
スヌープ対応したバス１１０は、従来のバスの機能に加えて、スヌープに対応するために機能追加されたバスである。スヌープ対応したバス１１０の詳細は、図４にて後述する。また、スヌープ対応キャッシュ＃０は、マスタＩ／Ｆ＃０とスレーブＩ／Ｆ＃０とで、スヌープ対応したバス１１０と接続される。同様にスヌープ対応キャッシュ＃１〜スヌープ対応キャッシュ＃３も、それぞれのマスタＩ／ＦとスレーブＩ／Ｆとで、スヌープ対応したバス１１０と接続される。
【００２７】
共有メモリ２０２は、ＣＰＵ＃０〜ＣＰＵ＃３からアクセス可能な記憶領域である。記憶領域とは、具体的には、たとえば、ＲＯＭ１０２、ＲＡＭ１０３、フラッシュＲＯＭ１０４である。
【００２８】
図２で示されるソフトウェアは、ＯＳ２０３と、スレッド＃０〜スレッド＃３と、である。ＯＳ２０３は、マルチコアプロセッサシステム１００を制御するプログラムである。具体的にＯＳ２０３は、ＣＰＵ＃０〜ＣＰＵ＃３が実行するソフトウェアのスケジューリング処理を行う。スレッド＃０〜スレッド＃３は、ＯＳ２０３によってＣＰＵ＃０〜ＣＰＵ＃３に割り当てられたスレッドである。スレッド＃０〜スレッド＃３は、同一のプロセスに属する場合も、異なるプロセスに属する場合も存在する。
【００２９】
図３は、スヌープ対応キャッシュ＃０の内部を示すブロック図である。図３では、スヌープ対応キャッシュ＃０〜スヌープ対応キャッシュ＃３のうち、スヌープ対応キャッシュ＃０を用いて内部を説明する。
【００３０】
スヌープ対応キャッシュ＃０は、キャッシュライン記憶部＃０とキャッシュライン制御部＃０とを内部に含む。キャッシュライン記憶部＃０は、データフィールドと、アドレスフィールドと、ステートフィールドを含む。データフィールドは、数十バイト程度のラインと呼ばれる連続したデータの単位で、データを記憶している。アドレスフィールドは、データフィールドが記憶するラインが共有メモリ２０２上で対応するアドレスを格納する。ステートフィールドは、データフィールドの状態を格納する。また、アドレスフィールドとステートフィールドとをあわせてタグ領域とする。
【００３１】
また、ステートフィールドのとりうる状態は、スヌープ方式を実現するプロトコルによって異なるが、代表的な状態としては、Ｍ状態、Ｅ状態、Ｓ状態、Ｉ状態、という４つの状態である。
【００３２】
Ｍ状態は、対応するラインが該当のキャッシュメモリだけに存在し、主記憶から変更されている状態を示す。Ｅ状態は、対応するラインが該当のキャッシュメモリだけに存在し、主記憶から変更されていない状態を示す。Ｓ状態は、対応するラインが複数のキャッシュメモリに存在し、主記憶から変更されていない状態を示す。Ｉ状態は、対応するラインが無効である状態を示す。さらに、前述の４つの状態と異なるＯ状態として、対応するラインが複数のキャッシュメモリに存在し、該当のラインが更新されており、主記憶へ書き戻す責任を持った状態を使用するプロトコルも存在する。
【００３３】
スヌープ方式を実現するプロトコルには、大別して、無効型プロトコルと更新型プロトコルが存在する。無効型プロトコルは、複数のキャッシュメモリから参照があるアドレスに対し、あるキャッシュメモリが更新を行う場合、そのアドレスはダーティであるとして参照中の全キャッシュの該当のラインを無効化するプロトコルである。更新型プロトコルは、複数のキャッシュメモリが参照しているアドレスに対してデータ更新を行うときは、主記憶と他のキャッシュメモリに対して更新データを通知するプロトコルである。
【００３４】
無効型プロトコルの例としては、Ｍ状態、Ｅ状態、Ｓ状態、Ｉ状態という４つの状態をとるＭＥＳＩ（Ｉｌｌｉｎｏｉｓ）プロトコル、または、Ｍ状態、Ｏ状態、Ｓ状態、Ｉ状態という４つ状態をとるＭＯＳＩ（Ｂｅｒｋｅｌｅｙ）プロトコルなどが存在する。更新型プロトコルの例としては、Ｍ状態、Ｅ状態、Ｉ状態という３つの状態をとるＭＥＩ（Ｆｉｒｅｆｌｙ）プロトコル、または、Ｍ状態、Ｏ状態、Ｅ状態、Ｓ状態という４つの状態をとるＭＯＥＳ（ＤＲＡＧＯＮ）プロトコルなどが存在する。
【００３５】
本実施の形態では、無効型プロトコルの一つであるＭＥＳＩプロトコルを例にして説明を行うが、他の無効型プロトコルや、また、更新型プロトコルであっても本実施の形態を適用することができる。
【００３６】
キャッシュライン制御部＃０は、キャッシュメモリの機能を実現するために要求される、データ格納構造決定処理、ライン入れ替え処理、データ更新処理、等といった様々な機能を有する。また、キャッシュライン制御部＃０は、対応するＣＰＵ＃０とはＣＰＵＩ／Ｆで接続され、バス１１０とは、マスタＩ／Ｆ＃０とスレーブＩ／Ｆ＃０とで接続されている。
【００３７】
また、キャッシュライン制御部＃０は、スヌープに対応するためスヌープ制御部＃０を含む。スヌープ制御部＃０は、スヌープ方式を実現するプロトコルに従って、キャッシュライン記憶部＃０を制御する機能を有する。本実施の形態におけるスヌープ制御部＃０は、ＭＥＳＩプロトコルに従ってキャッシュライン記憶部＃０を制御する。スヌープ制御部＃０は、新たにキャッシュラインをフェッチする処理と、キャッシュラインへの書き込み処理を行う。前述の２つの処理については、図１０、図１１にて後述する。
【００３８】
スヌープ対応キャッシュは、ＣＰＵ＃０〜ＣＰＵ＃３各々の分存在するため、スヌープ対応キャッシュの内部構造となるキャッシュライン記憶部、キャッシュライン制御部もそれぞれのＣＰＵ分存在する。たとえば、キャッシュライン記憶部＃１は、スヌープ対応キャッシュ＃１のキャッシュライン記憶部を示している。キャッシュライン記憶部＃２、キャッシュライン記憶部＃３も、それぞれスヌープ対応キャッシュ＃２、スヌープ対応キャッシュ＃３に対応する。キャッシュライン制御部、スヌープ制御部も同様である。
【００３９】
図４は、スヌープ対応したバス１１０の詳細を示す説明図である。図４中の線は物理的な一本の信号線であり、黒丸は信号線同士の接続を表す。バス１１０は、マスタＩ／Ｆ＃０〜マスタＩ／Ｆ＃３とスレーブＩ／Ｆ＃０〜スレーブＩ／Ｆ＃３から信号を受ける。マスタＩ／Ｆは、アドレス情報と、リードかライトかといったコマンド情報を送出する。コントローラ４０１は、アドレス情報とあらかじめコントローラ４０１に登録されたマッピング情報に基づいて、対応するスレーブＩ／Ｆにセレクト信号を出力する。セレクト信号を受け取ったスレーブＩ／Ｆはアドレス情報とコマンド情報を受け取り、コマンド情報に応じてデータのやりとりを行う。
【００４０】
図４の例にて、マスタＩ／Ｆ＃０によって送出された信号は、コントローラ４０１が受信する。コントローラ４０１は、たとえば、スレーブＩ／Ｆ＃１〜スレーブＩ／Ｆ＃３に対してセレクト信号を出力する。セレクト信号を受け取ったスレーブＩＦ＃１〜スレーブＩ／Ｆ＃３は、アドレス情報とコマンド情報を受け取り、コマンド情報に応じてデータのやりとりを行う。
【００４１】
さらにスヌープに対応したバス１１０は、ブロードキャスト、ブロック、インバリデートといった３つの機能が追加される。ブロードキャストとは、マスタＩ／Ｆから、コマンド情報とデータ情報の組み合わせの要求を、あらかじめブロードキャスト先として設定されたすべてのスレーブＩ／Ｆに送出する機能である。ブロックとは、現在のバス接続を強制的に解除する機能である。インバリデートとは、キャッシュメモリに対してアドレスに対応するラインを無効化させる機能である。これらの機能を使用することで、バス１１０は、キャッシュコヒーレンシ機構として要求される機能を満たす。
【００４２】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図５は、マルチコアプロセッサシステム１００の機能を示すブロック図である。マルチコアプロセッサシステム１００は、実行部５０３と、検出部５０４と、特定部５０５と、判断部５０６と、制御部５０７と、を含む。この制御部となる機能（検出部５０４〜制御部５０７）は、記憶装置に記憶されたプログラムをたとえばＣＰＵ＃０が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図１に示したＲＯＭ１０２、ＲＡＭ１０３、フラッシュＲＯＭ１０４などである。また、実行部５０３はキャッシュコヒーレンシ機構２０１が実行することにより、その機能を実現する。
【００４３】
また、マルチコアプロセッサシステム１００は、任意のスレッドに対して、同じ共有データにアクセスしないスレッドの一覧と、任意のスレッドがアクセスしないプロセス間通信の領域と、を格納した依存情報５０１にアクセス可能である。依存情報５０１の詳細は、図９にて後述する。
【００４４】
また、検出部５０４〜制御部５０７は、スケジューラ５０２に内部の機能として存在してもよいし、または、スケジューラ５０２の外部にあり、スケジューラ５０２の処理結果を通知可能な状態で存在してもよい。スケジューラ５０２は、ＯＳ２０３に含まれるソフトウェアであり、ＣＰＵに割り当てるプロセスを決定する機能を有する。また、図５では、検出部５０４〜制御部５０７は、ＣＰＵ＃０の内部に存在しているが、ＣＰＵ＃１〜ＣＰＵ＃３のいずれかに存在していてもよいし、ＣＰＵ＃０〜ＣＰＵ＃３のすべてに存在してもよい。
【００４５】
たとえば、スケジューラ５０２は、スレッドに設定されている優先度等に基づいて、次にＣＰＵに割り当てるスレッドを決定する。定められた時刻になった場合、スケジューラ５０２はディスパッチャが決定されたスレッドをＣＰＵに割り当てる。スケジューラの機能の１つとしてディスパッチャを含む形態も存在する。本実施の形態では、スケジューラ５０２内にディスパッチャの機能が存在する。
【００４６】
実行部５０３は、複数のコアの各々によってアクセスされるキャッシュメモリに格納された共有データの値のコヒーレンシを実行する機能を有する。たとえば、実行部５０３となるキャッシュコヒーレンシ機構２０１は、ＣＰＵ＃０がアクセスするスヌープ対応キャッシュ＃０と、ＣＰＵ＃１がアクセスするスヌープ対応キャッシュ＃１の共有データの値のコヒーレンシを実行する。
【００４７】
検出部５０４は、複数のコアのうち第１のコアによって実行された第１のスレッドを検出する機能を有する。たとえば、検出部５０４は、第１のコアとなるＣＰＵ＃０によって実行されたスレッドＡ−１を検出する。具体的にスレッドＡ−１が検出されるタイミングとしては、スケジューラ５０２によってスレッドの再スケジューリング要求が行われる時である。なお、検出されたスレッドの情報は、ＣＰＵ＃０のレジスタ、ローカルメモリなどに格納される。
【００４８】
特定部５０５は、検出部５０４によって第１のスレッドが検出された場合、複数のコアから第１のコア以外の第２のコアによって実行中の第２のスレッドを特定する機能を有する。たとえば、特定部５０５は、スレッドＡ−１が検出された場合、ＣＰＵ＃０〜ＣＰＵ＃３からＣＰＵ＃０以外、たとえばＣＰＵ＃１によって実行中のスレッドＡ−２を特定する。なお、特定されたスレッドの情報は、ＣＰＵ＃０のレジスタ、ローカルメモリなどに格納される。
【００４９】
判断部５０６は、第１のスレッドおよび特定部５０５によって特定された第２のスレッドによって共通してアクセスされる共有データが存在するか否かを判断する機能を有する。また、判断部５０６は、さらに、第１および第２のスレッドが同一のプロセスに属するか否かを判断してもよい。また、判断部５０６は、第１および第２のスレッドが異なるプロセスに属し、かつ、第１および第２のスレッドによって共通して使用されるプロセス間通信の領域が存在するか否かを判断してもよい。プロセス間通信の領域の詳細については、図８にて後述する。
【００５０】
また、判断部５０６は、第１および第２のスレッドが属するプロセス同士が使用されるプロセス間通信の領域が存在するか否かを判断してもよい。また、判断部５０６は、共通して使用されるプロセス間通信の領域が存在するか否かを判断する場合、初めに、第１および第２のスレッドの少なくとも一方がプロセス間通信の領域を使用していない状態を判断してもよい。第１および第２のスレッドが共にプロセス間通信の領域を使用している場合に、判断部５０６は、第１および第２のスレッドによって共通して使用されるプロセス間通信の領域が存在するか否かを判断してもよい。
【００５１】
たとえば、判断部５０６は、依存情報５０１にアクセスし、第１のスレッドの同じ共有データにアクセスしないスレッドの一覧に、第２のスレッドが含まれるか否かで、スレッドによって共通してアクセスされる共有データが存在するか否かを判断する。また、判断部５０６は、依存情報５０１にアクセスし、第１および第２のスレッドがアクセスしないプロセス間領域から、共通して使用されるプロセス間通信の領域が存在するか否かを判断してもよい。なお、判断結果は、ＣＰＵ＃０のレジスタ、ローカルメモリなどに格納される。
【００５２】
制御部５０７は、判断部５０６によって共通してアクセスされる共有データが存在しないと判断された場合、実行部５０３により第１および第２のコアそれぞれに対応する第１および第２のキャッシュメモリとのコヒーレンシの実行を停止させる機能を有する。また、制御部５０７は、第１および第２のスレッドが同一のプロセスであると判断され、かつ、共通してアクセスされる共有データが存在しないと判断された場合、第１および第２のキャッシュメモリとのコヒーレンシの実行を停止させてもよい。また、制御部５０７は、第１および第２のスレッドが異なるプロセスに属し、かつ、共通して使用されるプロセス間通信の領域が存在しないと判断された場合、第１および第２のキャッシュメモリとのコヒーレンシの実行を停止させてもよい。
【００５３】
また、制御部５０７は、第１および第２のキャッシュメモリとのコヒーレンシの実行を停止させた場合、第１のキャッシュメモリに格納された共有データを第１のキャッシュメモリから消去させてもよい。
【００５４】
たとえば、判断部５０６がスレッドＡ−１とスレッドＡ−２に共通してアクセスされる共有データが存在しないと判断した場合を想定する。この時、制御部５０７は、キャッシュコヒーレンシ機構２０１によりスヌープ対応キャッシュ＃０とスヌープ対応キャッシュ＃１のコヒーレンシの実行を停止させる。また、制御部５０７は、スヌープ対応キャッシュ＃０に格納された共有データをフラッシュすることで、共有データをスヌープ対応キャッシュ＃０から消去させる。具体的なフラッシュ操作は、図１２にて後述する。
【００５５】
図６は、キャッシュコヒーレンシの実行状態と停止状態を示す説明図である。符号６０１で示すブロック図は、マルチコアプロセッサシステム１００で動作するプロセスＡが保有するスレッドと、各スレッドがアクセスするメモリについて示している。プロセスＡは、スレッドＡ−１、スレッドＡ−２、スレッドＡ−３を保有する。また、スレッドＡ−１は、共有メモリ２０２のプロセスＡ用データ領域のうち、データＡにアクセスする。スレッドＡ−２は、データＢにアクセスする。スレッドＡ−３は、データＡとデータＢにアクセスする。
【００５６】
符号６０１で示す前提のもと、符号６０２で示すマルチコアプロセッサシステム１００では、ＣＰＵ＃０にスレッドＡ−１が割り当てられ、ＣＰＵ＃１にスレッドＡ−３が割り当てられる。符号６０２の状態では、キャッシュコヒーレンシ機構２０１は、キャッシュコヒーレンシを実行することで、ＣＰＵ＃０とＣＰＵ＃１はデータＡを整合性のとれた状態で共有することができる。
【００５７】
次に、符号６０３で示すマルチコアプロセッサシステム１００では、符号６０２の状態から、ＣＰＵ＃１に割り当てられたスレッドが、スレッドＡ−３からスレッドＡ−２に切り替わった状態を示している。符号６０３の状態では、ＣＰＵ＃０とＣＰＵ＃１には共有してアクセスするデータが存在しないため、キャッシュコヒーレンシ機構２０１は、キャッシュコヒーレンシの実行を停止してもよい。キャッシュコヒーレンシを無効にするには、たとえば、図４にて前述したスヌープに対応したバス１１０にて、ブロードキャスト送信を行う際に、ブロードキャスト先から除外することで、キャッシュコヒーレンシの実行停止を実現する。
【００５８】
具体的に無効にする方法としては、バス１１０にて、スヌープ対応キャッシュ＃０とスヌープ対応キャッシュ＃１のブロードキャストを停止するといった方法がある。たとえば、キャッシュコヒーレンシ機構２０１は、スヌープ対応キャッシュ＃０のマスタＩ／Ｆ＃０から無効化通知等をブロードキャスト送信する際に、スレーブＩ／Ｆ＃１には送信せず、スレーブＩ／Ｆ＃２とスレーブＩ／Ｆ＃３に送信する。このように、キャッシュコヒーレンシ機構２０１において、特定のＣＰＵ間のキャッシュコヒーレンシの実行を停止すると、送信先が減少するために、バス１１０のトラフィック量や処理量が減少し、消費電力を削減し、また遅延を防止することができる。
【００５９】
図７は、マルチコアプロセッサシステム１００の動作概要である。図７では、図６で提示したようなスレッドがアクセスする共有データに基づいてキャッシュコヒーレンシ機構２０１の実行と停止を切り替えることを実現するための処理群として、処理７０１〜処理７１０を示している。処理７０１と処理７０２は、マルチコアプロセッサシステム１００の設計時に実行され、処理７０３〜処理７１０は、マルチコアプロセッサシステム１００の動作中に実行される。
【００６０】
処理７０１では、スレッド間の依存関係を、ＥＳＬ（Ｅｌｅｃｔｒｏｎｉｃ  Ｓｙｓｔｅｍ  Ｌｅｖｅｌ）シミュレータなどによって、対象プロセスに属するスレッド間の依存関係を解析する。具体的な解析の例は、図８にて後述する。解析後、処理７０２ではコンパイラによって、対象プロセスの元となるプログラムが書き換えられる。具体的には、コンパイラは、特定のスレッドの先頭等に、特定のスレッドと依存関係があるスレッドの情報をプログラム内に追加する。
【００６１】
処理７０３にて、対象プロセスを実行するＣＰＵは、新規にスレッドを生成する。生成後、処理７０４にて、前述のＣＰＵは、コンパイラによって追加された依存関係の情報を、ＯＳ２０３内の依存情報５０１に追加する。依存情報５０１の詳細は、図９にて後述する。追加後、対象プロセスは、ＯＳ２０３に対してスレッドの割り当て要求を行い、処理７０５にて、ＯＳ２０３内のスケジューラ５０２によって割り当てが決定されたＣＰＵによって、生成されたスレッドを実行する。
【００６２】
ＯＳ２０３のスケジューラ５０２は、処理７０６にて、対象のＣＰＵに割り当てるスレッドを決定する。決定対象となるスレッドは、処理７０３にて生成されたスレッドや実行可能状態となっているスレッドから決定される。スレッドを決定後、スケジューラ５０２は、処理７０７にて、他のＣＰＵで実行中のスレッドを取得する。
【００６３】
実行中のスレッドを取得後、スケジューラ５０２は、処理７０８にて、登録された依存情報５０１から、コヒーレンシの実行、または停止を決定する。決定後、スケジューラ５０２は、処理７０９にて、決定内容に従ってキャッシュコヒーレンシ機構２０１を制御する。制御後、スケジューラ５０２は、処理７１０にて、対象のＣＰＵに決定されたスレッドを割り当てる。処理７０６〜処理７１０の詳細については、図１２、図１３にて後述する。
【００６４】
図８は、依存情報５０１の登録方法を示す説明図である。図８では、符号６０１で示したプロセスＡについて、依存情報５０１の登録方法を示している。マルチコアプロセッサシステム１００の設計時に、ＥＳＬシミュレータは、スレッド並列処理を行うプロセスＡ内のスレッドに対して、それぞれのスレッドが利用するデータ領域を調査する。
【００６５】
調査方法には、ソースコードを解析することで使用するデータ領域を得る静的手法や、実際にスレッドを実行してメモリアクセスの記録からスレッドが使用するデータ領域を得る動的手法などが存在する。スレッドのデータ領域の完全な解析が困難である場合には、調査によって明らかにデータ領域を共有していないことが判明したスレッドの組み合わせを記録してもよい。
【００６６】
データ領域の共有の調査に加えて、調査対象のスレッドが、ＯＳ２０３が提供するプロセス間通信の領域のうち、明らかに利用しない領域があれば、その領域も記録する。プロセス間通信の領域とは、複数のプロセス間で通信を行うための領域であり、ＯＳ２０３がＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）等で提供する。一般的に、プロセス間でメモリ空間は独立しており、互いのメモリ空間を直接アクセスすることはできない。したがって、プロセス間で情報を送受信する場合、プロセスは、プロセス間通信の領域を利用して情報を送受信する。たとえば、ＯＳ２０３はメモリ空間の塊となるチャンクを確保し、確保したチャンクをプロセス間通信の領域として、プロセスに提供する。
【００６７】
符号８０１は、プロセスＡの元となるプログラムである。ＥＳＬシミュレータは、調査の結果となる、データを共有しないスレッドの情報や利用しないプロセス間通信領域の情報を、プロセスＡの実行中にスレッドを起動する際に依存情報５０１に情報を登録するようにプログラムを変更する。コンパイラは、変更されたプログラムをコンパイルし、実行コードを生成する。具体的に図８では、スレッドＡ−１と、スレッドＡ−２には、共通してアクセスされる共有データが存在しないため、ＥＳＬシミュレータは、プロセスＡのプログラムに、スレッドＡ−１とスレッドＡ−２が依存の無いことを追記する。
【００６８】
ＯＳ２０３は、データを共有しないスレッドの情報を依存情報５０１に登録する。図８に示すプロセスＡのスレッド間の依存関係８０２では、スレッドＡ−１とスレッドＡ−２に“依存無し”が登録されることになる。ＯＳ２０３は、データを共有しないスレッドの情報と利用しないプロセス間通信領域とを管理する依存情報５０１として、スレッドデータ構造を拡張する。拡張されたスレッドデータ構造については、図９にて後述する。
【００６９】
図９は、拡張されたスレッドデータ構造９０１のメンバー一覧と記憶内容の一例を示す説明図である。図９では、拡張されたスレッドデータ構造９０１と、スレッドデータ構造９０１の記憶内容の一例として、表９０２、スレッドＩＤリスト９０３、スレッドＩＤリスト９０４、プロセス間通信領域リスト９０５、プロセス間通信領域リスト９０６を示している。
【００７０】
スレッドデータ構造９０１のスレッドＩＤフィールドには、スレッドごとに採番された値が設定される。スレッド関数フィールドは、スレッドの関数名が設定される。その他、スレッドデータ構造９０１のフィールドとして、従来のスレッドデータ構造に存在するフィールドが存在する。また、依存情報５０１の実体となる、データを共有しないスレッドＩＤリストフィールドと、利用しないプロセス間通信領域リストフィールドは、本実施の形態にて拡張されたフィールドである。
【００７１】
データを共有しないスレッドＩＤリストフィールドは、対象のスレッドとデータを共有しないスレッドＩＤリストへのポインタが設定されている。たとえば、表９０２において、スレッドＩＤが“１”であるＢｒｏｗｓｅｒ＿Ｍａｉｎスレッドは、データを共有しないスレッドＩＤリストフィールドにスレッドＩＤリスト９０３が設定されている。スレッドＩＤリスト９０３には、スレッドＩＤ“２”とスレッドＩＤ“３”のスレッドが登録されている。これにより、Ｂｒｏｗｓｅｒ＿Ｍａｉｎスレッドは、スレッドＩＤが“２”であるＢｒｏｗｓｅｒ＿Ｄｏｗｎｌｏａｄスレッドと、スレッドＩＤが“３”であるＢｒｏｗｓｅｒ＿Ｕｐｌｏａｄスレッドとに対してデータの共有がない、ということを示している。
【００７２】
同様に、Ｂｒｏｗｓｅｒ＿Ｄｏｗｎｌｏａｄスレッドのデータを共有しないスレッドＩＤリストフィールドには、スレッドＩＤリスト９０４が設定されている。スレッドＩＤリスト９０４の内容により、Ｂｒｏｗｓｅｒ＿Ｄｏｗｎｌｏａｄスレッドは、Ｂｒｏｗｓｅｒ＿Ｍａｉｎスレッドに対してデータの共有がないことを示している。
【００７３】
利用しないプロセス間通信領域リストフィールドは、スレッドが利用しないプロセス間通信領域リストへのポインタが設定されている。たとえば、Ｂｒｏｗｓｅｒ＿Ｍａｉｎスレッドは、利用しないプロセス間通信領域リストフィールドにプロセス間通信領域リスト９０５が設定されている。プロセス間通信領域リスト９０５には、チャンク３とチャンク４が登録されている。
【００７４】
また、Ｂｒｏｗｓｅｒ＿Ｍａｉｎスレッドと異なるプロセスとして実行される、スレッドＩＤが“４”のＦＴＰ＿Ｄｏｗｎｌｏａｄスレッドは、利用しないプロセス間通信領域リストフィールドにプロセス間通信領域リスト９０６が設定されている。プロセス間通信領域リスト９０６には、チャンク１とチャンク２が登録されている。ＯＳ２０３が確保したチャンクがチャンク１〜チャンク４である場合、プロセス間通信領域リスト９０５とプロセス間通信領域リスト９０６では、共通して利用されるプロセス間通信領域が存在しないことになる。
【００７５】
図９で説明したように、ＯＳ２０３は、スレッドデータ構造９０１によってスレッドを管理するが、同様に、スレッドの集合であるプロセスを管理してもよい。さらに、ＯＳ２０３は、プロセスごとに利用しないプロセス間通信領域リストを生成してもよい。
【００７６】
図１０は、スヌープ制御部＃０によるラインフェッチ処理を示すフローチャートである。図１０では、スヌープ対応キャッシュ＃０が、ＣＰＵ＃０からキャッシュへの読み込み要求を受信し、ＣＰＵ＃０が要求したキャッシュがキャッシュライン記憶部＃０に存在しなく、スヌープ制御部＃０によるラインフェッチ処理が発生した場合を想定している。スヌープ制御部＃０以外のスヌープ制御部＃１〜スヌープ制御部＃３も、対応するＣＰＵからの読み込み要求により、ラインフェッチ処理が行われる。
【００７７】
スヌープ制御部＃０は、新規ラインフェッチを決定する（ステップＳ１００１）。決定後、スヌープ制御部＃０は、バス１１０に１ライン分のリード要求をマスタＩ／Ｆ＃０からブロードキャストとして送出する（ステップＳ１００２）。
【００７８】
リード要求を受信したスヌープ制御部＃１〜スヌープ制御部＃３は、ラインフェッチ処理の応答を開始する。なお、スヌープ制御部＃１〜スヌープ制御部＃３はすべて等しい処理を行うため、以下の記述では、説明の簡略化のため、スヌープ制御部＃１にて説明を行う。スヌープ制御部＃１は、キャッシュライン記憶部＃１のタグ領域から、要求されたアドレスと一致するアドレスを持つラインが存在するかを検索する（ステップＳ１００３）。なお、一致するアドレスを持つラインを検索する際には、無効状態であるＩ状態以外のラインから検索される。
【００７９】
検索後、スヌープ制御部＃１は、一致するアドレスを持つラインが存在するかを判断する（ステップＳ１００４）。一致するアドレスを持つラインが存在しない場合（ステップＳ１００４：Ｎｏ）、スヌープ制御部＃１は、ラインフェッチ処理の応答を終了する。一致するアドレスを持つラインが存在する場合（ステップＳ１００４：Ｙｅｓ）、スヌープ制御部＃１は、リード要求の送信元、図１０の例ではスヌープ制御部＃０に、ブロック命令を発行する（ステップＳ１００５）。
【００８０】
発行後、スヌープ制御部＃１は、一致したラインの状態がＭ状態であるかを判断する（ステップＳ１００６）。一致したラインの状態がＭ状態である場合（ステップＳ１００６：Ｙｅｓ）、スヌープ制御部＃１は、一致したラインのデータを共有メモリ２０２に書き込む（ステップＳ１００７）。書き込み終了後、または、検索されたラインの状態がＭ状態以外の場合（ステップＳ１００６：Ｎｏ）、スヌープ制御部＃１は、ラインをＳ状態に変更し（ステップＳ１００８）、ラインフェッチ処理の応答を終了する。
【００８１】
スヌープ制御部＃０は、スヌープ制御部＃１〜スヌープ制御部＃３のいずれかからブロック命令によりブロックされたかを判断する（ステップＳ１００９）。ブロックされなかった場合（ステップＳ１００９：Ｎｏ）、スヌープ制御部＃０は、リードしたラインをＥ状態でキャッシュライン記憶部＃０に格納し（ステップＳ１０１０）、ラインフェッチ処理を終了する。ブロックされた場合（ステップＳ１００９：Ｙｅｓ）、スヌープ制御部＃０は、バス１１０に１ライン分のリード要求を再送する（ステップＳ１０１１）。再送後、スヌープ制御部＃０は、リードしたラインをＳ状態でキャッシュライン記憶部＃０に格納し（ステップＳ１０１２）、ラインフェッチ処理を終了する。
【００８２】
図１１は、スヌープ制御部＃０によるラインへの書き込み処理を示すフローチャートである。図１１では、スヌープ対応キャッシュ＃０が、ＣＰＵ＃０からキャッシュへの書き込み要求を受信した場合を想定している。スヌープ制御部＃０以外のスヌープ制御部＃１〜スヌープ制御部＃３も、対応するＣＰＵからの書き込み要求により、書き込み処理が行われる。
【００８３】
スヌープ制御部＃０は、ラインへの書き込みを決定する（ステップＳ１１０１）。決定後、スヌープ制御部＃０は、書き込み予定のラインがＳ状態であるかを判断する（ステップＳ１１０２）。Ｓ状態である場合（ステップＳ１１０２：Ｙｅｓ）、スヌープ制御部＃０は、無効化要求をスヌープ制御部＃１〜スヌープ制御部＃３にブロードキャストにて発行する（ステップＳ１１０３）。無効化要求を送信後、またはＳ状態でない場合（ステップＳ１１０２：Ｎｏ）、スヌープ制御部＃０は、書き込み予定のラインをＭ状態に変更する（ステップＳ１１０４）。変更後、スヌープ制御部＃０は、書き込み予定のラインへデータを書き込み（ステップＳ１１０５）、ラインへの書き込み処理を終了する。
【００８４】
ステップＳ１１０３の処理にて無効化要求を受信したスヌープ制御部＃１〜スヌープ制御部＃３は、ラインへの書き込み処理の応答を開始する。なお、スヌープ制御部＃１〜スヌープ制御部＃３はすべて等しい処理を行うため、以下の記述では、説明の簡略化のため、スヌープ制御部＃１にて説明を行う。
【００８５】
スヌープ制御部＃１は、キャッシュライン記憶部＃１のタグ領域から、要求されたアドレスと一致するアドレスを持つラインが存在するかを検索する（ステップＳ１１０６）。なお、一致するアドレスを持つラインを検索する際には、無効状態であるＩ状態以外のラインから検索される。検索後、スヌープ制御部＃１は、一致するアドレスを持つラインが存在するかを判断する（ステップＳ１１０７）。一致するアドレスを持つラインが存在する場合（ステップＳ１１０７：Ｙｅｓ）、スヌープ制御部＃１は、ラインをＩ状態にすることで無効化する（ステップＳ１１０８）。ラインの無効化後、または、一致するアドレスを持つラインが存在しない場合（ステップＳ１１０７：Ｎｏ）、スヌープ制御部＃１は、ラインへの書き込み処理の応答を終了する。
【００８６】
図１２は、コヒーレンシ制御処理を示すフローチャートである。コヒーレンシ制御処理は、ＣＰＵ＃０〜ＣＰＵ＃３のうち、どのＣＰＵでも実行される。図１２では、ＣＰＵ＃０にてコヒーレンシ制御処理が実行される場合にて説明を行う。
【００８７】
ＣＰＵ＃０は、再スケジュール要求の受け付けを検出する（ステップＳ１２０１）。コヒーレンシ制御処理は、スレッドの再スケジュールを行うたびに実行される。したがって、コヒーレンシ制御処理は、スケジューラ５０２の内部にあってもよいし、スケジューラ５０２の外部にあり、通知可能な状態であってもよい。ＣＰＵ＃０は、再スケジュールの対象ＣＰＵに割り付けるスレッドを決定する（ステップＳ１２０２）。再スケジュール対象ＣＰＵは、ＣＰＵ＃０であってもよいし、スケジューラ５０２が他のＣＰＵのスケジュール処理も行っている場合は、再スケジュール要求の受け付けの対象となった他のＣＰＵであってもよい。
【００８８】
決定後、ＣＰＵ＃０は、割り付け禁止フラグが設定されているかを判断する（ステップＳ１２０３）。割り付け禁止フラグが設定されている場合（ステップＳ１２０３：Ｙｅｓ）、ＣＰＵ＃０は、一定時間後、再度ステップＳ１２０３を実行する。割り付け禁止フラグが設定されていない場合（ステップＳ１２０３：Ｎｏ）、ＣＰＵ＃０は、対象ＣＰＵ以外の他のＣＰＵへ割り付け禁止フラグを設定する（ステップＳ１２０４）。
【００８９】
割り付け禁止フラグの設定後、ＣＰＵ＃０は、コヒーレンシ対象ＣＰＵ決定処理を実行する（ステップＳ１２０５）。コヒーレンシ対象ＣＰＵ決定処理の詳細は、図１３にて後述する。実行後、ＣＰＵ＃０は、コヒーレンシ対象ＣＰＵ決定処理によって、コヒーレンシを実行していた状態から停止へ変化したＣＰＵが存在するかを判断する（ステップＳ１２０６）。停止へ変化したＣＰＵがある場合（ステップＳ１２０６：Ｙｅｓ）、ＣＰＵ＃０は、対象ＣＰＵのキャッシュをフラッシュする（ステップＳ１２０７）。フラッシュとは、たとえばスヌープ制御部が、Ｍ状態など、データが更新されているラインを共有メモリ２０２に書き込み、Ｍ状態を含むすべてのラインをＩ状態に設定する操作である。
【００９０】
フラッシュ後、または、停止に変化したＣＰＵがない場合（ステップＳ１２０６：Ｎｏ）、ＣＰＵ＃０は、キャッシュコヒーレンシ機構２０１を制御する（ステップＳ１２０８）。具体的な制御内容として、ステップＳ１２０５の処理にて、対象ＣＰＵがＣＰＵ＃０であり、ＣＰＵ＃０とＣＰＵ＃１とのコヒーレンシの実行を停止すると決定した場合を想定する。
【００９１】
この場合、ＣＰＵ＃０は、スヌープ対応キャッシュ＃０に対し、スヌープ対応キャッシュ＃１をブロードキャスト先から除くように指示をする。具体的に、ＣＰＵ＃０は、スヌープ対応キャッシュ＃０の設定レジスタを変更することで、スヌープ対応キャッシュ＃１をブロードキャスト先から除くようにする。
【００９２】
同様に、ＣＰＵ＃０は、スヌープ対応キャッシュ＃１に対しても、スヌープ対応キャッシュ＃０をブロードキャスト先から除くように指示をする。ブロードキャスト先から除くことで、ステップＳ１００２、ステップＳ１１０３の処理で行ったブロードキャストの送信量が減少し、バス１１０内のトラフィック量を減少することができる。また、ブロードキャスト先から除かれたスヌープ対応キャッシュも、それぞれの応答処理を行わなくて済むため、処理量を減少させることができる。
【００９３】
制御後、ＣＰＵ＃０は、他ＣＰＵの割り付け禁止フラグを解除し（ステップＳ１２０９）、決定されたスレッドを対象ＣＰＵに割り付ける（ステップＳ１２１０）。割り付け後、ＣＰＵ＃０は、コヒーレンシ制御処理を終了する。
【００９４】
図１３は、コヒーレンシ対象ＣＰＵ決定処理を示すフローチャートである。コヒーレンシ対象ＣＰＵ決定処理も、コヒーレンシ制御処理と同じくＣＰＵ＃０〜ＣＰＵ＃３のうち、どのＣＰＵでも実行される。図１３では、図１２と同様に、ＣＰＵ＃０にてコヒーレンシ対象ＣＰＵ決定処理が実行される場合にて説明を行う。また、コヒーレンシ対象ＣＰＵ決定処理は、コヒーレンシ制御処理から対象ＣＰＵと割り付け予定のスレッドである対象スレッドを引数として取得する。
【００９５】
ＣＰＵ＃０は、対象ＣＰＵ以外の他のＣＰＵから、未選択のＣＰＵを選択する（ステップＳ１３０１）。選択後、ＣＰＵ＃０は、対象スレッドが属するプロセスと選択されたＣＰＵで実行中のスレッドが属するプロセスが同一かを判断する（ステップＳ１３０２）。
【００９６】
同一である場合（ステップＳ１３０２：Ｙｅｓ）、ＣＰＵ＃０は、対象スレッドのデータを共有しないスレッドＩＤリストフィールドに、選択されたＣＰＵで実行中のスレッドが含まれているかを判断する（ステップＳ１３０３）。含まれる場合（ステップＳ１３０３：Ｙｅｓ）、ＣＰＵ＃０は、対象ＣＰＵと選択されたＣＰＵとのコヒーレンシの停止を決定する（ステップＳ１３０４）。含まれない場合（ステップＳ１３０３：Ｎｏ）、ＣＰＵ＃０は、対象ＣＰＵと選択されたＣＰＵとのコヒーレンシの実行を決定する（ステップＳ１３０５）。
【００９７】
対象スレッドが属するプロセスと選択されたＣＰＵで実行中のスレッドが属するプロセスが同一でない場合（ステップＳ１３０２：Ｎｏ）、ＣＰＵ＃０は、プロセス同士が同一のプロセス間通信領域を利用するかを判断する（ステップＳ１３０６）。同一のプロセス間通信領域を利用する場合（ステップＳ１３０６：Ｙｅｓ）、ＣＰＵ＃０は、対象スレッドと選択されたＣＰＵで実行中のスレッドが同一のプロセス間通信領域を利用するかを判断する（ステップＳ１３０７）。
【００９８】
同一のプロセス間通信領域を利用する場合（ステップＳ１３０７：Ｙｅｓ）、ＣＰＵ＃０は、対象ＣＰＵと選択されたＣＰＵとのコヒーレンシの実行を決定する（ステップＳ１３０８）。同一のプロセス間通信領域を利用しない場合（ステップＳ１３０６：Ｎｏ、ステップＳ１３０７：Ｎｏ）、ＣＰＵ＃０は、対象ＣＰＵと選択されたＣＰＵとのコヒーレンシの停止を決定する（ステップＳ１３０９）。
【００９９】
ステップＳ１３０４、ステップＳ１３０５、ステップＳ１３０８、ステップＳ１３０９のいずれかの処理後、ＣＰＵ＃０は、対象ＣＰＵ以外の他のＣＰＵから未選択のＣＰＵが存在するかを判断する（ステップＳ１３１０）。未選択のＣＰＵがある場合（ステップＳ１３１０：Ｙｅｓ）、ＣＰＵ＃０は、ステップＳ１３０１の処理に移行する。未選択のＣＰＵがない場合（ステップＳ１３１０：Ｎｏ）、ＣＰＵ＃０はコヒーレンシ対象ＣＰＵ決定処理を終了する。
【０１００】
以上説明したように、マルチコアプロセッサシステム、キャッシュコヒーレンシ制御方法、およびキャッシュコヒーレンシ制御プログラムによれば、第１および第２のコアで実行中の第１および第２のスレッドでアクセスされる領域が異なることを判断する。領域が異なると判断された場合、マルチコアプロセッサシステムは、第１のコアに対応する第１のキャッシュメモリと第２のコアに対応する第２のキャッシュメモリとのコヒーレンシを停止させる。アクセスされる領域が異なるため、コヒーレンシを停止させても共有データの不整合が発生しない。よって、マルチコアプロセッサシステムは、キャッシュコヒーレンシ機構のトラフィック量が減少することで、消費電力を削減し、また、トラフィック量の増大による遅延を防止することができる。
【０１０１】
また、マルチコアプロセッサシステムは、第１および第２のスレッドが同一のプロセスに属し、かつ共通してアクセスされる共有データが存在しないと判断された場合に、コヒーレンシを停止させてもよい。これにより、マルチコアプロセッサシステムは、２つのコアが同一プロセスのスレッドを実行していても、キャッシュコヒーレンシ機構のトラフィック量を減少することができ、消費電力を削減することができる。携帯電話に代表される組み込み機器では、複数のプロセスを同時に起動するケースは少なく、同一のプロセスに属する複数のスレッドを実行する機会が多いため、本実施の形態は、特に有効である。
【０１０２】
さらに、組み込み機器に搭載される組み込みＯＳには、プロセスの概念がなく、すべてのスレッド（タスク）が同一のメモリ空間にアクセスするＯＳも存在する。たとえば、下記参考文献１で説明されているμＩＴＲＯＮである。
（参考文献１：組み込みＯＳ適材適所  《Ｗｉｎｄｏｗｓ（登録商標）  Ｅｍｂｅｄｄｅｄ  ＣＥ編》（１）  ――  まず、μＩＴＲＯＮとＷｉｎｄｏｗｓ（登録商標）  Ｅｍｂｅｄｄｅｄ  ＣＥの違いを理解する｜Ｔｅｃｈ  Ｖｉｌｌａｇｅ  ／  ＣＱ出版株式会社：［ｏｎｌｉｎｅ］、［平成２２年０５月１３日検索］、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｗｗｗ．ｋｕｍｉｋｏｍｉ．ｎｅｔ／ａｒｃｈｉｖｅｓ／２００９／０９／ｉｔｒｏｎｗｉｎｄｏｗｓ＿ｅｍｂｅｄｄｅｄ＿ｃｅｏｓｗｉｎｄｏｗｓ＿ｅｍｂｅｄｄｅｄ＿ｃｅ１．ｐｈｐ？ｐａｇｅ＝２＞）
【０１０３】
前述のようなＯＳでは、すべてのスレッドが全メモリ空間にアクセス可能であるため、従来手法を適用しても、常にコヒーレンシを実行する状態となる。しかし、本実施の形態におけるマルチコアプロセッサシステム１００では、共通してアクセスされる共有データが存在しないと判断された場合に、キャッシュコヒーレンシ機構のトラフィック量や処理量を削減することができ、特に効果がある。
【０１０４】
また、マルチコアプロセッサシステムは、第１および第２のスレッドが異なるプロセスに属し、かつ、第１および第２のスレッドによって共通して使用されるプロセス間通信の領域が存在しない場合に、コヒーレンシを停止してもよい。これにより、マルチコアプロセッサシステムは、異なるプロセスであってもコヒーレンシを実行すべき場合を除いてコヒーレンシを停止させることでトラフィック量や処理量が減少し、消費電力を削減し、また、トラフィック量の増大による遅延を防止することができる。
【０１０５】
また、マルチコアプロセッサシステムは、第１および第２のスレッドが属するプロセス同士が使用されるプロセス間通信の領域が存在するか否かを判断してもよい。また、第１および第２のスレッドによって共通して使用されるプロセス間通信の領域が存在するかを判断する場合、マルチコアプロセッサシステムは、初めに、第１および第２のスレッドの少なくとも一方がプロセス間通信の領域を使用していない状態を判断してもよい。
【０１０６】
プロセス間通信の領域を使用しているか否かの判断は、共通して使用されるプロセス間通信の領域が存在するか否かの判断よりも処理量が小さい。したがって、第１および第２のスレッドがプロセス間通信の領域を使用しているか否かを先に判断し、共に領域を使用している場合、共通して使用される領域が存在するかを判断する、という処理順序によって、全体の処理量を減少させることができる。
【０１０７】
また、マルチコアプロセッサシステムは、第１のキャッシュメモリと第２のキャッシュメモリとのコヒーレンシの実行を停止させた場合、第１のキャッシュメモリに格納された共有データを第１のキャッシュメモリから消去してもよい。これにより、マルチコアプロセッサシステムは、コヒーレンシの実行を停止させても、共有メモリの整合性をとることができる。
【０１０８】
なお、本実施の形態で説明したキャッシュコヒーレンシ制御方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本キャッシュコヒーレンシ制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本キャッシュコヒーレンシ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１０９】
＃０、＃１  ＣＰＵ、スヌープ対応キャッシュ
Ａ−１、Ａ−２  スレッド
１００  マルチコアプロセッサシステム
１１０  バス
５０１  依存情報
５０２  スケジューラ
５０３  実行部
５０４  検出部
５０５  特定部
５０６  判断部
５０７  制御部
【図１】
0005614483.tif 000002
【図２】
0005614483.tif 000003
【図３】
0005614483.tif 000004
【図４】
0005614483.tif 000005
【図５】
0005614483.tif 000006
【図６】
0005614483.tif 000007
【図７】
0005614483.tif 000008
【図８】
0005614483.tif 000009
【図９】
0005614483.tif 000010
【図１０】
0005614483.tif 000011
【図１１】
0005614483.tif 000012
【図１２】
0005614483.tif 000013
【図１３】
0005614483.tif 000014