以下に添付図面を参照して、本発明にかかるスレッド処理方法、およびスレッド処理システムの実施の形態を詳細に説明する。本実施の形態では、スレッド処理システムの一例として、マルチコアプロセッサシステムを挙げる。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
図1は、本発明の一実施例を示す説明図である。第1のOSが、(1)第1のスレッドを第1のCPUへディスパッチする。第1のOSが、(2)第1のスレッドの共有資源へのアクセス頻度を第1閾値と比較する。ここで、共有資源には、たとえば、共有メモリ、共有キャッシュメモリやバスなどが挙げられる。第1のOSが、(3)第1のスレッドと第2のCPUで実行中の第2のスレッドとの依存関係を判断する。ここで、スレッドは、周知のようにアプリケーションプログラム内での処理の実行単位である。依存関係があるとは、たとえば、第1のスレッドと第2のスレッドとでデータを共有している場合が挙げられる。たとえば、CPU間でキャッシュコヒーレントを取るか否かをアプリケーションの設計時に設計者があらかじめ解析しておくこととする。
第1のOSが、(4)アクセス頻度が第1閾値よりも大きいと判断し、かつ依存関係がない(×印)と判断した場合、第1のCPUへ供給されるクロックの位相と第2のCPUへ供給されるクロックの位相とが逆相となるようにクロック生成回路の設定を変更する。第1のOSが、(4)共有資源へ供給されるクロックの周波数を第1のCPUへ供給されるクロックの周波数の2倍になるようにクロック生成回路の設定を変更する。
たとえば、第1のCPUと第2のCPUと共有資源とがクロックの立ち上がりエッジで処理が行われるとすると、第1のCPUと第2のCPUとの共有資源へのアクセスが衝突しない。
(マルチコアプロセッサシステム)
図2は、マルチコアプロセッサシステムの一例を示すブロック図である。マルチコアプロセッサシステム200は、CPU201−1〜201−N(ここでは、N=4を例に挙げている。)と、スヌープ回路202と、2次キャッシュ203と、クロック生成回路204と、を有している。さらに、マルチコアプロセッサシステム200は、ディスプレイ205と、キーボード206と、I/F212(InterFace)と、メモリコントローラ207と、共有メモリ208と、を有している。
2次キャッシュ203と、クロック生成回路204と、ディスプレイ205と、キーボード206と、I/F212と、メモリコントローラ207とは、バス213を介して接続されている。CPU201−1〜201−4は、2次キャッシュ203を介して各部に接続されている。共有メモリ208は、メモリコントローラ207を介して各部に接続されている。
ここで、CPU201−1〜201−4は、それぞれレジスタとコアと1次キャッシュ221−1〜221−4を有している。コアは、演算機能を有している。各CPU内のレジスタは、PC(Program Counter)やリセットレジスタを有している。
CPU201−1はマスタCPUであり、マルチコアプロセッサシステム200の全体の制御を司り、OS231−1を実行する。OS231−1はマスタOSであり、CPU201−1に割り当てられたスレッドを実行する。OS231−1はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのCPU201に割り当てるかを制御する機能を有している。スケジューラはCPU201−1に割り当てられたアプリケーションの実行順序を制御する機能を有する。
CPU201−2〜201−4はスレーブCPUであり、それぞれOS231−2〜231−4を実行する。OS231−2〜231−4はスレーブOSであり、それぞれCPU201−2〜201−4に割り当てられたスレッドを実行する。OS231−2〜231−4はそれぞれスケジューラを有し、各スケジューラはそれぞれCPU201−2〜201−4に割り当てられたアプリケーションの実行順序を制御する機能を有する。
ここで、OS231−1〜231−4はそれぞれランキュー241−1〜241−4を有し、ランキュー241−1〜241−4にはCPU201−1〜201−4のそれぞれに割り当てられたアプリケーションのコンテキスト情報のポインタが積まれる。コンテキスト情報とは、たとえば、ロードされたアプリケーションの実行状態や該アプリケーション内の変数などが含まれる情報である。OS231−1〜231−4はそれぞれランキュー241−1〜241−4内のコンテキスト情報のポインタを取得し、アプリケーションのコンテキスト情報にアクセスすることで、アプリケーションを直ぐに実行することができる。
1次キャッシュ221−1〜221−4は、それぞれキャッシュメモリとキャッシュコントローラとを有している。1次キャッシュ221−1〜221−4はそれぞれOS231−1〜231−4が実行するスレッドから共有メモリ208への書込処理を一時的に記憶する。また、1次キャッシュ221−1〜221−4は、共有メモリ208から読み出されたデータを一時的に記憶する。
スヌープ回路202は、1次キャッシュ221−1〜221−4で共有するデータがいずれかの1次キャッシュ221で更新された場合、該更新を検出し、他の1次キャッシュ221も更新する。
2次キャッシュ203は、キャッシュメモリとキャッシュコントローラとを有している。2次キャッシュ203では、1次キャッシュ221−1〜221−4から追い出されたデータを記憶する。2次キャッシュ203では、OS231−1〜OS231−4で共有するデータを記憶する。2次キャッシュ203は、1次キャッシュ221−1〜221−4よりも、記憶容量が大きくかつCPU201−1〜201−4からのアクセス速度が遅い。2次キャッシュ203は共有メモリ208より、記憶容量が小さくかつCPU201−1〜201−4からのアクセス速度が速い。
ディスプレイ205は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ205は、たとえば、TFT液晶ディスプレイなどを採用することができる。キーボード206は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード206は、タッチパネル式の入力パッドやテンキーなどであってもよい。
I/F212は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワークに接続され、ネットワークを介して他の装置に接続される。そして、I/F212は、ネットワークと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F212には、たとえばモデムやLANアダプタなどを採用することができる。
メモリコントローラ207は、共有メモリ208へのアクセスを制御する。共有メモリ208は、たとえば、RAM209(Random Access Memory)と、ROM210(Read Only Memory)と、フラッシュROM211を有している。ROM210は、ブートプログラムなどのプログラムを記憶している。RAM209は、各CPUのワークエリアとして使用される。フラッシュROM211は、OS231−1〜231−4などのシステムソフトウェアやアプリケーションのプログラムを記憶している。RAM209はフラッシュROM211よりも各CPUからのアクセス速度が速い。各OSがアプリケーションのプログラムをフラッシュROM211からRAM209へロードすることにより、該アプリケーションのコンテキスト情報がRAM209内に展開される。
クロック生成回路204は、各部にクロックを供給する。クロックCLKが発振回路や外部から入力される基準クロックである。クロックCLK1〜CLK4がそれぞれCPU201−1〜201−4へ供給されるクロックである。クロックCLK−2CMが2次キャッシュ203へ供給されるクロックである。また、メモリコントローラ207、共有メモリ208、バス213、I/F212、ディスプレイ205やキーボード206などにもクロック生成回路204からクロックが共有されているが、図では配線を省略している。
たとえば、制御信号CPUCTRL1と、制御信号CPUCTRL2と、制御信号CPUCTRL3と、制御信号CPUCTRL4とに応じて、各CPUへ供給されるクロックの位相と2次キャッシュ203へ供給されるクロックの周波数が決定される。
図3は、クロック生成回路204の一例を示している。クロック生成回路204は、制御決定回路301と、選択回路302と、インバータ303と、120°遅延回路304と、90°遅延回路305と、選択回路306と、インバータ307と、120°遅延回路308と、を有している。クロック生成回路204は、90°遅延回路309と、選択回路310と、インバータ311と、90°遅延回路312と、逓倍回路313と、を有している。
インバータ303は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。インバータ307は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。インバータ311は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。
120°遅延回路304は、クロックCLKの位相を120°ずらす。120°遅延回路308は、120°遅延回路304から出力されるクロックの位相を120°ずらす。90°遅延回路305は、クロックCLKの位相を90°ずらす。90°遅延回路309は、90°遅延回路305から出力されるクロックの位相を90°ずらす。90°遅延回路312は、90°遅延回路309から出力されるクロックの位相を90°ずらす。
選択回路302は、制御信号CTRL2の値に応じてCPU201−2に供給するクロックを選択する。選択回路302では、制御信号CTRL2が「1」の場合、クロックCLKが選択される。選択回路302では、制御信号CTRL2が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路302では、制御信号CTRL2が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路302では、制御信号CTRL2が「4」の場合、クロックCLKの位相が90°ずらされたクロックが選択される。
選択回路306は、制御信号CTRL3の値に応じてCPU201−3に供給するクロックを選択する。選択回路306では、制御信号CTRL3が「1」の場合、クロックCLKが選択される。選択回路306では、制御信号CTRL3が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路306では、制御信号CTRL3が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路306では、制御信号CTRL3が「4」の場合、クロックCLKの位相が240°ずらされたクロックが選択される。選択回路306では、制御信号CTRL3が「5」の場合、クロックCLKの位相が180°ずらされたクロックが選択される。
選択回路310は、制御信号CTRL4の値に応じてCPU201−4に供給するクロックを選択する。選択回路310では、制御信号CTRL4が「1」の場合、クロックCLKが選択される。選択回路310では、制御信号CTRL4が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路310では、制御信号CTRL4が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路310では、制御信号CTRL4が「4」の場合、クロックCLKの位相が240°ずらされたクロックが選択される。選択回路310では、制御信号CTRL3が「5」の場合、クロックCLKの位相が270°ずらされたクロックが選択される。
逓倍回路313は、RATEに応じてクロックCLKを逓倍にする。逓倍回路313では、制御信号RATEの値が「1」の場合、クロックCLKがそのまま出力される。逓倍回路313では、制御信号RATEの値が「2」の場合、クロックCLKの周波数の2倍の周波数となるクロックが出力される。逓倍回路313では、制御信号RATEの値が「3」の場合、クロックCLKの周波数の3倍の周波数となるクロックが出力される。逓倍回路313では、制御信号RATEの値が「4」の場合、クロックCLKの周波数の4倍の周波数となるクロックが出力される。制御信号RATEの最大値は「4」である。
制御決定回路301は、制御信号CPUCTRL1から制御信号CPUCTRL4に応じて、各CPUへ供給されるクロックの位相と2次キャッシュ203へ供給されるクロックの周波数を決定する。たとえば、制御信号CPUCTRL1から制御信号CPUCTRL4のそれぞれのビット幅が12ビット(3[ビット]×4[制御信号])である。制御信号CPUCTRL1から制御信号CPUCTRL4はそれぞれ上位3ビットごとに順に制御信号CTRL2の値、制御信号CTRL3の値、制御信号CTRL4の値、制御信号RATEの値を示していることとする。
たとえば、OS231−1が、通常時には制御信号CPUCTRL1を「0000(10進表記)」に設定し、各CPUへ供給するクロックの位相や2次キャッシュ203へ供給するクロックの周波数を変更する際に変化させる。たとえば、制御信号CPUCTRL1の値が「1234(10進表記)」に変化させられると、制御決定回路301により、制御信号CTRL1の値が「1」となり、制御信号CTRL2の値が「2」となることとする。さらに、制御決定回路301により、制御信号CTRL3の値が「3」となり、制御信号RATEの値が「4」となることとする。また、制御決定回路301は、制御信号CPUCTRL1〜CPUCTRL4の「0000」から変更値への変化は検出するが、変更値から「0000」への変化は検出しないこととする。
(アプリケーションテーブル)
図4は、アプリケーションテーブルの一例を示す説明図である。アプリケーションテーブル400は、アプリID、スレッドID、依存スレッドID、アクセス頻度、負荷量のフィールドを有している。
アプリIDのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドIDのフィールドには、各スレッドを識別するための識別情報が登録される。依存スレッドIDのフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドと依存関係のあるスレッドの識別情報が登録される。
アクセス頻度のフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドから2次キャッシュ203への単位時間あたりのアクセス回数が登録される。負荷量のフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドの単位時間当たりの実行時間の比率が登録される。アクセス頻度や負荷量は、各スレッドのコンパイル時の解析およびシミュレーション結果に基づいて登録される。
フィールドに情報が設定されることで、アプリ情報(たとえば、アプリ情報401−1〜401−4)がレコードとして記憶されている。アプリケーションテーブル400は、RAM209、ROM210、フラッシュROM211などの記憶装置に記憶されている。さらに、2次キャッシュ203や1次キャッシュ221などに複製されたアプリケーションテーブル400が記憶されていてもよい。
図5は、割当テーブルの一例を示す説明図である。割当テーブル500は、アプリID、スレッドID、割当先CPUIDのフィールドを有している。アプリIDのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドIDのフィールドには、各スレッドを識別するための識別情報が登録される。割当先CPUIDのフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドの割当先CPUの識別情報が登録される。
各フィールドに情報が設定されることで、割当情報(たとえば、割当情報501−1〜501−5)がレコードとして記憶されている。割当テーブル500は、RAM209、ROM210、フラッシュROM211などの記憶装置に記憶されている。さらに、2次キャッシュ203や1次キャッシュ221などに複製されたアプリケーションテーブル400が記憶されていてもよい。
(OS231−i(i=1〜4)の機能例)
図6は、OS231−iの機能例を示すブロック図である。OS231−iは、受付部601−iと、判断部602−iと、比較部603−iと、グループ化設定部604−iと、変更部605−iと、実行部606−iと、を有している。受付部601−iから変更部605−iを有するOS231−iがフラッシュROM211などのストレージに記憶されている。CPU201−iが該記憶装置にアクセスして該OS231−iを読み出し、該OS231−i内にコーディングされている処理を実行することにより、該受付部601−iから実行部606−iの処理が実行される。ここでは、i=1を例に挙げて説明する。
受付部601−1は、イベントを受け付ける。マスタOSが受け付けるイベントとしては、スレッドの生成、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。スレーブOSが受け付けるイベントとしては、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。ここでは、イベントがスレッドの切り替えの場合を例に挙げて説明する。
受付部601−1は、スレッドの切り替えを受け付け、判断部602−1は、受付部601−1により切り替えが受け付けられたスレッド(第1のスレッド)と他のCPUで実行中のそれぞれのスレッドとに依存関係があるか否かを判断する。
たとえば、判断部602−1は、アプリケーションテーブル400から、第1のスレッドのIDをスレッドIDのフィールドに有するアプリ情報を検出する。たとえば、判断部602−1は、検出したアプリ情報の依存スレッドIDのフィールドに登録されているスレッドのIDを特定する。これにより、第1のスレッドと依存関係のあるスレッドのIDが特定される。
たとえば、判断部602−1は、プロセッサ間通信機能により他のOS231から、実行中のスレッドのIDを取得する。たとえば、判断部602−1は、特定したスレッドのIDと取得したスレッドのIDとを比較する。これにより、第1のスレッドと他のCPUで実行中のそれぞれのスレッドとに依存関係があるか否かが判断される。なお、判断結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
比較部603−1は、第1のスレッドがいずれのCPU201で実行中のスレッドとも依存関係がないと判断部602−1により判断された場合、第1のスレッドの2次キャッシュ203へのアクセス頻度を第1閾値と比較する。
たとえば、比較部603−1は、アプリケーションテーブル400から、第1のスレッドのIDをスレッドIDのフィールドに有するアプリ情報を検出する。たとえば、比較部603−1は、検出したアプリ情報のアクセス頻度のフィールドに登録されたアクセス頻度を特定する。たとえば、比較部603−1は、特定したアクセス頻度が第1閾値以上であるか否かを判断する。これにより、第1のスレッドの2次キャッシュ203へのアクセス頻度が第1閾値以上であるか否かが判断される。
比較部603−1は、第1のスレッドの2次キャッシュ203へのアクセス頻度が第1閾値以上であると判断した場合、第1のスレッドの負荷量を第2閾値と比較する。たとえば、比較部603−1は、検出したアプリ情報の負荷量のフィールドに登録された第1のスレッドの負荷量が、第2閾値以上であるか否かを判断する。
比較部603−1は、第1のスレッドの負荷量が第2閾値以上であると判断した場合、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する。たとえば、比較部603−1は、制御信号RATEの値をクロック生成回路204から取得し、制御信号RATEの値が最大値であるか否かを判断する。上述最大値は4である。
判断部602−1は、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと比較部603−1により判断された場合、CPU201−1を除く残余のCPUで実行中のスレッド間に依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドとに依存関係があるか否かを判断する。具体的な判断方法については、CPU201−1で実行中のスレッドと、CPU201−2〜201−4のそれぞれで実行中のスレッドとの依存関係の有無を判断した処理と同一処理であるため、詳細な説明は省略する。なお、判断結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
(例1)
図7は、例1を示す説明図である。図7では、丸印の中に符号が付されているものが、各符号に即したCPU201で実行中のスレッドを示している。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。そのため、図7では、CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドとを結ぶ矢印間に×印が付されている。
図7では、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは依存関係がなく、CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。
グループ化設定部604−1は、依存関係に応じてCPUをグループ化する。ここで、1グループは、1CPU以上であり、直接的または間接的に依存関係があるスレッドを実行中のCPUを1グループとする。たとえば、グループ化設定部604−1が、各CPUを異なるグループに設定する。CPU201−1はグループG1に属し、CPU201−2はグループG2に属し、CPU201−3はグループG3に属し、CPU201−4はグループG4に属する。CPUグループ数GCは4である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、グループ化の設定結果に応じて各CPUへ供給するクロックの位相を変更し、CPUグループ数GCに応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「4554」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「4」にし、制御信号CTRL3の値を「5」にし、制御信号CTRL4の値を「5」にし、制御信号RATEの値を「4」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも90°(=360°/G)ずらされた位相のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相よりも90°ずらされた位相のクロックがCPU201−3へ供給される。CPU201−3へ供給されるクロックの位相よりも90°ずらされた位相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の4倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。すなわち、グループ間で供給されるクロックが非同期となり、クロックCLK−2CMの周波数がいずれのグループとも同期する周波数となる。
(例2)
図8は、例2を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは依存関係がない。CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは直接的に依存関係がある。×印の矢印間は、依存関係がないことを示し、○印の矢印間は、依存関係があることを示している。
グループ化設定部604−1は、CPU201−1をグループG1にし、CPU201−2をグループG2にし、CPU201−3とCPU201−4をグループG3にする。CPUグループ数GCは3である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、グループ数に応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「3443」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「3」にし、制御信号CTRL3の値を「4」にし、制御信号CTRL4の値を「4」にし、制御信号RATEの値を「3」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも120°(=360°/CPUグループ数GC=360°/3)ずらされた位相のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相よりも120°ずらされた位相のクロックがCPU201−3へ供給される。CPU201−2へ供給されるクロックの位相よりも120°ずらされた位相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の3倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(例3)
図9は、例3を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。図9では、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドには依存関係がある。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドには依存関係がある。CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドには直接的に依存関係がないが、CPU201−3を介して間接的に依存関係がある。
グループ化設定部604−1は、CPU201−1をグループG1にし、CPU201−2とCPU201−3とCPU201−4をグループG2にする。CPUグループ数GCは2である。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、グループ数に応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「2222」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「2」にし、制御信号CTRL3の値を「2」にし、制御信号CTRL4の値を「2」にし、制御信号RATEの値を「2」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも180°(=360°/G)ずらされた位相(逆相)のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相と逆相のクロックがCPU201−3へ供給される。CPU201−2へ供給されるクロックの位相と逆相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の2倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(例4)
また、判断部602−1は、受付部601−1により切り替えが受け付けられた第1のスレッドと他のCPUで実行中のそれぞれのスレッドとに依存関係があると判断した場合、すべてのCPUで実行中のスレッド間に依存関係があるか否かを判断する。
図10は、例4を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2で実行中のスレッドは直接的に依存関係がある。CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは直接的に依存関係がある。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは直接的に依存関係がある。
CPU201−1で切り替えが発生した第1のスレッドとCPU201−3で実行中のスレッドは、直接的に依存関係がないが、CPU201−2で実行中のスレッドを介して間接的に依存関係がある。CPU201−1で切り替えが発生した第1のスレッドとCPU201−4で実行中のスレッドは、直接的に依存関係がないが、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドを介して間接的に依存関係がある。
たとえば、グループ化設定部604−1は、CPU201−1〜201−4をグループG1にする。CPUグループ数GCは1である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、CPUグループ数GCに応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「1111」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「1」にし、制御信号CTRL3の値を「1」にし、制御信号CTRL4の値を「1」にし、制御信号RATEの値を「1」にする。
これにより、クロックCLKと同相のクロックが各CPUへ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数と同一となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(OS231−iによるスレッド処理手順)
図11および図12は、OS231−iによるスレッド処理手順の一例を示すフローチャートである。OS231−iは、受付部601−iにより、イベントの発生を受け付けたか否かを判断する(ステップS1101)。OS231−iは、イベントの発生を受け付けていないと判断した場合(ステップS1101:No)、ステップS1101へ戻る。OS231−iは、ディスパッチを受け付けると(ステップS1101:ディスパッチ)、ステップS1123へ移行する。
OS231−iは、スレッドの実行終了を受け付けたと判断した場合(ステップS1101:実行終了)、実行待ちのスレッドがあるか否かを判断する(ステップS1102)。実行待ちのスレッドがあるか否かについては、ランキュー241−iにコンテキスト情報のポインタが登録されているか否かによって判断される。OS231−iは、実行待ちのスレッドがないと判断した場合(ステップS1102:No)、ステップS1116へ移行する。OS231−iは、実行待ちのスレッドがあると判断した場合(ステップS1102:Yes)、ステップS1103へ移行する。
ステップS1101において、OS231−iは、スレッドのスイッチを受け付けたと判断した場合(ステップS1101:スイッチ)、ステップS1103へ移行する。ステップS1101のスイッチ、またはステップS1102のYesのつぎに、OS231−iが、判断部602−iにより、つぎに実行するスレッド(第1のスレッド)と他のCPUで実行中のスレッドとに依存関係があるか否かを判断する(ステップS1103)。つぎに実行するスレッドとは、スレッドのスイッチの場合にはスイッチ後のスレッドであり、スレッドの実行終了の場合にはランキュー241−iの先頭にコンテキスト情報のポインタが登録されているスレッドである。
OS231−iは、第1のスレッドと他のCPUで実行中のスレッドとに依存関係があると判断した場合(ステップS1103:Yes)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1104)。OS231−iは、すべてのCPUで直接的または間接的に依存関係があるか否かを判断する(ステップS1105)。OS231−iは、すべてのCPUで依存関係があると判断した場合(ステップS1105:Yes)、すべてのCPUに供給するクロックの位相を同一位相に変更する(ステップS1106)。OS231−iは、2次キャッシュ203に供給するクロックの周波数をデフォルトに変更し(ステップS1107)、ステップS1123へ移行する。
ステップS1105において、OS231−iは、すべてのCPUで依存関係があると判断しなかった場合(ステップS1105:No)、ステップS1112へ移行する。ステップS1103において、OS231−iは、第1のスレッドと他のCPUで実行中のスレッドとに依存関係がないと判断した場合(ステップS1103:No)、第1のスレッドのメモリアクセス頻度>所定頻度であるか否かを判断する(ステップS1108)。所定頻度は第1閾値である。OS231−iは、第1のスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1108:No)、ステップS1116へ移行する。OS231−iは、第1のスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1108:Yes)、第1のスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1109)。所定負荷量は第2閾値である。
OS231−iは、第1のスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1109:No)、ステップS1116へ移行する。OS231−iは、第1のスレッドの負荷量>所定負荷量であると判断した場合(ステップS1109:Yes)、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する(ステップS1110)。OS231−iは、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であると判断した場合(ステップS1110:Yes)、ステップS1123へ移行する。OS231−iは、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと判断した場合(ステップS1110:No)、判断部602−iにより、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1111)。
OS231−iは、直接的または間接的に依存関係のあるCPUごとにグループ化し(ステップS1112)、CPUグループ数GCを決定する(ステップS1113)。OS231−iは、グループ化したCPUごとに該CPUへ供給するクロックの位相を変更し(ステップS1114)、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1115)、ステップS1123へ移行する。
ステップS1102のNo、ステップS1108のNo、またはステップS1109のNoのつぎに、OS231−iは、比較部603−iにより、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度であるかを判断する(ステップS1116)。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1116:No)、ステップS1123へ移行する。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1116:Yes)、ステップS1117へ移行する。
OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1117)。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1117:No)、ステップS1123へ移行する。
OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量であると判断した場合(ステップS1117:Yes)、CPUグループ数GCをデクリメントする(ステップS1118)。OS231−iは、他のCPUで実行中のスレッド間の依存関係を確認し(ステップS1119)、減らしたCPUグループ数GCと依存関係に沿ってCPU201をグループ化する(ステップS1120)。たとえば、依存関係に沿ってCPU数が均等になるようにCPUグループ数GC分のグループを作成することとしてもよい。
OS231−iは、グループ化したCPUごとに該CPUへ供給するクロックの位相を変更する(ステップS1121)。OS231−iは、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1122)、ステップS1123へ移行する。OS231−iは、実行部606−iにより、第1のスレッドを実行し(ステップS1123)、ステップS1101へ戻る。ステップS1123は、ステップS1101のディスパッチ、ステップS1107、ステップS1110のYes、ステップS1115、ステップS1116のNo、ステップS1117のNo、またはステップS1122のつぎに実行される。
(OS231−1によるスレッド処理手順)
図13および図14は、OS231−1によるスレッド処理手順の一例を示すフローチャートである。OS231−1が、受付部601−iにより、スレッドの生成を受け付けたか否かを判断する(ステップS1301)。OS231−1が、スレッドの生成を受け付けていないと判断した場合(ステップS1301:No)、ステップS1301へ戻る。
OS231−1が、スレッドの生成を受け付けたと判断した場合(ステップS1301:Yes)、生成されたスレッドが他のCPUで実行中のスレッドと依存関係があるか否かを判断する(ステップS1302)。OS231−1が、生成されたスレッドが他のCPUで実行中のスレッドと依存関係があると判断した場合(ステップS1302:Yes)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1303)。OS231−1が、すべてのCPUで直接的または間接的に依存関係があるか否かを判断する(ステップS1304)。OS231−1が、すべてのCPUで直接的または間接的に依存関係がないと判断した場合(ステップS1304:No)、ステップS1313へ移行する。
OS231−1が、すべてのCPUで直接的または間接的に依存関係があると判断した場合(ステップS1304:Yes)、すべてのCPUに供給するクロックの位相を同一位相に変更する(ステップS1305)。OS231−1が、2次キャッシュ203に供給するクロックの周波数をデフォルトに変更し(ステップS1306)、負荷が最小のCPUに生成されたスレッドを割り当て(ステップS1307)、ステップS1301へ戻る。負荷が最小のCPUについては、まず、OS231−1が、割当テーブル500を用いて各CPUに割り当てられているスレッドを特定する。OS231−1が、アプリケーションテーブル400を参照し、特定したスレッドの負荷量を検索する。OS231−1が、CPUごとに割当済のスレッドの検索した負荷量の合計値を算出し、合計値が最小のCPUを負荷が最小のCPUとして特定する。
OS231−1が、生成されたスレッドが他のCPUで実行中のスレッドと依存関係がないと判断した場合(ステップS1302:No)、生成されたスレッドのメモリアクセス頻度>所定頻度であるか否かを判断する(ステップS1308)。OS231−1が、生成されたスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1308:No)、ステップS1311へ移行する。
OS231−1が、生成されたスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1308:Yes)、生成されたスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1309)。OS231−1が、生成されたスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1309:No)、ステップS1311へ移行する。
OS231−1が、生成されたスレッドの負荷量>所定負荷量であると判断した場合(ステップS1309:Yes)、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する(ステップS1310)。OS231−1が、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であると判断した場合(ステップS1310:Yes)、ステップS1311へ移行する。ステップS1308のNo、ステップS1309のNo、またはステップS1310のYesのつぎに、OS231−1が、負荷が最小のCPUに生成されたスレッドを割り当て(ステップS1311)、ステップS1301へ戻る。
ステップS1310において、OS231−1が、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと判断した場合(ステップS1310:No)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1312)。OS231−1が、直接的または間接的に依存関係のあるCPUごとにグループ化し(ステップS1313)、CPUグループ数GCとグループ化されたCPUに基づいて、各CPUへ供給するクロックの位相を変更する(ステップS1314)。OS231−1が、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1315)、ステップS1301へ戻る。
(クロック生成回路204による変更処理手順)
図15は、クロック生成回路204による変更処理手順の一例を示すフローチャートである。まず、クロック生成回路204が、各CPUからの制御命令を受け付けたか否かを判断する(ステップS1501)。制御命令とは、たとえば、制御信号CPUCTRL1からCPUCTRL4のいずれかの「0000」から変更値への変化である。
クロック生成回路204が、各CPUからの制御命令を受け付けたと判断した場合(ステップS1501:Yes)、制御信号を変更し(ステップS1502)、ステップS1501へ戻る。ここで、制御信号とは、たとえば、制御信号CTRL1からCTRL4や制御信号RATEである。クロック生成回路204が、各CPUからの制御命令を受け付けていないと判断した場合(ステップS1501:No)、ステップS1501へ戻る。
以上説明したように、スレッド処理方法、およびスレッド処理システムによれば、第1のCPUで実行される第1のスレッドと第2のCPUで実行される第2のスレッドに依存関係がないかを判断する。第1のスレッドと第2のスレッドとに依存関係がなく、かつ第1のスレッドの共有資源へのアクセス頻度が所定頻度以上であれば、第1のCPUへ供給するクロックの位相を第2のCPUへ供給するクロックの位相と異なる位相に変更する。
第1のスレッドのアクセス頻度が多いほど、第1のスレッドから共有資源へのアクセスが第2のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各CPUへ供給されるクロックの位相が異なることで、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。また、CPUへ供給されるクロックの位相が異なることで、ピーク電流を減少させることができる。
また、第1のCPUへ供給されるクロックの位相と第2のCPUに供給されるクロックの位相とが逆相となるように変更することにより、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。
また、第1のCPUへ供給されるクロックの位相を変更するとともに、複数のCPUへ供給するクロックの周波数を上げるのではなく、共有資源へのクロックの周波数を上げる。これにより、消費電力を抑制しつつ、複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、マルチコアプロセッサシステムの性能を向上させることができる。
また、共有資源に供給されるクロックの周波数を第1のCPUへ供給されるクロックの周波数の2倍に変更する。複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、複数のCPUから共有資源へのアクセスの集中により発生する待ち時間を削減することができる。
また、第1のスレッドを実行するときの負荷量を第2閾値と比較し、負荷量が第2閾値よりも大きいときに、依存関係を判断する。第1のスレッドの負荷量が大きいほど、第1のスレッドから共有資源へのアクセスが第2のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各CPUへ供給されるクロックの位相が異なることで、複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、最小限に消費電力を抑制することができる。
また、第1のスレッドと第2のスレッドとに依存関係があるときは、第1のCPUへ供給されるクロックの位相を変更しない。これにより、第1のスレッドと第2のスレッドとで共有しているデータや排他制御に影響が生じるのを防止することができる。
また、依存関係がないとき、第1動作クロックの第1位相から第2位相への変更がされている場合、第1動作クロックの位相を第2位相から第1位相に変更する。これにより、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。
また、依存関係は、共有メモリまたは第1プロセッサのメモリに登録される。これにより、第1のスレッドと第2のスレッドとの依存関係を容易に判断することができ、処理時間を短縮化することができる。
また、依存関係があるスレッドを実行中のCPU群ごとにグループ化する。グループ化したCPU群が複数ある場合、CPU群ごとに該CPU群へ供給されるクロックの位相を異なるCPU群間で非同期となる位相に設定する。共有資源へ供給するクロックの周波数をいずれのCPU群とも同期する周波数に設定する。これにより、マルチコアプロセッサのCPU数が増加しても、アクセスの衝突を減少させることができ、マルチコアプロセッサの性能を向上させることができる。
なお、本実施の形態で説明したスレッド処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド処理プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド処理プログラムは、インターネット等のネットワークを介して配布してもよい。
以下に添付図面を参照して、本発明にかかるスレッド処理方法、およびスレッド処理システムの実施の形態を詳細に説明する。本実施の形態では、スレッド処理システムの一例として、マルチコアプロセッサシステムを挙げる。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
図1は、本発明の一実施例を示す説明図である。第1のOSが、(1)第1のスレッドを第1のCPUへディスパッチする。第1のOSが、(2)第1のスレッドの共有資源へのアクセス頻度を第1閾値と比較する。ここで、共有資源には、たとえば、共有メモリ、共有キャッシュメモリやバスなどが挙げられる。第1のOSが、(3)第1のスレッドと第2のCPUで実行中の第2のスレッドとの依存関係を判断する。ここで、スレッドは、周知のようにアプリケーションプログラム内での処理の実行単位である。依存関係があるとは、たとえば、第1のスレッドと第2のスレッドとでデータを共有している場合が挙げられる。たとえば、CPU間でキャッシュコヒーレントを取るか否かをアプリケーションの設計時に設計者があらかじめ解析しておくこととする。
第1のOSが、(4)アクセス頻度が第1閾値よりも大きいと判断し、かつ依存関係がない(×印)と判断した場合、第1のCPUへ供給されるクロックの位相と第2のCPUへ供給されるクロックの位相とが逆相となるようにクロック生成回路の設定を変更する。第1のOSが、(4)共有資源へ供給されるクロックの周波数を第1のCPUへ供給されるクロックの周波数の2倍になるようにクロック生成回路の設定を変更する。
たとえば、第1のCPUと第2のCPUと共有資源とがクロックの立ち上がりエッジで処理が行われるとすると、第1のCPUと第2のCPUとの共有資源へのアクセスが衝突しない。
(マルチコアプロセッサシステム)
図2は、マルチコアプロセッサシステムの一例を示すブロック図である。マルチコアプロセッサシステム200は、CPU201−1〜201−N(ここでは、N=4を例に挙げている。)と、スヌープ回路202と、2次キャッシュ203と、クロック生成回路204と、を有している。さらに、マルチコアプロセッサシステム200は、ディスプレイ205と、キーボード206と、I/F212(InterFace)と、メモリコントローラ207と、共有メモリ208と、を有している。
2次キャッシュ203と、クロック生成回路204と、ディスプレイ205と、キーボード206と、I/F212と、メモリコントローラ207とは、バス213を介して接続されている。CPU201−1〜201−4は、2次キャッシュ203を介して各部に接続されている。共有メモリ208は、メモリコントローラ207を介して各部に接続されている。
ここで、CPU201−1〜201−4は、それぞれレジスタとコアと1次キャッシュ221−1〜221−4を有している。コアは、演算機能を有している。各CPU内のレジスタは、PC(Program Counter)やリセットレジスタを有している。
CPU201−1はマスタCPUであり、マルチコアプロセッサシステム200の全体の制御を司り、OS231−1を実行する。OS231−1はマスタOSであり、CPU201−1に割り当てられたスレッドを実行する。OS231−1はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのCPU201に割り当てるかを制御する機能を有している。スケジューラはCPU201−1に割り当てられたアプリケーションの実行順序を制御する機能を有する。
CPU201−2〜201−4はスレーブCPUであり、それぞれOS231−2〜231−4を実行する。OS231−2〜231−4はスレーブOSであり、それぞれCPU201−2〜201−4に割り当てられたスレッドを実行する。OS231−2〜231−4はそれぞれスケジューラを有し、各スケジューラはそれぞれCPU201−2〜201−4に割り当てられたアプリケーションの実行順序を制御する機能を有する。
ここで、OS231−1〜231−4はそれぞれランキュー241−1〜241−4を有し、ランキュー241−1〜241−4にはCPU201−1〜201−4のそれぞれに割り当てられたアプリケーションのコンテキスト情報のポインタが積まれる。コンテキスト情報とは、たとえば、ロードされたアプリケーションの実行状態や該アプリケーション内の変数などが含まれる情報である。OS231−1〜231−4はそれぞれランキュー241−1〜241−4内のコンテキスト情報のポインタを取得し、アプリケーションのコンテキスト情報にアクセスすることで、アプリケーションを直ぐに実行することができる。
1次キャッシュ221−1〜221−4は、それぞれキャッシュメモリとキャッシュコントローラとを有している。1次キャッシュ221−1〜221−4はそれぞれOS231−1〜231−4が実行するスレッドから共有メモリ208への書込処理を一時的に記憶する。また、1次キャッシュ221−1〜221−4は、共有メモリ208から読み出されたデータを一時的に記憶する。
スヌープ回路202は、1次キャッシュ221−1〜221−4で共有するデータがいずれかの1次キャッシュ221で更新された場合、該更新を検出し、他の1次キャッシュ221も更新する。
2次キャッシュ203は、キャッシュメモリとキャッシュコントローラとを有している。2次キャッシュ203では、1次キャッシュ221−1〜221−4から追い出されたデータを記憶する。2次キャッシュ203では、OS231−1〜OS231−4で共有するデータを記憶する。2次キャッシュ203は、1次キャッシュ221−1〜221−4よりも、記憶容量が大きくかつCPU201−1〜201−4からのアクセス速度が遅い。2次キャッシュ203は共有メモリ208より、記憶容量が小さくかつCPU201−1〜201−4からのアクセス速度が速い。
ディスプレイ205は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ205は、たとえば、TFT液晶ディスプレイなどを採用することができる。キーボード206は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード206は、タッチパネル式の入力パッドやテンキーなどであってもよい。
I/F212は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワークに接続され、ネットワークを介して他の装置に接続される。そして、I/F212は、ネットワークと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F212には、たとえばモデムやLANアダプタなどを採用することができる。
メモリコントローラ207は、共有メモリ208へのアクセスを制御する。共有メモリ208は、たとえば、RAM209(Random Access Memory)と、ROM210(Read Only Memory)と、フラッシュROM211を有している。ROM210は、ブートプログラムなどのプログラムを記憶している。RAM209は、各CPUのワークエリアとして使用される。フラッシュROM211は、OS231−1〜231−4などのシステムソフトウェアやアプリケーションのプログラムを記憶している。RAM209はフラッシュROM211よりも各CPUからのアクセス速度が速い。各OSがアプリケーションのプログラムをフラッシュROM211からRAM209へロードすることにより、該アプリケーションのコンテキスト情報がRAM209内に展開される。
クロック生成回路204は、各部にクロックを供給する。クロックCLKが発振回路や外部から入力される基準クロックである。クロックCLK1〜CLK4がそれぞれCPU201−1〜201−4へ供給されるクロックである。クロックCLK−2CMが2次キャッシュ203へ供給されるクロックである。また、メモリコントローラ207、共有メモリ208、バス213、I/F212、ディスプレイ205やキーボード206などにもクロック生成回路204からクロックが共有されているが、図では配線を省略している。
たとえば、制御信号CPUCTRL1と、制御信号CPUCTRL2と、制御信号CPUCTRL3と、制御信号CPUCTRL4とに応じて、各CPUへ供給されるクロックの位相と2次キャッシュ203へ供給されるクロックの周波数が決定される。
図3は、クロック生成回路204の一例を示している。クロック生成回路204は、制御決定回路301と、選択回路302と、インバータ303と、120°遅延回路304と、90°遅延回路305と、選択回路306と、インバータ307と、120°遅延回路308と、を有している。クロック生成回路204は、90°遅延回路309と、選択回路310と、インバータ311と、90°遅延回路312と、逓倍回路313と、を有している。
インバータ303は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。インバータ307は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。インバータ311は、クロックCLKを反転して出力することにより、クロックCLKと逆相のクロックを出力する。
120°遅延回路304は、クロックCLKの位相を120°ずらす。120°遅延回路308は、120°遅延回路304から出力されるクロックの位相を120°ずらす。90°遅延回路305は、クロックCLKの位相を90°ずらす。90°遅延回路309は、90°遅延回路305から出力されるクロックの位相を90°ずらす。90°遅延回路312は、90°遅延回路309から出力されるクロックの位相を90°ずらす。
選択回路302は、制御信号CTRL2の値に応じてCPU201−2に供給するクロックを選択する。選択回路302では、制御信号CTRL2が「1」の場合、クロックCLKが選択される。選択回路302では、制御信号CTRL2が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路302では、制御信号CTRL2が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路302では、制御信号CTRL2が「4」の場合、クロックCLKの位相が90°ずらされたクロックが選択される。
選択回路306は、制御信号CTRL3の値に応じてCPU201−3に供給するクロックを選択する。選択回路306では、制御信号CTRL3が「1」の場合、クロックCLKが選択される。選択回路306では、制御信号CTRL3が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路306では、制御信号CTRL3が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路306では、制御信号CTRL3が「4」の場合、クロックCLKの位相が240°ずらされたクロックが選択される。選択回路306では、制御信号CTRL3が「5」の場合、クロックCLKの位相が180°ずらされたクロックが選択される。
選択回路310は、制御信号CTRL4の値に応じてCPU201−4に供給するクロックを選択する。選択回路310では、制御信号CTRL4が「1」の場合、クロックCLKが選択される。選択回路310では、制御信号CTRL4が「2」の場合、クロックCLKの位相と逆位相のクロックが選択される。選択回路310では、制御信号CTRL4が「3」の場合、クロックCLKの位相が120°ずらされたクロックが選択される。選択回路310では、制御信号CTRL4が「4」の場合、クロックCLKの位相が240°ずらされたクロックが選択される。選択回路310では、制御信号CTRL3が「5」の場合、クロックCLKの位相が270°ずらされたクロックが選択される。
逓倍回路313は、RATEに応じてクロックCLKを逓倍にする。逓倍回路313では、制御信号RATEの値が「1」の場合、クロックCLKがそのまま出力される。逓倍回路313では、制御信号RATEの値が「2」の場合、クロックCLKの周波数の2倍の周波数となるクロックが出力される。逓倍回路313では、制御信号RATEの値が「3」の場合、クロックCLKの周波数の3倍の周波数となるクロックが出力される。逓倍回路313では、制御信号RATEの値が「4」の場合、クロックCLKの周波数の4倍の周波数となるクロックが出力される。制御信号RATEの最大値は「4」である。
制御決定回路301は、制御信号CPUCTRL1から制御信号CPUCTRL4に応じて、各CPUへ供給されるクロックの位相と2次キャッシュ203へ供給されるクロックの周波数を決定する。たとえば、制御信号CPUCTRL1から制御信号CPUCTRL4のそれぞれのビット幅が12ビット(3[ビット]×4[制御信号])である。制御信号CPUCTRL1から制御信号CPUCTRL4はそれぞれ上位3ビットごとに順に制御信号CTRL2の値、制御信号CTRL3の値、制御信号CTRL4の値、制御信号RATEの値を示していることとする。
たとえば、OS231−1が、通常時には制御信号CPUCTRL1を「0000(10進表記)」に設定し、各CPUへ供給するクロックの位相や2次キャッシュ203へ供給するクロックの周波数を変更する際に変化させる。たとえば、制御信号CPUCTRL1の値が「1234(10進表記)」に変化させられると、制御決定回路301により、制御信号CTRL1の値が「1」となり、制御信号CTRL2の値が「2」となることとする。さらに、制御決定回路301により、制御信号CTRL3の値が「3」となり、制御信号RATEの値が「4」となることとする。また、制御決定回路301は、制御信号CPUCTRL1〜CPUCTRL4の「0000」から変更値への変化は検出するが、変更値から「0000」への変化は検出しないこととする。
(アプリケーションテーブル)
図4は、アプリケーションテーブルの一例を示す説明図である。アプリケーションテーブル400は、アプリID、スレッドID、依存スレッドID、アクセス頻度、負荷量のフィールドを有している。
アプリIDのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドIDのフィールドには、各スレッドを識別するための識別情報が登録される。依存スレッドIDのフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドと依存関係のあるスレッドの識別情報が登録される。
アクセス頻度のフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドから2次キャッシュ203への単位時間あたりのアクセス回数が登録される。負荷量のフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドの単位時間当たりの実行時間の比率が登録される。アクセス頻度や負荷量は、各スレッドのコンパイル時の解析およびシミュレーション結果に基づいて登録される。
フィールドに情報が設定されることで、アプリ情報(たとえば、アプリ情報401−1〜401−4)がレコードとして記憶されている。アプリケーションテーブル400は、RAM209、ROM210、フラッシュROM211などの記憶装置に記憶されている。さらに、2次キャッシュ203や1次キャッシュ221などに複製されたアプリケーションテーブル400が記憶されていてもよい。
図5は、割当テーブルの一例を示す説明図である。割当テーブル500は、アプリID、スレッドID、割当先CPUIDのフィールドを有している。アプリIDのフィールドには、各アプリケーションを識別するための識別情報が登録される。スレッドIDのフィールドには、各スレッドを識別するための識別情報が登録される。割当先CPUIDのフィールドには、同一レコードのスレッドIDのフィールドに識別情報が登録されたスレッドの割当先CPUの識別情報が登録される。
各フィールドに情報が設定されることで、割当情報(たとえば、割当情報501−1〜501−5)がレコードとして記憶されている。割当テーブル500は、RAM209、ROM210、フラッシュROM211などの記憶装置に記憶されている。さらに、2次キャッシュ203や1次キャッシュ221などに複製されたアプリケーションテーブル400が記憶されていてもよい。
(OS231−i(i=1〜4)の機能例)
図6は、OS231−iの機能例を示すブロック図である。OS231−iは、受付部601−iと、判断部602−iと、比較部603−iと、グループ化設定部604−iと、変更部605−iと、実行部606−iと、を有している。受付部601−iから変更部605−iを有するOS231−iがフラッシュROM211などのストレージに記憶されている。CPU201−iが該記憶装置にアクセスして該OS231−iを読み出し、該OS231−i内にコーディングされている処理を実行することにより、該受付部601−iから実行部606−iの処理が実行される。ここでは、i=1を例に挙げて説明する。
受付部601−1は、イベントを受け付ける。マスタOSが受け付けるイベントとしては、スレッドの生成、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。スレーブOSが受け付けるイベントとしては、スレッドのディスパッチ、スレッドの切り替えやスレッドの実行終了が挙げられる。ここでは、イベントがスレッドの切り替えの場合を例に挙げて説明する。
受付部601−1は、スレッドの切り替えを受け付け、判断部602−1は、受付部601−1により切り替えが受け付けられたスレッド(第1のスレッド)と他のCPUで実行中のそれぞれのスレッドとに依存関係があるか否かを判断する。
たとえば、判断部602−1は、アプリケーションテーブル400から、第1のスレッドのIDをスレッドIDのフィールドに有するアプリ情報を検出する。たとえば、判断部602−1は、検出したアプリ情報の依存スレッドIDのフィールドに登録されているスレッドのIDを特定する。これにより、第1のスレッドと依存関係のあるスレッドのIDが特定される。
たとえば、判断部602−1は、プロセッサ間通信機能により他のOS231から、実行中のスレッドのIDを取得する。たとえば、判断部602−1は、特定したスレッドのIDと取得したスレッドのIDとを比較する。これにより、第1のスレッドと他のCPUで実行中のそれぞれのスレッドとに依存関係があるか否かが判断される。なお、判断結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
比較部603−1は、第1のスレッドがいずれのCPU201で実行中のスレッドとも依存関係がないと判断部602−1により判断された場合、第1のスレッドの2次キャッシュ203へのアクセス頻度を第1閾値と比較する。
たとえば、比較部603−1は、アプリケーションテーブル400から、第1のスレッドのIDをスレッドIDのフィールドに有するアプリ情報を検出する。たとえば、比較部603−1は、検出したアプリ情報のアクセス頻度のフィールドに登録されたアクセス頻度を特定する。たとえば、比較部603−1は、特定したアクセス頻度が第1閾値以上であるか否かを判断する。これにより、第1のスレッドの2次キャッシュ203へのアクセス頻度が第1閾値以上であるか否かが判断される。
比較部603−1は、第1のスレッドの2次キャッシュ203へのアクセス頻度が第1閾値以上であると判断した場合、第1のスレッドの負荷量を第2閾値と比較する。たとえば、比較部603−1は、検出したアプリ情報の負荷量のフィールドに登録された第1のスレッドの負荷量が、第2閾値以上であるか否かを判断する。
比較部603−1は、第1のスレッドの負荷量が第2閾値以上であると判断した場合、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する。たとえば、比較部603−1は、制御信号RATEの値をクロック生成回路204から取得し、制御信号RATEの値が最大値であるか否かを判断する。上述最大値は4である。
判断部602−1は、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと比較部603−1により判断された場合、CPU201−1を除く残余のCPUで実行中のスレッド間に依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドとに依存関係があるか否かを判断する。たとえば、判断部602−1は、CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドとに依存関係があるか否かを判断する。具体的な判断方法については、CPU201−1で実行中のスレッドと、CPU201−2〜201−4のそれぞれで実行中のスレッドとの依存関係の有無を判断した処理と同一処理であるため、詳細な説明は省略する。なお、判断結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
(例1)
図7は、例1を示す説明図である。図7では、丸印の中に符号が付されているものが、各符号に即したCPU201で実行中のスレッドを示している。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。そのため、図7では、CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドとを結ぶ矢印間に×印が付されている。
図7では、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは依存関係がなく、CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。
グループ化設定部604−1は、依存関係に応じてCPUをグループ化する。ここで、1グループは、1CPU以上であり、直接的または間接的に依存関係があるスレッドを実行中のCPUを1グループとする。たとえば、グループ化設定部604−1が、各CPUを異なるグループに設定する。CPU201−1はグループG1に属し、CPU201−2はグループG2に属し、CPU201−3はグループG3に属し、CPU201−4はグループG4に属する。CPUグループ数GCは4である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、グループ化の設定結果に応じて各CPUへ供給するクロックの位相を変更し、CPUグループ数GCに応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「4554」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「4」にし、制御信号CTRL3の値を「5」にし、制御信号CTRL4の値を「5」にし、制御信号RATEの値を「4」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも90°(=360°/G)ずらされた位相のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相よりも90°ずらされた位相のクロックがCPU201−3へ供給される。CPU201−3へ供給されるクロックの位相よりも90°ずらされた位相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の4倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。すなわち、グループ間で供給されるクロックが非同期となり、クロックCLK−2CMの周波数がいずれのグループとも同期する周波数となる。
(例2)
図8は、例2を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは依存関係がない。CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドは依存関係がない。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは直接的に依存関係がある。×印の矢印間は、依存関係がないことを示し、○印の矢印間は、依存関係があることを示している。
グループ化設定部604−1は、CPU201−1をグループG1にし、CPU201−2をグループG2にし、CPU201−3とCPU201−4をグループG3にする。CPUグループ数GCは3である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、グループ数に応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「3443」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「3」にし、制御信号CTRL3の値を「4」にし、制御信号CTRL4の値を「4」にし、制御信号RATEの値を「3」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも120°(=360°/CPUグループ数GC=360°/3)ずらされた位相のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相よりも120°ずらされた位相のクロックがCPU201−3へ供給される。CPU201−2へ供給されるクロックの位相よりも120°ずらされた位相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の3倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(例3)
図9は、例3を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2〜201−4のそれぞれで実行中のスレッドには依存関係がない。図9では、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドには依存関係がある。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドには依存関係がある。CPU201−2で実行中のスレッドとCPU201−4で実行中のスレッドには直接的に依存関係がないが、CPU201−3を介して間接的に依存関係がある。
グループ化設定部604−1は、CPU201−1をグループG1にし、CPU201−2とCPU201−3とCPU201−4をグループG2にする。CPUグループ数GCは2である。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、グループ数に応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「2222」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「2」にし、制御信号CTRL3の値を「2」にし、制御信号CTRL4の値を「2」にし、制御信号RATEの値を「2」にする。
これにより、CPU201−1へ供給されるクロックの位相よりも180°(=360°/G)ずらされた位相(逆相)のクロックがCPU201−2へ供給される。CPU201−2へ供給されるクロックの位相と逆相のクロックがCPU201−3へ供給される。CPU201−2へ供給されるクロックの位相と逆相のクロックがCPU201−4へ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数の2倍となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(例4)
また、判断部602−1は、受付部601−1により切り替えが受け付けられた第1のスレッドと他のCPUで実行中のそれぞれのスレッドとに依存関係があると判断した場合、すべてのCPUで実行中のスレッド間に依存関係があるか否かを判断する。
図10は、例4を示す説明図である。CPU201−1で切り替えが発生した第1のスレッドとCPU201−2で実行中のスレッドは直接的に依存関係がある。CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドは直接的に依存関係がある。CPU201−3で実行中のスレッドとCPU201−4で実行中のスレッドは直接的に依存関係がある。
CPU201−1で切り替えが発生した第1のスレッドとCPU201−3で実行中のスレッドは、直接的に依存関係がないが、CPU201−2で実行中のスレッドを介して間接的に依存関係がある。CPU201−1で切り替えが発生した第1のスレッドとCPU201−4で実行中のスレッドは、直接的に依存関係がないが、CPU201−2で実行中のスレッドとCPU201−3で実行中のスレッドを介して間接的に依存関係がある。
たとえば、グループ化設定部604−1は、CPU201−1〜201−4をグループG1にする。CPUグループ数GCは1である。なお、グループ化の設定結果は、RAM209、フラッシュROM211などの記憶装置に記憶される。
変更部605−1は、CPUグループ数GCに応じて各CPUへ供給するクロックの位相を変更し、CPUグループ数GCに応じて2次キャッシュ203へ供給するクロックの周波数を変更する。たとえば、変更部605−1は、制御信号CPUCTRL1の値を0から「1111」に変更する。クロック生成回路204は、制御信号CPUCTRL1の変化を検出する。クロック生成回路204は、制御信号CPUCTRL1の値に基づいて、制御信号CTRL2の値を「1」にし、制御信号CTRL3の値を「1」にし、制御信号CTRL4の値を「1」にし、制御信号RATEの値を「1」にする。
これにより、クロックCLKと同相のクロックが各CPUへ供給される。クロックCLK−2CMの周波数がクロックCLKの周波数と同一となる。そして、実行部606−1は、変更部605−1による変更が終了後、第1のスレッドを実行する。
(OS231−iによるスレッド処理手順)
図11および図12は、OS231−iによるスレッド処理手順の一例を示すフローチャートである。OS231−iは、受付部601−iにより、イベントの発生を受け付けたか否かを判断する(ステップS1101)。OS231−iは、イベントの発生を受け付けていないと判断した場合(ステップS1101:No)、ステップS1101へ戻る。OS231−iは、ディスパッチを受け付けると(ステップS1101:ディスパッチ)、ステップS1123へ移行する。
OS231−iは、スレッドの実行終了を受け付けたと判断した場合(ステップS1101:実行終了)、実行待ちのスレッドがあるか否かを判断する(ステップS1102)。実行待ちのスレッドがあるか否かについては、ランキュー241−iにコンテキスト情報のポインタが登録されているか否かによって判断される。OS231−iは、実行待ちのスレッドがないと判断した場合(ステップS1102:No)、ステップS1116へ移行する。OS231−iは、実行待ちのスレッドがあると判断した場合(ステップS1102:Yes)、ステップS1103へ移行する。
ステップS1101において、OS231−iは、スレッドのスイッチを受け付けたと判断した場合(ステップS1101:スイッチ)、ステップS1103へ移行する。ステップS1101のスイッチ、またはステップS1102のYesのつぎに、OS231−iが、判断部602−iにより、つぎに実行するスレッド(第1のスレッド)と他のCPUで実行中のスレッドとに依存関係があるか否かを判断する(ステップS1103)。つぎに実行するスレッドとは、スレッドのスイッチの場合にはスイッチ後のスレッドであり、スレッドの実行終了の場合にはランキュー241−iの先頭にコンテキスト情報のポインタが登録されているスレッドである。
OS231−iは、第1のスレッドと他のCPUで実行中のスレッドとに依存関係があると判断した場合(ステップS1103:Yes)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1104)。OS231−iは、すべてのCPUで直接的または間接的に依存関係があるか否かを判断する(ステップS1105)。OS231−iは、すべてのCPUで依存関係があると判断した場合(ステップS1105:Yes)、すべてのCPUに供給するクロックの位相を同一位相に変更する(ステップS1106)。OS231−iは、2次キャッシュ203に供給するクロックの周波数をデフォルトに変更し(ステップS1107)、ステップS1123へ移行する。
ステップS1105において、OS231−iは、すべてのCPUで依存関係があると判断しなかった場合(ステップS1105:No)、ステップS1112へ移行する。ステップS1103において、OS231−iは、第1のスレッドと他のCPUで実行中のスレッドとに依存関係がないと判断した場合(ステップS1103:No)、第1のスレッドのメモリアクセス頻度>所定頻度であるか否かを判断する(ステップS1108)。所定頻度は第1閾値である。OS231−iは、第1のスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1108:No)、ステップS1116へ移行する。OS231−iは、第1のスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1108:Yes)、第1のスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1109)。所定負荷量は第2閾値である。
OS231−iは、第1のスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1109:No)、ステップS1116へ移行する。OS231−iは、第1のスレッドの負荷量>所定負荷量であると判断した場合(ステップS1109:Yes)、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する(ステップS1110)。OS231−iは、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であると判断した場合(ステップS1110:Yes)、ステップS1123へ移行する。OS231−iは、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと判断した場合(ステップS1110:No)、判断部602−iにより、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1111)。
OS231−iは、直接的または間接的に依存関係のあるCPUごとにグループ化し(ステップS1112)、CPUグループ数GCを決定する(ステップS1113)。OS231−iは、グループ化したCPUごとに該CPUへ供給するクロックの位相を変更し(ステップS1114)、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1115)、ステップS1123へ移行する。
ステップS1102のNo、ステップS1108のNo、またはステップS1109のNoのつぎに、OS231−iは、比較部603−iにより、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度であるかを判断する(ステップS1116)。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1116:No)、ステップS1123へ移行する。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1116:Yes)、ステップS1117へ移行する。
OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1117)。OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1117:No)、ステップS1123へ移行する。
OS231−iは、スイッチ前に実行していたスレッドまたは実行終了したスレッドの負荷量>所定負荷量であると判断した場合(ステップS1117:Yes)、CPUグループ数GCをデクリメントする(ステップS1118)。OS231−iは、他のCPUで実行中のスレッド間の依存関係を確認し(ステップS1119)、減らしたCPUグループ数GCと依存関係に沿ってCPU201をグループ化する(ステップS1120)。たとえば、依存関係に沿ってCPU数が均等になるようにCPUグループ数GC分のグループを作成することとしてもよい。
OS231−iは、グループ化したCPUごとに該CPUへ供給するクロックの位相を変更する(ステップS1121)。OS231−iは、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1122)、ステップS1123へ移行する。OS231−iは、実行部606−iにより、第1のスレッドを実行し(ステップS1123)、ステップS1101へ戻る。ステップS1123は、ステップS1101のディスパッチ、ステップS1107、ステップS1110のYes、ステップS1115、ステップS1116のNo、ステップS1117のNo、またはステップS1122のつぎに実行される。
(OS231−1によるスレッド処理手順)
図13および図14は、OS231−1によるスレッド処理手順の一例を示すフローチャートである。OS231−1が、受付部601−iにより、スレッドの生成を受け付けたか否かを判断する(ステップS1301)。OS231−1が、スレッドの生成を受け付けていないと判断した場合(ステップS1301:No)、ステップS1301へ戻る。
OS231−1が、スレッドの生成を受け付けたと判断した場合(ステップS1301:Yes)、生成されたスレッドが他のCPUで実行中のスレッドと依存関係があるか否かを判断する(ステップS1302)。OS231−1が、生成されたスレッドが他のCPUで実行中のスレッドと依存関係があると判断した場合(ステップS1302:Yes)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1303)。OS231−1が、すべてのCPUで直接的または間接的に依存関係があるか否かを判断する(ステップS1304)。OS231−1が、すべてのCPUで直接的または間接的に依存関係がないと判断した場合(ステップS1304:No)、ステップS1313へ移行する。
OS231−1が、すべてのCPUで直接的または間接的に依存関係があると判断した場合(ステップS1304:Yes)、すべてのCPUに供給するクロックの位相を同一位相に変更する(ステップS1305)。OS231−1が、2次キャッシュ203に供給するクロックの周波数をデフォルトに変更し(ステップS1306)、負荷が最小のCPUに生成されたスレッドを割り当て(ステップS1307)、ステップS1301へ戻る。負荷が最小のCPUについては、まず、OS231−1が、割当テーブル500を用いて各CPUに割り当てられているスレッドを特定する。OS231−1が、アプリケーションテーブル400を参照し、特定したスレッドの負荷量を検索する。OS231−1が、CPUごとに割当済のスレッドの検索した負荷量の合計値を算出し、合計値が最小のCPUを負荷が最小のCPUとして特定する。
OS231−1が、生成されたスレッドが他のCPUで実行中のスレッドと依存関係がないと判断した場合(ステップS1302:No)、生成されたスレッドのメモリアクセス頻度>所定頻度であるか否かを判断する(ステップS1308)。OS231−1が、生成されたスレッドのメモリアクセス頻度>所定頻度でないと判断した場合(ステップS1308:No)、ステップS1311へ移行する。
OS231−1が、生成されたスレッドのメモリアクセス頻度>所定頻度であると判断した場合(ステップS1308:Yes)、生成されたスレッドの負荷量>所定負荷量であるか否かを判断する(ステップS1309)。OS231−1が、生成されたスレッドの負荷量>所定負荷量でないと判断した場合(ステップS1309:No)、ステップS1311へ移行する。
OS231−1が、生成されたスレッドの負荷量>所定負荷量であると判断した場合(ステップS1309:Yes)、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であるか否かを判断する(ステップS1310)。OS231−1が、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大であると判断した場合(ステップS1310:Yes)、ステップS1311へ移行する。ステップS1308のNo、ステップS1309のNo、またはステップS1310のYesのつぎに、OS231−1が、負荷が最小のCPUに生成されたスレッドを割り当て(ステップS1311)、ステップS1301へ戻る。
ステップS1310において、OS231−1が、2次キャッシュ203へ供給するクロックの周波数の逓倍率が最大でないと判断した場合(ステップS1310:No)、他のCPUで実行中のスレッド間の依存関係を確認する(ステップS1312)。OS231−1が、直接的または間接的に依存関係のあるCPUごとにグループ化し(ステップS1313)、CPUグループ数GCとグループ化されたCPUに基づいて、各CPUへ供給するクロックの位相を変更する(ステップS1314)。OS231−1が、CPUグループ数GCに基づいて、2次キャッシュ203に供給するクロックの周波数を変更し(ステップS1315)、ステップS1301へ戻る。
(クロック生成回路204による変更処理手順)
図15は、クロック生成回路204による変更処理手順の一例を示すフローチャートである。まず、クロック生成回路204が、各CPUからの制御命令を受け付けたか否かを判断する(ステップS1501)。制御命令とは、たとえば、制御信号CPUCTRL1からCPUCTRL4のいずれかの「0000」から変更値への変化である。
クロック生成回路204が、各CPUからの制御命令を受け付けたと判断した場合(ステップS1501:Yes)、制御信号を変更し(ステップS1502)、ステップS1501へ戻る。ここで、制御信号とは、たとえば、制御信号CTRL1からCTRL4や制御信号RATEである。クロック生成回路204が、各CPUからの制御命令を受け付けていないと判断した場合(ステップS1501:No)、ステップS1501へ戻る。
以上説明したように、スレッド処理方法、およびスレッド処理システムによれば、第1のCPUで実行される第1のスレッドと第2のCPUで実行される第2のスレッドに依存関係がないかを判断する。第1のスレッドと第2のスレッドとに依存関係がなく、かつ第1のスレッドの共有資源へのアクセス頻度が所定頻度以上であれば、第1のCPUへ供給するクロックの位相を第2のCPUへ供給するクロックの位相と異なる位相に変更する。
第1のスレッドのアクセス頻度が多いほど、第1のスレッドから共有資源へのアクセスが第2のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各CPUへ供給されるクロックの位相が異なることで、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。また、CPUへ供給されるクロックの位相が異なることで、ピーク電流を減少させることができる。
また、第1のCPUへ供給されるクロックの位相と第2のCPUに供給されるクロックの位相とが逆相となるように変更することにより、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。
また、第1のCPUへ供給されるクロックの位相を変更するとともに、複数のCPUへ供給するクロックの周波数を上げるのではなく、共有資源へのクロックの周波数を上げる。これにより、消費電力を抑制しつつ、複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、マルチコアプロセッサシステムの性能を向上させることができる。
また、共有資源に供給されるクロックの周波数を第1のCPUへ供給されるクロックの周波数の2倍に変更する。複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、複数のCPUから共有資源へのアクセスの集中により発生する待ち時間を削減することができる。
また、第1のスレッドを実行するときの負荷量を第2閾値と比較し、負荷量が第2閾値よりも大きいときに、依存関係を判断する。第1のスレッドの負荷量が大きいほど、第1のスレッドから共有資源へのアクセスが第2のスレッドから共有資源へのアクセスと衝突する可能性が高い。そのため、各CPUへ供給されるクロックの位相が異なることで、複数のCPUから共有資源へのアクセスが衝突することを減少させることができ、最小限に消費電力を抑制することができる。
また、第1のスレッドと第2のスレッドとに依存関係があるときは、第1のCPUへ供給されるクロックの位相を変更しない。これにより、第1のスレッドと第2のスレッドとで共有しているデータや排他制御に影響が生じるのを防止することができる。
また、依存関係がないとき、第1動作クロックの第1位相から第2位相への変更がされている場合、第1動作クロックの位相を第2位相から第1位相に変更する。これにより、複数のCPUから共有資源へのアクセスが衝突することを減少させることができる。
また、依存関係は、共有メモリまたは第1プロセッサのメモリに登録される。これにより、第1のスレッドと第2のスレッドとの依存関係を容易に判断することができ、処理時間を短縮化することができる。
また、依存関係があるスレッドを実行中のCPU群ごとにグループ化する。グループ化したCPU群が複数ある場合、CPU群ごとに該CPU群へ供給されるクロックの位相を異なるCPU群間で非同期となる位相に設定する。共有資源へ供給するクロックの周波数をいずれのCPU群とも同期する周波数に設定する。これにより、マルチコアプロセッサのCPU数が増加しても、アクセスの衝突を減少させることができ、マルチコアプロセッサの性能を向上させることができる。
なお、本実施の形態で説明したスレッド処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド処理プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド処理プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)第1スレッドの実行命令を第1プロセッサに供給し、
前記第1スレッドと第2プロセッサで実行される第2スレッドとの依存関係を判断し、
前記第1スレッドの共有メモリまたは共有キャッシュメモリへのアクセス頻度を第1閾値と比較し、
前記アクセス頻度が第1閾値よりも大きいとき、かつ前記依存関係がないと判断されるときは、前記第1プロセッサの第1動作クロックの位相を変更すること、
を特徴とするスレッド処理方法。
(付記2)前記第1動作クロックの位相を前記第2プロセッサの第2動作クロックと逆相になるように変更すること、
を特徴とする付記1に記載のスレッド処理方法。
(付記3)前記第1動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする付記1または付記2に記載のスレッド処理方法。
(付記4)前記動作クロックの周波数を2倍に変更すること、
を特徴とする付記3に記載のスレッド処理方法。
(付記5)前記第1スレッドを実行するときの第1負荷を第2閾値と比較し、
前記第1負荷が前記第2閾値よりも大きく、前記アクセス頻度が第1閾値よりも大きく、かつ前記依存関係がないと判断されるときは、前記第1プロセッサの第1動作クロックの位相を変更すること、
を特徴とする付記1乃至付記4の何れか一に記載のスレッド処理方法。
(付記6)前記依存関係があるときは、前記第1動作クロックの位相を変更しないこと、
を特徴とする付記1乃至付記5の何れか一に記載のスレッド処理方法。
(付記7)前記依存関係がないとき、前記第1動作クロックの第1位相から第2位相へ変更されていた場合には、前記第1動作クロックの位相を前記第2位相から前記第1位相に変更すること、
を特徴とする付記1乃至付記6の何れか一に記載のスレッド処理方法。
(付記8)前記依存関係は、前記共有メモリまたは前記第1プロセッサのメモリに登録されること、
を特徴とする付記1乃至付記7の何れか一に記載のスレッド処理方法。
(付記9)依存関係があるスレッド間を関連付けるテーブルへアクセス可能な複数のコアのうちの一のコアが、
前記複数のコアの各コアで実行中のスレッド間に直接的または間接的に依存関係があるか否かを、前記テーブルを参照することで判断し、
判断結果に基づいて、前記複数のコアを直接的または間接的に依存関係があるスレッドを実行するコア群ごとにグループ化し、
前記グループ化したコア群が複数ある場合、前記コア群ごとに前記コア群へ供給するクロックの位相を前記コア群間で非同期となる位相に設定し、
前記複数のコアで共有する共有資源へ供給するクロックの周波数をいずれのコア群とも同期する周波数に設定すること、
を特徴とするスレッド処理方法。
(付記10)第1プロセッサと、
前記第1プロセッサと第2プロセッサとがアクセス可能な共有メモリまたは共有キャッシュメモリと、
前記第1プロセッサまたは前記共有メモリに供給される動作クロックを制御するクロック制御ユニットと、
を含み、
前記クロック制御ユニットは、
前記第1プロセッサで実行される第1スレッドの前記共有メモリまたは前記共有キャッシュメモリへのアクセス頻度と第1閾値との比較結果と前記第1スレッドと前記第2プロセッサが実行する第2スレッドとの依存関係とに基づいて、前記第1プロセッサの第1動作クロックの位相を変更すること、
を特徴とするスレッド処理システム。
(付記11)前記クロック制御ユニットは、前記比較結果が前記アクセス頻度が前記第1閾値よりも大きいことを示すとともに前記依存関係があるときに、前記第1動作クロックの位相を変更すること、
を特徴とする付記10に記載のスレッド処理システム。
(付記12)前記クロック制御ユニットは、前記第1プロセッサが前記第1スレッドを実行するときの第1負荷と第2閾値との比較結果に基づいて、前記第1プロセッサの第1動作クロックの位相を変更すること、
を特徴とする付記10または付記11に記載のスレッド処理システム。
(付記13)前記クロック制御ユニットは、前記第1動作クロックの位相を前記第2プロセッサの第2動作クロックと逆相になるように変更すること、
を特徴とする付記10乃至付記12の何れか一に記載のスレッド処理システム。
(付記14)前記クロック制御ユニットは、前記第1動作クロックの位相を変更するとき、前記共有メモリまたは共有キャッシュメモリに供給される動作クロックの周波数を変更すること、
を特徴とする付記10乃至付記12の何れか一に記載のスレッド処理システム。
(付記15)前記クロック制御ユニットは、前記動作クロックの周波数を2倍に変更すること、
を特徴とする付記14に記載のスレッド処理システム。