(57)【特許請求の範囲】
【請求項１】
複数のプロセッサと、前記複数のプロセッサに個別に電源を供給する電源供給装置と、前記複数のプロセッサ間で共有され、夫々、前記複数のプロセッサのうちの１つに実行される複数のスレッドを記憶する共有メモリと、を備えるマルチプロセッサシステムであって、
前記共有メモリは、
前記複数のスレッドのうちの待ちイベントを有するスレッドが待ちイベント数と対応付けて登録されるスレッドプールと、
前記複数のスレッドのうちの待ちイベントを有さないスレッドが登録されるスレッドキューと、
を備え、
前記複数のプロセッサは、
前記電源供給装置から電源が供給されたときに、前記スレッドキューから第１のスレッドを取得して、前記第１のスレッドを実行する１以上の第１のプロセッサと、
前記第１のスレッドの実行状況に基づいて、前記第１のスレッドを待ちイベントとする前記スレッドプールに登録されている第２のスレッドの、待ちイベント数を更新し、前記第２のスレッドの待ちイベント数がゼロ値となったとき、当該第２のスレッドを前記スレッドキューに登録する第２のプロセッサと、
前記スレッドキューに登録されているスレッドの数と、前記スレッドプールに登録されている、待ちイベント数が第１のしきい値以下のスレッドの数と、に基づいて、前記第１のプロセッサに対する前記電源供給装置からの電源供給を個別に停止／再開する第３のプロセッサと、
を備えることを特徴とするマルチプロセッサシステム。
【請求項２】
前記第３のプロセッサは、前記スレッドキューに登録されているスレッドの数に、前記待ちイベント数が第１のしきい値以下のスレッドの数を加算するとともに、第２のしきい値を減算して、プロセッサ数設定値を算出し、電源が供給された第１のプロセッサの数が前記プロセッサ数設定値と等しくなるように前記第１のプロセッサの電源供給を停止／再開する、
ことを特徴とする請求項１に記載のマルチプロセッサシステム。
【請求項３】
前記第２のしきい値を、予めプログラムされたタイミングで、または前記共有メモリが記憶する複数のスレッドの構造に基づくタイミングで、動的に変更する第４のプロセッサをさらに備える、ことを特徴とする請求項２に記載のマルチプロセッサシステム。
【請求項４】
前記第３のプロセッサは、前記待ちイベント数が第１のしきい値以下のスレッドの数に所定の重み付け係数を乗算するとともに、前記スレッドキューに登録されているスレッドの数を加算して、プロセッサ数設定値を算出し、電源が供給された第１のプロセッサの数が前記プロセッサ数設定値と等しくなるように前記第１のプロセッサの電源供給を停止／再開する、
ことを特徴とする請求項１に記載のマルチプロセッサシステム。
【請求項５】
複数のプロセッサと、前記複数のプロセッサに個別に電源を供給する電源供給装置と、前記複数のプロセッサ間で共有され、夫々、前記複数のプロセッサのうちの１つに実行される複数のスレッドを記憶する共有メモリと、を備えるマルチプロセッサシステムの電力制御方法であって、
前記共有メモリが記憶する複数のスレッドのうちの待ちイベント数を有するスレッドを待ちイベント数と対応付けてスレッドプールに登録し、
前記共有メモリが記憶する複数のスレッドのうちの待ちイベント数を有さないスレッドをスレッドキューに登録し、
前記複数のプロセッサのうちの前記電源供給装置からの電源が供給されたプロセッサが前記スレッドキューから第１のスレッドを取得して、取得した第１のスレッドを実行し、
前記第１のスレッドの実行状況に基づいて、前記第１のスレッドを待ちイベントとする前記スレッドプールに登録されている第２のスレッドの、待ちイベント数を更新し、
前記第２のスレッドの待ちイベント数がゼロ値となったとき、当該第２のスレッドを前記スレッドキューに登録し、
前記スレッドキューに登録されているスレッドの数と、前記スレッドプールに登録されている、待ちイベント数が第１のしきい値以下のスレッドの数と、に基づいて、プロセッサ数設定値を算出し、
電源が供給されたプロセッサの数が前記プロセッサ数設定値と等しくなるように前記複数のプロセッサに対する前記電源供給装置からの電源供給を個別に停止／再開する、
を備えることを特徴とする電力制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、マルチプロセッサシステムおよび電力制御方法に関する。
【背景技術】
【０００２】
従来、消費電力の削減を目的としてプロセッサ毎に電源供給を停止したり再開したりする機能を備えるマルチプロセッサシステムがある。
【０００３】
マルチプロセッサシステムの消費電力を低減する手法として、例えば、プロセッサがスレッドを実行中であるか非実行中であるかに基づいてプロセッサの電源をオンしたりオフしたりする手法が考えられる。一般に、プロセッサの電源をオンからオフおよびオフからオンに遷移するとき、プロセッサの静電容量に相当する電流が流れるため、低消費電力化の観点からは電源のオンとオフの遷移の頻度はあまり高くないほうがよい。しかしながら、この手法によると、プロセッサに空きがあればすぐにでも実行されることが可能なスレッド（以降、実行可能スレッド）の数が頻繁に変化すると、電源オン・オフの遷移の頻度が高くなってしまい、消費電力が増加する場合がある。
【０００４】
また、電源状態の遷移には幾分かの時間がかかる。電源のオフ状態またはオン状態が保たれる時間が短くなると、スレッドの実行時間に対する電源のオンとオフの遷移にかかる時間の割合が増大し、結果としてマルチプロセッサシステムの性能低下を招く。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−２７１９３０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の一つの実施形態は、性能低下を抑制しつつ消費電力を低減するマルチプロセッサシステムおよびマルチプロセッサシステムの電力制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一つの実施形態によれば、マルチプロセッサシステムは、複数のプロセッサと、前記複数のプロセッサに個別に電源を供給する電源供給装置と、前記複数のプロセッサ間で共有され、夫々、前記複数のプロセッサのうちの１つに実行される複数のスレッドを記憶する共有メモリと、を備える。前記共有メモリは、前記複数のスレッドのうちの待ちイベントを有するスレッドが待ちイベント数と対応付けて登録されるスレッドプールと、前記複数のスレッドのうちの待ちイベントを有さないスレッドが登録されるスレッドキューと、を備える。前記複数のプロセッサは、１以上の第１のプロセッサと、第２のプロセッサと、第３のプロセッサとを備える。第１のプロセッサは、前記電源供給装置から電源が供給されたときに、前記スレッドキューから第１のスレッドを取得して、取得した第１のスレッドを実行する。第２のプロセッサは、前記第１のスレッドの実行状況に基づいて、前記第１のスレッドを待ちイベントとする前記スレッドプールに登録されている第２のスレッドの、待ちイベント数を更新し、前記第２のスレッドの待ちイベント数がゼロ値となったとき、当該第２のスレッドを前記スレッドキューに登録する。第３のプロセッサは、前記スレッドキューに登録されているスレッドの数と、前記スレッドプールに登録されている、待ちイベント数が第１のしきい値以下のスレッドの数と、に基づいて、前記第１のプロセッサに対する前記電源供給装置からの電源供給を個別に停止／再開する。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態のマルチプロセッサシステムの構成図。
【図２】アプリケーションプログラムに含まれる複数のスレッドの構造の一例を説明する図。
【図３】実行可能スレッドキューのデータ構造例を示す図。
【図４】イベント待ちスレッドプールのデータ構造例を示す図。
【図５】プロセッサ電源状態フラグの一例を示す図。
【図６】第１の実施形態のユーザタスクの動作を説明するフローチャート。
【図７】第１の実施形態のスレッド登録処理の動作を説明するフローチャート。
【図８】第１の実施形態のスレッド実行制御タスクの動作を説明するフローチャート。
【図９】第１の実施形態のプロセッサ数設定値の算出処理のフローチャート。
【図１０】第１の実施形態のスレッドの動作を説明するフローチャート。
【図１１】第１の実施形態のイベント送信処理の動作を説明するフローチャート。
【図１２−１】第１の実施形態のマルチプロセッサシステムにおけるプロセッサの状態の遷移を説明する図。
【図１２−２】比較例を適用したマルチプロセッサシステムにおけるプロセッサの状態の遷移を説明する図。
【図１３】第２の実施形態のマルチプロセッサシステムの構成図。
【図１４】第２の実施形態のユーザタスクの動作を説明するフローチャート。
【図１５】第２の実施形態のイベント待ちスレッド数変更処理の動作を説明するフローチャート。
【図１６】第２の実施形態のマルチプロセッサシステムにおいて実行されるプロセッサ数設定値の算出処理のフローチャート。
【図１７】第３の実施形態のマルチプロセッサシステムの構成図。
【図１８】第３の実施形態の待ちイベント数しきい値変更処理の動作を説明するフローチャート。
【図１９】第３の実施形態のマルチプロセッサシステムにおいて実行されるプロセッサ数設定値の算出処理のフローチャート。
【図２０】第４の実施形態のマルチプロセッサシステムの構成図である。
【図２１】第４の実施形態のスレッド実行制御タスクの動作を説明するフローチャート。
【図２２】第４の実施形態の電源オフプロセッサ選択処理の動作を説明するフローチャート。
【図２３】第４の実施形態の電源オフプロセッサ登録処理の動作を説明するフローチャート。
【図２４】第５の実施形態のマルチプロセッサシステムの構成図。
【図２５】第５の実施形態のスレッド実行制御タスクの動作を説明するフローチャート。
【図２６】第５の実施形態の電源オフプロセッサ選択処理の動作を説明するフローチャート。
【図２７】第５の実施形態の電源オフプロセッサ登録処理の動作を説明するフローチャート。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、実施形態にかかるマルチプロセッサシステムおよび電力制御方法を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【００１０】
（第１の実施形態）
図１は、第１の実施形態のマルチプロセッサシステムの構成図である。図１のマルチプロセッサシステム１は、４個のプロセッサ１０ａ〜１０ｄと、共有メモリ１１と、電源供給装置１２と、バス１３と、電力供給線１４とを備えている。プロセッサ１０ａ〜１０ｄおよび共有メモリ１１はバス１３に接続されている。プロセッサ１０ａ〜１０ｄは、バス１３を介して共有メモリ１１にアクセスすることができる。電源供給装置１２は、電力供給線１４を介してプロセッサ１０ａ〜１０ｄに電力を供給する。
【００１１】
なお、図１では、電力供給線１４はプロセッサ１０ａ〜１０ｄに共通接続されているものとして描画されているが、実際には電力供給線１４はプロセッサ１０ａ〜１０ｄに個別に接続されている。電源供給装置１２は、プロセッサ１０ａ〜１０ｄの夫々に電源を供給したり電源供給を停止したりすることができる。例えば、プロセッサ１０ａ〜１０ｄは、ターゲットのプロセッサを指定して、電源を供給せしめる指令または電源供給を停止せしめる指令を図示しない専用線を用いて電源供給装置１２に送信する。電源供給装置１２は、ターゲットのプロセッサに対し、指令の内容に対応する処置を実行する。なお、以降、プロセッサに電源が供給されている状態を電源オン状態、プロセッサに電源が供給されていない状態を電源オフ状態ということとする。
【００１２】
共有メモリ１１は、例えばメモリ、レジスタ、外部記憶装置、またはそれらの組み合わせにより構成される。共有メモリ１１は、プロセッサ１０ａ〜１０ｄで実行されるプログラムであるアプリケーションプログラム２０を予め記憶している。アプリケーションプログラム２０は、複数のスレッドＴ１、Ｔ２、Ｔ３、…と、これらのスレッドを管理するユーザタスク２１とにより構成される。
【００１３】
図２は、アプリケーションプログラム２０に含まれる複数のスレッドの構造の一例を説明する図である。図２において、スレッドを表すボックスに括弧書きで記述されている数字は、スレッドの実行にかかる時間であり、ボックス間の矢印はイベントの関係を示している。例えば、スレッドＴ１は、実行時間が４０であり、実行が完了したときに、スレッドＴ５およびスレッドＴ６にイベントを送信する。スレッドＴ５は、スレッドＴ１〜Ｔ４の実行が完了したとき、言い換えると、スレッドＴ１〜Ｔ４からのイベントを受信したとき、実行が可能な状態となる。なお、スレッドが実行可能な状態になるために実行完了する必要があるスレッドを、待ちイベントということとする。即ち、スレッドＴ５の待ちイベントはスレッドＴ１〜Ｔ４である。また、そのスレッドの待ちイベントの実行が完了していないためにすぐに実行されることが不可能なスレッドをイベント待ちスレッドということとする。
【００１４】
共有メモリ１１は、スレッドの実行を制御するとともにプロセッサ１０ａ〜１０ｄの電力制御を実行するスレッド実行制御タスク１１１と、アプリケーションプログラム２０が含むスレッドを後述の実行可能スレッドキュー１１２またはイベント待ちスレッドプール１１３に登録するスレッド登録処理１１４と、スレッドがイベントを送信する際に当該スレッドによって呼び出されるイベント送信処理１１５とを予め記憶している。スレッド実行制御タスク１１１、スレッド登録処理１１４、イベント送信処理１１５は夫々、プログラムモジュールとして共有メモリ１１に格納されている。
【００１５】
また、共有メモリ１１は、実行可能スレッドキュー１１２およびイベント待ちスレッドプール１１３を備えている。実行可能スレッドキュー１１２およびイベント待ちスレッドプール１１３は夫々スレッド管理のためのデータ構造である。
【００１６】
実行可能スレッドキュー１１２は、例えばＦＩＦＯであって、実行可能スレッドを特定する情報が登録される。図３は、実行可能スレッドキュー１１２のデータ構造例を示す図である。図３の実行可能スレッドキュー１１２には、実行可能スレッドの実行開始アドレスが登録されている。実行開始アドレスは、スレッドの実体であるプログラムモジュールの先頭アドレスである。
【００１７】
イベント待ちスレッドプール１１３は、イベント待ちスレッド毎に待ちイベント数を記録したエントリが登録される。図４は、イベント待ちスレッドプール１１３のデータ構造例を示す図である。図４のイベント待ちスレッドプール１１３には、イベント待ちスレッド毎に、ＩＤと、待ちイベントの数と、イベント待ちスレッドの実行開始アドレスが登録されている。なお、夫々のエントリに記述されている待ちイベント数は、ＩＤあるいは実行開始アドレスにより特定されるスレッドにかかる待ちイベントの実行が完了する毎にイベント送信処理１１５によりデクリメントされる。待ちイベント数が０になると、そのエントリはイベント待ちスレッドプール１１３から削除され、そのエントリが示すスレッドが実行可能スレッドキュー１１２に登録される。
【００１８】
電源供給装置１２は、プロセッサ１０ａ〜１０ｄが電源オン状態であるか電源オフ状態であるかをプロセッサ毎に示すプロセッサ電源状態フラグ（フラグ情報）１２１を備えている。プロセッサ１０ａ〜１０ｄの夫々は、プロセッサ電源状態フラグ１２１を参照することによって他のプロセッサが電源オン状態であるか電源オフ状態であるかを認識することができる。図５は、プロセッサ電源状態フラグ１２１の一例を示す図である。この例によると、プロセッサ電源状態フラグ１２１は、電源オン状態である場合には「１」を、電源オフ状態である場合には「０」を示す１ビットの情報を、４つのプロセッサ１０ａ〜１０ｄの夫々について備えている。プロセッサ電源状態フラグ１２１は、例えば、電源供給装置１２の中または外に設けられた、レジスタや小規模なメモリに保持される。
【００１９】
次に、図６〜図１１を参照して、第１の実施形態のマルチプロセッサシステム１の動作を説明する。プロセッサ１０ａ〜１０ｄの夫々は、共有メモリ１１が記憶するプログラムモジュール（ユーザタスク２１、複数のスレッド、スレッド実行制御タスク１１１、スレッド登録処理１１４、またはイベント送信処理１１５）による制御の下で動作するが、以降の動作の説明では、対応するプログラムモジュールを動作主体として説明する。
【００２０】
第１の実施形態のマルチプロセッサシステム１の動作は、プロセッサ１０ａ〜１０ｄのうちの１つにユーザタスク２１が起動されてから開始される。図６は、ユーザタスク２１の動作を説明するフローチャートである。ユーザタスク２１は、起動されると、ユーザタスク２１自身の初期化を行い（Ｓ１）、その後、ユーザタスク２１を実行するプロセッサを除く他の全てのプロセッサにスレッド実行制御タスク１１１を起動する（Ｓ２）。なお、プロセッサ１０ａ〜１０ｄの初期状態はすべて電源オン状態であるものとしている。続いて、ユーザタスク２１は、アプリケーションプログラム２０に含まれる複数のスレッドのうちの１つを指定してスレッド登録処理１１４を実行する（Ｓ３）。
【００２１】
図７は、スレッド登録処理１１４の動作を説明するフローチャートである。スレッド登録処理１１４は、指定されたスレッドが０より大きい数（即ち１つ以上）の待ちイベントを有するか否かを判定する（Ｓ１１）。指定されたスレッドが１以上の待ちイベントを有する場合（Ｓ１１、Ｙｅｓ）、指定されたスレッドはイベント待ちスレッドであるので、スレッド登録処理１１４は、指定されたスレッドをイベント待ちスレッドプール１１３に登録する（Ｓ１２）。即ち、スレッド登録処理１１４は、指定されたスレッドのＩＤ、待ちイベント数、および実行開始アドレスをイベント待ちスレッドプール１１３に登録する。指定されたスレッドが１未満（即ち０）の待ちイベントを有する場合（Ｓ１１、Ｎｏ）、指定されたスレッドは実行可能スレッドであるので、スレッド登録処理１１４は、指定されたスレッドを実行可能スレッドキュー１１２に登録する（Ｓ１３）。即ち、スレッド登録処理１１４は、指定されたスレッドの実行開始アドレスを実行可能スレッドキュー１１２に登録する。Ｓ１２またはＳ１３の後、指定されたスレッドに対するスレッド登録処理１１４の動作が終了となる。
【００２２】
ユーザタスク２１は、Ｓ３の後、アプリケーションプログラム２０に含まれる全てのスレッドに対するスレッド登録処理１１４が完了したか否かを判定する（Ｓ４）。スレッド登録処理１１４が未完了のスレッドが存在する場合（Ｓ４、Ｎｏ）、ユーザタスク２１は、スレッド登録処理１１４が未完了のスレッドを指定してＳ３を実行する。全てのスレッドに対するスレッド登録処理１１４が完了した場合（Ｓ４、Ｙｅｓ）、ユーザタスク２１は、登録した全てのスレッドの実行が完了するまで待機し（Ｓ５）、全てのスレッドの実行が完了した後、ユーザタスク２１自身の終了処理を実行して（Ｓ６）、動作を終了する。
【００２３】
図８は、Ｓ２にて起動されたスレッド実行制御タスク１１１の動作を説明するフローチャートである。始めに、スレッド実行制御タスク１１１は、実行可能スレッドキュー１１２に１以上のスレッドが登録されているか否かを判定する（Ｓ２１）。実行可能スレッドキュー１１２に１以上のスレッドが登録されている場合（Ｓ２１、Ｙｅｓ）、スレッド実行制御タスク１１１は、実行可能スレッドキュー１１２から１つのスレッドを取り出す（Ｓ２２）。そして、スレッド実行制御タスク１１１は、電源オン状態とするプロセッサ数設定値の算出を実行する（Ｓ２３）。
【００２４】
図９は、Ｓ２３にて実行される、プロセッサ数設定値を算出する処理のフローチャートである。スレッド実行制御タスク１１１は、実行可能スレッドキュー１１２に登録されているスレッドの数（Ａ）を、イベント待ちスレッドプール１１３に登録されている待ちイベント数が予め設定された値（ここでは１）のスレッドの数（Ｂ）を、それぞれ取得する（Ｓ４１、Ｓ４２）。そして、スレッド実行制御タスク１１１は、あらかじめ設定されたイベント待ちスレッド数しきい値（Ｃ）を用いて、Ａ＋(Ｂ−Ｃ）を演算し、得られた値をプロセッサ数設定値とする（Ｓ４３）。そして、スレッド実行制御タスク１１１は、プロセッサ数設定値がＳ２の処理によりスレッド実行制御タスク１１１が起動されたプロセッサの数より大きい場合には、算出したプロセッサ数設定値をスレッド実行制御タスク１１１が起動されたプロセッサの数で丸めて（Ｓ４４）、Ｓ２３を終了する。例えば、実行可能スレッドキュー１１２に登録されている実行可能スレッドの数が１で、イベント待ちスレッドプール１１３に登録されているスレッドのうちの待ちイベント数が１のスレッドの数が２で、イベント待ちスレッド数しきい値が１である場合は、プロセッサ数設定値は２となる。
【００２５】
Ｓ２３に続いて、スレッド実行制御タスク１１１は、プロセッサ電源状態フラグ１２１を参照することによって、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値未満であるか否かを判定する（Ｓ２４）。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ２４、Ｙｅｓ）、スレッド実行制御タスク１１１は、電源オン状態のプロセッサ数がプロセッサ数設定値に等しくなるまでプロセッサ１０ａ〜１０ｄのうちの電源オフ状態のプロセッサを電源オン状態に遷移させる（Ｓ２５）。そして、Ｓ２２により取得したスレッドを実行する（Ｓ２６）。
【００２６】
図１０は、Ｓ２６（即ちスレッドの動作）のフローチャートである。スレッドは、当該スレッドのプログラムモジュールに基づく固有の演算処理を実行する（Ｓ５１）。演算処理が完了すると、スレッドは、イベント送信処理１１５を実行し（Ｓ５２）、動作を終了する。
【００２７】
図１１は、イベント送信処理１１５の動作を説明するフローチャートである。イベント送信処理１１５は、イベント送信処理１１５を呼び出したスレッドを待ちイベントとするスレッドのＩＤをキーとしてイベント待ちスレッドプール１１３を検索して、見つかったエントリに記述されている待ちイベント数を１だけデクリメントし（Ｓ６１）、デクリメント後の待ちイベント数が０であるか否かを判定する（Ｓ６２）。なお、夫々のスレッドは、自スレッドを待ちイベントとするスレッドのＩＤを知っているものとしている。待ちイベント数が０である場合（Ｓ６２、Ｙｅｓ）、スレッドは、待ちイベント数が０となったスレッドを実行可能スレッドキュー１１２に登録するとともに（Ｓ６３）、待ちイベント数が０となったスレッドにかかるエントリをイベント待ちスレッドプール１１３から削除して（Ｓ６４）、動作を終了する。待ちイベント数が０でない場合（Ｓ６２、Ｎｏ）、Ｓ６３およびＳ６４がスキップされる。
【００２８】
なお、イベント送信処理１１５を呼び出したスレッドを待ちイベントとするスレッドが複数存在する場合には、イベント送信処理１１５を呼び出したスレッドを待ちイベントとするスレッド毎にイベント送信処理１１５が実行される。また、イベント送信処理１１５は、スレッドが自スレッドに固有の演算処理が完了した後に実行されるものとしたが、演算処理の途中にイベントを送信可能である場合には、演算処理の途中にイベントを送信するようにしてもよい。
【００２９】
スレッドの実行が完了すると、スレッド実行制御タスク１１１は、Ｓ２１を実行する。電源オン状態のプロセッサ数がプロセッサ数設定値を越える場合（Ｓ２４、Ｎｏ）、Ｓ２５はスキップされる。
【００３０】
実行可能スレッドキュー１１２に登録されているスレッドがない場合（Ｓ２１、Ｎｏ）、スレッド実行制御タスク１１１は、Ｓ２３と同様の手順でプロセッサ数設定値を算出する（Ｓ２７）。そして、スレッド実行制御タスク１１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値より大きいか否かを判定する（Ｓ２８）。電源オン状態のプロセッサ数がプロセッサ数設定値より大きい場合（Ｓ２８、Ｙｅｓ）、スレッド実行制御タスク１１１は、自タスク１１１を実行しているプロセッサを電源オフ状態に遷移させ（Ｓ２９）、動作を停止する（Ｓ３０）。スレッド実行制御タスク１１１は、自タスク１１１を実行するプロセッサが他のプロセッサにて実行されているスレッド実行制御タスク１１１によって電源オン状態に遷移せしめられると（Ｓ３１）、Ｓ２１を実行する。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ２８、Ｎｏ）、スレッド実行制御タスク１１１は、Ｓ２１を実行する。
【００３１】
図１２−１は、第１の実施形態のマルチプロセッサシステムにおけるプロセッサの状態の遷移を説明する図である。図１２−１は、図２に示した構造のスレッドが実行せしめられた場合のプロセッサ１０ａ〜１０ｄの状態の遷移を示している。例えば時刻が４０を経過した直後では、スレッドＴ５およびスレッドＴ６が待ちイベント数が１のイベント待ちスレッドに該当する。その時点においては、プロセッサ１０ａは、スレッドＴ１の実行が終わり、実行可能スレッドの数がゼロとなっているにもかかわらず、電源オフ状態に移行していない。スレッドＴ２の実行が完了すると、スレッドＴ５およびスレッドＴ６が実行可能スレッドキュー１１２に登録される。そして、電源オン状態を保たれていたプロセッサ１０ａはスレッドＴ６の実行を開始し、スレッドＴ２の実行を完了したプロセッサ１０ｂはスレッドＴ５の実行を開始する。
【００３２】
図１２−２は、第１の実施形態と比較される技術（比較例）を適用したマルチプロセッサシステムにおけるプロセッサの状態の遷移を説明する図である。比較例によれば、実行可能スレッドキューにスレッドが登録されたとき、プロセッサが電源オン状態に遷移せしめられる。そして、プロセッサがスレッドを実行完了した後、実行可能スレッドキューに取得可能なスレッドがない場合に、当該プロセッサが電源オフ状態に遷移せしめられる。比較例によると、例えば、プロセッサ１０ａは、スレッドＴ１の実行を完了した後、状態遷移のための時間を費やして電源オフ状態に移行する。そして、スレッドＴ２の実行が完了すると、プロセッサ１０ａは、再度、状態遷移のための時間を費やして電源オン状態に移行する。このように、比較例によると、第１の実施形態に比べて電源オン状態と電源オフ状態との間を遷移する頻度が高いため、遷移のために消費される電力が増加する。また、プロセッサ１０ａが第１の実施形態のケースよりも２０だけ後の時刻に実行完了している。これは、電源オン状態と電源オフ状態間の遷移があまりにも多いために、遷移にかかる時間がスレッドの実行にかかる時間に対して相対的に増加したことによる。
【００３３】
第１の実施形態によれば、待ちイベント数が１のイベント待ちスレッドの数（即ち近い将来に実行可能スレッドとなるスレッドの数）を考慮に入れてプロセッサを電源オン状態と電源オフ状態間を遷移せしめるので、遷移の頻度を低減することができる。これにより、性能低下を抑えつつ消費電力を低減することができる。
【００３４】
なお、以上の説明においては、スレッドを実行するプロセッサが、当該スレッドにかかるイベント送信処理１１５の一環としてイベント待ちスレッドプール１１３と実行可能スレッドキュー１１２とを更新するものとして説明した。しかしながら、スレッドを実行するとともに当該スレッドにかかるイベントの送信を実行するプロセッサと、イベント待ちスレッドプール１１３および実行可能スレッドキュー１１２を更新するプロセッサとは、異なっていてもよい。
【００３５】
また、スレッド実行制御タスク１１１を実行するプロセッサが、スレッドを実行するとともに、実行可能スレッドキュー１１２に登録されているスレッドの数とイベント待ちスレッドプール１１３に登録されているスレッドの数とに基づいて自他のプロセッサの電源制御を実行する、として説明した。しかしながら、スレッド実行制御タスク１１１の機能のうちのスレッドを取得して実行する機能のみを実行するプロセッサと、プロセッサ１０ａ〜１０ｄの電源制御を実行するプロセッサとは、異なっていてもよい。即ち、プロセッサ１０ａ〜１０ｄの電源制御を実行する特定のプロセッサを用意するようにしてもよい。
【００３６】
以上述べたように、本発明の第１の実施形態のマルチプロセッサシステム１は、実行可能スレッドキュー１１２に登録されているスレッドの数と、イベント待ちスレッドプール１１３に登録されている、待ちイベント数が所定のしきい値以上のスレッドの数と、に基づいて、スレッド実行制御タスク１１１を実行するプロセッサに対する電源供給装置１２からの電源供給を個別に停止／再開する。そのため、近い将来に実行可能となるスレッドの数を考慮して電源オン状態と電源オフ状態間の遷移を実行するので、性能低下を抑制しつつ消費電力を低減することができる。
【００３７】
また、マルチプロセッサシステム１は、実行可能スレッドキュー１１２に登録されているスレッドの数Ａに、待ちイベント数が所定のしきい値以上のスレッドの数Ｂを加算するとともに、予め決められたイベント待ちスレッド数しきい値Ｃを減算してプロセッサ数設定値を算出し、電源供給がオンとなっているプロセッサ１０ａ〜１０ｄの数がプロセッサ数設定値と等しくなるようにプロセッサ１０ａ〜１０ｄの電源供給を停止／再開するので、性能低下を抑制しつつ消費電力を低減することができる。
【００３８】
また、スレッド実行制御タスク１１１の下でスレッドを実行するプロセッサ１０ａ〜１０ｄは夫々、電源供給がオンとなっているプロセッサ１０ａ〜１０ｄの数がプロセッサ数設定値よりも小さいとき、電源供給が停止されている他のプロセッサ１０ａ〜１０ｄへの電源供給を再開し、電源が供給されているプロセッサ１０ａ〜１０ｄの数がプロセッサ数設定値よりも大きいとき、自プロセッサに対する電源供給を停止するので、電源制御用のプロセッサを特別に用意することなくプロセッサ１０ａ〜１０ｄに対する電源供給の停止／再開の制御を実現することができる。
【００３９】
また、プロセッサ１０ａ〜１０ｄのうちの１つのプロセッサは、ユーザタスク２１の制御の下で、共有メモリ１１が記憶する複数のスレッドの夫々を、待ちイベント数に基づいて、イベント待ちスレッドプール１１３または実行可能スレッドキュー１１２に登録するので、起動時にスレッドの分類を行うことができるようになる。
【００４０】
また、電源供給装置１２は、電源が供給されているか電源供給が停止されているかをプロセッサ１０ａ〜１０ｄの夫々について記述したプロセッサ電源状態フラグ１２１を備え、プロセッサ１０ａ〜１０ｄは、プロセッサ電源状態フラグ１２１を参照することによって電源オン状態のプロセッサの数を特定する。これにより、プロセッサ１０ａ〜１０ｄの夫々は、簡単な構成で他のプロセッサ１０ａ〜１０ｄの電源の状態を確認することができる。
【００４１】
（第２の実施形態）
イベント待ちスレッド数しきい値を１で固定すると、待ちイベント数が１であるイベント待ちスレッドの数が急激に増大した場合に、スレッドを非実行中であるにも関わらず電源オン状態のまま待機せしめられるプロセッサの数が多くなり、消費電力が増大する事態が発生する。そこで、第２の実施形態のマルチプロセッサシステムは、イベント待ちスレッド数しきい値の変更が可能に構成されている。
【００４２】
図１３は、第２の実施形態のマルチプロセッサシステムの構成図である。第２の実施形態の説明においては、第１の実施形態と同一の構成要素には同一の名称および符号を付して、重複する説明を省略する。
【００４３】
図１３のマルチプロセッサシステム２は、４個のプロセッサ１０ａ〜１０ｄと、共有メモリ１１ａと、電源供給装置１２と、バス１３と、電力供給線１４とを備えている。共有メモリ１１ａは、第１の実施形態の構成に加え、イベント待ちスレッド数しきい値変更処理２１２を予め記憶している。また、共有メモリ１１ａには、イベント待ちスレッド数しきい値設定値２１１が格納される。イベント待ちスレッド数しきい値設定値２１１は、イベント待ちスレッド数変更処理２１２によって変更される。
【００４４】
図１４は、第２の実施形態のユーザタスク２２の動作を説明するフローチャートである。ユーザタスク２２は、起動されると、ユーザタスク２２自身の初期化を行い（Ｓ７１）、イベント待ちスレッド数しきい値設定値２１１を初期設定するためにイベント待ちスレッド数変更処理２１２を実行する（Ｓ７２）。ここでは、イベント待ちスレッド数変更処理２１２は、ユーザタスク２２により指定される値をイベント待ちスレッド数しきい値設定値２１１に設定する。なお、イベント待ちスレッド数変更処理２１２の動作は後述する。
【００４５】
その後、ユーザタスク２２は、ユーザタスク２２を実行するプロセッサを除く他の全てのプロセッサにスレッド実行制御タスク１１１を起動する（Ｓ７３）。続いて、ユーザタスク２２は、アプリケーションプログラム２０に含まれ、イベント待ちスレッド数しきい値設定値２１１で実行せしめるスレッドのうちの１つを指定して、スレッド登録処理１１４を実行する（Ｓ７４）。そして、ユーザタスク２２は、イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が完了したか否かを判定する（Ｓ７５）。イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が未完了である場合（Ｓ７５、Ｎｏ）、ユーザタスク２２は、スレッド登録処理１１４が未完了のスレッドを指定してＳ７４を実行する。イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が完了した場合（Ｓ７５、Ｙｅｓ）、ユーザタスク２２は、登録した全てのスレッドの実行が完了するまで待機する（Ｓ７６）。
【００４６】
登録した全てのスレッドの実行が完了した後、ユーザタスク２２は、再度イベント待ちスレッド数変更処理２１２を実行してイベント待ちスレッド数しきい値設定値２１１を変更し（Ｓ７７）、アプリケーションプログラム２０に含まれ、したイベント待ちスレッド数しきい値設定値２１１で実行せしめるスレッドのうちの１つを指定して、スレッド登録処理１１４を実行する（Ｓ７８）。そして、ユーザタスク２２は、イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が完了したか否かを判定する（Ｓ７９）。イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が未完了である場合（Ｓ７９、Ｎｏ）、ユーザタスク２２は、スレッド登録処理１１４が未完了のスレッドを指定してＳ７８の動作を実行する。イベント待ちスレッド数しきい値設定値２１１で実行せしめる全てのスレッドに対するスレッド登録処理１１４が完了した場合（Ｓ７９、Ｙｅｓ）、ユーザタスク２２は、登録した全てのスレッドの実行が完了するまで待機する（Ｓ８０）。登録した全てのスレッドの実行が完了した後、ユーザタスク２２は、ユーザタスク２２自身の終了処理を実行して（Ｓ８１）、動作を終了する。
【００４７】
図１５は、イベント待ちスレッド数変更処理２１２の動作を説明するフローチャートである。イベント待ちスレッド数変更処理２１２は、ユーザタスク２２に予めプログラムされている値をイベント待ちスレッド数しきい値設定値２１１に設定し（Ｓ９１）、プロセッサ数設定値を算出する（Ｓ９２）。そして、イベント待ちスレッド数変更処理２１２は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値未満であるか否かを判定する（Ｓ９３）。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ９３、Ｙｅｓ）、イベント待ちスレッド数変更処理２１２は、電源オン状態のプロセッサ数がプロセッサ数設定値に等しくなるまで電源オフ状態のプロセッサを電源オン状態に遷移させて（Ｓ９４）、処理を終了する。電源オン状態のプロセッサ数がプロセッサ数設定値以上の場合（Ｓ９３、Ｎｏ）、Ｓ９４はスキップされる。
【００４８】
図１６は、第２の実施形態のマルチプロセッサシステム２において実行されるプロセッサ数設定値の算出処理のフローチャートである。始めに、イベント待ちスレッド数変更処理２１２は、実行可能スレッドキュー１１２に登録されているスレッドの数（Ａ）を、イベント待ちスレッドプール１１３に登録されている待ちイベント数が１のスレッドの数（Ｂ）を、それぞれ取得する（Ｓ１０１、Ｓ１０２）。そして、イベント待ちスレッド数変更処理２１２は、イベント待ちスレッド数しきい値設定値２１１（Ｃ２）を読み出して（Ｓ１０３）、Ａ＋(Ｂ−Ｃ２）を演算し、得られた値をプロセッサ数設定値とする（Ｓ１０４）。そして、イベント待ちスレッド数変更処理２１２は、プロセッサ数設定値が、Ｓ７３によりスレッド実行制御タスク１１１が起動されるプロセッサの数より大きい場合には、算出したプロセッサ数設定値をスレッド実行制御タスク１１１を実行するプロセッサの数で丸めて（Ｓ１０５）、プロセッサ数設定値を算出する処理を終了する。
【００４９】
なお、スレッド実行制御タスク１１１がプロセッサ数設定値を算出する際にも、スレッド実行制御タスク１１１は図１６と同様の手順でプロセッサ数設定値を算出する。
【００５０】
なお、以上の説明においては、ユーザタスク２２がイベント待ちスレッド数しきい値設定値２１１を予めプログラムされたタイミングで設定変更するものとして説明したが、プロセッサ１０ａ〜１０ｄのうちの例えば１つのプロセッサに、アプリケーションプログラム２０が含む複数のスレッドの構造に基づいてイベント待ちスレッド数しきい値設定値２１１を動的に変更せしめるタスクを実行させるようにしてもよい。例えばこのタスクは、待ちイベント数が１であるイベント待ちスレッドの数の増減に応じてイベント待ちスレッド数しきい値設定値２１１を増減せしめることができる。
【００５１】
このように、第２の実施形態のマルチプロセッサシステム２は、予めプログラムされたタイミングで、またはアプリケーションプログラム２０が含む複数のスレッドの構造に基づくタイミングで、動的にイベント待ちスレッド数しきい値設定値２１１を変更するので、例えば待ちイベント数が１以上のスレッドの数が多くなったときにイベント待ちスレッド数しきい値設定値２１１をより大きい値に変更することで、電源オン状態で待機するプロセッサの数を小さくすることができ、より効率的な電力制御が可能となる。
【００５２】
（第３の実施形態）
待ちイベント数が１のスレッドの数を用いてプロセッサ数設定値を算出するようにしたとしても、アプリケーションプログラムが、実行時間が短い多数のスレッドを含んでいると、待ちイベント数が１のイベント待ちスレッドの数が頻繁に変化する。その結果、電源供給の停止／再開の頻度をそれほど大きくは低減できないという事態が発生する。そこで、第３の実施形態のマルチプロセッサシステムは、１以上の値でかつ変更可能な値をしきい値とし、待ちイベント数がこのしきい値以下のスレッドの数を用いてプロセッサ数設定値を算出する。
【００５３】
図１７は、第３の実施形態のマルチプロセッサシステムの構成を示す図である。第３の実施形態の説明においては、第２の実施形態と同一の構成要素には同一の名称および符号を付して、重複する説明を省略する。
【００５４】
図１７のマルチプロセッサシステム３は、４個のプロセッサ１０ａ〜１０ｄと、共有メモリ１１ｂと、電源供給装置１２と、バス１３と、電力供給線１４とを備えている。共有メモリ１１ｂは、第２の実施形態の構成に加え、待ちイベント数しきい値変更処理３１２を予め記憶している。また、共有メモリ１１ｂには、さらに待ちイベント数しきい値設定値３１１が格納される。待ちイベント数しきい値設定値３１１は、待ちイベント数しきい値変更処理３１２により変更される。
【００５５】
ユーザタスク２３は、図１４にて説明した手順を実行するほか、予めユーザタスク２３にプログラムされたタイミングで待ちイベント数しきい値変更処理３１２を実行する。ここでは、ユーザタスク２３は、待ちイベント数しきい値設定値３１１に設定する値を指定して待ちイベント数しきい値変更処理３１２を実行するものとする。
【００５６】
図１８は、待ちイベント数しきい値変更処理３１２の動作を説明するフローチャートである。始めに、待ちイベント数しきい値変更処理３１２は、ユーザタスク２３から指定された値を待ちイベント数しきい値設定値３１１に設定し（Ｓ１１１）、プロセッサ数設定値の算出を行う（Ｓ１１２）。そして、待ちイベント数しきい値変更処理３１２は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値未満であるか否かを判定する（Ｓ１１３）。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ１１３、Ｙｅｓ）、待ちイベント数しきい値変更処理３１２は、電源オン状態のプロセッサ数がプロセッサ数設定値に等しくなるまで電源オフ状態のプロセッサを電源オン状態に遷移させて（Ｓ１１４）、処理を終了する。電源オン状態のプロセッサ数がプロセッサ数設定値以上の場合（Ｓ１１３、Ｎｏ）、Ｓ１１４はスキップされる。
【００５７】
図１９は、第３の実施形態のマルチプロセッサシステム３において実行されるプロセッサ数設定値の算出処理のフローチャートである。始めに、待ちイベント数しきい値変更処理３１２は、実行可能スレッドキュー１１２に登録されているスレッドの数（Ａ）を取得する（Ｓ１２１）。そして、待ちイベント数しきい値変更処理３１２は、待ちイベント数しきい値設定値３１１（Ｘ）を読み出して（Ｓ１２２）、イベント待ちスレッドプール１１３に登録されている待ちイベント数がＸ以下のスレッドの数（Ｂ２）を取得する（Ｓ１２３）。そして、待ちイベント数しきい値変更処理３１２は、イベント待ちスレッド数しきい値設定値２１１（Ｃ２）を読み出して（Ｓ１２４）、Ａ＋(Ｂ２−Ｃ２）を演算し、得られた値をプロセッサ数設定値とする（Ｓ１２５）。そして、待ちイベント数しきい値変更処理３１２は、プロセッサ数設定値が、Ｓ７３によりスレッド実行制御タスク１１１が起動されるプロセッサの数より大きい場合には、算出したプロセッサ数設定値をスレッド実行制御タスク１１１を実行するプロセッサの数で丸めて（Ｓ１２６）、プロセッサ数設定値を算出する処理を終了する。
【００５８】
なお、スレッド実行制御タスク１１１がプロセッサ数設定値を算出する際にも、スレッド実行制御タスク１１１は図１９に示した手順と同様の手順でプロセッサ数設定値を算出する。また、イベント待ちスレッド数変更処理２１２がプロセッサ数設定値を算出する際にも、イベント待ちスレッド数変更処理２１２は図１９と同様の手順でプロセッサ数設定値を算出する。
【００５９】
なお、以上の説明においては、ユーザタスク２３が待ちイベント数しきい値設定値３１１を予めプログラムされたタイミングで設定変更するものとして説明したが、プロセッサ１０ａ〜１０ｄのうちの例えば１つのプロセッサに、アプリケーションプログラム２０が含む複数のスレッドの構造に基づいて待ちイベント数しきい値設定値３１１を動的に変更せしめるタスクを実行させるようにしてもよい。例えばアプリケーションプログラム２０が動画再生のプログラムである場合には、同一のスレッドの構造が周期的に繰り返される。このタスクは、周期的に繰り返されるスレッドの構造を解析して、実行時間が短い複数のスレッドが同時に実行可能スレッドとなるタイミングを予測することができる。このタスクは、予測したタイミングで、待ちイベント数しきい値設定値３１１を増加させることができる。
【００６０】
このように、第３の実施形態のマルチプロセッサシステム３は、待ちイベント数しきい値設定値３１１を、予めプログラムされたタイミングで、またはアプリケーションプログラム２０が含む複数のスレッドの構造に基づくタイミングで、動的に変更するので、より効率的な電力制御が可能となる。
【００６１】
（第４の実施形態）
電源オフ状態から電源オン状態に遷移せしめるプロセッサの選択を所定のルールに基づいて実行されるようにしてもよい。第４の実施形態のマルチプロセッサシステムは、電源オフ状態に遷移したタイミングが遅いプロセッサほど優先的に電源オン状態に遷移させる。
【００６２】
図２０は、第４の実施形態のマルチプロセッサシステムの構成を示す図である。第４の実施形態の説明においては、第１の実施形態と同一の構成要素には同一の名称および符号を付して、重複する説明を省略する。
【００６３】
第４の実施形態のマルチプロセッサシステム４は、４個のプロセッサ１０ａ〜１０ｄと、共有メモリ１１ｃと、電源供給装置１２と、バス１３と、電力供給線１４とを備えている。共有メモリ１１ｃは、スレッド実行制御タスク４１１と、スレッド登録処理１１４と、イベント送信処理１１５と、電源オフプロセッサ登録処理４１３と、電源オフプロセッサ選択処理４１４とを予め記憶している。また、共有メモリ１１ｃは、実行可能スレッドキュー１１２、イベント待ちスレッドプール１１３および電源オフプロセッサスタック４１２を備えている。電源オフプロセッサスタック４１２は、電源オフ状態のプロセッサを識別する情報がスタックされるデータ構造である。
【００６４】
図２１は、第４の実施形態のスレッド実行制御タスク４１１の動作を説明するフローチャートである。始めに、スレッド実行制御タスク４１１は、実行可能スレッドキュー１１２に１以上のスレッドが登録されているか否かを判定する（Ｓ１３１）。実行可能スレッドキュー１１２に１以上のスレッドが登録されている場合（Ｓ１３１、Ｙｅｓ）、スレッド実行制御タスク４１１は、実行可能スレッドキュー１１２から１つのスレッドを取り出す（Ｓ１３２）。そして、スレッド実行制御タスク４１１は、プロセッサ数設定値の算出を実行する（Ｓ１３３）。そして、スレッド実行制御タスク４１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値未満であるか否かを判定する（Ｓ１３４）。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ１３４、Ｙｅｓ）、スレッド実行制御タスク４１１は、電源オフプロセッサ選択処理４１４を実行する（Ｓ１３５）。
【００６５】
図２２は、電源オフプロセッサ選択処理４１４の動作を説明するフローチャートである。電源オフプロセッサ選択処理４１４は、電源オフプロセッサスタック４１２の末尾に登録されているプロセッサの識別情報を取り出して（Ｓ１５１）、動作を終了する。
【００６６】
スレッド実行制御タスク４１１は、Ｓ１３５により取り出された識別情報が示す電源オフ状態のプロセッサを電源オン状態に遷移させて（Ｓ１３６）、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値に等しいか否かを判定する（Ｓ１３７）。電源オン状態のプロセッサ数がプロセッサ数設定値に等しくない場合（Ｓ１３７、Ｎｏ）、スレッド実行制御タスク４１１は、Ｓ１３５を実行する。電源オン状態のプロセッサ数がプロセッサ数設定値に等しい場合（Ｓ１３７、Ｙｅｓ）、スレッド実行制御タスク４１１は、Ｓ１３２により取得したスレッドを実行する（Ｓ１３８）。そして、スレッド実行制御タスク４１１は、スレッドの実行を完了すると、Ｓ１３１を実行する。
【００６７】
一方で、実行可能スレッドキュー１１２に登録されているスレッドがない場合（Ｓ１３１、Ｎｏ）、スレッド実行制御タスク４１１は、プロセッサ数設定値を算出する（Ｓ１３９）。そして、スレッド実行制御タスク４１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値より大きいか否かを判定する（Ｓ１４０）。電源オン状態のプロセッサ数がプロセッサ数設定値より大きい場合（Ｓ１４０、Ｙｅｓ）、スレッド実行制御タスク４１１は、電源オフプロセッサ登録処理４１３を実行する（Ｓ１４１）。
【００６８】
図２３は、電源オフプロセッサ登録処理４１３の動作を説明するフローチャートである。電源オフプロセッサ登録処理４１３は、自処理４１３を実行するプロセッサの識別情報を電源オフプロセッサスタック４１２の末尾に登録して（Ｓ１６１）、動作を終了する。
【００６９】
電源オフプロセッサ登録処理４１３を実行した後、スレッド実行制御タスク４１１は、自タスク４１１を実行しているプロセッサを電源オフ状態に遷移させ（Ｓ１４２）、動作を停止する（Ｓ１４３）。スレッド実行制御タスク４１１は、自タスク４１１を実行するプロセッサが他のプロセッサにて実行されているスレッド実行制御タスク４１１によって電源オン状態に遷移せしめられると（Ｓ１４３）、Ｓ１３１を実行する。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ１４０、Ｎｏ）、スレッド実行制御タスク４１１は、Ｓ１３１を実行する。
【００７０】
このように、第４の実施形態のマルチプロセッサシステム４は、電源オフ状態に移行したタイミングが遅いプロセッサを優先して電源オン状態に移行させるので、プロセッサの利用を偏らせることが可能となる。
【００７１】
（第５の実施形態）
第５の実施形態のマルチプロセッサシステムは、電源オフ状態に遷移したタイミングが早いプロセッサほど優先的に電源オン状態に遷移させる。
【００７２】
図２４は、第５の実施形態のマルチプロセッサシステムの構成図である。第５の実施形態の説明においては、第１の実施形態と同一の構成要素には同一の名称および符号を付して、重複する説明を省略する。
【００７３】
第５の実施形態のマルチプロセッサシステム４は、４個のプロセッサ１０ａ〜１０ｄと、共有メモリ１１ｄと、電源供給装置１２と、バス１３と、電力供給線１４とを備えている。共有メモリ１１ｄは、スレッド実行制御タスク５１１と、スレッド登録処理１１４と、イベント送信処理１１５と、電源オフプロセッサ登録処理５１３と、電源オフプロセッサ選択処理５１４とを予め記憶している。また、共有メモリ１１ｄは、実行可能スレッドキュー１１２、イベント待ちスレッドプール１１３および電源オフプロセッサキュー５１２を備えている。電源オフプロセッサキュー５１２は、電源オフ状態のプロセッサを識別する情報が登録されるＦＩＦＯ構造のデータ構造である。
【００７４】
図２５は、第５の実施形態のスレッド実行制御タスク５１１の動作を説明するフローチャートである。始めに、スレッド実行制御タスク５１１は、実行可能スレッドキュー１１２に１以上のスレッドが登録されているか否かを判定する（Ｓ１７１）。実行可能スレッドキュー１１２に１以上のスレッドが登録されている場合（Ｓ１７１、Ｙｅｓ）、スレッド実行制御タスク５１１は、実行可能スレッドキュー１１２から１つのスレッドを取り出す（Ｓ１７２）。そして、スレッド実行制御タスク５１１は、プロセッサ数設定値の算出を実行する（Ｓ１７３）。そして、スレッド実行制御タスク５１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値未満であるか否かを判定する（Ｓ１７４）。電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ１７４、Ｙｅｓ）、スレッド実行制御タスク５１１は、電源オフプロセッサ選択処理５１４を実行する（Ｓ１７５）。
【００７５】
図２６は、電源オフプロセッサ選択処理５１４の動作を説明するフローチャートである。電源オフプロセッサ選択処理５１４は、電源オフプロセッサキュー５１２の先頭に登録されているプロセッサの識別情報を取り出して（Ｓ１９１）、動作を終了する。
【００７６】
スレッド実行制御タスク５１１は、Ｓ１７５により取り出された識別情報が示す電源オフ状態のプロセッサを電源オン状態に遷移させて（Ｓ１７６）、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値に等しいか否かを判定する（Ｓ１７７）。電源オン状態のプロセッサ数がプロセッサ数設定値に等しくない場合（Ｓ１７７、Ｎｏ）、スレッド実行制御タスク５１１は、Ｓ１７５を実行する。電源オン状態のプロセッサ数がプロセッサ数設定値に等しい場合（Ｓ１７７、Ｙｅｓ）、スレッド実行制御タスク５１１は、Ｓ１７２により取得したスレッドを実行する（Ｓ１７８）。そして、スレッド実行制御タスク５１１は、スレッドの実行を完了すると、Ｓ１７１を実行する。
【００７７】
一方、実行可能スレッドキュー１１２に登録されているスレッドがない場合（Ｓ１７１、Ｎｏ）、スレッド実行制御タスク５１１は、プロセッサ数設定値を算出する（Ｓ１７９）。そして、スレッド実行制御タスク５１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値と等しいか否かを判定する（Ｓ１８０）。電源オン状態のプロセッサ数がプロセッサ数設定値と等しい場合（Ｓ１８０、Ｙｅｓ）、スレッド実行制御タスク５１１は、電源オフプロセッサ選択処理５１４を再度実行し（Ｓ１８１）、電源オフ状態のプロセッサの識別情報を取得できたか否かを判定する（Ｓ１８２）。電源オフ状態のプロセッサがない等の理由で電源オフ状態のプロセッサの識別情報を取得できなかった場合（Ｓ１８２、Ｎｏ）、スレッド実行制御タスク５１１は、Ｓ１７１を実行する。
【００７８】
電源オフ状態のプロセッサの識別情報を取得できた場合（Ｓ１８２、Ｙｅｓ）、スレッド実行制御タスク５１１は、取得した識別情報が示すプロセッサを電源オフ状態から電源オン状態に遷移させ（Ｓ１８３）、電源オフプロセッサ登録処理５１３を実行する（Ｓ１８４）。
【００７９】
図２７は、電源オフプロセッサ登録処理５１３の動作を説明するフローチャートである。電源オフプロセッサ登録処理５１３は、自処理５１３を実行するプロセッサの識別情報を電源オフプロセッサキュー５１２の末尾に登録して（Ｓ２０１）、動作を終了する。
【００８０】
電源オフプロセッサ登録処理５１３を実行した後、スレッド実行制御タスク５１１は、自タスク５１１を実行しているプロセッサを電源オフ状態に遷移させ（Ｓ１８５）、動作を停止する（Ｓ１８６）。スレッド実行制御タスク５１１は、自タスク５１１を実行するプロセッサが他のプロセッサにて実行されているスレッド実行制御タスク５１１によって電源オン状態に遷移せしめられると（Ｓ１８７）、Ｓ１７１を実行する。
【００８１】
電源オン状態のプロセッサ数がプロセッサ数設定値と等しくない場合（Ｓ１８０、Ｎｏ）、スレッド実行制御タスク５１１は、その時点で電源オン状態のプロセッサ数がプロセッサ数設定値より大きいか否かを判定する（Ｓ１８８）。スレッド実行制御タスク５１１は、電源オン状態のプロセッサ数がプロセッサ数設定値より大きい場合（Ｓ１８８、Ｙｅｓ）、Ｓ１８４を実行し、電源オン状態のプロセッサ数がプロセッサ数設定値未満である場合（Ｓ１８８、Ｎｏ）、Ｓ１７１を実行する。
【００８２】
このように、第５の実施形態のマルチプロセッサシステム５は、電源オフ状態に移行したタイミングが早いプロセッサを優先して電源オン状態に移行させるので、プロセッサ１０ａ〜１０ｄを満遍なくプロセッサが利用され、プロセッサ１０ａ〜１０ｄの温度を略平均化させることができるようになる。
【００８３】
なお、第１〜第５の実施形態の説明において、マルチプロセッサシステムは、実行可能スレッドキュー１１２に登録されているスレッドの数に対し、イベント待ちスレッドプール１１３に登録されている待ちイベント数が予め設定された値のスレッドの数を加算し、イベント待ちスレッド数しきい値を減算することによって、プロセッサ数設定値を算出する（第１の算出方法）、として説明したが、プロセッサ数設定値の算出方法は、実行可能スレッドの数と、待ちイベント数が所定数以下のスレッドの数と、に基づいて算出するものであれば上記に限定されない。
【００８４】
例えば、待ちイベント数が所定数以下のスレッドの数に所定の重み付け係数を乗算するとともに、実行可能スレッドの数を加算することによって、プロセッサ数設定値を算出するようにしてもよい（第２の算出方法）。第２の算出方法によれば、重み付け係数を１より小さい値に設定されることによって、待ちイベント数が所定数以下のスレッドの数が急激に増加／減少してもプロセッサ数設定値の変動を小さく抑えることができる。
【００８５】
また、プロセッサ数設定値の算出方法を、ユーザタスクにプログラムされたタイミングで、またはアプリケーションプログラム２０に含まれる複数のスレッドの構造に基づくタイミングで、動的に変更されるようにしてもよい。
【００８６】
このように、第１〜第５の実施形態のマルチプロセッサシステムは、実行可能スレッドキュー１１２に登録されているスレッドの数と、イベント待ちスレッドプール１１３に登録されている、待ちイベント数が所定のしきい値以上のスレッドの数と、に基づいて、プロセッサ１０ａ〜１０ｄのうちのスレッド実行制御タスク１１１を実行するプロセッサに対する電源供給装置１２からの電源供給を個別に停止／再開するので、性能低下を抑制しつつ消費電力を低減することができる。
【００８７】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００８８】
１〜５  マルチプロセッサシステム、１０ａ〜１０ｄ  プロセッサ、１１  共有メモリ、１２  電源供給装置、２０  アプリケーションプログラム、１１１  スレッド実行制御タスク、１１２  実行可能スレッドキュー、１１３  イベント待ちスレッドプール、１１４  スレッド登録処理、１１５  イベント送信処理、１２１  プロセッサ電源状態フラグ、２１１  イベント待ちスレッド数しきい値設定値、３１１  待ちイベント数しきい値設定値、４１２  電源オフプロセッサスタック、５１２  電源オフプロセッサキュー。
【図１】
0005554358.tif 000002
【図２】
0005554358.tif 000003
【図３】
0005554358.tif 000004
【図４】
0005554358.tif 000005
【図５】
0005554358.tif 000006
【図６】
0005554358.tif 000007
【図７】
0005554358.tif 000008
【図８】
0005554358.tif 000009
【図９】
0005554358.tif 000010
【図１０】
0005554358.tif 000011
【図１１】
0005554358.tif 000012
【図１２−１】
0005554358.tif 000013
【図１２−２】
0005554358.tif 000014
【図１３】
0005554358.tif 000015
【図１４】
0005554358.tif 000016
【図１５】
0005554358.tif 000017
【図１６】
0005554358.tif 000018
【図１７】
0005554358.tif 000019
【図１８】
0005554358.tif 000020
【図１９】
0005554358.tif 000021
【図２０】
0005554358.tif 000022
【図２１】
0005554358.tif 000023
【図２２】
0005554358.tif 000024
【図２３】
0005554358.tif 000025
【図２４】
0005554358.tif 000026
【図２５】
0005554358.tif 000027
【図２６】
0005554358.tif 000028
【図２７】
0005554358.tif 000029