(57)【特許請求の範囲】
【請求項１】
複数のコアを有するマルチコアプロセッサシステムであって、
前記複数のコアのうちの一のコアが、
対象タスクと同期するタスクの有無を判断し、
前記対象タスクと同期するタスクがあると判断した場合、前記複数のコアのうち、いずれのタスクにも同期しない非同期タスクが割り当てられたコアを除く第１のコアを特定し、前記対象タスクと同期するタスクがないと判断した場合、前記複数のコアのうち、いずれかのタスクに同期する同期タスクが割り当てられたコアを除く第２のコアを特定し、
特定した前記第１または第２のコアに対し前記対象タスクの起動指示を通知する、
処理を実行することを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記一のコアが、
特定する処理の後に、移行元のコアに割り当てられたタスクを移行先のコアに移行させる処理を実行し、
特定する処理では、
前記対象タスクと同期するタスクがあると判断した場合において、前記第１のコアが特定されなかった場合、前記複数のコアのうち、前記非同期タスクが割り当てられているコア群を特定し、
移行させる処理では、
特定した前記コア群のうちの第３のコアに割り当てられた前記非同期タスクを前記コア群のうちの前記第３のコアを除く他のコアに移行させ、
通知する処理では、
前記第３のコアに割り当てられた前記非同期タスクを前記他のコアに移行させた後、前記対象タスクの起動指示を前記第３のコアに通知することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記一のコアが、
特定する処理の後に、移行元のコアに割り当てられているタスクを移行先のコアに移行させる処理を実行し、
特定する処理では、
前記対象タスクと同期するタスクがないと判断した場合において、前記第２のコアが特定されなかった場合、前記複数のコアのうち、前記同期タスクが割り当てられているコア群を特定し、
移行させる処理では、
特定した前記コア群のうちの第３のコアに割り当てられた前記同期タスクを前記コア群のうちの前記第３のコアを除く他のコアに移行させ、
通知する処理では、
前記第３のコアに割り当てられた前記同期タスクを前記他のコアに移行させた後、前記対象タスクの起動指示を前記第３のコアに通知することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項４】
記憶装置と、
前記記憶装置へクロックを供給するクロック供給回路と、
前記複数のコアの各々について、前記コアが省電力状態であるか否かを示す値を保持可能であって、前記コアが前記値を変更可能なレジスタと、
を有し、
前記一のコアが、
前記対象タスクと同期するタスクがないと判断した場合において、特定した前記第１のコアまたは第２のコアが前記省電力状態であるか否かを前記レジスタに保持された前記値に基づいて判断する処理を実行し、
通知する処理では、
特定した前記第１のコアまたは第２のコアが前記省電力状態であると判断し、前記クロックの周波数が所定周波数よりも大きい場合に、前記クロックの周波数を所定周波数まで下げる指示を前記クロック供給回路に通知することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項５】
記憶装置と、
前記記憶装置へ電源電圧を供給する電源供給回路と、
前記複数のコアの各々について、前記コアが省電力状態であるか否かを示す値を保持可能であって、前記コアが前記値を変更可能なレジスタと、
を有し、
前記一のコアが、
前記対象タスクと同期するタスクがないと判断した場合において、特定した前記第１または第２のコアが前記省電力状態であるか否かを前記レジスタに保持された前記値に基づいて判断する処理を実行し、
通知する処理では、
特定した前記第１または第２のコアが前記省電力状態であると判断し、前記電源電圧の値が所定値よりも大きい場合に、前記電源電圧の値を所定値まで下げる指示を前記電源供給回路に通知することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項６】
複数のコアを有するマルチコアプロセッサシステムの制御プログラムであって、
前記複数のコアのうちの一のコアに、
対象タスクと同期するタスクの有無を判断し、
前記対象タスクと同期するタスクがあると判断した場合、前記複数のコアのうち、いずれのタスクにも同期しない非同期タスクが割り当てられたコアを除く第１のコアを特定し、前記対象タスクと同期するタスクがないと判断した場合、前記複数のコアのうち、いずれかのタスクに同期する同期タスクが割り当てられたコアを除く第２のコアを特定し、
特定した前記第１または第２のコアに対し前記対象タスクの起動指示を通知する、
処理を実行させることを特徴とするマルチコアプロセッサシステムの制御プログラム。
【請求項７】
複数のコアを有するマルチコアプロセッサシステムの制御方法であって、
前記複数のコアのうちの一のコアが、
対象タスクと同期するタスクの有無を判断し、
前記対象タスクと同期するタスクがあると判断した場合、前記複数のコアのうち、いずれのタスクにも同期しない非同期タスクが割り当てられたコアを除く第１のコアを特定し、前記対象タスクと同期するタスクがないと判断した場合、前記複数のコアのうち、いずれかのタスクに同期する同期タスクが割り当てられたコアを除く第２のコアを特定し、
特定した前記第１または第２のコアに対し前記対象タスクの起動指示を通知する、
処理を実行することを特徴とするマルチコアプロセッサシステムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチコアプロセッサへのタスクの割り当てを制御するマルチコアプロセッサシステム、制御プログラム、および制御方法に関する。
【背景技術】
【０００２】
従来、マルチコアプロセッサシステムにおいてスケジューラはタスクの割り当て指示を受け付けると、どのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）にタスクを割り当てるかを決定する（たとえば、下記特許文献１〜３参照。）。決定方法としては、たとえば、スケジューラがマルチコアプロセッサから最も低負荷なＣＰＵを特定して、該低負荷なＣＰＵに割り当てる方法が知られている。【０００３】
また、タスクには、他のタスクと同期するタスクと他のタスクと同期しないタスクがある。たとえば、動画再生に関するタスク（以下、「動画再生タスク」と称する。）は、動画デコードに関するタスク（以下、「動画デコードタスク」と称する。）と音声デコードに関するタスク（以下、「音声デコードタスク」と称する。）を起動する。一のＣＰＵに動画デコードタスクが割り当てられ、他のＣＰＵに音声デコードタスクが割り当てられたとする。動画の再生が３０ＦＰＳ（Ｆｒａｍｅ  Ｐｅｒ  Ｓｅｃｏｎｄ）の場合、動画デコードの結果と音声デコードの結果との結合のために１秒間に３０回同期処理が一のＣＰＵと他のＣＰＵで行われていた（たとえば、下記特許文献４参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平２−３３６５０号公報
【特許文献２】特開２００５−２６７６３５号公報
【特許文献３】特許第３４２９５８２号公報
【特許文献４】特公平６−１４６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、動画デコードタスクが割り当てられている一のＣＰＵまたは音声デコードタスクが割り当てられている他のＣＰＵにいずれのタスクにも同期しないタスクが割り当てられていると、同期処理に起因する待ち時間により該同期しないタスクの実行時間が増大するという問題点があった。【０００６】
マルチコアプロセッサで共有する共有メモリに与えるクロックの周波数を上げることで、同期処理による待ち時間を減少させることができるが、共有メモリの消費電力はマルチコアプロセッサ全体の消費電力において大きな割合を占める。そのため、マルチコアプロセッサにおいて共有メモリに与えるクロックの周波数を上げることができないという問題点があった。【０００７】
本発明は、上述した従来技術による問題点を解消するため、消費電力を増大させることなく、いずれのタスクにも同期しないタスクの実行時間を減少でき、スループットを向上させることができるマルチコアプロセッサシステム、制御プログラム、および制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、本マルチコアプロセッサシステム、制御プログラム、および制御方法は、対象タスクと同期するタスクの有無を判断し、前記対象タスクと同期するタスクがあると判断された場合、マルチコアプロセッサのうち、いずれのタスクにも同期しない非同期タスクが割り当てられていないコアを特定し、前記対象タスクと同期するタスクがないと判断された場合、前記マルチコアプロセッサのうち、いずれかのタスクに同期する同期タスクが割り当てられていないコアを特定し、前記対象タスクの起動指示を前記特定されたコアへ通知することを要件とする。
【発明の効果】
【０００９】
本マルチコアプロセッサシステム、制御プログラム、および制御方法によれば、消費電力を増大させることなく、いずれのタスクにも同期しないタスクの実行時間を減少でき、スループットを向上させることができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】本発明の一実施例を示す説明図である。
【図２】本実施の形態にかかるマルチコアプロセッサシステム１００のハードウェア構成を示すブロック図である。
【図３】同期テーブル１３２の一例を示す説明図である。
【図４】分周回路１０４の一例を示す説明図である。
【図５】クロックテーブル１３３の一例を示す説明図である。
【図６】クロック制御テーブル１３４の一例を示す説明図である。
【図７】本実施の形態にかかるスケジューラ１２１の機能的構成を示すブロック図である。
【図８】実施例１において各タスクがＣＰＵに割り当てられている例を示す説明図である。
【図９】実施例１において同期タスクであるタスク＃７の割り当て例を示す説明図である。
【図１０】実施例１において非同期タスクであるタスク＃５の割り当て例を示す説明図である。
【図１１】実施例１にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャートである。
【図１２】実施例２において非同期タスクであるタスク＃３の割り当て例を示す説明図である。
【図１３】実施例２において同期タスクであるタスク＃４の割り当て例を示す説明図である。
【図１４】実施例３においてメモリクロックが下げられる例を示す説明図である。
【図１５】実施例３において同期タスクであるタスク＃７がＣＰＵに割り当てられる例を示す説明図である。
【図１６】タスク＃１が動作状態からスリープ状態に変化した例を示す説明図である。
【図１７】実施例２および３にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャート（その１）である。
【図１８】実施例２および３にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャート（その２）である。
【図１９】実施例２および３にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャート（その３）である。
【図２０】実施例２および３にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャート（その４）である。
【発明を実施するための形態】
【００１１】
以下に添付図面を参照して、本発明にかかるマルチコアプロセッサシステム、制御プログラム、および制御方法の好適な実施の形態を詳細に説明する。なお、本実施の形態のマルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００１２】
図１は、本発明の一実施例を示す説明図である。たとえば、ＣＰＵ＃０には動画再生タスクと該動画再生タスクにより起動された動画デコードタスクが割り当てられ、ＣＰＵ＃１には動画再生タスクにより起動された音声デコードタスクが割り当てられている。
【００１３】
動画再生タスクが動画再生に関するアプリの処理であって、動画デコードタスクが動画デコード処理であり、音声デコードタスクが音声デコード処理である。動画再生に関するアプリでは、各デコード処理の結果を一定間隔で結合する結合処理が行われるため、動画デコードタスクと音声デコードタスクとは同期する必要がある。ここで、動画デコードタスクと音声デコードタスクのようにいずれかのタスクに同期するタスクを同期タスクと称する。
【００１４】
ＣＰＵ＃２にはいずれのタスクにも同期しない非同期タスク１が割り当てられ、ＣＰＵ＃３にはいずれのタスクにも同期しない非同期タスク２が割り当てられている。ここで、いずれのタスクにも同期しないタスクを非同期タスクと称する。
【００１５】
そして、スケジューラ１２１が非同期タスク３の割り当て指示を受け付けると、非同期タスク３に同期するタスクの有無を判断する。ここでは、非同期タスク３に同期するタスクは無いと判断される。そして、スケジューラ１２１が、同期タスクが割り当てられていないＣＰＵを特定する。同期タスクが割り当てられていないＣＰＵとは、いずれのタスクも割り当てられていないＣＰＵおよび非同期タスクが割り当てられているＣＰＵである。ここでは、同期タスクが割り当てられていないＣＰＵとしてＣＰＵ＃２とＣＰＵ＃３が特定され、スケジューラ１２１が特定したＣＰＵ＃２に非同期タスク＃３の起動指示を通知することによりＣＰＵ＃２に非同期タスク＃３が割り当てられる。
【００１６】
また、図示していないが、スケジューラ１２１が同期タスクの割り当て指示を受け付けると、非同期タスクが割り当てられていないＣＰＵを特定する。非同期タスクが割り当てられていないＣＰＵとは、いずれのタスクも割り当てられていないＣＰＵおよび同期タスクが割り当てられているＣＰＵである。ここで、ＣＰＵ＃１とＣＰＵ＃２が特定され、ＣＰＵ＃１とＣＰＵ＃２のうちのいずれか一方に同期タスクを割り当てる。
【００１７】
このように、同期タスクと非同期タスクを同一のＣＰＵに割り当てないように制御することで、同期処理によって発生する待ち時間により非同期タスクの実行時間が増大するのを防止でき、スループットを向上させることができる。
【００１８】
（マルチコアプロセッサシステム１００のハードウェア構成）
図２は、本実施の形態にかかるマルチコアプロセッサシステム１００のハードウェア構成を示すブロック図である。図２において、マルチコアプロセッサシステム１００は、ＣＰＵ♯０〜ＣＰＵ＃３と、調停回路１０２と、共有メモリ１０３と、分周回路１０４と、を備えている。また、各構成部は、バス１０１によってそれぞれ接続されている。
【００１９】
ＣＰＵ＃０〜ＣＰＵ＃２は、それぞれコアとレジスタとキャッシュとを備えている。各レジスタは、ＰＯＷとＦＲを備えている。ＰＯＷは各ＣＰＵ上で動作するＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が省電力モードであるか否かを示すレジスタであり、ＰＯＷが１であれば省電力モードであることを示し、ＰＯＷが０であれば省電力モードでないことを示す。
【００２０】
ＦＲはメモリクロックが下げられているか否かを示すレジスタであり、ＦＲが１であればメモリクロックが下げられていることを示し、ＦＲが０であればメモリクロックが下げられていないことを示す。メモリクロックとはキャッシュメモリや共有メモリ１０３へ与えられるクロックである。
【００２１】
ＣＰＵ＃０はＯＳ１１１を実行し、マルチコアプロセッサシステム１００の全体の制御を司り、割り当てられたタスクを実行する。ＯＳ１１１はマスタＯＳであり、タスクをどのＣＰＵに割り当てるかを制御するスケジューラ１２１を備えている。
【００２２】
同期タスクと非同期タスクとが同一ＣＰＵに割り当てられないように制御する制御プログラムがスケジューラ１２１に備えられているため、該制御プログラムにコーディングされている処理はＣＰＵ＃０が実行する。ＣＰＵ＃１とＣＰＵ＃２とＣＰＵ＃３は、それぞれＯＳ１１２とＯＳ１１３とＯＳ１１４を実行し、各ＯＳに割り当てられたタスクを実行する。ＯＳ１１２〜ＯＳ１１４はスレーブＯＳである。また、タスクが割り当てられているＣＰＵとタスクが割り当てられているＯＳとは同一の意味である。ＯＳ１１１〜ＯＳ１１４は、省電力モードと通常モードがある。各ＯＳは通常モードから省電力モードに移行すると、該各ＯＳを実行するＣＰＵのレジスタ内のＰＯＷを１に設定する。
【００２３】
調停回路１０２は、ＣＰＵ＃０〜ＣＰＵ＃３から共有メモリ１０３へのアクセスを調停する回路である。具体的には、調停回路１０２は、ＣＰＵ＃０〜ＣＰＵ＃３のそれぞれに割り当てられたタスクからのアクセス要求をリクエストバッファへ登録し、リクエストバッファに登録されている順にアクセス要求を取り出し、取り出したアクセス要求を許可する。また、調停回路１０２は、どのＣＰＵが許可されているかを示す信号（後述するＳＥＬ［１：０］）を分周回路１０４へ入力する。
【００２４】
共有メモリ１０３は、マルチコアプロセッサに共有されるメモリであり、タスクテーブル１３１と、同期テーブル１３２と、クロックテーブル１３３と、クロック制御テーブル１３４と、を記憶している。共有メモリ１０３は、具体的には、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、フラッシュＲＯＭなどを備えている。
【００２５】
たとえば、フラッシュＲＯＭが各ＯＳのプログラムを記憶し、ＲＯＭがアプリケーションプログラムを記憶し、ＲＡＭがＣＰＵ＃０〜ＣＰＵ＃３のワークエリアとして使用される。共有メモリ１０３に記憶されているプログラムは、各ＣＰＵにロードされることで、コーディングされている処理を該各ＣＰＵに実行させることとなる。
【００２６】
タスクテーブル１３１は、タスクがどのＣＰＵに割り当てられているか、ＣＰＵがどのタスクを実行中であるかを示す情報である。各ＯＳは該ＯＳが起動後にプロセステーブルを読み出して各ＣＰＵのキャッシュに記憶しておく。スケジューラ１２１はタスクを割り当てるとタスクテーブル１３１に登録する。各ＯＳはタスクスイッチが発生するとプロセステーブルにどのタスクが実行状態になったかを登録する。
【００２７】
各ＯＳはタスクテーブル１３１を書き換えると、スヌープ処理を実行することで、全ＣＰＵのキャッシュに記憶されているタスクテーブル１３１を更新する。スケジューラ１２１はタスクテーブル１３１に変更があるか否かによってタスクディスパッチやタスクスイッチが発生したことを検出することができる。つぎに、同期テーブル１３２について図３を用いて詳細に説明する。
【００２８】
図３は、同期テーブル１３２の一例を示す説明図である。同期テーブル１３２は、各タスクがどのタスクに同期するかを示すテーブルであり、タスクの項目３０１と同期対象タスクの項目３０２と同期中断イベントの項目３０３を備えている。タスクの項目３０１および同期対象タスクの項目３０２にはタスク名が保持されている。該タスクの項目３０１に保持されているタスク名（以下、「タスクの項目３０１のタスク名」と称する。）に対応するタスクは、同期対象タスクの項目３０２にタスク名が保持されていれば同期タスクであり、同期対象タスクの項目３０２にタスク名が保持されていなければ非同期タスクである。
【００２９】
たとえば、タスクの項目３０１のタスク名がタスク＃０の場合、同期対象タスクの項目３０２にはタスク＃１とタスク＃２が保持されている。すなわち、タスク＃０はタスク＃１とタスク＃２と同期することを示している。また、たとえば、タスクの項目３０１のタスク名がタスク＃３の場合、同期対象タスクの項目３０２にはタスク名が登録されていないため、タスク＃３は非同期タスクである。また、タスク＃０〜タスク＃２と、タスク＃４と、タスク＃６と、タスク＃７と、は同期タスクであり、タスク＃３と、タスク＃５と、タスク＃８と、タスク＃９と、は非同期タスクである。
【００３０】
同期対象タスクの項目３０２に保持されているタスク名（以下、「同期対象タスクの項目３０２のタスク名」と称する。）に対応するタスクが、ある状態でタスクの項目３０１のタスク名に対応するタスクに同期しなくなる場合がある。同期中断イベントの項目３０３には該ある状態の状態名が保持されている。タスクの項目３０１のタスク名がタスク＃０の場合、同期対象タスクの項目３０２にはタスク＃１とタスク＃２が保持され、同期中断イベントの項目３０３にはそれぞれ「ｃｏｍｐｌｅｔｅ」が保持されている。すなわち、タスク＃１が「ｃｏｍｐｌｅｔｅ」となった場合、タスク＃０とタスク＃１は同期を中断し、タスク＃２が「ｃｏｍｐｌｅｔｅ」となった場合、タスク＃０とタスク＃２は同期を中断する。なお、「ｃｏｍｐｌｅｔｅ」は完了状態を示し、「ｓｌｅｅｐ」はスリープ状態を示す。また、通常に動作している状態は動作状態と称する。
【００３１】
また、アプリケーションの設計者が設計時にコンパイラを用いて解析することにより、各タスクが同期であるか非同期であるかが判別され、同期テーブル１３２が該設計者により作成される。
【００３２】
図２の説明に戻って、分周回路１０４は、ＣＰＵ＃０〜ＣＰＵ＃３と各ＣＰＵのキャッシュとバス１０１と共有メモリ１０３へクロックを供給する供給源である。なお、図２では各構成部と分周回路１０４とを接続する接続線を省略している。
【００３３】
図４は、分周回路１０４の一例を示す説明図である。分周回路１０４は、クロックを逓倍にするＰＬＬ回路４０１とクロックを分周するカウンタ回路４０２とを備えている。分周回路１０４は、ＣＬＫＩＮと、ＣＭＯＤＥ［３：０］と、ＣＭＯＤＥ＿０［３：０］と、ＣＭＯＤＥ＿１［３：０］と、ＣＭＯＤＥ＿２［３：０］と、ＣＭＯＤＥ＿３［３：０］と、を入力とし、各構成部へのクロックを出力とする。
【００３４】
ＣＬＫＩＮには、たとえば、発振回路からのクロックが入力される。たとえば、ＣＬＫＩＮに周波数が５０ＭＨｚのクロックが入力されると、入力されたクロックの周波数をＰＬＬ回路４０１が２倍にし、ＰＬＬ回路４０１が逓倍後の１００ＭＨｚのクロックをカウンタ回路４０２に与える。カウンタ回路４０２はＣＭＯＤＥ［３：０］の値とＣＭＯＤＥ＿０［３：０］の値とＣＭＯＤＥ＿１［３：０］の値とＣＭＯＤＥ＿２［３：０］の値とＭＯＤＥ＿３［３：０］の値に沿って各構成部に１００ＭＨｚを分周して与える。ここで、分周とは、周波数をさげることであり、２分周とは周波数を１／２にすることであり、４分周とは周波数を１／４にすることである。
【００３５】
ＣＭＯＤＥ＿０［３：０］に入力される値に基づいて、ＣＰＵ＃０のキャッシュへ与えるクロックの周波数と、調停回路１０２によりＣＰＵ＃０から共有メモリ１０３へのアクセスが許可されている場合の共有メモリ１０３へのクロックの周波数が決定される。ＣＭＯＤＥ＿１［３：０］に入力される値に基づいて、ＣＰＵ＃１のキャッシュへ与えるクロックの周波数と、調停回路１０２によりＣＰＵ＃１から共有メモリ１０３へのアクセスが許可されている場合の共有メモリ１０３へのクロックの周波数が決定される。
【００３６】
ＣＭＯＤＥ＿２［３：０］に入力される値に基づいて、ＣＰＵ＃２のキャッシュへ与えるクロックの周波数と、調停回路１０２によりＣＰＵ＃２から共有メモリ１０３へのアクセスが許可されている場合の共有メモリ１０３へのクロックの周波数が決定される。ＣＭＯＤＥ＿３［３：０］に入力される値に基づいて、ＣＰＵ＃３のキャッシュへ与えるクロックの周波数と、調停回路１０２によりＣＰＵ＃３から共有メモリ１０３へのアクセスが許可されている場合の共有メモリ１０３へのクロックの周波数が決定される。
【００３７】
また、調停回路１０２により共有メモリ１０３へのアクセスを許可されているＣＰＵはＳＥＬ［１：０］によって判別される。たとえば、ＳＥＬ［１：０］が“００”であれば、ＣＰＵ＃０が共有メモリ１０３へのアクセスが許可されており、ＳＥＬ［１：０］が“０１”であれば、ＣＰＵ＃１が共有メモリ１０３へのアクセスが許可されている。たとえば、ＳＥＬ［１：０］が“１０”であれば、ＣＰＵ＃２が共有メモリ１０３へのアクセスが許可されており、ＳＥＬ［１：０］が“１１”であれば、ＣＰＵ＃３が許可されている。
【００３８】
ＣＭＯＤＥ［３：０］に入力される値に基づいて、マルチコアプロセッサの構成部のうち各ＣＰＵのキャッシュおよび共有メモリ１０３を除く残余の構成部に与えるクロックの周波数が決定される。
【００３９】
つぎに、図２に戻って、共有メモリ１０３に記憶されているクロックテーブル１３３とクロック制御テーブル１３４について説明する。
【００４０】
図５は、クロックテーブル１３３の一例を示す説明図である。クロックテーブル１３３には、メモリクロックテーブル５０１と他のクロックテーブル５１１が備えられている。まず、メモリクロックテーブル５０１は、メモリクロックの周波数を決定するためのテーブルであり、ＣＭＯＤＥ＿ｘ［３：０］の項目５０２と比率の項目５０３を備えている。ＣＭＯＤＥ＿ｘのｘは０〜３であり、ＣＰＵ＃０〜ＣＰＵ＃３に対応している。ＣＭＯＤＥ＿ｘ［３：０］の項目５０２の値は分周回路１０４のＣＭＯＤＥ＿ｘ［３：０］に対応している。比率の項目５０３は、共有メモリの項目５０４とキャッシュの項目５０５を備え、比率の項目５０３の値はＰＬＬ回路４０１による逓倍後の周波数に対する分周比を表している。
【００４１】
上述のように分周とは、周波数を下げることであり、２分周とは周波数を１／２にすることであり、４分周とは周波数を１／４にすることである。比率の項目５０３の値が２であれば、２分周であることを示し、比率の項目５０３の値が４であれば、４分周であることを示す。
【００４２】
たとえば、ＣＭＯＤＥ＿ｘ［３：０］の項目５０２の値が“００００”の場合、共有メモリの項目５０４は２であり、キャッシュの項目５０５は２である。すなわち、ＰＬＬ回路４０１による逓倍後の周波数が１００ＭＨｚであると、共有メモリ１０３へのクロック周波数は５０ＭＨｚであり、キャッシュへのクロック周波数は５０ＭＨｚである。また、分周回路１０４に与えるＣＭＯＤＥ＿ｘ［３：０］が“００００”の場合をデフォルトのメモリクロックとし、スケジューラ１２１がメモリクロックをデフォルトに戻すとは、分周回路１０４に与えるＣＭＯＤＥ＿ｘ［３：０］を“００００”に設定することを示す。
【００４３】
つぎに、他のクロックテーブル５１１は、マルチコアプロセッサの構成部のうち共有メモリ１０３およびキャッシュを除く残余の構成部に与えるクロックを決定するためのテーブルであり、ＣＭＯＤＥ［３：０］の項目５１２と比率の項目５１３とを備えている。ＣＭＯＤＥ［３：０］の項目５１２の値は分周回路１０４のＣＭＯＤＥ［３：０］に与える値である。比率の項目５１３は、外部バスの項目５１４とコアの項目５１５などマルチコアプロセッサシステム１００のうちの共有メモリ１０３およびキャッシュを除く残余の構成部の項目を備え、比率の項目５１３の値はＰＬＬ回路４０１による逓倍後の周波数に対する比率を表している。
【００４４】
図６は、クロック制御テーブル１３４の一例を示す説明図である。クロック制御テーブル１３４は、各ＣＰＵに割り当てられているタスクに基づいて省電力モード時のメモリクロックを決定するためのテーブルであり、タスクの項目６０１と比率の項目６０２が備えられている。比率の項目６０２は、共有メモリの項目６０３とキャッシュの項目６０４が備えられている。クロック制御テーブル１３４では、タスクの項目６０１のタスク名ごとに共有メモリの項目６０３の値とキャッシュの項目６０４の値が登録されている。
【００４５】
共有メモリの項目６０３の値とキャッシュの項目６０４の値は、ＰＬＬ回路４０１による逓倍後のクロックに対する分周比である。たとえば、タスク＃０が他のタスクに同期していない場合であり、かつタスク＃０が割り当てられているＣＰＵ上で動作するＯＳが省電力モード時の場合において、逓倍後のクロックが４分周された分周後のクロックを共有メモリ１０３に与えることができることを示している。さらに、タスク＃０が割り当てられているＣＰＵのキャッシュメモリへ逓倍後のクロックが４分周された分周後のクロックを与えることができる。
【００４６】
すなわち、対象タスクがいずれのタスクにも同期していない場合でかつ、省電力モード時にはメモリクロックを下げることができる。メモリクロックを下げるとは、メモリクロックの周波数を低くすることを指す。
【００４７】
また、他のタスクが完了状態となり同期していないタスク＃０と非同期タスクであるタスク＃５が同一ＣＰＵに割り当てられ、かつ該ＣＰＵ上で動作するＯＳが省電力モードの場合を例に挙げる。タスクの項目６０１のタスク名がタスク＃０の場合、共有メモリの項目６０３の値は２であり、タスクの項目６０１のタスク名がタスク＃５の場合、共有メモリの項目６０３の値は４である。ここでは、周波数が高い方が優先され、共有メモリ１０３へ与えるクロックは逓倍後のクロックが２分周されたクロックまで下げることができる。
【００４８】
また、上述のように各ＯＳは、該各ＯＳを実行するＣＰＵに割り当てられたタスクの状態により通常モードから省電力モードに移行する。たとえば、タスク＃０が動作状態から完了状態（「ｃｏｍｐｌｅｔｅ」）に変化すると、該タスク＃０が割り当てられているＣＰＵ上で動作するＯＳが該変化を検出して省電力モードに移行し、該ＯＳが該ＣＰＵのレジスタ内のＰＯＷを１に設定する。
【００４９】
また、図２に戻って、図示していないが、マルチコアプロセッサシステム１００では、Ｉ／Ｆ（ＩｎｔｅｒＦａｃｅ）やディスプレイやキーボードなどを備えている。Ｉ／Ｆは、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワークに接続され、当該ネットワークを介して他の装置に接続される。そして、Ｉ／Ｆは、ネットワークと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆには、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００５０】
ディスプレイは、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイは、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。キーボードは、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００５１】
ＣＰＵ＃０では、タスク＃０とタスク＃１が実行され、ＣＰＵ＃２では、タスク＃２とタスク＃３が実行され、ＣＰＵ＃３では、タスク＃６が実行されている。
【００５２】
（スケジューラ１２１の機能的構成）
図７は、本実施の形態にかかるスケジューラ１２１の機能的構成を示すブロック図である。スケジューラ１２１は、受付部７０１と、タスク判断部７０２と、特定部７０３と、移行部７０４と、状態判断部７０５と、通知部７０６とを備えている。各機能（受付部７０１〜通知部７０６）は、具体的には、たとえば、共有メモリ１０３に記憶されたスケジューラ１２１をＣＰＵ♯０に実行させることにより該各機能を実現する。
【００５３】
本実施の形態では、各機能を実施例１〜実施例３に分けて説明する。実施例１では、対象スレッドが同期タスクであるか非同期タスクであるかに基づいて割り当てるＣＰＵが特定される例を説明する。実施例２では、対象スレッドを割り当てるＣＰＵが特定されなかった場合の例を説明する。実施例３では、非同期タスクが割り当てられているＣＰＵ上で動作するＯＳが省電力モードに移行した場合に、メモリクロックを下げる例を説明する。
【００５４】
（実施例１）
まず、受付部７０１は、対象タスクの割り当て指示を受け付け、タスク判断部７０２は、該受付部７０１により対象タスクの割り当て指示を受け付けると、対象タスクと同期するタスクの有無を判断する。
【００５５】
つぎに、特定部７０３は、判断部により対象タスクと同期するタスクがあると判断された場合、マルチコアプロセッサのうち、いずれのタスクにも同期しない非同期タスクが割り当てられていないＣＰＵを特定する。一方、特定部７０３は、判断部により対象タスクと同期するタスクがないと判断された場合、マルチコアプロセッサのうち、いずれかのタスクに同期する同期タスクが割り当てられていないＣＰＵを特定する。
【００５６】
そして、通知部７０６は、対象タスクの起動指示を特定部７０３により特定されたＣＰＵへ通知する。以上の説明を踏まえて図を用いて詳細に説明する。
【００５７】
図８は、実施例１において各タスクがＣＰＵに割り当てられている例を示す説明図である。ＣＰＵ＃０にはタスク＃０とタスク＃１が割り当てられ、ＣＰＵ＃１にはタスク＃２とタスク＃４が割り当てられている。ＣＰＵ＃２にはタスク＃６が割り当てられ、ＣＰＵ＃３にはタスク＃３が割り当てられている。タスク＃０とタスク＃１とタスク＃２とがそれぞれ同期し、タスク＃４とタスク＃６が同期している。タスク＃３は非同期タスクである。
【００５８】
図９は、実施例１において同期タスクであるタスク＃７の割り当て例を示す説明図である。まず、スケジューラ１２１がタスク＃７の割り当て指示を受け付けると、同期テーブル１３２を読み出し、同期テーブル１３２のタスクの項目３０１からタスク＃７を検索して同期対象タスクの項目３０２のタスク名を読み出す。スケジューラ１２１がタスクの項目のタスク名がタスク＃７の場合において同期対象タスクの項目３０２が空であるか否かに基づいてタスク＃７が同期タスクであるか非同期タスクであるかを判断する。
【００５９】
タスクの項目３０１のタスク名がタスク＃７の場合、同期対象タスクの項目３０２にはタスク＃６が登録されているため、スケジューラ１２１はタスク＃７が同期タスクであると判断する。つづいて、スケジューラ１２１は、ＣＰＵ＃０〜ＣＰＵ＃３のうち、非同期タスクが割り当てられていないＣＰＵを特定する。ここで、ＣＰＵ＃１〜ＣＰＵ＃２が、非同期タスクが割り当てられていないＣＰＵとして特定される。
【００６０】
そして、スケジューラ１２１が、ＣＰＵ＃１〜ＣＰＵ＃２のうち最も低負荷なＣＰＵを特定し、特定したＣＰＵにタスク＃７の起動指示を通知する。ここでは、ＣＰＵ＃２にタスク＃７の起動指示が通知される。
【００６１】
図１０は、実施例１において非同期タスクであるタスク＃５の割り当て例を示す説明図である。まず、スケジューラ１２１がタスク＃５の割り当て指示を受け付けると、同期テーブル１３２を読み出し、同期テーブル１３２のタスクの項目３０１からタスク＃５を検索して同期対象タスクの項目３０２を読み出す。スケジューラ１２１がタスクの項目３０１のタスク名がタスク＃５の場合において同期対象タスクの項目３０２のタスク名が空であるか否かに基づいてタスク＃５が同期タスクであるか非同期タスクであるかを判断する。
【００６２】
タスクの項目３０１のタスク名がタスク＃５の場合、同期対象タスクの項目３０２が空であるため、スケジューラ１２１はタスク＃５が非同期タスクであると判断する。つづいて、スケジューラ１２１は、ＣＰＵ＃０〜ＣＰＵ＃３のうち、同期タスクが割り当てられていないＣＰＵを特定する。ここで、ＣＰＵ＃３が、同期タスクが割り当てられていないＣＰＵとして特定される。そして、スケジューラ１２１が、ＣＰＵ＃３にタスク＃５の起動指示を通知する。
【００６３】
（実施例１にかかるスケジューラ１２１による制御処理手順）
図１１は、実施例１にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャートである。まず、スケジューラ１２１が、対象タスクの割り当て指示を受け付けたか否かを判断し（ステップＳ１１０１）、対象タスクの割り当て指示を受け付けていないと判断した場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１１０１へ戻る。
【００６４】
一方、スケジューラ１２１が、受付部７０１により、対象タスクの割り当て指示を受け付けたと判断した場合（ステップＳ１１０１：Ｙｅｓ）、判断部により、対象タスクに同期するタスクがあるか否かを判断する（ステップＳ１１０２）。スケジューラ１２１が、対象タスクに同期するタスクがあると判断した場合（ステップＳ１１０２：Ｙｅｓ）、特定部７０３により、非同期タスクが割り当てられていないＣＰＵを特定する（ステップＳ１１０３）。そして、スケジューラ１２１が、通知部７０６により、対象タスクの起動指示を特定したＣＰＵへ通知し（ステップＳ１１０４）、ステップＳ１１０１へ戻る。
【００６５】
一方、スケジューラ１２１が、対象タスクが対象タスクに同期するタスクがないと判断した場合（ステップＳ１１０２：Ｎｏ）、特定部７０３により、同期タスクが割り当てられていないＣＰＵを特定する（ステップＳ１１０５）。そして、スケジューラ１２１が、通知部７０６により、対象タスクの起動指示を特定したＣＰＵへ通知し（ステップＳ１１０６）、ステップＳ１１０１へ戻る。
【００６６】
（実施例２）
実施例２では、対象スレッドに同期するタスクがある場合に非同期タスクが割り当てられていないＣＰＵが特定されなかった場合と、対象スレッドに同期するタスクがない場合に同期タスクが割り当てられていないＣＰＵが特定されなかった場合とについて説明する。
【００６７】
図７の説明に戻って、特定部７０３は、対象タスクと同期するタスクがあると判断された場合において、非同期タスクが割り当てられていないＣＰＵが特定されなかった場合、マルチコアプロセッサのうち、非同期タスクが割り当てられているＣＰＵ群を特定する。
【００６８】
移行部７０４は、特定部７０３により特定されたＣＰＵ群のうちの一のＣＰＵに割り当てられた非同期タスクをＣＰＵ群のうちの一のＣＰＵを除く他のＣＰＵに移行させる。
【００６９】
通知部７０６は、移行部７０４により一のＣＰＵに割り当てられた非同期タスクを他のＣＰＵに移行させた後、対象タスクの起動指示を一のＣＰＵに通知する。
【００７０】
また、特定部７０３は、対象タスクと同期するタスクがないと判断された場合において、同期タスクが割り当てられていないＣＰＵが特定されなかった場合、マルチコアプロセッサのうち、同期タスクが割り当てられているＣＰＵ群を特定する。
【００７１】
移行部７０４は、特定部７０３により特定されたＣＰＵ群のうちの一のＣＰＵに割り当てられた同期タスクをＣＰＵ群のうちの一のＣＰＵを除く他のＣＰＵに移行させる。
【００７２】
通知部７０６は、移行部７０４により一のＣＰＵに割り当てられた同期タスクを他のＣＰＵに移行させた後、対象タスクの起動指示を一のＣＰＵに通知する。
【００７３】
以上を踏まえて図を用いて詳細に説明する。
【００７４】
図１２は、実施例２において非同期タスクであるタスク＃３の割り当て例を示す説明図である。図１２では、ＣＰＵ＃０にはタスク＃０とタスク＃１が割り当てられ、ＣＰＵ＃１にはタスク＃２とタスク＃４が割り当てられ、ＣＰＵ＃２にはタスク＃６が割り当てられ、ＣＰＵ＃３にはタスク＃７が割り当てられている（点線のタスク＃７）。
【００７５】
まず、スケジューラ１２１がタスク＃３の割り当て指示を受け付けると、タスク＃３が同期タスクであるか非同期タスクであるかを判断する。タスク＃３は非同期タスクである。そして、スケジューラ１２１が、ＣＰＵ＃０〜ＣＰＵ＃３のうち、同期タスクが割り当てられていないＣＰＵを特定する。
【００７６】
ここで、同期タスクが割り当てられていないＣＰＵはない。つぎに、スケジューラ１２１が、同期タスクが割り当てられていないＣＰＵが特定されない場合、同期タスクが割り当てられているＣＰＵ群を特定する。ここでは、同期タスクが割り当てられているＣＰＵ群としてＣＰＵ＃０〜ＣＰＵ＃３が特定される。
【００７７】
つぎに、スケジューラ１２１が、同期タスクが割り当てられているＣＰＵ群から最も低負荷な第１の低負荷ＣＰＵを特定し、該ＣＰＵ群から２番目に低負荷な第２の低負荷ＣＰＵを特定する。図１２では、第１の低負荷ＣＰＵとしてＣＰＵ＃３が特定され、第２の低負荷ＣＰＵとしてＣＰＵ＃２が特定される。
【００７８】
そして、スケジューラ１２１が、（１）第１の低負荷ＣＰＵであるＣＰＵ＃３に割り当てられたタスク＃７を第２の低負荷ＣＰＵであるＣＰＵ＃２にマイグレーションさせる。スケジューラ１２１が、（２）タスク＃７がマイグレーションすると、いずれのタスクも割り当てられていないＣＰＵ＃３にタスク＃３の起動指示を通知する。
【００７９】
図１３は、実施例２において同期タスクであるタスク＃４の割り当て例を示す説明図である。図１３では、ＣＰＵ＃０にはタスク＃３が割り当てられ、ＣＰＵ＃１にはタスク＃５が割り当てられ、ＣＰＵ＃２にはタスク＃８が割り当てられ、ＣＰＵ＃３にはタスク＃９が割り当てられている（マイグレーション前の点線のタスク＃９）。タスク＃３とタスク＃５とタスク＃８とタスク＃９とは非同期タスクである。
【００８０】
そして、スケジューラ１２１が、タスク＃４の起動指示を受け付けると、タスク＃４が同期タスクであるか非同期タスクであるかを判断する。タスク＃４は同期タスクである。そして、スケジューラ１２１が、ＣＰＵ＃０〜ＣＰＵ＃３のうち、非同期タスクが割り当てられていないＣＰＵを特定する。
【００８１】
ここで、非同期タスクが割り当てられていないＣＰＵはない。つぎに、スケジューラ１２１が、非同期タスクが割り当てられていないＣＰＵが特定されない場合、非同期タスクが割り当てられているＣＰＵ群を特定する。ここでは、非同期タスクが割り当てられているＣＰＵ群としてＣＰＵ＃０〜ＣＰＵ＃３が特定される。
【００８２】
つぎに、スケジューラ１２１が、非同期タスクが割り当てられているＣＰＵ群から最も低負荷な第１の低負荷ＣＰＵを特定し、該ＣＰＵ群から２番目に低負荷な第２の低負荷ＣＰＵを特定する。図１３では、第１の低負荷ＣＰＵとしてＣＰＵ＃３が特定され、第２の低負荷ＣＰＵとしてＣＰＵ＃２が特定される。
【００８３】
そして、スケジューラ１２１が、（１）第１の低負荷ＣＰＵであるＣＰＵ＃３に割り当てられたタスク＃９を第２の低負荷ＣＰＵであるＣＰＵ＃２にマイグレーションさせる。スケジューラ１２１が、（２）タスク＃９がマイグレーションすると、いずれのタスクも割り当てられていないＣＰＵ＃３にタスク＃４の起動指示を通知する。
【００８４】
（実施例３）
実施例３では、ＯＳが省電力モードであり、かつ非同期タスクのみが割り当てられているＣＰＵのメモリクロックを下げる例を説明する。従来より、共有メモリ１０３の消費電力はマルチコアプロセッサシステム１００の消費電力において大きな割合を占めていた。同期タスクは同期処理のために共有メモリ１０３へのアクセスやキャッシュへのアクセスを遅くすることができないため、共有メモリ１０３やキャッシュに与えるクロックの周波数を下げることができなかった。従来では、同期タスクと非同期タスクが混在してＣＰＵに割り当てられていたため、常に共有メモリ１０３やキャッシュに与えるクロックの周波数を下げることができないという問題点があった。
【００８５】
本発明におけるスケジューラ１２１は同期タスクと非同期タスクとが同一ＣＰＵに割り当てられないように制御する。実施例３では、ＯＳが省電力モードであり、かつ非同期タスクのみが割り当てられているＣＰＵのキャッシュに与えるクロックの周波数や該ＣＰＵが調停回路１０２によりアクセスが許可されている期間において共有メモリ１０３へ与えるクロックの周波数を下げる例を説明する。
【００８６】
さらに、実施例３では、クロックが下げられているＣＰＵに割り当てられた非同期タスクがマイグレーションにより他のＣＰＵに割り当てられ、該クロックが下げられているＣＰＵに同期タスクが割り当てられる例を説明する。
【００８７】
図７の説明に戻って、状態判断部７０５は、対象タスクと同期するタスクがないと判断された場合において、特定部７０３により特定されたＣＰＵが省電力モードであるか否かを判断する。
【００８８】
通知部７０６は、状態判断部７０５により特定されたＣＰＵが省電力モードであると判断された場合、共有メモリ１０３に与えるクロックの周波数および該ＣＰＵのキャッシュに与えるクロックの周波数をそれぞれ所定周波数まで下げる指示を分周回路１０４に通知する。
【００８９】
以上を踏まえて図を用いて詳細に説明する。
【００９０】
図１４は、実施例３においてメモリクロックが下げられる例を示す説明図である。図１４では、ＣＰＵ＃０にはタスク＃１とタスク＃４が割り当てられ、ＣＰＵ＃１にはタスク＃２とタスク＃６が割り当てられ、ＣＰＵ＃２にはタスク＃７が割り当てられ、ＣＰＵ＃３にはタスク＃５が割り当てられている。
【００９１】
まず、スケジューラ１２１がタスク＃３の割り当て指示を受け付けると、タスク＃３が同期タスクであるか非同期タスクであるかを判断する。タスク＃３は非同期タスクである。そして、スケジューラ１２１が、ＣＰＵ＃０〜ＣＰＵ＃３のうち、同期タスクが割り当てられていないＣＰＵを特定する。
【００９２】
ここで、同期タスクが割り当てられていないＣＰＵとしてＣＰＵ＃３が特定される。そして、ＯＳ１１４が省電力モードであるか否かを判断する。具体的には、ＣＰＵ＃３のレジスタ内のＰＯＷが１であるか否かを判断する。該ＰＯＷが１であれば、ＯＳ１１４は省電力モードであり、該ＰＯＷが０であれば、ＯＳ１１４は省電力モードでない。図１４では、ＣＰＵ＃３のレジスタ内のＰＯＷが１であり、かつ非同期タスクのみが割り当てられているため、スケジューラ１２１が（１）ＣＰＵ＃３のメモリクロックを下げる。
【００９３】
ＣＰＵ＃３のメモリクロックを下げるとは、ＣＰＵ＃３のキャッシュへ与えるクロックの周波数と調停回路１０２によりＣＰＵ＃３から共有メモリ１０３へのアクセスが許可されている場合の共有メモリ１０３へのクロックの周波数とが下げられることを意味している。たとえば、スケジューラ１２１がＣＭＯＤＥ＿３［３：０］を“００００”に設定して分周回路１０４に与えているとする。
【００９４】
そして、スケジューラ１２１が、クロック制御テーブル１３４からタスクの項目６０１のタスク名がＣＰＵ＃３の場合およびタスク＃５の場合の共有メモリの項目６０３の値とキャッシュの項目６０４の値を検索する。ここで、クロック制御テーブル１３４からタスクの項目６０１のタスク名がタスク＃５の場合の共有メモリの項目６０３の値は４であり、キャッシュの項目６０４の値は４である。一方、クロック制御テーブル１３４でタスクの項目６０１のタスク名がタスク＃３の場合の共有メモリの項目６０３の値は４であり、キャッシュの項目６０４の値は４である。
【００９５】
タスクの項目６０１のタスク名がタスク＃３の場合とタスク＃５の場合とで共有メモリの項目６０３の値が同一値であり、キャッシュメモリの項目の値が同一値である。よって、スケジューラ１２１が、共有メモリ１０３へ与えるクロックの周波数を逓倍後のクロックの周波数の２分周とし、キャッシュへ与えるクロックの周波数を逓倍後のクロックの周波数の２分周とする。
【００９６】
そして、スケジューラ１２１が、メモリクロックテーブル５０１から共有メモリの項目５０４の値が４であり、キャッシュの項目５０５の値が４であるＣＭＯＤＥ＿ｘ［３：０］の値を特定する。ここでは、ＣＭＯＤＥ＿ｘ［３：０］の値が“００１１”の場合、共有メモリの項目６０３の値が４であり、キャッシュの項目５０５の値が４である。
【００９７】
そして、スケジューラ１２１が、ＣＭＯＤＥ＿３［３：０］の値を“０１１１”に設定して分周回路１０４に与えることで、共有メモリ１０３に与えるクロックとＣＰＵ＃３のキャッシュに与えるクロックの周波数が下がる。ＣＰＵ＃３のキャッシュには周波数が２５ＭＨｚのクロックが与えられ、ＣＰＵ＃３が調停回路１０２によりアクセスが許可されている期間に共有メモリ１０３には周波数が２５ＭＨｚのクロックが与えられる。
【００９８】
つぎに、スケジューラ１２１が、（１）メモリクロックを下げると、（２）ＣＰＵ＃３のレジスタ内のＦＲを１に設定し、（３）タスク＃３の起動指示をＣＰＵ＃３に通知することでＣＰＵ＃３にタスク３を割り当てる。
【００９９】
図１５は、実施例３において同期タスクであるタスク＃７がＣＰＵに割り当てられる例を示す説明図である。図１５では、ＣＰＵ＃０にはタスク＃１とタスク＃４が割り当てられ、ＣＰＵ＃１にはタスク＃２とタスク＃６が割り当てられ、ＣＰＵ＃２にはタスク＃３が割り当てられ（マイグレーション前の点線のタスク＃３）、ＣＰＵ＃３にはタスク＃５が割り当てられている。
【０１００】
まず、スケジューラ１２１がタスク＃７の割り当て指示を受け付けると、タスク＃７が同期タスクであるか非同期タスクであるかを判断する。タスク＃７は同期タスクである。そして、スケジューラ１２１が、ＣＰＵ＃０〜ＣＰＵ＃３のうち、非同期タスクが割り当てられていないＣＰＵを特定する。ここでは、ＣＰＵ＃０とＣＰＵ＃１が、非同期タスクが割り当てられていないＣＰＵとして特定される。
【０１０１】
スケジューラ１２１が、タスク＃７をＣＰＵ＃０に割り当ててリアルタイム制約を遵守できるか否かを判断する。リアルタイム制約とは、たとえば、ある時間以内にタスクを実行することができることなどの実行時間に関する制約である。スケジューラ１２１は実行時間を予測することでリアルタイム制約を遵守できるか否かを判断する。図１５では、スケジューラ１２１が、タスク＃７をＣＰＵ＃０に割り当ててリアルタイム制約を遵守できないと判断する。
【０１０２】
つぎに、スケジューラ１２１が、タスク＃７をＣＰＵ＃１に割り当ててリアルタイム制約を遵守できるか否かを判断する。図１５では、スケジューラ１２１が、タスク＃７をＣＰＵ＃１に割り当ててリアルタイム制約を遵守できないと判断する。
【０１０３】
スケジューラ１２１は、非同期タスクが割り当てられていないＣＰＵに割り当てることができない場合、非同期タスクが割り当てられていないＣＰＵが特定できないと判断する。つぎに、スケジューラ１２１は、非同期タスクが割り当てられていないＣＰＵが特定できなかった場合、実施例２で示したように非同期タスクが割り当てられているＣＰＵ群を特定する。ここでは、スケジューラ１２１が、ＣＰＵ＃２とＣＰＵ＃３を非同期タスクが割り当てられているＣＰＵ群として特定する。
【０１０４】
つぎに、スケジューラ１２１は、（１）ＣＰＵ＃２に割り当てられている非同期タスクをＣＰＵ＃３にマイグレーションさせる。そして、スケジューラ１２１が、ＣＰＵ＃２のメモリクロックが下げられているか否かをＣＰＵ＃２のレジスタ内のＦＲに基づいて判断する。ＦＲは１であるため、スケジューラ１２１が、ＣＰＵ＃２のメモリクロックが下げられていると判断し、（２）ＣＰＵ＃２のメモリクロックをデフォルトに戻す。
【０１０５】
そして、スケジューラ１２１がＣＰＵ＃２のメモリクロックをデフォルトに戻したため、（３）ＣＰＵ＃２のレジスタ内のＦＲを０に設定し、（４）タスク＃７の起動指示をＣＰＵ＃２に通知することでタスク＃７をＣＰＵ＃２に割り当てる。
【０１０６】
また、図８から図１５の例では、スケジューラ１２１がタスクの割り当て指示を受け付けた場合におけるスケジューラ１２１の割り当て処理について説明したが、これに限らず。たとえば、タスクが通常の状態からスリープ状態に変化した場合に同期タスクであったものが非同期タスクとなる場合があり、スケジューラ１２１は再割り当てを行うことにより同期タスクと非同期タスクを同一のコアに割り当てないように制御する。
【０１０７】
図１６は、タスク＃１が動作状態からスリープ状態に変化した例を示す説明図である。図１６では、タスク＃１が動作状態の場合、ＣＰＵ＃０にはタスク＃１が割り当てられ、ＣＰＵ＃１にはタスク＃２とタスク＃４（マイグレーション前の点線のタスク＃４）が割り当てられている。さらに、ＣＰＵ＃２にはタスク＃６が割り当てられ、ＣＰＵ＃３にはタスク＃７が割り当てられている。タスク＃２とタスク＃４はいずれも同期タスクであるため同一のＣＰＵに割り当てられている。
【０１０８】
つぎに、タスク＃１が動作状態からスリープ状態に変化したとする。スケジューラ１２１は、タスク＃１が動作状態からスリープ状態への変化を検出し、同期テーブル１３２からタスク＃１に同期している同期対象タスクを特定する。タスク＃１に同期する同期対象タスクはタスク＃０とタスク＃２である。ここでは、タスク＃０は起動していないため、タスク＃２のみが特定される。
【０１０９】
そして、スケジューラ１２１が、同期テーブル１３２からタスクの項目３０１のタスク名がタスク＃２であり、かつ同期対象タスクの項目３０２のタスク名がタスク＃１の場合の同期中断イベントの項目３０３の値を読み出す。ここでは、該同期中断イベントの項目３０３の値として「ｓｌｅｅｐ」が読み出される。スケジューラ１２１が、タスク＃１がスリープ状態であり、該同期中断イベントの項目３０３の値として「ｓｌｅｅｐ」であるため、タスク＃２は同期タスクであったが、非同期タスクになったと判断する。
【０１１０】
よって、スケジューラ１２１が、ＣＰＵ＃１には非同期タスクであるタスク＃２と同期タスクであるタスク＃４が同一のＣＰＵに割り当てられているため、再割り当てを行う。たとえば、スケジューラ１２１が、ＣＰＵ＃０〜ＣＰＵ＃３のうち、同期タスクが割り当てられていないＣＰＵを特定する。ここでは、ＣＰＵ＃２とＣＰＵ＃３が特定される。ここで、ＣＰＵ＃３がＣＰＵ＃２よりも負荷の小さいＣＰＵであるとする。
【０１１１】
そして、スケジューラ１２１が、タスク＃４をＣＰＵ＃１から特定したＣＰＵ＃３にマイグレーションさせることにより、同期タスクと非同期タスクが同一ＣＰＵに割り当てられないように制御する。したがって、ＣＰＵ＃１には非同期タスクであるタスク＃２のみが割り当てられ、ＣＰＵ＃３には同期タスクであるタスク＃７とタスク＃４が割り当てられている。
【０１１２】
（実施例２および３にかかるスケジューラ１２１による制御処理手順）
図１７〜図２０は、実施例２および３にかかるスケジューラ１２１による制御処理手順の一例を示すフローチャートである。まず、スケジューラ１２１が、各ＣＰＵに割り当てられたタスクの変化を検出したか否かまたはタスクの起動指示を受け付けたか否かを判断する（ステップＳ１７０１）。ここで、各ＣＰＵに割り当てられたタスクの変化とは、たとえば、タスクが完了したり、タスクのディスパッチまたはタスクのスイッチが発生した場合を示している。スケジューラ１２１が、各ＣＰＵに割り当てられたタスクの変化を検出していないおよびタスクの起動指示を受け付けていないと判断した場合（ステップＳ１７０１：Ｎｏ）、ステップＳ１７０１へ戻る。
【０１１３】
一方、スケジューラ１２１が、各ＣＰＵに割り当てられたタスクの変化を検出したまたはタスクの起動指示を受け付けたと判断した場合（ステップＳ１７０１：Ｙｅｓ）、各ＣＰＵに割り当てられたタスクまたは割り当て指示があるタスクを特定する（ステップＳ１７０２）。つぎに、スケジューラ１２１が、特定したタスクの中で未選択のタスクがあるか否かを判断する（ステップＳ１７０３）。そして、スケジューラ１２１が、特定したタスクの中で未選択のタスクがあると判断した場合（ステップＳ１７０３：Ｙｅｓ）、未選択のタスクの中から任意のタスクを対象タスクとして選択する（ステップＳ１７０４）。
【０１１４】
つぎに、スケジューラ１２１が、対象タスクに同期するタスクがあるか否かを判断する（ステップＳ１７０５）。スケジューラ１２１が、対象タスクに同期するタスクがあると判断した場合（ステップＳ１７０５：Ｙｅｓ）、いずれのタスクも割り当てられていないＣＰＵおよび同期タスクが割り当てられているＣＰＵを第１のＣＰＵ群として特定する（ステップＳ１７０６）。
【０１１５】
そして、スケジューラ１２１が、第１のＣＰＵ群があるか否かを判断し（ステップＳ１７０７）、第１のＣＰＵ群があると判断した場合（ステップＳ１７０７：Ｙｅｓ）、第１のＣＰＵ群から最も負荷の小さいＣＰＵを特定する（ステップＳ１７０８）。スケジューラ１２１が、第１のＣＰＵ群から低負荷ＣＰＵを削除し（ステップＳ１７０９）、対象タスクを低負荷ＣＰＵに割り当てた場合、リアルタイム制約を遵守できるか否かを判断する（ステップＳ１７１０）。
【０１１６】
スケジューラ１２１が、対象タスクを低負荷ＣＰＵに割り当てた場合、リアルタイム制約を遵守できると判断した場合（ステップＳ１７１０：Ｙｅｓ）、対象タスクを低負荷ＣＰＵに割り当て（ステップＳ１７１１）、ステップＳ１７０３へ戻る。一方、対象タスクを低負荷ＣＰＵに割り当てた場合、リアルタイム制約を遵守できないと判断した場合（ステップＳ１７１０：Ｎｏ）、ステップＳ１７０７に戻る。
【０１１７】
一方、ステップＳ１７０７において、スケジューラ１２１が、第１のＣＰＵ群がないと判断した場合（ステップＳ１７０７：Ｎｏ）、非同期タスクのみが割り当てられている第２のＣＰＵ群を特定する（ステップＳ１７１２）。そして、スケジューラ１２１が、第２のＣＰＵ群から最も負荷の小さい第１の低負荷ＣＰＵを特定し（ステップＳ１７１３）、第２のＣＰＵ群から２番目に負荷の小さい第２の低負荷ＣＰＵを特定する（ステップＳ１７１４）。
【０１１８】
スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた非同期タスクを第２の低負荷ＣＰＵにマイグレーションさせてリアルタイム制約を遵守できるか否かを判断する（ステップＳ１７１５）。そして、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた非同期タスクを第２の低負荷ＣＰＵにマイグレーションさせてリアルタイム制約を遵守できると判断した場合（ステップＳ１７１５：Ｙｅｓ）、ステップＳ１７１６に移行する。一方、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた非同期タスクを第２の低負荷ＣＰＵにマイグレーションさせるとリアルタイム制約を遵守できないと判断した場合（ステップＳ１７１５：Ｎｏ）、ステップＳ１７２０へ移行する。
【０１１９】
つぎに、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられたタスクを第２の低負荷ＣＰＵにマイグレーションさせ（ステップＳ１７１６）、第１の低負荷ＣＰＵのメモリクロックが下げられているか否かを判断する（ステップＳ１７１７）。スケジューラ１２１が、第１の低負荷ＣＰＵのメモリクロックが下げられていると判断した場合（ステップＳ１７１７：Ｙｅｓ）、第１の低負荷ＣＰＵのメモリクロックをデフォルトに戻す（ステップＳ１７１８）。
【０１２０】
そして、スケジューラ１２１が、第１の低負荷のメモリクロックに関するレジスタを０に設定し（ステップＳ１７１９）、対象タスクを第１の低負荷ＣＰＵに割り当て（ステップＳ１７２０）、ステップＳ１７０３へ戻る。一方、スケジューラ１２１が、第１の低負荷ＣＰＵのメモリクロックが下げられていないと判断した場合（ステップＳ１７１７：Ｎｏ）、ステップＳ１７２０へ移行する。
【０１２１】
一方、ステップＳ１７０５において、スケジューラ１２１が、対象タスクに同期するタスクがないと判断した場合（ステップＳ１７０５：Ｎｏ）、いずれのタスクも割り当てられていないＣＰＵおよび非同期タスクのみが割り当てられているＣＰＵを第２のＣＰＵ群として特定する（ステップＳ１７２１）。つぎに、スケジューラ１２１が、第２のＣＰＵ群があるか否かを判断し（ステップＳ１７２２）、第２のＣＰＵ群があると判断した場合（ステップＳ１７２２：Ｙｅｓ）、第２のＣＰＵ群の中で最も低負荷な第１の低負荷ＣＰＵを特定し（ステップＳ１７２３）、ステップＳ１７２９へ移行する。
【０１２２】
一方、スケジューラ１２１が、第２のＣＰＵ群がないと判断した場合（ステップＳ１７２２：Ｎｏ）、同期タスクが割り当てられている第１のＣＰＵ群を特定する（ステップＳ１７２４）。つぎに、スケジューラ１２１が、第１のＣＰＵ群の中で最も低負荷な第１の低負荷ＣＰＵを特定し（ステップＳ１７２５）、第１のＣＰＵ群から２番目に負荷の小さい第２の低負荷ＣＰＵを特定する（ステップＳ１７２６）。
【０１２３】
そして、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた同期タスクを第２の低負荷ＣＰＵにマイグレーションさせてリアルタイム制約を遵守できるか否かを判断する（ステップＳ１７２７）。スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた同期タスクを第２の低負荷ＣＰＵにマイグレーションさせてリアルタイム制約を遵守できないと判断した場合（ステップＳ１７２７：Ｎｏ）、ステップＳ１７３２へ移行する。
【０１２４】
一方、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた同期タスクを第２の低負荷ＣＰＵにマイグレーションさせてリアルタイム制約を遵守できると判断した場合（ステップＳ１７２７：Ｙｅｓ）、ステップＳ１７２８に移行する。つぎに、ステップＳ１７２８において、スケジューラ１２１が、第１の低負荷ＣＰＵに割り当てられた同期タスクを第２の低負荷ＣＰＵにマイグレーションさせ（ステップＳ１７２８）、第１の低負荷ＣＰＵ上で動作するＯＳが省電力モードであるか否かを判断する（ステップＳ１７２９）。
【０１２５】
まず、スケジューラ１２１が、第１の低負荷ＣＰＵ上で動作するＯＳが省電力モードでないと判断した場合（ステップＳ１７２９：Ｎｏ）、ステップＳ１７３２へ移行する。一方、スケジューラ１２１が、第１の低負荷ＣＰＵ上で動作するＯＳが省電力モードであると判断した場合（ステップＳ１７２９：Ｙｅｓ）、第１の低負荷ＣＰＵに割り当てられたタスクに基づきメモリクロックを下げる（ステップＳ１７３０）。
【０１２６】
そして、スケジューラ１２１が、第１の低負荷ＣＰＵのメモリクロックに関するレジスタを１に設定し（ステップＳ１７３１）、対象タスクを第１の低負荷ＣＰＵに割り当て（ステップＳ１７３２）、ステップＳ１７０３へ戻る。
【０１２７】
一方、スケジューラ１２１が、特定したタスクの中で未選択のタスクがないと判断した場合（ステップＳ１７０３：Ｎｏ）、ステップＳ１７０１へ戻る。
【０１２８】
また、実施例３では共有メモリ１０３およびＣＰＵのキャッシュに与えるクロックの周波数を下げる例を示したが、該共有メモリ１０３やＣＰＵのキャッシュに与える電源電圧を下げてもよい。図２で示していないが、マルチコアプロセッサシステム１００が各構成部へ電源電圧を供給する電源供給回路を備えているとする。
【０１２９】
状態判断部７０５は、対象タスクと同期するタスクがないと判断された場合において、特定部７０３により特定されたＣＰＵが省電力状態であるか否かを判断する。
【０１３０】
通知部７０６は、状態判断部７０５により特定されたＣＰＵが省電力状態であると判断された場合、電源電圧の値を所定値まで下げる指示を電源供給回路に通知する。
【０１３１】
たとえば、共有メモリ１０３やＣＰＵのキャッシュへ通常の動作状態では１．１［Ｖ］の電源電圧を与えなければならないとする。あるＣＰＵが省電力モードでありかつ非同期タスクのみが割り当てられていれば、該あるＣＰＵのキャッシュに与える電源電圧と調停回路１０２に許可されている間、共有メモリ１０３へ与える電源電圧を所定電圧まで下げてもよい。所定電圧とは、タスクごとにあらかじめ設計者により決められている値である。
【０１３２】
以上説明したように、マルチコアプロセッサシステム、制御プログラム、および制御方法によれば、いずれかのタスクに同期する同期タスクといずれのタスクにも同期しない非同期タスクとが同一ＣＰＵに割り当てられないように制御する。したがって、同期タスクの同期処理により非同期タスクが待機するのを防止でき、非同期タスクの実行時間を防止できる。これにより、非同期タスクが割り当てられているＣＰＵのスループットを向上させることができる。
【０１３３】
また、対象タスクが非同期タスクの場合において、同期タスクが割り当てられていないＣＰＵが特定されなかった場合、同期タスクが割り当てられている一のＣＰＵから同期タスクを同期タスクが割り当てられている他のＣＰＵへマイグレーションさせる。そして、一のＣＰＵに対象タスクを割り当てることで、非同期タスクと同期タスクとが同一のＣＰＵに割り当てられないように制御できる。したがって、同期タスクの同期処理により非同期タスクが待機するのを防止することができる。
【０１３４】
また、対象タスクが同期タスクの場合において、非同期タスクが割り当てられていないＣＰＵが特定されなかった場合、非同期タスクが割り当てられている一のＣＰＵから非同期タスクを非同期タスクが割り当てられている他のＣＰＵへマイグレーションさせる。そして、一のＣＰＵに対象タスクを割り当てることで、非同期タスクと同期タスクとが同一のＣＰＵに割り当てられないように制御できる。したがって、同期タスクの同期処理により非同期タスクが待機するのを防止することができる。
【０１３５】
また、非同期タスクが割り当てられているＣＰＵ上で動作するＯＳが省電力モードであれば、共有メモリと該ＣＰＵのキャッシュへ供給するクロックを下げることで、低消費電力化を図ることができる。
【０１３６】
また、非同期タスクが割り当てられているＣＰＵ上で動作するＯＳが省電力モードであれば、共有メモリと該ＣＰＵのキャッシュへ供給する電源電圧を下げることで、低消費電力化を図ることができる。
【符号の説明】
【０１３７】
１００  マルチコアプロセッサシステム
１０３  共有メモリ
１０４  分周回路
１２１  スケジューラ
７０２  タスク判断部
７０３  特定部
７０４  移行部
７０５  状態判断部
７０６  通知部
【図１】
0005534002.tif 000002
【図２】
0005534002.tif 000003
【図３】
0005534002.tif 000004
【図４】
0005534002.tif 000005
【図５】
0005534002.tif 000006
【図６】
0005534002.tif 000007
【図７】
0005534002.tif 000008
【図８】
0005534002.tif 000009
【図９】
0005534002.tif 000010
【図１０】
0005534002.tif 000011
【図１１】
0005534002.tif 000012
【図１２】
0005534002.tif 000013
【図１３】
0005534002.tif 000014
【図１４】
0005534002.tif 000015
【図１５】
0005534002.tif 000016
【図１６】
0005534002.tif 000017
【図１７】
0005534002.tif 000018
【図１８】
0005534002.tif 000019
【図１９】
0005534002.tif 000020
【図２０】
0005534002.tif 000021