(57)【要約】  第１のＯＳが、（１）第１のスレッドを第１のＣＰＵへディスパッチする。第１のＯＳが、（２）第１のスレッドの共有資源へのアクセス頻度を第１閾値と比較する。第１のＯＳが、（３）第１のスレッドと第２のＣＰＵで実行中の第２のスレッドとの依存関係を判断する。第１のＯＳが、（４）アクセス頻度が第１閾値よりも大きいと判断し、かつ依存関係がない（×印）と判断した場合、第１のＣＰＵへ供給されるクロックの位相と第２のＣＰＵへ供給されるクロックの位相とが逆相となるようにクロック生成回路の設定を変更する。第１のＯＳが、（４）共有資源へ供給されるクロックの周波数を第１のＣＰＵへ供給されるクロックの周波数の２倍になるようにクロック生成回路の設定を変更する。
2012144011.tif 000002
【特許請求の範囲】
【請求項１】
第１スレッドの実行命令を第１プロセッサに供給し、
前記第１スレッドと第２プロセッサで実行される第２スレッドとの依存関係を判断し、
前記第１スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第１閾値と比較し、
前記アクセス頻度が第１閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理方法。
【請求項２】
前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする請求項１に記載のスレッド処理方法。
【請求項３】
前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする請求項１または請求項２に記載のスレッド処理方法。
【請求項４】
前記動作クロックの周波数を２倍に変更すること、
を特徴とする請求項３に記載のスレッド処理方法。
【請求項５】
前記第１スレッドを実行するときの第１負荷を第２閾値と比較し、
前記第１負荷が前記第２閾値よりも大きく、前記アクセス頻度が第１閾値よりも大きく、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする請求項１乃至請求項４の何れか一に記載のスレッド処理方法。
【請求項６】
前記依存関係があるときは、前記第１動作クロックの位相を変更しないこと、
を特徴とする請求項１乃至請求項５の何れか一に記載のスレッド処理方法。
【請求項７】
前記依存関係がないとき、前記第１動作クロックの第１位相から第２位相へ変更されていた場合には、前記第１動作クロックの位相を前記第２位相から前記第１位相に変更すること、
を特徴とする請求項１乃至請求項６の何れか一に記載のスレッド処理方法。
【請求項８】
前記依存関係は、前記共有メモリまたは前記第１プロセッサのメモリに登録されること、
を特徴とする請求項１乃至請求項７の何れか一に記載のスレッド処理方法。
【請求項９】
依存関係があるスレッド間を関連付けるテーブルへアクセス可能な複数のコアのうちの一のコアが、
前記複数のコアの各コアで実行中のスレッド間に直接的または間接的に依存関係があるか否かを、前記テーブルを参照することで判断し、
判断結果に基づいて、前記複数のコアを直接的または間接的に依存関係があるスレッドを実行するコア群ごとにグループ化し、
前記グループ化したコア群が複数ある場合、前記コア群ごとに前記コア群へ供給するクロックの位相を前記コア群間で非同期となる位相に設定し、
前記複数のコアで共有する共有資源へ供給するクロックの周波数をいずれのコア群とも同期する周波数に設定すること、
を特徴とするスレッド処理方法。
【請求項１０】
第１プロセッサと、
前記第１プロセッサと第２プロセッサとがアクセス可能な共有メモリまたは共有キャッシュメモリと、
前記第１プロセッサまたは前記共有メモリに供給される動作クロックを制御するクロック制御ユニットと、
を含み、
前記クロック制御ユニットは、
前記第１プロセッサで実行される第１スレッドの前記共有メモリまたは前記共有キャッシュメモリへのアクセス頻度と第１閾値との比較結果と前記第１スレッドと前記第２プロセッサが実行する第２スレッドとの依存関係とに基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理システム。
【請求項１１】
前記クロック制御ユニットは、前記比較結果が前記アクセス頻度が前記第１閾値よりも大きいことを示すとともに前記依存関係があるときに、前記第１動作クロックの位相を変更すること、
を特徴とする請求項１０に記載のスレッド処理システム。
【請求項１２】
前記クロック制御ユニットは、前記第１プロセッサが前記第１スレッドを実行するときの第１負荷と第２閾値との比較結果に基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする請求項１０または請求項１１に記載のスレッド処理システム。
【請求項１３】
前記クロック制御ユニットは、前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする請求項１０乃至請求項１２の何れか一に記載のスレッド処理システム。
【請求項１４】
前記クロック制御ユニットは、前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする請求項１０乃至請求項１２の何れか一に記載のスレッド処理システム。
【請求項１５】
前記クロック制御ユニットは、前記動作クロックの周波数を２倍に変更すること、
を特徴とする請求項１４に記載のスレッド処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッドを処理するスレッド処理方法、およびスレッド処理システムに関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムでは、複数のＣＰＵが複数のスレッドを動作させる。メモリやバスなどの複数のＣＰＵで共有する共有資源では、複数のＣＰＵから同時にアクセスを受け付ける場合がある。共有資源では、たとえば、同時に複数のアクセスに関する処理を行うことができないため、各アクセスの優先度を判断し、アクセスに関する処理を順に行っている。【０００３】
また、フォールトトレラントシステムにおいて、故障モードになると、すべてのＣＰＵの動作を同一にする技術が知られている。すなわち、複数のＣＰＵから共有資源へのアクセスが競合するが、共有資源の同一のデータにアクセスする。そこで、マスタＣＰＵには共有資源へアクセスさせ、スレーブＣＰＵには共有資源へアクセスさせずに、マスタＣＰＵのアクセス結果をスレーブＣＰＵに返すために、マスタＣＰＵに供給されるクロックの位相と逆位相のクロックをスレーブＣＰＵに供給させる。そして、スレーブＣＰＵから共有資源へのアクセスのタイミングをマスタＣＰＵから共有資源へのアクセスのタイミングよりも遅らせる技術が知られている（たとえば、特許文献１参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２００８−５１８３１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、故障モードでない場合に、共有資源へ同時に２つのアクセスが発生した場合、いずれか一方のアクセスに関する処理は待機させられることになるという問題点がある。【０００６】
本発明は、上述した従来技術による問題点を解消するため、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができるスレッド処理方法、およびスレッド処理システムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、第１スレッドの実行命令を第１プロセッサに供給し、前記第１スレッドと第２プロセッサで実行される第２スレッドとの依存関係を判断し、前記第１スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第１閾値と比較し、前記アクセス頻度が第１閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更するスレッド処理方法、およびスレッド処理システムが提案される。
【発明の効果】
【０００８】
本発明の一側面によれば、共有資源へのアクセスが衝突することを減少させることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本発明の一実施例を示す説明図である。
【図２】図２は、マルチコアプロセッサシステムの一例を示すブロック図である。
【図３】図３は、クロック生成回路２０４の一例を示している。
【図４】図４は、アプリケーションテーブルの一例を示す説明図である。
【図５】図５は、割当テーブルの一例を示す説明図である。
【図６】図６は、ＯＳ２３１−ｉの機能例を示すブロック図である。
【図７】図７は、例１を示す説明図である。
【図８】図８は、例２を示す説明図である。
【図９】図９は、例３を示す説明図である。
【図１０】図１０は、例４を示す説明図である。
【図１１】図１１は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャート（その１）である。
【図１２】図１２は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャート（その２）である。
【図１３】図１３は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャート（その１）である。
【図１４】図１４は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャート（その２）である。
【図１５】図１５は、クロック生成回路２０４による変更処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に添付図面を参照して、本発明にかかるスレッド処理方法、およびスレッド処理システムの実施の形態を詳細に説明する。本実施の形態では、スレッド処理システムの一例として、マルチコアプロセッサシステムを挙げる。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００１１】
図１は、本発明の一実施例を示す説明図である。第１のＯＳが、（１）第１のスレッドを第１のＣＰＵへディスパッチする。第１のＯＳが、（２）第１のスレッドの共有資源へのアクセス頻度を第１閾値と比較する。ここで、共有資源には、たとえば、共有メモリ、共有キャッシュメモリやバスなどが挙げられる。第１のＯＳが、（３）第１のスレッドと第２のＣＰＵで実行中の第２のスレッドとの依存関係を判断する。ここで、スレッドは、周知のようにアプリケーションプログラム内での処理の実行単位である。依存関係があるとは、たとえば、第１のスレッドと第２のスレッドとでデータを共有している場合が挙げられる。たとえば、ＣＰＵ間でキャッシュコヒーレントを取るか否かをアプリケーションの設計時に設計者があらかじめ解析しておくこととする。
【００１２】
第１のＯＳが、（４）アクセス頻度が第１閾値よりも大きいと判断し、かつ依存関係がない（×印）と判断した場合、第１のＣＰＵへ供給されるクロックの位相と第２のＣＰＵへ供給されるクロックの位相とが逆相となるようにクロック生成回路の設定を変更する。第１のＯＳが、（４）共有資源へ供給されるクロックの周波数を第１のＣＰＵへ供給されるクロックの周波数の２倍になるようにクロック生成回路の設定を変更する。
【００１３】
たとえば、第１のＣＰＵと第２のＣＰＵと共有資源とがクロックの立ち上がりエッジで処理が行われるとすると、第１のＣＰＵと第２のＣＰＵとの共有資源へのアクセスが衝突しない。
【００１４】
（マルチコアプロセッサシステム）
図２は、マルチコアプロセッサシステムの一例を示すブロック図である。マルチコアプロセッサシステム２００は、ＣＰＵ２０１−１〜２０１−Ｎ（ここでは、Ｎ＝４を例に挙げている。）と、スヌープ回路２０２と、２次キャッシュ２０３と、クロック生成回路２０４と、を有している。さらに、マルチコアプロセッサシステム２００は、ディスプレイ２０５と、キーボード２０６と、Ｉ／Ｆ２１２（ＩｎｔｅｒＦａｃｅ）と、メモリコントローラ２０７と、共有メモリ２０８と、を有している。
【００１５】
２次キャッシュ２０３と、クロック生成回路２０４と、ディスプレイ２０５と、キーボード２０６と、Ｉ／Ｆ２１２と、メモリコントローラ２０７とは、バス２１３を介して接続されている。ＣＰＵ２０１−１〜２０１−４は、２次キャッシュ２０３を介して各部に接続されている。共有メモリ２０８は、メモリコントローラ２０７を介して各部に接続されている。
【００１６】
ここで、ＣＰＵ２０１−１〜２０１−４は、それぞれレジスタとコアと１次キャッシュ２２１−１〜２２１−４を有している。コアは、演算機能を有している。各ＣＰＵ内のレジスタは、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）やリセットレジスタを有している。
【００１７】
ＣＰＵ２０１−１はマスタＣＰＵであり、マルチコアプロセッサシステム２００の全体の制御を司り、ＯＳ２３１−１を実行する。ＯＳ２３１−１はマスタＯＳであり、ＣＰＵ２０１−１に割り当てられたスレッドを実行する。ＯＳ２３１−１はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのＣＰＵ２０１に割り当てるかを制御する機能を有している。スケジューラはＣＰＵ２０１−１に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００１８】
ＣＰＵ２０１−２〜２０１−４はスレーブＣＰＵであり、それぞれＯＳ２３１−２〜２３１−４を実行する。ＯＳ２３１−２〜２３１−４はスレーブＯＳであり、それぞれＣＰＵ２０１−２〜２０１−４に割り当てられたスレッドを実行する。ＯＳ２３１−２〜２３１−４はそれぞれスケジューラを有し、各スケジューラはそれぞれＣＰＵ２０１−２〜２０１−４に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００１９】
ここで、ＯＳ２３１−１〜２３１−４はそれぞれランキュー２４１−１〜２４１−４を有し、ランキュー２４１−１〜２４１−４にはＣＰＵ２０１−１〜２０１−４のそれぞれに割り当てられたアプリケーションのコンテキスト情報のポインタが積まれる。コンテキスト情報とは、たとえば、ロードされたアプリケーションの実行状態や該アプリケーション内の変数などが含まれる情報である。ＯＳ２３１−１〜２３１−４はそれぞれランキュー２４１−１〜２４１−４内のコンテキスト情報のポインタを取得し、アプリケーションのコンテキスト情報にアクセスすることで、アプリケーションを直ぐに実行することができる。
【００２０】
１次キャッシュ２２１−１〜２２１−４は、それぞれキャッシュメモリとキャッシュコントローラとを有している。１次キャッシュ２２１−１〜２２１−４はそれぞれＯＳ２３１−１〜２３１−４が実行するスレッドから共有メモリ２０８への書込処理を一時的に記憶する。また、１次キャッシュ２２１−１〜２２１−４は、共有メモリ２０８から読み出されたデータを一時的に記憶する。
【００２１】
スヌープ回路２０２は、１次キャッシュ２２１−１〜２２１−４で共有するデータがいずれかの１次キャッシュ２２１で更新された場合、該更新を検出し、他の１次キャッシュ２２１も更新する。
【００２２】
２次キャッシュ２０３は、キャッシュメモリとキャッシュコントローラとを有している。２次キャッシュ２０３では、１次キャッシュ２２１−１〜２２１−４から追い出されたデータを記憶する。２次キャッシュ２０３では、ＯＳ２３１−１〜ＯＳ２３１−４で共有するデータを記憶する。２次キャッシュ２０３は、１次キャッシュ２２１−１〜２２１−４よりも、記憶容量が大きくかつＣＰＵ２０１−１〜２０１−４からのアクセス速度が遅い。２次キャッシュ２０３は共有メモリ２０８より、記憶容量が小さくかつＣＰＵ２０１−１〜２０１−４からのアクセス速度が速い。
【００２３】
ディスプレイ２０５は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０５は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。キーボード２０６は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０６は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００２４】
Ｉ／Ｆ２１２は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワークに接続され、ネットワークを介して他の装置に接続される。そして、Ｉ／Ｆ２１２は、ネットワークと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２１２には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２５】
メモリコントローラ２０７は、共有メモリ２０８へのアクセスを制御する。共有メモリ２０８は、たとえば、ＲＡＭ２０９（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ＲＯＭ２１０（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、フラッシュＲＯＭ２１１を有している。ＲＯＭ２１０は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０９は、各ＣＰＵのワークエリアとして使用される。フラッシュＲＯＭ２１１は、ＯＳ２３１−１〜２３１−４などのシステムソフトウェアやアプリケーションのプログラムを記憶している。ＲＡＭ２０９はフラッシュＲＯＭ２１１よりも各ＣＰＵからのアクセス速度が速い。各ＯＳがアプリケーションのプログラムをフラッシュＲＯＭ２１１からＲＡＭ２０９へロードすることにより、該アプリケーションのコンテキスト情報がＲＡＭ２０９内に展開される。
【００２６】
クロック生成回路２０４は、各部にクロックを供給する。クロックＣＬＫが発振回路や外部から入力される基準クロックである。クロックＣＬＫ１〜ＣＬＫ４がそれぞれＣＰＵ２０１−１〜２０１−４へ供給されるクロックである。クロックＣＬＫ−２ＣＭが２次キャッシュ２０３へ供給されるクロックである。また、メモリコントローラ２０７、共有メモリ２０８、バス２１３、Ｉ／Ｆ２１２、ディスプレイ２０５やキーボード２０６などにもクロック生成回路２０４からクロックが共有されているが、図では配線を省略している。
【００２７】
たとえば、制御信号ＣＰＵＣＴＲＬ１と、制御信号ＣＰＵＣＴＲＬ２と、制御信号ＣＰＵＣＴＲＬ３と、制御信号ＣＰＵＣＴＲＬ４とに応じて、各ＣＰＵへ供給されるクロックの位相と２次キャッシュ２０３へ供給されるクロックの周波数が決定される。
【００２８】
図３は、クロック生成回路２０４の一例を示している。クロック生成回路２０４は、制御決定回路３０１と、選択回路３０２と、インバータ３０３と、１２０°遅延回路３０４と、９０°遅延回路３０５と、選択回路３０６と、インバータ３０７と、１２０°遅延回路３０８と、を有している。クロック生成回路２０４は、９０°遅延回路３０９と、選択回路３１０と、インバータ３１１と、９０°遅延回路３１２と、逓倍回路３１３と、を有している。
【００２９】
インバータ３０３は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。インバータ３０７は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。インバータ３１１は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。
【００３０】
１２０°遅延回路３０４は、クロックＣＬＫの位相を１２０°ずらす。１２０°遅延回路３０８は、１２０°遅延回路３０４から出力されるクロックの位相を１２０°ずらす。９０°遅延回路３０５は、クロックＣＬＫの位相を９０°ずらす。９０°遅延回路３０９は、９０°遅延回路３０５から出力されるクロックの位相を９０°ずらす。９０°遅延回路３１２は、９０°遅延回路３０９から出力されるクロックの位相を９０°ずらす。
【００３１】
選択回路３０２は、制御信号ＣＴＲＬ２の値に応じてＣＰＵ２０１−２に供給するクロックを選択する。選択回路３０２では、制御信号ＣＴＲＬ２が「１」の場合、クロックＣＬＫが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「４」の場合、クロックＣＬＫの位相が９０°ずらされたクロックが選択される。
【００３２】
選択回路３０６は、制御信号ＣＴＲＬ３の値に応じてＣＰＵ２０１−３に供給するクロックを選択する。選択回路３０６では、制御信号ＣＴＲＬ３が「１」の場合、クロックＣＬＫが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「４」の場合、クロックＣＬＫの位相が２４０°ずらされたクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「５」の場合、クロックＣＬＫの位相が１８０°ずらされたクロックが選択される。
【００３３】
選択回路３１０は、制御信号ＣＴＲＬ４の値に応じてＣＰＵ２０１−４に供給するクロックを選択する。選択回路３１０では、制御信号ＣＴＲＬ４が「１」の場合、クロックＣＬＫが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「４」の場合、クロックＣＬＫの位相が２４０°ずらされたクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ３が「５」の場合、クロックＣＬＫの位相が２７０°ずらされたクロックが選択される。
【００３４】
逓倍回路３１３は、ＲＡＴＥに応じてクロックＣＬＫを逓倍にする。逓倍回路３１３では、制御信号ＲＡＴＥの値が「１」の場合、クロックＣＬＫがそのまま出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「２」の場合、クロックＣＬＫの周波数の２倍の周波数となるクロックが出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「３」の場合、クロックＣＬＫの周波数の３倍の周波数となるクロックが出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「４」の場合、クロックＣＬＫの周波数の４倍の周波数となるクロックが出力される。制御信号ＲＡＴＥの最大値は「４」である。
【００３５】
制御決定回路３０１は、制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４に応じて、各ＣＰＵへ供給されるクロックの位相と２次キャッシュ２０３へ供給されるクロックの周波数を決定する。たとえば、制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４のそれぞれのビット幅が１２ビット（３［ビット］×４［制御信号］）である。制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４はそれぞれ上位３ビットごとに順に制御信号ＣＴＲＬ２の値、制御信号ＣＴＲＬ３の値、制御信号ＣＴＲＬ４の値、制御信号ＲＡＴＥの値を示していることとする。
【００３６】
たとえば、ＯＳ２３１−１が、通常時には制御信号ＣＰＵＣＴＲＬ１を「００００（１０進表記）」に設定し、各ＣＰＵへ供給するクロックの位相や２次キャッシュ２０３へ供給するクロックの周波数を変更する際に変化させる。たとえば、制御信号ＣＰＵＣＴＲＬ１の値が「１２３４（１０進表記）」に変化させられると、制御決定回路３０１により、制御信号ＣＴＲＬ１の値が「１」となり、制御信号ＣＴＲＬ２の値が「２」となることとする。さらに、制御決定回路３０１により、制御信号ＣＴＲＬ３の値が「３」となり、制御信号ＲＡＴＥの値が「４」となることとする。また、制御決定回路３０１は、制御信号ＣＰＵＣＴＲＬ１〜ＣＰＵＣＴＲＬ４の「００００」から変更値への変化は検出するが、変更値から「００００」への変化は検出しないこととする。
【００３７】
（アプリケーションテーブル）
図４は、アプリケーションテーブルの一例を示す説明図である。アプリケーションテーブル４００は、アプリＩＤ、スレッドＩＤ、依存スレッドＩＤ、アクセス頻度、負荷量のフィールドを有している。
【００３８】
アプリＩＤのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドＩＤのフィールドには、各スレッドを識別するための識別情報が登録される。依存スレッドＩＤのフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドと依存関係のあるスレッドの識別情報が登録される。
【００３９】
アクセス頻度のフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドから２次キャッシュ２０３への単位時間あたりのアクセス回数が登録される。負荷量のフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドの単位時間当たりの実行時間の比率が登録される。アクセス頻度や負荷量は、各スレッドのコンパイル時の解析およびシミュレーション結果に基づいて登録される。
【００４０】
フィールドに情報が設定されることで、アプリ情報（たとえば、アプリ情報４０１−１〜４０１−４）がレコードとして記憶されている。アプリケーションテーブル４００は、ＲＡＭ２０９、ＲＯＭ２１０、フラッシュＲＯＭ２１１などの記憶装置に記憶されている。さらに、２次キャッシュ２０３や１次キャッシュ２２１などに複製されたアプリケーションテーブル４００が記憶されていてもよい。
【００４１】
図５は、割当テーブルの一例を示す説明図である。割当テーブル５００は、アプリＩＤ、スレッドＩＤ、割当先ＣＰＵＩＤのフィールドを有している。アプリＩＤのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドＩＤのフィールドには、各スレッドを識別するための識別情報が登録される。割当先ＣＰＵＩＤのフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドの割当先ＣＰＵの識別情報が登録される。
【００４２】
各フィールドに情報が設定されることで、割当情報（たとえば、割当情報５０１−１〜５０１−５）がレコードとして記憶されている。割当テーブル５００は、ＲＡＭ２０９、ＲＯＭ２１０、フラッシュＲＯＭ２１１などの記憶装置に記憶されている。さらに、２次キャッシュ２０３や１次キャッシュ２２１などに複製されたアプリケーションテーブル４００が記憶されていてもよい。
【００４３】
（ＯＳ２３１−ｉ（ｉ＝１〜４）の機能例）
図６は、ＯＳ２３１−ｉの機能例を示すブロック図である。ＯＳ２３１−ｉは、受付部６０１−ｉと、判断部６０２−ｉと、比較部６０３−ｉと、グループ化設定部６０４−ｉと、変更部６０５−ｉと、実行部６０６−ｉと、を有している。受付部６０１−ｉから変更部６０５−ｉを有するＯＳ２３１−ｉがフラッシュＲＯＭ２１１などのストレージに記憶されている。ＣＰＵ２０１−ｉが該記憶装置にアクセスして該ＯＳ２３１−ｉを読み出し、該ＯＳ２３１−ｉ内にコーディングされている処理を実行することにより、該受付部６０１−ｉから実行部６０６−ｉの処理が実行される。ここでは、ｉ＝１を例に挙げて説明する。
【００４４】
受付部６０１−１は、イベントを受け付ける。マスタＯＳが受け付けるイベントとしては、スレッドの生成、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。スレーブＯＳが受け付けるイベントとしては、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。ここでは、イベントがスレッドの切り替えの場合を例に挙げて説明する。
【００４５】
受付部６０１−１は、スレッドの切り替えを受け付け、判断部６０２−１は、受付部６０１−１により切り替えが受け付けられたスレッド（第１のスレッド）と他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があるか否かを判断する。
【００４６】
たとえば、判断部６０２−１は、アプリケーションテーブル４００から、第１のスレッドのＩＤをスレッドＩＤのフィールドに有するアプリ情報を検出する。たとえば、判断部６０２−１は、検出したアプリ情報の依存スレッドＩＤのフィールドに登録されているスレッドのＩＤを特定する。これにより、第１のスレッドと依存関係のあるスレッドのＩＤが特定される。
【００４７】
たとえば、判断部６０２−１は、プロセッサ間通信機能により他のＯＳ２３１から、実行中のスレッドのＩＤを取得する。たとえば、判断部６０２−１は、特定したスレッドのＩＤと取得したスレッドのＩＤとを比較する。これにより、第１のスレッドと他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があるか否かが判断される。なお、判断結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００４８】
比較部６０３−１は、第１のスレッドがいずれのＣＰＵ２０１で実行中のスレッドとも依存関係がないと判断部６０２−１により判断された場合、第１のスレッドの２次キャッシュ２０３へのアクセス頻度を第１閾値と比較する。
【００４９】
たとえば、比較部６０３−１は、アプリケーションテーブル４００から、第１のスレッドのＩＤをスレッドＩＤのフィールドに有するアプリ情報を検出する。たとえば、比較部６０３−１は、検出したアプリ情報のアクセス頻度のフィールドに登録されたアクセス頻度を特定する。たとえば、比較部６０３−１は、特定したアクセス頻度が第１閾値以上であるか否かを判断する。これにより、第１のスレッドの２次キャッシュ２０３へのアクセス頻度が第１閾値以上であるか否かが判断される。
【００５０】
比較部６０３−１は、第１のスレッドの２次キャッシュ２０３へのアクセス頻度が第１閾値以上であると判断した場合、第１のスレッドの負荷量を第２閾値と比較する。たとえば、比較部６０３−１は、検出したアプリ情報の負荷量のフィールドに登録された第１のスレッドの負荷量が、第２閾値以上であるか否かを判断する。
【００５１】
比較部６０３−１は、第１のスレッドの負荷量が第２閾値以上であると判断した場合、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する。たとえば、比較部６０３−１は、制御信号ＲＡＴＥの値をクロック生成回路２０４から取得し、制御信号ＲＡＴＥの値が最大値であるか否かを判断する。上述最大値は４である。
【００５２】
判断部６０２−１は、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと比較部６０３−１により判断された場合、ＣＰＵ２０１−１を除く残余のＣＰＵで実行中のスレッド間に依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドとに依存関係があるか否かを判断する。具体的な判断方法については、ＣＰＵ２０１−１で実行中のスレッドと、ＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドとの依存関係の有無を判断した処理と同一処理であるため、詳細な説明は省略する。なお、判断結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００５３】
（例１）
図７は、例１を示す説明図である。図７では、丸印の中に符号が付されているものが、各符号に即したＣＰＵ２０１で実行中のスレッドを示している。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。そのため、図７では、ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドとを結ぶ矢印間に×印が付されている。
【００５４】
図７では、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは依存関係がなく、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。
【００５５】
グループ化設定部６０４−１は、依存関係に応じてＣＰＵをグループ化する。ここで、１グループは、１ＣＰＵ以上であり、直接的または間接的に依存関係があるスレッドを実行中のＣＰＵを１グループとする。たとえば、グループ化設定部６０４−１が、各ＣＰＵを異なるグループに設定する。ＣＰＵ２０１−１はグループＧ１に属し、ＣＰＵ２０１−２はグループＧ２に属し、ＣＰＵ２０１−３はグループＧ３に属し、ＣＰＵ２０１−４はグループＧ４に属する。ＣＰＵグループ数ＧＣは４である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００５６】
変更部６０５−１は、グループ化の設定結果に応じて各ＣＰＵへ供給するクロックの位相を変更し、ＣＰＵグループ数ＧＣに応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「４５５４」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「４」にし、制御信号ＣＴＲＬ３の値を「５」にし、制御信号ＣＴＲＬ４の値を「５」にし、制御信号ＲＡＴＥの値を「４」にする。
【００５７】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも９０°（＝３６０°／Ｇ）ずらされた位相のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも９０°ずらされた位相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−３へ供給されるクロックの位相よりも９０°ずらされた位相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の４倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。すなわち、グループ間で供給されるクロックが非同期となり、クロックＣＬＫ−２ＣＭの周波数がいずれのグループとも同期する周波数となる。
【００５８】
（例２）
図８は、例２を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは依存関係がない。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは直接的に依存関係がある。×印の矢印間は、依存関係がないことを示し、○印の矢印間は、依存関係があることを示している。
【００５９】
グループ化設定部６０４−１は、ＣＰＵ２０１−１をグループＧ１にし、ＣＰＵ２０１−２をグループＧ２にし、ＣＰＵ２０１−３とＣＰＵ２０１−４をグループＧ３にする。ＣＰＵグループ数ＧＣは３である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００６０】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、グループ数に応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「３４４３」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「３」にし、制御信号ＣＴＲＬ３の値を「４」にし、制御信号ＣＴＲＬ４の値を「４」にし、制御信号ＲＡＴＥの値を「３」にする。
【００６１】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも１２０°（＝３６０°／ＣＰＵグループ数ＧＣ＝３６０°／３）ずらされた位相のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも１２０°ずらされた位相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも１２０°ずらされた位相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の３倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００６２】
（例３）
図９は、例３を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。図９では、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドには依存関係がある。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドには依存関係がある。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドには直接的に依存関係がないが、ＣＰＵ２０１−３を介して間接的に依存関係がある。
【００６３】
グループ化設定部６０４−１は、ＣＰＵ２０１−１をグループＧ１にし、ＣＰＵ２０１−２とＣＰＵ２０１−３とＣＰＵ２０１−４をグループＧ２にする。ＣＰＵグループ数ＧＣは２である。
【００６４】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、グループ数に応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「２２２２」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「２」にし、制御信号ＣＴＲＬ３の値を「２」にし、制御信号ＣＴＲＬ４の値を「２」にし、制御信号ＲＡＴＥの値を「２」にする。
【００６５】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも１８０°（＝３６０°／Ｇ）ずらされた位相（逆相）のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相と逆相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相と逆相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の２倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００６６】
（例４）
また、判断部６０２−１は、受付部６０１−１により切り替えが受け付けられた第１のスレッドと他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があると判断した場合、すべてのＣＰＵで実行中のスレッド間に依存関係があるか否かを判断する。
【００６７】
図１０は、例４を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２で実行中のスレッドは直接的に依存関係がある。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは直接的に依存関係がある。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは直接的に依存関係がある。
【００６８】
ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−３で実行中のスレッドは、直接的に依存関係がないが、ＣＰＵ２０１−２で実行中のスレッドを介して間接的に依存関係がある。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−４で実行中のスレッドは、直接的に依存関係がないが、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドを介して間接的に依存関係がある。
【００６９】
たとえば、グループ化設定部６０４−１は、ＣＰＵ２０１−１〜２０１−４をグループＧ１にする。ＣＰＵグループ数ＧＣは１である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００７０】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、ＣＰＵグループ数ＧＣに応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「１１１１」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「１」にし、制御信号ＣＴＲＬ３の値を「１」にし、制御信号ＣＴＲＬ４の値を「１」にし、制御信号ＲＡＴＥの値を「１」にする。
【００７１】
これにより、クロックＣＬＫと同相のクロックが各ＣＰＵへ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数と同一となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００７２】
（ＯＳ２３１−ｉによるスレッド処理手順）
図１１および図１２は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャートである。ＯＳ２３１−ｉは、受付部６０１−ｉにより、イベントの発生を受け付けたか否かを判断する（ステップＳ１１０１）。ＯＳ２３１−ｉは、イベントの発生を受け付けていないと判断した場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１１０１へ戻る。ＯＳ２３１−ｉは、ディスパッチを受け付けると（ステップＳ１１０１：ディスパッチ）、ステップＳ１１２３へ移行する。
【００７３】
ＯＳ２３１−ｉは、スレッドの実行終了を受け付けたと判断した場合（ステップＳ１１０１：実行終了）、実行待ちのスレッドがあるか否かを判断する（ステップＳ１１０２）。実行待ちのスレッドがあるか否かについては、ランキュー２４１−ｉにコンテキスト情報のポインタが登録されているか否かによって判断される。ＯＳ２３１−ｉは、実行待ちのスレッドがないと判断した場合（ステップＳ１１０２：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、実行待ちのスレッドがあると判断した場合（ステップＳ１１０２：Ｙｅｓ）、ステップＳ１１０３へ移行する。
【００７４】
ステップＳ１１０１において、ＯＳ２３１−ｉは、スレッドのスイッチを受け付けたと判断した場合（ステップＳ１１０１：スイッチ）、ステップＳ１１０３へ移行する。ステップＳ１１０１のスイッチ、またはステップＳ１１０２のＹｅｓのつぎに、ＯＳ２３１−ｉが、判断部６０２−ｉにより、つぎに実行するスレッド（第１のスレッド）と他のＣＰＵで実行中のスレッドとに依存関係があるか否かを判断する（ステップＳ１１０３）。つぎに実行するスレッドとは、スレッドのスイッチの場合にはスイッチ後のスレッドであり、スレッドの実行終了の場合にはランキュー２４１−ｉの先頭にコンテキスト情報のポインタが登録されているスレッドである。
【００７５】
ＯＳ２３１−ｉは、第１のスレッドと他のＣＰＵで実行中のスレッドとに依存関係があると判断した場合（ステップＳ１１０３：Ｙｅｓ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１１０４）。ＯＳ２３１−ｉは、すべてのＣＰＵで直接的または間接的に依存関係があるか否かを判断する（ステップＳ１１０５）。ＯＳ２３１−ｉは、すべてのＣＰＵで依存関係があると判断した場合（ステップＳ１１０５：Ｙｅｓ）、すべてのＣＰＵに供給するクロックの位相を同一位相に変更する（ステップＳ１１０６）。ＯＳ２３１−ｉは、２次キャッシュ２０３に供給するクロックの周波数をデフォルトに変更し（ステップＳ１１０７）、ステップＳ１１２３へ移行する。
【００７６】
ステップＳ１１０５において、ＯＳ２３１−ｉは、すべてのＣＰＵで依存関係があると判断しなかった場合（ステップＳ１１０５：Ｎｏ）、ステップＳ１１１２へ移行する。ステップＳ１１０３において、ＯＳ２３１−ｉは、第１のスレッドと他のＣＰＵで実行中のスレッドとに依存関係がないと判断した場合（ステップＳ１１０３：Ｎｏ）、第１のスレッドのメモリアクセス頻度＞所定頻度であるか否かを判断する（ステップＳ１１０８）。所定頻度は第１閾値である。ＯＳ２３１−ｉは、第１のスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１１０８：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、第１のスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１１０８：Ｙｅｓ）、第１のスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１１０９）。所定負荷量は第２閾値である。
【００７７】
ＯＳ２３１−ｉは、第１のスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１１０９：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、第１のスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１１０９：Ｙｅｓ）、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する（ステップＳ１１１０）。ＯＳ２３１−ｉは、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であると判断した場合（ステップＳ１１１０：Ｙｅｓ）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと判断した場合（ステップＳ１１１０：Ｎｏ）、判断部６０２−ｉにより、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１１１１）。
【００７８】
ＯＳ２３１−ｉは、直接的または間接的に依存関係のあるＣＰＵごとにグループ化し（ステップＳ１１１２）、ＣＰＵグループ数ＧＣを決定する（ステップＳ１１１３）。ＯＳ２３１−ｉは、グループ化したＣＰＵごとに該ＣＰＵへ供給するクロックの位相を変更し（ステップＳ１１１４）、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１１１５）、ステップＳ１１２３へ移行する。
【００７９】
ステップＳ１１０２のＮｏ、ステップＳ１１０８のＮｏ、またはステップＳ１１０９のＮｏのつぎに、ＯＳ２３１−ｉは、比較部６０３−ｉにより、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度であるかを判断する（ステップＳ１１１６）。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１１１６：Ｎｏ）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１１１６：Ｙｅｓ）、ステップＳ１１１７へ移行する。
【００８０】
ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１１１７）。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１１１７：Ｎｏ）、ステップＳ１１２３へ移行する。
【００８１】
ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１１１７：Ｙｅｓ）、ＣＰＵグループ数ＧＣをデクリメントする（ステップＳ１１１８）。ＯＳ２３１−ｉは、他のＣＰＵで実行中のスレッド間の依存関係を確認し（ステップＳ１１１９）、減らしたＣＰＵグループ数ＧＣと依存関係に沿ってＣＰＵ２０１をグループ化する（ステップＳ１１２０）。たとえば、依存関係に沿ってＣＰＵ数が均等になるようにＣＰＵグループ数ＧＣ分のグループを作成することとしてもよい。
【００８２】
ＯＳ２３１−ｉは、グループ化したＣＰＵごとに該ＣＰＵへ供給するクロックの位相を変更する（ステップＳ１１２１）。ＯＳ２３１−ｉは、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１１２２）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、実行部６０６−ｉにより、第１のスレッドを実行し（ステップＳ１１２３）、ステップＳ１１０１へ戻る。ステップＳ１１２３は、ステップＳ１１０１のディスパッチ、ステップＳ１１０７、ステップＳ１１１０のＹｅｓ、ステップＳ１１１５、ステップＳ１１１６のＮｏ、ステップＳ１１１７のＮｏ、またはステップＳ１１２２のつぎに実行される。
【００８３】
（ＯＳ２３１−１によるスレッド処理手順）
図１３および図１４は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャートである。ＯＳ２３１−１が、受付部６０１−ｉにより、スレッドの生成を受け付けたか否かを判断する（ステップＳ１３０１）。ＯＳ２３１−１が、スレッドの生成を受け付けていないと判断した場合（ステップＳ１３０１：Ｎｏ）、ステップＳ１３０１へ戻る。
【００８４】
ＯＳ２３１−１が、スレッドの生成を受け付けたと判断した場合（ステップＳ１３０１：Ｙｅｓ）、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係があるか否かを判断する（ステップＳ１３０２）。ＯＳ２３１−１が、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係があると判断した場合（ステップＳ１３０２：Ｙｅｓ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１３０３）。ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係があるか否かを判断する（ステップＳ１３０４）。ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係がないと判断した場合（ステップＳ１３０４：Ｎｏ）、ステップＳ１３１３へ移行する。
【００８５】
ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係があると判断した場合（ステップＳ１３０４：Ｙｅｓ）、すべてのＣＰＵに供給するクロックの位相を同一位相に変更する（ステップＳ１３０５）。ＯＳ２３１−１が、２次キャッシュ２０３に供給するクロックの周波数をデフォルトに変更し（ステップＳ１３０６）、負荷が最小のＣＰＵに生成されたスレッドを割り当て（ステップＳ１３０７）、ステップＳ１３０１へ戻る。負荷が最小のＣＰＵについては、まず、ＯＳ２３１−１が、割当テーブル５００を用いて各ＣＰＵに割り当てられているスレッドを特定する。ＯＳ２３１−１が、アプリケーションテーブル４００を参照し、特定したスレッドの負荷量を検索する。ＯＳ２３１−１が、ＣＰＵごとに割当済のスレッドの検索した負荷量の合計値を算出し、合計値が最小のＣＰＵを負荷が最小のＣＰＵとして特定する。
【００８６】
ＯＳ２３１−１が、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係がないと判断した場合（ステップＳ１３０２：Ｎｏ）、生成されたスレッドのメモリアクセス頻度＞所定頻度であるか否かを判断する（ステップＳ１３０８）。ＯＳ２３１−１が、生成されたスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１３０８：Ｎｏ）、ステップＳ１３１１へ移行する。
【００８７】
ＯＳ２３１−１が、生成されたスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１３０８：Ｙｅｓ）、生成されたスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１３０９）。ＯＳ２３１−１が、生成されたスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１３０９：Ｎｏ）、ステップＳ１３１１へ移行する。
【００８８】
ＯＳ２３１−１が、生成されたスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１３０９：Ｙｅｓ）、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する（ステップＳ１３１０）。ＯＳ２３１−１が、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であると判断した場合（ステップＳ１３１０：Ｙｅｓ）、ステップＳ１３１１へ移行する。ステップＳ１３０８のＮｏ、ステップＳ１３０９のＮｏ、またはステップＳ１３１０のＹｅｓのつぎに、ＯＳ２３１−１が、負荷が最小のＣＰＵに生成されたスレッドを割り当て（ステップＳ１３１１）、ステップＳ１３０１へ戻る。
【００８９】
ステップＳ１３１０において、ＯＳ２３１−１が、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと判断した場合（ステップＳ１３１０：Ｎｏ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１３１２）。ＯＳ２３１−１が、直接的または間接的に依存関係のあるＣＰＵごとにグループ化し（ステップＳ１３１３）、ＣＰＵグループ数ＧＣとグループ化されたＣＰＵに基づいて、各ＣＰＵへ供給するクロックの位相を変更する（ステップＳ１３１４）。ＯＳ２３１−１が、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１３１５）、ステップＳ１３０１へ戻る。
【００９０】
（クロック生成回路２０４による変更処理手順）
図１５は、クロック生成回路２０４による変更処理手順の一例を示すフローチャートである。まず、クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けたか否かを判断する（ステップＳ１５０１）。制御命令とは、たとえば、制御信号ＣＰＵＣＴＲＬ１からＣＰＵＣＴＲＬ４のいずれかの「００００」から変更値への変化である。
【００９１】
クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けたと判断した場合（ステップＳ１５０１：Ｙｅｓ）、制御信号を変更し（ステップＳ１５０２）、ステップＳ１５０１へ戻る。ここで、制御信号とは、たとえば、制御信号ＣＴＲＬ１からＣＴＲＬ４や制御信号ＲＡＴＥである。クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けていないと判断した場合（ステップＳ１５０１：Ｎｏ）、ステップＳ１５０１へ戻る。
【００９２】
以上説明したように、スレッド処理方法、およびスレッド処理システムによれば、第１のＣＰＵで実行される第１のスレッドと第２のＣＰＵで実行される第２のスレッドに依存関係がないかを判断する。第１のスレッドと第２のスレッドとに依存関係がなく、かつ第１のスレッドの共有資源へのアクセス頻度が所定頻度以上であれば、第１のＣＰＵへ供給するクロックの位相を第２のＣＰＵへ供給するクロックの位相と異なる位相に変更する。
【００９３】
第１のスレッドのアクセス頻度が多いほど、第１のスレッドから共有資源へのアクセスが第２のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各ＣＰＵへ供給されるクロックの位相が異なることで、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。また、ＣＰＵへ供給されるクロックの位相が異なることで、ピーク電流を減少させることができる。
【００９４】
また、第１のＣＰＵへ供給されるクロックの位相と第２のＣＰＵに供給されるクロックの位相とが逆相となるように変更することにより、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。
【００９５】
また、第１のＣＰＵへ供給されるクロックの位相を変更するとともに、複数のＣＰＵへ供給するクロックの周波数を上げるのではなく、共有資源へのクロックの周波数を上げる。これにより、消費電力を抑制しつつ、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、マルチコアプロセッサシステムの性能を向上させることができる。
【００９６】
また、共有資源に供給されるクロックの周波数を第１のＣＰＵへ供給されるクロックの周波数の２倍に変更する。複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、複数のＣＰＵから共有資源へのアクセスの集中により発生する待ち時間を削減することができる。
【００９７】
また、第１のスレッドを実行するときの負荷量を第２閾値と比較し、負荷量が第２閾値よりも大きいときに、依存関係を判断する。第１のスレッドの負荷量が大きいほど、第１のスレッドから共有資源へのアクセスが第２のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各ＣＰＵへ供給されるクロックの位相が異なることで、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、最小限に消費電力を抑制することができる。
【００９８】
また、第１のスレッドと第２のスレッドとに依存関係があるときは、第１のＣＰＵへ供給されるクロックの位相を変更しない。これにより、第１のスレッドと第２のスレッドとで共有しているデータや排他制御に影響が生じるのを防止することができる。
【００９９】
また、依存関係がないとき、第１動作クロックの第１位相から第２位相への変更がされている場合、第１動作クロックの位相を第２位相から第１位相に変更する。これにより、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。
【０１００】
また、依存関係は、共有メモリまたは第１プロセッサのメモリに登録される。これにより、第１のスレッドと第２のスレッドとの依存関係を容易に判断することができ、処理時間を短縮化することができる。
【０１０１】
また、依存関係があるスレッドを実行中のＣＰＵ群ごとにグループ化する。グループ化したＣＰＵ群が複数ある場合、ＣＰＵ群ごとに該ＣＰＵ群へ供給されるクロックの位相を異なるＣＰＵ群間で非同期となる位相に設定する。共有資源へ供給するクロックの周波数をいずれのＣＰＵ群とも同期する周波数に設定する。これにより、マルチコアプロセッサのＣＰＵ数が増加しても、アクセスの衝突を減少させることができ、マルチコアプロセッサの性能を向上させることができる。
【０１０２】
なお、本実施の形態で説明したスレッド処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド処理プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド処理プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１０３】
２００  マルチコアプロセッサシステム
２０１−１〜２０１−４  ＣＰＵ
２０３  ２次キャッシュ
２０４  クロック生成回路
２０８  共有メモリ
４００  アプリケーションテーブル
【図１】
2012144011.tif 000003
【図２】
2012144011.tif 000004
【図３】
2012144011.tif 000005
【図４】
2012144011.tif 000006
【図５】
2012144011.tif 000007
【図６】
2012144011.tif 000008
【図７】
2012144011.tif 000009
【図８】
2012144011.tif 000010
【図９】
2012144011.tif 000011
【図１０】
2012144011.tif 000012
【図１１】
2012144011.tif 000013
【図１２】
2012144011.tif 000014
【図１３】
2012144011.tif 000015
【図１４】
2012144011.tif 000016
【図１５】
2012144011.tif 000017
【手続補正書】
【提出日】平成25年10月23日(2013.10.23)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１スレッドの実行命令を第１プロセッサに供給し、
前記第１スレッドと第２プロセッサで実行される第２スレッドとの依存関係を判断し、
前記第１スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第１閾値と比較し、
前記アクセス頻度が第１閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理方法。
【請求項２】
前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする請求項１に記載のスレッド処理方法。
【請求項３】
前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする請求項１または請求項２に記載のスレッド処理方法。
【請求項４】
前記動作クロックの周波数を２倍に変更すること、
を特徴とする請求項３に記載のスレッド処理方法。
【請求項５】
前記第１スレッドを実行するときの第１負荷を第２閾値と比較し、
前記第１負荷が前記第２閾値よりも大きく、前記アクセス頻度が第１閾値よりも大きく、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする請求項１乃至請求項４の何れか一に記載のスレッド処理方法。
【請求項６】
前記依存関係があるときは、前記第１動作クロックの位相を変更しないこと、
を特徴とする請求項１乃至請求項５の何れか一に記載のスレッド処理方法。
【請求項７】
前記依存関係がないとき、前記第１動作クロックの第１位相から第２位相へ変更されていた場合には、前記第１動作クロックの位相を前記第２位相から前記第１位相に変更すること、
を特徴とする請求項１乃至請求項６の何れか一に記載のスレッド処理方法。
【請求項８】
前記依存関係は、前記共有メモリまたは前記第１プロセッサのメモリに登録されること、
を特徴とする請求項１乃至請求項７の何れか一に記載のスレッド処理方法。
【請求項９】
第１プロセッサと、
前記第１プロセッサと第２プロセッサとがアクセス可能な共有メモリまたは共有キャッシュメモリと、
前記第１プロセッサまたは前記共有メモリに供給される動作クロックを制御するクロック制御ユニットと、
を含み、
前記クロック制御ユニットは、
前記第１プロセッサで実行される第１スレッドの前記共有メモリまたは前記共有キャッシュメモリへのアクセス頻度と第１閾値との比較結果と前記第１スレッドと前記第２プロセッサが実行する第２スレッドとの依存関係とに基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理システム。
【請求項１０】
前記クロック制御ユニットは、前記比較結果が前記アクセス頻度が前記第１閾値よりも大きいことを示すとともに前記依存関係があるときに、前記第１動作クロックの位相を変更すること、
を特徴とする請求項９に記載のスレッド処理システム。
【請求項１１】
前記クロック制御ユニットは、前記第１プロセッサが前記第１スレッドを実行するときの第１負荷と第２閾値との比較結果に基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする請求項９または請求項１０に記載のスレッド処理システム。
【請求項１２】
前記クロック制御ユニットは、前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする請求項９乃至請求項１１の何れか一に記載のスレッド処理システム。
【請求項１３】
前記クロック制御ユニットは、前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする請求項９乃至請求項１１の何れか一に記載のスレッド処理システム。
【請求項１４】
前記クロック制御ユニットは、前記動作クロックの周波数を２倍に変更すること、
を特徴とする請求項１３に記載のスレッド処理システム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッドを処理するスレッド処理方法、およびスレッド処理システムに関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムでは、複数のＣＰＵが複数のスレッドを動作させる。メモリやバスなどの複数のＣＰＵで共有する共有資源では、複数のＣＰＵから同時にアクセスを受け付ける場合がある。共有資源では、たとえば、同時に複数のアクセスに関する処理を行うことができないため、各アクセスの優先度を判断し、アクセスに関する処理を順に行っている。
【０００３】
また、フォールトトレラントシステムにおいて、故障モードになると、すべてのＣＰＵの動作を同一にする技術が知られている。すなわち、複数のＣＰＵから共有資源へのアクセスが競合するが、共有資源の同一のデータにアクセスする。そこで、マスタＣＰＵには共有資源へアクセスさせ、スレーブＣＰＵには共有資源へアクセスさせずに、マスタＣＰＵのアクセス結果をスレーブＣＰＵに返すために、マスタＣＰＵに供給されるクロックの位相と逆位相のクロックをスレーブＣＰＵに供給させる。そして、スレーブＣＰＵから共有資源へのアクセスのタイミングをマスタＣＰＵから共有資源へのアクセスのタイミングよりも遅らせる技術が知られている（たとえば、特許文献１参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２００８−５１８３１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、故障モードでない場合に、共有資源へ同時に２つのアクセスが発生した場合、いずれか一方のアクセスに関する処理は待機させられることになるという問題点がある。
【０００６】
本発明は、上述した従来技術による問題点を解消するため、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができるスレッド処理方法、およびスレッド処理システムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、第１スレッドの実行命令を第１プロセッサに供給し、前記第１スレッドと第２プロセッサで実行される第２スレッドとの依存関係を判断し、前記第１スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第１閾値と比較し、前記アクセス頻度が第１閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更するスレッド処理方法、およびスレッド処理システムが提案される。
【発明の効果】
【０００８】
本発明の一側面によれば、共有資源へのアクセスが衝突することを減少させることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本発明の一実施例を示す説明図である。
【図２】図２は、マルチコアプロセッサシステムの一例を示すブロック図である。
【図３】図３は、クロック生成回路２０４の一例を示している。
【図４】図４は、アプリケーションテーブルの一例を示す説明図である。
【図５】図５は、割当テーブルの一例を示す説明図である。
【図６】図６は、ＯＳ２３１−ｉの機能例を示すブロック図である。
【図７】図７は、例１を示す説明図である。
【図８】図８は、例２を示す説明図である。
【図９】図９は、例３を示す説明図である。
【図１０】図１０は、例４を示す説明図である。
【図１１】図１１は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャート（その１）である。
【図１２】図１２は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャート（その２）である。
【図１３】図１３は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャート（その１）である。
【図１４】図１４は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャート（その２）である。
【図１５】図１５は、クロック生成回路２０４による変更処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に添付図面を参照して、本発明にかかるスレッド処理方法、およびスレッド処理システムの実施の形態を詳細に説明する。本実施の形態では、スレッド処理システムの一例として、マルチコアプロセッサシステムを挙げる。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００１１】
図１は、本発明の一実施例を示す説明図である。第１のＯＳが、（１）第１のスレッドを第１のＣＰＵへディスパッチする。第１のＯＳが、（２）第１のスレッドの共有資源へのアクセス頻度を第１閾値と比較する。ここで、共有資源には、たとえば、共有メモリ、共有キャッシュメモリやバスなどが挙げられる。第１のＯＳが、（３）第１のスレッドと第２のＣＰＵで実行中の第２のスレッドとの依存関係を判断する。ここで、スレッドは、周知のようにアプリケーションプログラム内での処理の実行単位である。依存関係があるとは、たとえば、第１のスレッドと第２のスレッドとでデータを共有している場合が挙げられる。たとえば、ＣＰＵ間でキャッシュコヒーレントを取るか否かをアプリケーションの設計時に設計者があらかじめ解析しておくこととする。
【００１２】
第１のＯＳが、（４）アクセス頻度が第１閾値よりも大きいと判断し、かつ依存関係がない（×印）と判断した場合、第１のＣＰＵへ供給されるクロックの位相と第２のＣＰＵへ供給されるクロックの位相とが逆相となるようにクロック生成回路の設定を変更する。第１のＯＳが、（４）共有資源へ供給されるクロックの周波数を第１のＣＰＵへ供給されるクロックの周波数の２倍になるようにクロック生成回路の設定を変更する。
【００１３】
たとえば、第１のＣＰＵと第２のＣＰＵと共有資源とがクロックの立ち上がりエッジで処理が行われるとすると、第１のＣＰＵと第２のＣＰＵとの共有資源へのアクセスが衝突しない。
【００１４】
（マルチコアプロセッサシステム）
図２は、マルチコアプロセッサシステムの一例を示すブロック図である。マルチコアプロセッサシステム２００は、ＣＰＵ２０１−１〜２０１−Ｎ（ここでは、Ｎ＝４を例に挙げている。）と、スヌープ回路２０２と、２次キャッシュ２０３と、クロック生成回路２０４と、を有している。さらに、マルチコアプロセッサシステム２００は、ディスプレイ２０５と、キーボード２０６と、Ｉ／Ｆ２１２（ＩｎｔｅｒＦａｃｅ）と、メモリコントローラ２０７と、共有メモリ２０８と、を有している。
【００１５】
２次キャッシュ２０３と、クロック生成回路２０４と、ディスプレイ２０５と、キーボード２０６と、Ｉ／Ｆ２１２と、メモリコントローラ２０７とは、バス２１３を介して接続されている。ＣＰＵ２０１−１〜２０１−４は、２次キャッシュ２０３を介して各部に接続されている。共有メモリ２０８は、メモリコントローラ２０７を介して各部に接続されている。
【００１６】
ここで、ＣＰＵ２０１−１〜２０１−４は、それぞれレジスタとコアと１次キャッシュ２２１−１〜２２１−４を有している。コアは、演算機能を有している。各ＣＰＵ内のレジスタは、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）やリセットレジスタを有している。
【００１７】
ＣＰＵ２０１−１はマスタＣＰＵであり、マルチコアプロセッサシステム２００の全体の制御を司り、ＯＳ２３１−１を実行する。ＯＳ２３１−１はマスタＯＳであり、ＣＰＵ２０１−１に割り当てられたスレッドを実行する。ＯＳ２３１−１はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのＣＰＵ２０１に割り当てるかを制御する機能を有している。スケジューラはＣＰＵ２０１−１に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００１８】
ＣＰＵ２０１−２〜２０１−４はスレーブＣＰＵであり、それぞれＯＳ２３１−２〜２３１−４を実行する。ＯＳ２３１−２〜２３１−４はスレーブＯＳであり、それぞれＣＰＵ２０１−２〜２０１−４に割り当てられたスレッドを実行する。ＯＳ２３１−２〜２３１−４はそれぞれスケジューラを有し、各スケジューラはそれぞれＣＰＵ２０１−２〜２０１−４に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００１９】
ここで、ＯＳ２３１−１〜２３１−４はそれぞれランキュー２４１−１〜２４１−４を有し、ランキュー２４１−１〜２４１−４にはＣＰＵ２０１−１〜２０１−４のそれぞれに割り当てられたアプリケーションのコンテキスト情報のポインタが積まれる。コンテキスト情報とは、たとえば、ロードされたアプリケーションの実行状態や該アプリケーション内の変数などが含まれる情報である。ＯＳ２３１−１〜２３１−４はそれぞれランキュー２４１−１〜２４１−４内のコンテキスト情報のポインタを取得し、アプリケーションのコンテキスト情報にアクセスすることで、アプリケーションを直ぐに実行することができる。
【００２０】
１次キャッシュ２２１−１〜２２１−４は、それぞれキャッシュメモリとキャッシュコントローラとを有している。１次キャッシュ２２１−１〜２２１−４はそれぞれＯＳ２３１−１〜２３１−４が実行するスレッドから共有メモリ２０８への書込処理を一時的に記憶する。また、１次キャッシュ２２１−１〜２２１−４は、共有メモリ２０８から読み出されたデータを一時的に記憶する。
【００２１】
スヌープ回路２０２は、１次キャッシュ２２１−１〜２２１−４で共有するデータがいずれかの１次キャッシュ２２１で更新された場合、該更新を検出し、他の１次キャッシュ２２１も更新する。
【００２２】
２次キャッシュ２０３は、キャッシュメモリとキャッシュコントローラとを有している。２次キャッシュ２０３では、１次キャッシュ２２１−１〜２２１−４から追い出されたデータを記憶する。２次キャッシュ２０３では、ＯＳ２３１−１〜ＯＳ２３１−４で共有するデータを記憶する。２次キャッシュ２０３は、１次キャッシュ２２１−１〜２２１−４よりも、記憶容量が大きくかつＣＰＵ２０１−１〜２０１−４からのアクセス速度が遅い。２次キャッシュ２０３は共有メモリ２０８より、記憶容量が小さくかつＣＰＵ２０１−１〜２０１−４からのアクセス速度が速い。
【００２３】
ディスプレイ２０５は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０５は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。キーボード２０６は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０６は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００２４】
Ｉ／Ｆ２１２は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワークに接続され、ネットワークを介して他の装置に接続される。そして、Ｉ／Ｆ２１２は、ネットワークと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２１２には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２５】
メモリコントローラ２０７は、共有メモリ２０８へのアクセスを制御する。共有メモリ２０８は、たとえば、ＲＡＭ２０９（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ＲＯＭ２１０（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、フラッシュＲＯＭ２１１を有している。ＲＯＭ２１０は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０９は、各ＣＰＵのワークエリアとして使用される。フラッシュＲＯＭ２１１は、ＯＳ２３１−１〜２３１−４などのシステムソフトウェアやアプリケーションのプログラムを記憶している。ＲＡＭ２０９はフラッシュＲＯＭ２１１よりも各ＣＰＵからのアクセス速度が速い。各ＯＳがアプリケーションのプログラムをフラッシュＲＯＭ２１１からＲＡＭ２０９へロードすることにより、該アプリケーションのコンテキスト情報がＲＡＭ２０９内に展開される。
【００２６】
クロック生成回路２０４は、各部にクロックを供給する。クロックＣＬＫが発振回路や外部から入力される基準クロックである。クロックＣＬＫ１〜ＣＬＫ４がそれぞれＣＰＵ２０１−１〜２０１−４へ供給されるクロックである。クロックＣＬＫ−２ＣＭが２次キャッシュ２０３へ供給されるクロックである。また、メモリコントローラ２０７、共有メモリ２０８、バス２１３、Ｉ／Ｆ２１２、ディスプレイ２０５やキーボード２０６などにもクロック生成回路２０４からクロックが共有されているが、図では配線を省略している。
【００２７】
たとえば、制御信号ＣＰＵＣＴＲＬ１と、制御信号ＣＰＵＣＴＲＬ２と、制御信号ＣＰＵＣＴＲＬ３と、制御信号ＣＰＵＣＴＲＬ４とに応じて、各ＣＰＵへ供給されるクロックの位相と２次キャッシュ２０３へ供給されるクロックの周波数が決定される。
【００２８】
図３は、クロック生成回路２０４の一例を示している。クロック生成回路２０４は、制御決定回路３０１と、選択回路３０２と、インバータ３０３と、１２０°遅延回路３０４と、９０°遅延回路３０５と、選択回路３０６と、インバータ３０７と、１２０°遅延回路３０８と、を有している。クロック生成回路２０４は、９０°遅延回路３０９と、選択回路３１０と、インバータ３１１と、９０°遅延回路３１２と、逓倍回路３１３と、を有している。
【００２９】
インバータ３０３は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。インバータ３０７は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。インバータ３１１は、クロックＣＬＫを反転して出力することにより、クロックＣＬＫと逆相のクロックを出力する。
【００３０】
１２０°遅延回路３０４は、クロックＣＬＫの位相を１２０°ずらす。１２０°遅延回路３０８は、１２０°遅延回路３０４から出力されるクロックの位相を１２０°ずらす。９０°遅延回路３０５は、クロックＣＬＫの位相を９０°ずらす。９０°遅延回路３０９は、９０°遅延回路３０５から出力されるクロックの位相を９０°ずらす。９０°遅延回路３１２は、９０°遅延回路３０９から出力されるクロックの位相を９０°ずらす。
【００３１】
選択回路３０２は、制御信号ＣＴＲＬ２の値に応じてＣＰＵ２０１−２に供給するクロックを選択する。選択回路３０２では、制御信号ＣＴＲＬ２が「１」の場合、クロックＣＬＫが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３０２では、制御信号ＣＴＲＬ２が「４」の場合、クロックＣＬＫの位相が９０°ずらされたクロックが選択される。
【００３２】
選択回路３０６は、制御信号ＣＴＲＬ３の値に応じてＣＰＵ２０１−３に供給するクロックを選択する。選択回路３０６では、制御信号ＣＴＲＬ３が「１」の場合、クロックＣＬＫが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「４」の場合、クロックＣＬＫの位相が２４０°ずらされたクロックが選択される。選択回路３０６では、制御信号ＣＴＲＬ３が「５」の場合、クロックＣＬＫの位相が１８０°ずらされたクロックが選択される。
【００３３】
選択回路３１０は、制御信号ＣＴＲＬ４の値に応じてＣＰＵ２０１−４に供給するクロックを選択する。選択回路３１０では、制御信号ＣＴＲＬ４が「１」の場合、クロックＣＬＫが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「２」の場合、クロックＣＬＫの位相と逆位相のクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「３」の場合、クロックＣＬＫの位相が１２０°ずらされたクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ４が「４」の場合、クロックＣＬＫの位相が２４０°ずらされたクロックが選択される。選択回路３１０では、制御信号ＣＴＲＬ３が「５」の場合、クロックＣＬＫの位相が２７０°ずらされたクロックが選択される。
【００３４】
逓倍回路３１３は、ＲＡＴＥに応じてクロックＣＬＫを逓倍にする。逓倍回路３１３では、制御信号ＲＡＴＥの値が「１」の場合、クロックＣＬＫがそのまま出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「２」の場合、クロックＣＬＫの周波数の２倍の周波数となるクロックが出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「３」の場合、クロックＣＬＫの周波数の３倍の周波数となるクロックが出力される。逓倍回路３１３では、制御信号ＲＡＴＥの値が「４」の場合、クロックＣＬＫの周波数の４倍の周波数となるクロックが出力される。制御信号ＲＡＴＥの最大値は「４」である。
【００３５】
制御決定回路３０１は、制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４に応じて、各ＣＰＵへ供給されるクロックの位相と２次キャッシュ２０３へ供給されるクロックの周波数を決定する。たとえば、制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４のそれぞれのビット幅が１２ビット（３［ビット］×４［制御信号］）である。制御信号ＣＰＵＣＴＲＬ１から制御信号ＣＰＵＣＴＲＬ４はそれぞれ上位３ビットごとに順に制御信号ＣＴＲＬ２の値、制御信号ＣＴＲＬ３の値、制御信号ＣＴＲＬ４の値、制御信号ＲＡＴＥの値を示していることとする。
【００３６】
たとえば、ＯＳ２３１−１が、通常時には制御信号ＣＰＵＣＴＲＬ１を「００００（１０進表記）」に設定し、各ＣＰＵへ供給するクロックの位相や２次キャッシュ２０３へ供給するクロックの周波数を変更する際に変化させる。たとえば、制御信号ＣＰＵＣＴＲＬ１の値が「１２３４（１０進表記）」に変化させられると、制御決定回路３０１により、制御信号ＣＴＲＬ１の値が「１」となり、制御信号ＣＴＲＬ２の値が「２」となることとする。さらに、制御決定回路３０１により、制御信号ＣＴＲＬ３の値が「３」となり、制御信号ＲＡＴＥの値が「４」となることとする。また、制御決定回路３０１は、制御信号ＣＰＵＣＴＲＬ１〜ＣＰＵＣＴＲＬ４の「００００」から変更値への変化は検出するが、変更値から「００００」への変化は検出しないこととする。
【００３７】
（アプリケーションテーブル）
図４は、アプリケーションテーブルの一例を示す説明図である。アプリケーションテーブル４００は、アプリＩＤ、スレッドＩＤ、依存スレッドＩＤ、アクセス頻度、負荷量のフィールドを有している。
【００３８】
アプリＩＤのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドＩＤのフィールドには、各スレッドを識別するための識別情報が登録される。依存スレッドＩＤのフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドと依存関係のあるスレッドの識別情報が登録される。
【００３９】
アクセス頻度のフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドから２次キャッシュ２０３への単位時間あたりのアクセス回数が登録される。負荷量のフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドの単位時間当たりの実行時間の比率が登録される。アクセス頻度や負荷量は、各スレッドのコンパイル時の解析およびシミュレーション結果に基づいて登録される。
【００４０】
フィールドに情報が設定されることで、アプリ情報（たとえば、アプリ情報４０１−１〜４０１−４）がレコードとして記憶されている。アプリケーションテーブル４００は、ＲＡＭ２０９、ＲＯＭ２１０、フラッシュＲＯＭ２１１などの記憶装置に記憶されている。さらに、２次キャッシュ２０３や１次キャッシュ２２１などに複製されたアプリケーションテーブル４００が記憶されていてもよい。
【００４１】
図５は、割当テーブルの一例を示す説明図である。割当テーブル５００は、アプリＩＤ、スレッドＩＤ、割当先ＣＰＵＩＤのフィールドを有している。アプリＩＤのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドＩＤのフィールドには、各スレッドを識別するための識別情報が登録される。割当先ＣＰＵＩＤのフィールドには、同一レコードのスレッドＩＤのフィールドに識別情報が登録されたスレッドの割当先ＣＰＵの識別情報が登録される。
【００４２】
各フィールドに情報が設定されることで、割当情報（たとえば、割当情報５０１−１〜５０１−５）がレコードとして記憶されている。割当テーブル５００は、ＲＡＭ２０９、ＲＯＭ２１０、フラッシュＲＯＭ２１１などの記憶装置に記憶されている。さらに、２次キャッシュ２０３や１次キャッシュ２２１などに複製されたアプリケーションテーブル４００が記憶されていてもよい。
【００４３】
（ＯＳ２３１−ｉ（ｉ＝１〜４）の機能例）
図６は、ＯＳ２３１−ｉの機能例を示すブロック図である。ＯＳ２３１−ｉは、受付部６０１−ｉと、判断部６０２−ｉと、比較部６０３−ｉと、グループ化設定部６０４−ｉと、変更部６０５−ｉと、実行部６０６−ｉと、を有している。受付部６０１−ｉから変更部６０５−ｉを有するＯＳ２３１−ｉがフラッシュＲＯＭ２１１などのストレージに記憶されている。ＣＰＵ２０１−ｉが該記憶装置にアクセスして該ＯＳ２３１−ｉを読み出し、該ＯＳ２３１−ｉ内にコーディングされている処理を実行することにより、該受付部６０１−ｉから実行部６０６−ｉの処理が実行される。ここでは、ｉ＝１を例に挙げて説明する。
【００４４】
受付部６０１−１は、イベントを受け付ける。マスタＯＳが受け付けるイベントとしては、スレッドの生成、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。スレーブＯＳが受け付けるイベントとしては、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。ここでは、イベントがスレッドの切り替えの場合を例に挙げて説明する。
【００４５】
受付部６０１−１は、スレッドの切り替えを受け付け、判断部６０２−１は、受付部６０１−１により切り替えが受け付けられたスレッド（第１のスレッド）と他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があるか否かを判断する。
【００４６】
たとえば、判断部６０２−１は、アプリケーションテーブル４００から、第１のスレッドのＩＤをスレッドＩＤのフィールドに有するアプリ情報を検出する。たとえば、判断部６０２−１は、検出したアプリ情報の依存スレッドＩＤのフィールドに登録されているスレッドのＩＤを特定する。これにより、第１のスレッドと依存関係のあるスレッドのＩＤが特定される。
【００４７】
たとえば、判断部６０２−１は、プロセッサ間通信機能により他のＯＳ２３１から、実行中のスレッドのＩＤを取得する。たとえば、判断部６０２−１は、特定したスレッドのＩＤと取得したスレッドのＩＤとを比較する。これにより、第１のスレッドと他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があるか否かが判断される。なお、判断結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００４８】
比較部６０３−１は、第１のスレッドがいずれのＣＰＵ２０１で実行中のスレッドとも依存関係がないと判断部６０２−１により判断された場合、第１のスレッドの２次キャッシュ２０３へのアクセス頻度を第１閾値と比較する。
【００４９】
たとえば、比較部６０３−１は、アプリケーションテーブル４００から、第１のスレッドのＩＤをスレッドＩＤのフィールドに有するアプリ情報を検出する。たとえば、比較部６０３−１は、検出したアプリ情報のアクセス頻度のフィールドに登録されたアクセス頻度を特定する。たとえば、比較部６０３−１は、特定したアクセス頻度が第１閾値以上であるか否かを判断する。これにより、第１のスレッドの２次キャッシュ２０３へのアクセス頻度が第１閾値以上であるか否かが判断される。
【００５０】
比較部６０３−１は、第１のスレッドの２次キャッシュ２０３へのアクセス頻度が第１閾値以上であると判断した場合、第１のスレッドの負荷量を第２閾値と比較する。たとえば、比較部６０３−１は、検出したアプリ情報の負荷量のフィールドに登録された第１のスレッドの負荷量が、第２閾値以上であるか否かを判断する。
【００５１】
比較部６０３−１は、第１のスレッドの負荷量が第２閾値以上であると判断した場合、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する。たとえば、比較部６０３−１は、制御信号ＲＡＴＥの値をクロック生成回路２０４から取得し、制御信号ＲＡＴＥの値が最大値であるか否かを判断する。上述最大値は４である。
【００５２】
判断部６０２−１は、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと比較部６０３−１により判断された場合、ＣＰＵ２０１−１を除く残余のＣＰＵで実行中のスレッド間に依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部６０２−１は、ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドとに依存関係があるか否かを判断する。具体的な判断方法については、ＣＰＵ２０１−１で実行中のスレッドと、ＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドとの依存関係の有無を判断した処理と同一処理であるため、詳細な説明は省略する。なお、判断結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００５３】
（例１）
図７は、例１を示す説明図である。図７では、丸印の中に符号が付されているものが、各符号に即したＣＰＵ２０１で実行中のスレッドを示している。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。そのため、図７では、ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドとを結ぶ矢印間に×印が付されている。
【００５４】
図７では、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは依存関係がなく、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。
【００５５】
グループ化設定部６０４−１は、依存関係に応じてＣＰＵをグループ化する。ここで、１グループは、１ＣＰＵ以上であり、直接的または間接的に依存関係があるスレッドを実行中のＣＰＵを１グループとする。たとえば、グループ化設定部６０４−１が、各ＣＰＵを異なるグループに設定する。ＣＰＵ２０１−１はグループＧ１に属し、ＣＰＵ２０１−２はグループＧ２に属し、ＣＰＵ２０１−３はグループＧ３に属し、ＣＰＵ２０１−４はグループＧ４に属する。ＣＰＵグループ数ＧＣは４である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００５６】
変更部６０５−１は、グループ化の設定結果に応じて各ＣＰＵへ供給するクロックの位相を変更し、ＣＰＵグループ数ＧＣに応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「４５５４」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「４」にし、制御信号ＣＴＲＬ３の値を「５」にし、制御信号ＣＴＲＬ４の値を「５」にし、制御信号ＲＡＴＥの値を「４」にする。
【００５７】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも９０°（＝３６０°／Ｇ）ずらされた位相のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも９０°ずらされた位相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−３へ供給されるクロックの位相よりも９０°ずらされた位相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の４倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。すなわち、グループ間で供給されるクロックが非同期となり、クロックＣＬＫ−２ＣＭの周波数がいずれのグループとも同期する周波数となる。
【００５８】
（例２）
図８は、例２を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは依存関係がない。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは依存関係がない。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは直接的に依存関係がある。×印の矢印間は、依存関係がないことを示し、○印の矢印間は、依存関係があることを示している。
【００５９】
グループ化設定部６０４−１は、ＣＰＵ２０１−１をグループＧ１にし、ＣＰＵ２０１−２をグループＧ２にし、ＣＰＵ２０１−３とＣＰＵ２０１−４をグループＧ３にする。ＣＰＵグループ数ＧＣは３である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００６０】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、グループ数に応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「３４４３」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「３」にし、制御信号ＣＴＲＬ３の値を「４」にし、制御信号ＣＴＲＬ４の値を「４」にし、制御信号ＲＡＴＥの値を「３」にする。
【００６１】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも１２０°（＝３６０°／ＣＰＵグループ数ＧＣ＝３６０°／３）ずらされた位相のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも１２０°ずらされた位相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相よりも１２０°ずらされた位相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の３倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００６２】
（例３）
図９は、例３を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２〜２０１−４のそれぞれで実行中のスレッドには依存関係がない。図９では、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドには依存関係がある。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドには依存関係がある。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドには直接的に依存関係がないが、ＣＰＵ２０１−３を介して間接的に依存関係がある。
【００６３】
グループ化設定部６０４−１は、ＣＰＵ２０１−１をグループＧ１にし、ＣＰＵ２０１−２とＣＰＵ２０１−３とＣＰＵ２０１−４をグループＧ２にする。ＣＰＵグループ数ＧＣは２である。
【００６４】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、グループ数に応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「２２２２」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「２」にし、制御信号ＣＴＲＬ３の値を「２」にし、制御信号ＣＴＲＬ４の値を「２」にし、制御信号ＲＡＴＥの値を「２」にする。
【００６５】
これにより、ＣＰＵ２０１−１へ供給されるクロックの位相よりも１８０°（＝３６０°／Ｇ）ずらされた位相（逆相）のクロックがＣＰＵ２０１−２へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相と逆相のクロックがＣＰＵ２０１−３へ供給される。ＣＰＵ２０１−２へ供給されるクロックの位相と逆相のクロックがＣＰＵ２０１−４へ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数の２倍となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００６６】
（例４）
また、判断部６０２−１は、受付部６０１−１により切り替えが受け付けられた第１のスレッドと他のＣＰＵで実行中のそれぞれのスレッドとに依存関係があると判断した場合、すべてのＣＰＵで実行中のスレッド間に依存関係があるか否かを判断する。
【００６７】
図１０は、例４を示す説明図である。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−２で実行中のスレッドは直接的に依存関係がある。ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドは直接的に依存関係がある。ＣＰＵ２０１−３で実行中のスレッドとＣＰＵ２０１−４で実行中のスレッドは直接的に依存関係がある。
【００６８】
ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−３で実行中のスレッドは、直接的に依存関係がないが、ＣＰＵ２０１−２で実行中のスレッドを介して間接的に依存関係がある。ＣＰＵ２０１−１で切り替えが発生した第１のスレッドとＣＰＵ２０１−４で実行中のスレッドは、直接的に依存関係がないが、ＣＰＵ２０１−２で実行中のスレッドとＣＰＵ２０１−３で実行中のスレッドを介して間接的に依存関係がある。
【００６９】
たとえば、グループ化設定部６０４−１は、ＣＰＵ２０１−１〜２０１−４をグループＧ１にする。ＣＰＵグループ数ＧＣは１である。なお、グループ化の設定結果は、ＲＡＭ２０９、フラッシュＲＯＭ２１１などの記憶装置に記憶される。
【００７０】
変更部６０５−１は、ＣＰＵグループ数ＧＣに応じて各ＣＰＵへ供給するクロックの位相を変更し、ＣＰＵグループ数ＧＣに応じて２次キャッシュ２０３へ供給するクロックの周波数を変更する。たとえば、変更部６０５−１は、制御信号ＣＰＵＣＴＲＬ１の値を０から「１１１１」に変更する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の変化を検出する。クロック生成回路２０４は、制御信号ＣＰＵＣＴＲＬ１の値に基づいて、制御信号ＣＴＲＬ２の値を「１」にし、制御信号ＣＴＲＬ３の値を「１」にし、制御信号ＣＴＲＬ４の値を「１」にし、制御信号ＲＡＴＥの値を「１」にする。
【００７１】
これにより、クロックＣＬＫと同相のクロックが各ＣＰＵへ供給される。クロックＣＬＫ−２ＣＭの周波数がクロックＣＬＫの周波数と同一となる。そして、実行部６０６−１は、変更部６０５−１による変更が終了後、第１のスレッドを実行する。
【００７２】
（ＯＳ２３１−ｉによるスレッド処理手順）
図１１および図１２は、ＯＳ２３１−ｉによるスレッド処理手順の一例を示すフローチャートである。ＯＳ２３１−ｉは、受付部６０１−ｉにより、イベントの発生を受け付けたか否かを判断する（ステップＳ１１０１）。ＯＳ２３１−ｉは、イベントの発生を受け付けていないと判断した場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１１０１へ戻る。ＯＳ２３１−ｉは、ディスパッチを受け付けると（ステップＳ１１０１：ディスパッチ）、ステップＳ１１２３へ移行する。
【００７３】
ＯＳ２３１−ｉは、スレッドの実行終了を受け付けたと判断した場合（ステップＳ１１０１：実行終了）、実行待ちのスレッドがあるか否かを判断する（ステップＳ１１０２）。実行待ちのスレッドがあるか否かについては、ランキュー２４１−ｉにコンテキスト情報のポインタが登録されているか否かによって判断される。ＯＳ２３１−ｉは、実行待ちのスレッドがないと判断した場合（ステップＳ１１０２：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、実行待ちのスレッドがあると判断した場合（ステップＳ１１０２：Ｙｅｓ）、ステップＳ１１０３へ移行する。
【００７４】
ステップＳ１１０１において、ＯＳ２３１−ｉは、スレッドのスイッチを受け付けたと判断した場合（ステップＳ１１０１：スイッチ）、ステップＳ１１０３へ移行する。ステップＳ１１０１のスイッチ、またはステップＳ１１０２のＹｅｓのつぎに、ＯＳ２３１−ｉが、判断部６０２−ｉにより、つぎに実行するスレッド（第１のスレッド）と他のＣＰＵで実行中のスレッドとに依存関係があるか否かを判断する（ステップＳ１１０３）。つぎに実行するスレッドとは、スレッドのスイッチの場合にはスイッチ後のスレッドであり、スレッドの実行終了の場合にはランキュー２４１−ｉの先頭にコンテキスト情報のポインタが登録されているスレッドである。
【００７５】
ＯＳ２３１−ｉは、第１のスレッドと他のＣＰＵで実行中のスレッドとに依存関係があると判断した場合（ステップＳ１１０３：Ｙｅｓ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１１０４）。ＯＳ２３１−ｉは、すべてのＣＰＵで直接的または間接的に依存関係があるか否かを判断する（ステップＳ１１０５）。ＯＳ２３１−ｉは、すべてのＣＰＵで依存関係があると判断した場合（ステップＳ１１０５：Ｙｅｓ）、すべてのＣＰＵに供給するクロックの位相を同一位相に変更する（ステップＳ１１０６）。ＯＳ２３１−ｉは、２次キャッシュ２０３に供給するクロックの周波数をデフォルトに変更し（ステップＳ１１０７）、ステップＳ１１２３へ移行する。
【００７６】
ステップＳ１１０５において、ＯＳ２３１−ｉは、すべてのＣＰＵで依存関係があると判断しなかった場合（ステップＳ１１０５：Ｎｏ）、ステップＳ１１１２へ移行する。ステップＳ１１０３において、ＯＳ２３１−ｉは、第１のスレッドと他のＣＰＵで実行中のスレッドとに依存関係がないと判断した場合（ステップＳ１１０３：Ｎｏ）、第１のスレッドのメモリアクセス頻度＞所定頻度であるか否かを判断する（ステップＳ１１０８）。所定頻度は第１閾値である。ＯＳ２３１−ｉは、第１のスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１１０８：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、第１のスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１１０８：Ｙｅｓ）、第１のスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１１０９）。所定負荷量は第２閾値である。
【００７７】
ＯＳ２３１−ｉは、第１のスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１１０９：Ｎｏ）、ステップＳ１１１６へ移行する。ＯＳ２３１−ｉは、第１のスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１１０９：Ｙｅｓ）、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する（ステップＳ１１１０）。ＯＳ２３１−ｉは、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であると判断した場合（ステップＳ１１１０：Ｙｅｓ）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと判断した場合（ステップＳ１１１０：Ｎｏ）、判断部６０２−ｉにより、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１１１１）。
【００７８】
ＯＳ２３１−ｉは、直接的または間接的に依存関係のあるＣＰＵごとにグループ化し（ステップＳ１１１２）、ＣＰＵグループ数ＧＣを決定する（ステップＳ１１１３）。ＯＳ２３１−ｉは、グループ化したＣＰＵごとに該ＣＰＵへ供給するクロックの位相を変更し（ステップＳ１１１４）、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１１１５）、ステップＳ１１２３へ移行する。
【００７９】
ステップＳ１１０２のＮｏ、ステップＳ１１０８のＮｏ、またはステップＳ１１０９のＮｏのつぎに、ＯＳ２３１−ｉは、比較部６０３−ｉにより、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度であるかを判断する（ステップＳ１１１６）。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１１１６：Ｎｏ）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１１１６：Ｙｅｓ）、ステップＳ１１１７へ移行する。
【００８０】
ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１１１７）。ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１１１７：Ｎｏ）、ステップＳ１１２３へ移行する。
【００８１】
ＯＳ２３１−ｉは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１１１７：Ｙｅｓ）、ＣＰＵグループ数ＧＣをデクリメントする（ステップＳ１１１８）。ＯＳ２３１−ｉは、他のＣＰＵで実行中のスレッド間の依存関係を確認し（ステップＳ１１１９）、減らしたＣＰＵグループ数ＧＣと依存関係に沿ってＣＰＵ２０１をグループ化する（ステップＳ１１２０）。たとえば、依存関係に沿ってＣＰＵ数が均等になるようにＣＰＵグループ数ＧＣ分のグループを作成することとしてもよい。
【００８２】
ＯＳ２３１−ｉは、グループ化したＣＰＵごとに該ＣＰＵへ供給するクロックの位相を変更する（ステップＳ１１２１）。ＯＳ２３１−ｉは、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１１２２）、ステップＳ１１２３へ移行する。ＯＳ２３１−ｉは、実行部６０６−ｉにより、第１のスレッドを実行し（ステップＳ１１２３）、ステップＳ１１０１へ戻る。ステップＳ１１２３は、ステップＳ１１０１のディスパッチ、ステップＳ１１０７、ステップＳ１１１０のＹｅｓ、ステップＳ１１１５、ステップＳ１１１６のＮｏ、ステップＳ１１１７のＮｏ、またはステップＳ１１２２のつぎに実行される。
【００８３】
（ＯＳ２３１−１によるスレッド処理手順）
図１３および図１４は、ＯＳ２３１−１によるスレッド処理手順の一例を示すフローチャートである。ＯＳ２３１−１が、受付部６０１−ｉにより、スレッドの生成を受け付けたか否かを判断する（ステップＳ１３０１）。ＯＳ２３１−１が、スレッドの生成を受け付けていないと判断した場合（ステップＳ１３０１：Ｎｏ）、ステップＳ１３０１へ戻る。
【００８４】
ＯＳ２３１−１が、スレッドの生成を受け付けたと判断した場合（ステップＳ１３０１：Ｙｅｓ）、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係があるか否かを判断する（ステップＳ１３０２）。ＯＳ２３１−１が、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係があると判断した場合（ステップＳ１３０２：Ｙｅｓ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１３０３）。ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係があるか否かを判断する（ステップＳ１３０４）。ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係がないと判断した場合（ステップＳ１３０４：Ｎｏ）、ステップＳ１３１３へ移行する。
【００８５】
ＯＳ２３１−１が、すべてのＣＰＵで直接的または間接的に依存関係があると判断した場合（ステップＳ１３０４：Ｙｅｓ）、すべてのＣＰＵに供給するクロックの位相を同一位相に変更する（ステップＳ１３０５）。ＯＳ２３１−１が、２次キャッシュ２０３に供給するクロックの周波数をデフォルトに変更し（ステップＳ１３０６）、負荷が最小のＣＰＵに生成されたスレッドを割り当て（ステップＳ１３０７）、ステップＳ１３０１へ戻る。負荷が最小のＣＰＵについては、まず、ＯＳ２３１−１が、割当テーブル５００を用いて各ＣＰＵに割り当てられているスレッドを特定する。ＯＳ２３１−１が、アプリケーションテーブル４００を参照し、特定したスレッドの負荷量を検索する。ＯＳ２３１−１が、ＣＰＵごとに割当済のスレッドの検索した負荷量の合計値を算出し、合計値が最小のＣＰＵを負荷が最小のＣＰＵとして特定する。
【００８６】
ＯＳ２３１−１が、生成されたスレッドが他のＣＰＵで実行中のスレッドと依存関係がないと判断した場合（ステップＳ１３０２：Ｎｏ）、生成されたスレッドのメモリアクセス頻度＞所定頻度であるか否かを判断する（ステップＳ１３０８）。ＯＳ２３１−１が、生成されたスレッドのメモリアクセス頻度＞所定頻度でないと判断した場合（ステップＳ１３０８：Ｎｏ）、ステップＳ１３１１へ移行する。
【００８７】
ＯＳ２３１−１が、生成されたスレッドのメモリアクセス頻度＞所定頻度であると判断した場合（ステップＳ１３０８：Ｙｅｓ）、生成されたスレッドの負荷量＞所定負荷量であるか否かを判断する（ステップＳ１３０９）。ＯＳ２３１−１が、生成されたスレッドの負荷量＞所定負荷量でないと判断した場合（ステップＳ１３０９：Ｎｏ）、ステップＳ１３１１へ移行する。
【００８８】
ＯＳ２３１−１が、生成されたスレッドの負荷量＞所定負荷量であると判断した場合（ステップＳ１３０９：Ｙｅｓ）、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する（ステップＳ１３１０）。ＯＳ２３１−１が、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大であると判断した場合（ステップＳ１３１０：Ｙｅｓ）、ステップＳ１３１１へ移行する。ステップＳ１３０８のＮｏ、ステップＳ１３０９のＮｏ、またはステップＳ１３１０のＹｅｓのつぎに、ＯＳ２３１−１が、負荷が最小のＣＰＵに生成されたスレッドを割り当て（ステップＳ１３１１）、ステップＳ１３０１へ戻る。
【００８９】
ステップＳ１３１０において、ＯＳ２３１−１が、２次キャッシュ２０３へ供給するクロックの周波数の逓倍率が最大でないと判断した場合（ステップＳ１３１０：Ｎｏ）、他のＣＰＵで実行中のスレッド間の依存関係を確認する（ステップＳ１３１２）。ＯＳ２３１−１が、直接的または間接的に依存関係のあるＣＰＵごとにグループ化し（ステップＳ１３１３）、ＣＰＵグループ数ＧＣとグループ化されたＣＰＵに基づいて、各ＣＰＵへ供給するクロックの位相を変更する（ステップＳ１３１４）。ＯＳ２３１−１が、ＣＰＵグループ数ＧＣに基づいて、２次キャッシュ２０３に供給するクロックの周波数を変更し（ステップＳ１３１５）、ステップＳ１３０１へ戻る。
【００９０】
（クロック生成回路２０４による変更処理手順）
図１５は、クロック生成回路２０４による変更処理手順の一例を示すフローチャートである。まず、クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けたか否かを判断する（ステップＳ１５０１）。制御命令とは、たとえば、制御信号ＣＰＵＣＴＲＬ１からＣＰＵＣＴＲＬ４のいずれかの「００００」から変更値への変化である。
【００９１】
クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けたと判断した場合（ステップＳ１５０１：Ｙｅｓ）、制御信号を変更し（ステップＳ１５０２）、ステップＳ１５０１へ戻る。ここで、制御信号とは、たとえば、制御信号ＣＴＲＬ１からＣＴＲＬ４や制御信号ＲＡＴＥである。クロック生成回路２０４が、各ＣＰＵからの制御命令を受け付けていないと判断した場合（ステップＳ１５０１：Ｎｏ）、ステップＳ１５０１へ戻る。
【００９２】
以上説明したように、スレッド処理方法、およびスレッド処理システムによれば、第１のＣＰＵで実行される第１のスレッドと第２のＣＰＵで実行される第２のスレッドに依存関係がないかを判断する。第１のスレッドと第２のスレッドとに依存関係がなく、かつ第１のスレッドの共有資源へのアクセス頻度が所定頻度以上であれば、第１のＣＰＵへ供給するクロックの位相を第２のＣＰＵへ供給するクロックの位相と異なる位相に変更する。
【００９３】
第１のスレッドのアクセス頻度が多いほど、第１のスレッドから共有資源へのアクセスが第２のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各ＣＰＵへ供給されるクロックの位相が異なることで、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。また、ＣＰＵへ供給されるクロックの位相が異なることで、ピーク電流を減少させることができる。
【００９４】
また、第１のＣＰＵへ供給されるクロックの位相と第２のＣＰＵに供給されるクロックの位相とが逆相となるように変更することにより、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。
【００９５】
また、第１のＣＰＵへ供給されるクロックの位相を変更するとともに、複数のＣＰＵへ供給するクロックの周波数を上げるのではなく、共有資源へのクロックの周波数を上げる。これにより、消費電力を抑制しつつ、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、マルチコアプロセッサシステムの性能を向上させることができる。
【００９６】
また、共有資源に供給されるクロックの周波数を第１のＣＰＵへ供給されるクロックの周波数の２倍に変更する。複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、複数のＣＰＵから共有資源へのアクセスの集中により発生する待ち時間を削減することができる。
【００９７】
また、第１のスレッドを実行するときの負荷量を第２閾値と比較し、負荷量が第２閾値よりも大きいときに、依存関係を判断する。第１のスレッドの負荷量が大きいほど、第１のスレッドから共有資源へのアクセスが第２のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各ＣＰＵへ供給されるクロックの位相が異なることで、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができ、最小限に消費電力を抑制することができる。
【００９８】
また、第１のスレッドと第２のスレッドとに依存関係があるときは、第１のＣＰＵへ供給されるクロックの位相を変更しない。これにより、第１のスレッドと第２のスレッドとで共有しているデータや排他制御に影響が生じるのを防止することができる。
【００９９】
また、依存関係がないとき、第１動作クロックの第１位相から第２位相への変更がされている場合、第１動作クロックの位相を第２位相から第１位相に変更する。これにより、複数のＣＰＵから共有資源へのアクセスが衝突することを減少させることができる。
【０１００】
また、依存関係は、共有メモリまたは第１プロセッサのメモリに登録される。これにより、第１のスレッドと第２のスレッドとの依存関係を容易に判断することができ、処理時間を短縮化することができる。
【０１０１】
また、依存関係があるスレッドを実行中のＣＰＵ群ごとにグループ化する。グループ化したＣＰＵ群が複数ある場合、ＣＰＵ群ごとに該ＣＰＵ群へ供給されるクロックの位相を異なるＣＰＵ群間で非同期となる位相に設定する。共有資源へ供給するクロックの周波数をいずれのＣＰＵ群とも同期する周波数に設定する。これにより、マルチコアプロセッサのＣＰＵ数が増加しても、アクセスの衝突を減少させることができ、マルチコアプロセッサの性能を向上させることができる。
【０１０２】
なお、本実施の形態で説明したスレッド処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド処理プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド処理プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１０３】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１０４】
（付記１）第１スレッドの実行命令を第１プロセッサに供給し、
前記第１スレッドと第２プロセッサで実行される第２スレッドとの依存関係を判断し、
前記第１スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第１閾値と比較し、
前記アクセス頻度が第１閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理方法。
【０１０５】
（付記２）前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする付記１に記載のスレッド処理方法。
【０１０６】
（付記３）前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする付記１または付記２に記載のスレッド処理方法。
【０１０７】
（付記４）前記動作クロックの周波数を２倍に変更すること、
を特徴とする付記３に記載のスレッド処理方法。
【０１０８】
（付記５）前記第１スレッドを実行するときの第１負荷を第２閾値と比較し、
前記第１負荷が前記第２閾値よりも大きく、前記アクセス頻度が第１閾値よりも大きく、かつ前記依存関係がないと判断されるときは、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする付記１乃至付記４の何れか一に記載のスレッド処理方法。
【０１０９】
（付記６）前記依存関係があるときは、前記第１動作クロックの位相を変更しないこと、
を特徴とする付記１乃至付記５の何れか一に記載のスレッド処理方法。
【０１１０】
（付記７）前記依存関係がないとき、前記第１動作クロックの第１位相から第２位相へ変更されていた場合には、前記第１動作クロックの位相を前記第２位相から前記第１位相に変更すること、
を特徴とする付記１乃至付記６の何れか一に記載のスレッド処理方法。
【０１１１】
（付記８）前記依存関係は、前記共有メモリまたは前記第１プロセッサのメモリに登録されること、
を特徴とする付記１乃至付記７の何れか一に記載のスレッド処理方法。
【０１１２】
（付記９）依存関係があるスレッド間を関連付けるテーブルへアクセス可能な複数のコアのうちの一のコアが、
前記複数のコアの各コアで実行中のスレッド間に直接的または間接的に依存関係があるか否かを、前記テーブルを参照することで判断し、
判断結果に基づいて、前記複数のコアを直接的または間接的に依存関係があるスレッドを実行するコア群ごとにグループ化し、
前記グループ化したコア群が複数ある場合、前記コア群ごとに前記コア群へ供給するクロックの位相を前記コア群間で非同期となる位相に設定し、
前記複数のコアで共有する共有資源へ供給するクロックの周波数をいずれのコア群とも同期する周波数に設定すること、
を特徴とするスレッド処理方法。
【０１１３】
（付記１０）第１プロセッサと、
前記第１プロセッサと第２プロセッサとがアクセス可能な共有メモリまたは共有キャッシュメモリと、
前記第１プロセッサまたは前記共有メモリに供給される動作クロックを制御するクロック制御ユニットと、
を含み、
前記クロック制御ユニットは、
前記第１プロセッサで実行される第１スレッドの前記共有メモリまたは前記共有キャッシュメモリへのアクセス頻度と第１閾値との比較結果と前記第１スレッドと前記第２プロセッサが実行する第２スレッドとの依存関係とに基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とするスレッド処理システム。
【０１１４】
（付記１１）前記クロック制御ユニットは、前記比較結果が前記アクセス頻度が前記第１閾値よりも大きいことを示すとともに前記依存関係があるときに、前記第１動作クロックの位相を変更すること、
を特徴とする付記１０に記載のスレッド処理システム。
【０１１５】
（付記１２）前記クロック制御ユニットは、前記第１プロセッサが前記第１スレッドを実行するときの第１負荷と第２閾値との比較結果に基づいて、前記第１プロセッサの第１動作クロックの位相を変更すること、
を特徴とする付記１０または付記１１に記載のスレッド処理システム。
【０１１６】
（付記１３）前記クロック制御ユニットは、前記第１動作クロックの位相を前記第２プロセッサの第２動作クロックと逆相になるように変更すること、
を特徴とする付記１０乃至付記１２の何れか一に記載のスレッド処理システム。
【０１１７】
（付記１４）前記クロック制御ユニットは、前記第１動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする付記１０乃至付記１２の何れか一に記載のスレッド処理システム。
【０１１８】
（付記１５）前記クロック制御ユニットは、前記動作クロックの周波数を２倍に変更すること、
を特徴とする付記１４に記載のスレッド処理システム。
【符号の説明】
【０１１９】
２００  マルチコアプロセッサシステム
２０１−１〜２０１−４  ＣＰＵ
２０３  ２次キャッシュ
２０４  クロック生成回路
２０８  共有メモリ
４００  アプリケーションテーブル
【国際調査報告】
2012144011.tif 000018
2012144011.tif 000019
2012144011.tif 000020
2012144011.tif 000021