(57)【要約】【課題】処理負荷を予測して、ＣＰＵコアに処理を割り当てられる情報処理装置、電子制御ユニット及びタスク割り当て方法を提供すること。【解決手段】複数のセンサ１１のセンサ値を受け付ける入力インターフェイス２４と、複数のタスクプログラムが記憶されたタスク記憶手段１５と、タスクプログラムを実行してセンサ値に演算処理を施す複数のＣＰＵ１３，１４と、を有する情報処理装置１００であって、複数のＣＰＵの処理負荷を検出する処理負荷検出手段４２と、センサ値の増減傾向を検出する増減検出手段３８と、センサ値に演算処理を施すＣＰＵを特定し、処理負荷と増減傾向から前記ＣＰＵの予測処理負荷を算出する処理負荷予測手段４８と、複数のＣＰＵの予測処理負荷を比較して、第一の前記ＣＰＵに割り当てられていた前記タスクプログラムを第二の前記ＣＰＵに割り当てる負荷分散手段４４と、を有することを特徴とする。【選択図】図１
2011141782.tif 000002
【特許請求の範囲】
【請求項１】
複数のセンサのセンサ値を受け付ける入力インターフェイスと、複数のタスクプログラムが記憶されたタスク記憶手段と、前記タスクプログラムを実行してセンサ値に演算処理を施す複数のＣＰＵと、を有する情報処理装置であって、
複数の前記ＣＰＵの処理負荷を検出する処理負荷検出手段と、
前記センサ値の増減傾向を検出する増減検出手段と、
前記センサ値に演算処理を施す前記ＣＰＵを特定し、前記処理負荷と前記増減傾向から前記ＣＰＵの予測処理負荷を算出する処理負荷予測手段と、
複数の前記ＣＰＵの前記予測処理負荷を比較して、第一の前記ＣＰＵに割り当てられていた前記タスクプログラムを第二の前記ＣＰＵに割り当てる負荷分散手段と、
を有することを特徴とする情報処理装置。
【請求項２】
前記処理負荷予測手段は、
前記処理負荷検出手段が前記処理負荷を検出してから、前記負荷分散手段が第一の前記ＣＰＵに割り当てられていた前記タスクプログラムを第二の前記ＣＰＵに割り当てるまでの、割り当て時間が経過する際の前記ＣＰＵの予測処理負荷を算出する、
を有することを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記ＣＰＵが実行している前記タスクプログラムを前記ＣＰＵ毎に登録した実行タスクテーブルを有し、
前記タスクプログラムは、前記タスクプログラムに用いられる前記センサ値を示す制御タグを記憶しており、
前記処理負荷予測手段は、前記実行タスクテーブルを参照して特定した、前記ＣＰＵが実行している前記タスクプログラムの前記制御タグに基づき、前記ＣＰＵが演算処理を施す前記センサ値を特定する、
ことを特徴とする請求項１又は２記載の情報処理装置。
【請求項４】
前記ＣＰＵが実行している前記タスクプログラムを前記ＣＰＵ毎に登録した実行タスクテーブルと、前記タスクプログラムに用いられる前記センサ値を出力する前記センサを対応づけたセンサ対応テーブルとを有し、
前記処理負荷予測手段は、前記実行タスクテーブルを参照して特定した、前記ＣＰＵが実行している前記タスクプログラムに用いられる前記センサ値を、前記センサ対応テーブルを参照して特定する、
ことを特徴とする請求項１又は２記載の情報処理装置。
【請求項５】
前記増減検出手段は前記センサ値の微分値を検出する手段であり、
前記処理負荷予測手段は、前記微分値に前記割り当て時間を乗じて前記処理負荷に加えた値を前記ＣＰＵの前記予測処理負荷とする、
ことを特徴とする請求項２記載の情報処理装置。
【請求項６】
前記ＣＰＵが実行している１以上の前記タスクプログラムに用いられる前記センサ値が複数ある場合、
前記処理負荷予測手段は、前記微分値に前記割り当て時間を乗じて前記処理負荷に加えた値を、前記タスクプログラム毎にさらに加算して、前記ＣＰＵの前記予測処理負荷とする、
ことを特徴とする請求項５記載の情報処理装置。
【請求項７】
前記ＣＰＵが実行している１以上の前記タスクプログラムに用いられる前記センサ値が複数ある場合、
前記処理負荷予測手段は、前記微分値の平均に前記割り当て時間を乗じて前記処理負荷に加えた値を、前記ＣＰＵの前記予測処理負荷とする、
ことを特徴とする請求項５記載の情報処理装置。
【請求項８】
前記ＣＰＵが実行している１以上の前記タスクプログラムに用いられる前記センサ値が複数ある場合、
前記処理負荷予測手段は、最も大きい前記微分値又は最も小さい前記微分値に前記割り当て時間を乗じて前記処理負荷に加えた値を、前記ＣＰＵの前記予測処理負荷とする、
ことを特徴とする請求項５記載の情報処理装置。
【請求項９】
前記処理負荷検出手段は、
第一の時間を計測する第一のタイマと、
前記ＣＰＵが前記タスクプログラムを実行している第二の時間を計測する第二のタイマと、を有し、
前記第一の時間に対する前記第二の時間の比から前記処理負荷を検出する、
ことを特徴とする請求項１〜８いずれか１項記載の情報処理装置。
【請求項１０】
請求項１〜９いずれか１項記載の情報処理装置を搭載した電子制御ユニット。
【請求項１１】
複数のセンサのセンサ値を受け付ける入力インターフェイスと、複数のタスクプログラムが記憶されたタスク記憶手段と、前記タスクプログラムを実行してセンサ値に演算処理を施す複数のＣＰＵと、を有する情報処理装置のタスク割り当て方法であって、
処理負荷検出手段が、複数の前記ＣＰＵの処理負荷を検出するステップと、
増減検出手段が、前記センサ値の増減傾向を検出するステップと、
処理負荷予測手段が、前記センサ値に演算処理を施す前記ＣＰＵを特定し、前記処理負荷と前記増減傾向から前記ＣＰＵの予測処理負荷を算出するステップと、
負荷分散手段が、複数の前記ＣＰＵの前記予測処理負荷を比較して、第一の前記ＣＰＵに割り当てられていた前記タスクプログラムを第二の前記ＣＰＵに割り当てるステップと、
を有することを特徴とするタスク割り当て方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のＣＰＵコアを有するマルチコア型のＣＰＵにおいて、各CPUコアの負荷を分散する情報処理装置、電子制御ユニット及びタスク割り当て方法に関する。
【背景技術】
【０００２】
複数のＣＰＵコアを有するマルチコア型のＣＰＵでは、各ＣＰＵコアが独自に処理を実行することができ、処理効率を向上させることができるようになっている。このマルチコア型のＣＰＵを搭載した情報処理装置では、各ＣＰＵコアへの負荷を分散させることで、さらに処理効率の向上が可能になる。例えば、各ＣＰＵコアがそれぞれＯＳを実行できるようにしておき、このＯＳが自身の処理負荷を検出して、処理負荷が大きくなると、ＣＰＵコアに別のＯＳを起動させる情報処理装置が考案されている（例えば、特許文献１参照。）。
【０００３】
また、より直接にＣＰＵコアの処理負荷を監視して、負荷を分散することも考えられている（例えば、特許文献２、３参照。）。特許文献２には、タスク走行時間によりＣＰＵコアの負荷率を計測し、負荷率の少ないＣＰＵコアにだけ割り込みを発生させ処理を実行させるマルチＣＰＵシステムが開示されている。
【０００４】
特許文献３には、分散装置の負荷率の移動平均値を監視して、移動平均値が所定値以下になると、分散装置の個別動作ジャーナルファイルと異常ログファイルを中央装置に送信する分散型制御システムが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−２６２４１９号公報
【特許文献２】特開２０００−３３０９５８号公報
【特許文献３】特開２００２−２５９２３６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献２のように現在のＣＰＵコアの処理負荷を算出して処理を割り当てると、割り当てた際には別の処理で処理負荷が増大している可能性があるという問題がある。また、特許文献３のように、負荷率の移動平均値を指標とした場合、移動平均値は過去の負荷率に影響されるので、必ずしも現在のＣＰＵコアの負荷率を現していないという問題がある。
【０００７】
また、特許文献３のように、過去の負荷率が影響しやすい移動平均値により将来の負荷率を予測することは好ましくなく、タスクを割り当てる際の処理負荷を的確に予測することは困難である。
【０００８】
本発明は、上記課題に鑑み、処理負荷を予測して、ＣＰＵコアに処理を割り当てられる情報処理装置、電子制御ユニット及びタスク割り当て方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記課題に鑑み、本発明は、複数のセンサのセンサ値を受け付ける入力インターフェイスと、複数のタスクプログラムが記憶されたタスク記憶手段と、前記タスクプログラムを実行してセンサ値に演算処理を施す複数のＣＰＵと、を有する情報処理装置であって、複数の前記ＣＰＵの処理負荷を検出する処理負荷検出手段と、前記センサ値の増減傾向を検出する増減検出手段と、前記センサ値に演算処理を施す前記ＣＰＵを特定し、前記処理負荷と前記増減傾向から前記ＣＰＵの予測処理負荷を算出する処理負荷予測手段と、複数の前記ＣＰＵの前記予測処理負荷を比較して、第一の前記ＣＰＵに割り当てられていた前記タスクプログラムを第二の前記ＣＰＵに割り当てる負荷分散手段と、を有することを特徴とする。
【発明の効果】
【００１０】
処理負荷を予測して、ＣＰＵコアに処理を割り当てられる情報処理装置、電子制御ユニット及びタスク割り当て方法を提供することができる。
【図面の簡単な説明】
【００１１】
【図１】情報処理装置による負荷分散を模式的に説明する図の一例である。
【図２】情報処理装置の概略構成図の一例である。
【図３】ホストＣＰＵの機能ブロック図の一例である。
【図４】ＩＮＴＣ１がタイマＡを制御する手順を示すフローチャート図の一例である。
【図５】ホストＣＰＵが負荷を分散する手順を示すフローチャート図の一例である。
【図６】情報処理装置によるサブＣＰＵの負荷の予測を模式的に説明する図の一例である。
【図７】情報処理装置の概略構成図の一例を示す（実施例２）
【図８】センサ値とその微分値を模式的に説明する図の一例である。
【図９】ホストＣＰＵの機能ブロック図の一例である（実施例２）。
【図１０】処理負荷の予測を模式的に説明する図の一例である。
【図１１】負荷予測部が、各サブＣＰＵの予測負荷率Ｙを算出する手順を示すフローチャート図の一例である。
【図１２】ホストＣＰＵの機能ブロック図の一例である（実施例２：変形例）。
【図１３】制御タグをさらに詳細に説明する図の一例である。
【図１４】負荷予測部が、各サブＣＰＵの予測負荷率Ｙを算出する手順を示すフローチャート図の一例である（変形例）。
【図１５】ホストＣＰＵが負荷を分散する手順を示すフローチャート図の一例である。
【発明を実施するための形態】
【００１２】
以下、本発明を実施するための形態について図面を参照しながら説明する。
【実施例１】
【００１３】
図１は、本実施例の情報処理装置２００による負荷分散を模式的に説明する図の一例である。情報処理装置１００はホストＣＰＵ１２及び複数のサブＣＰＵ１３，１４を有する。各サブＣＰＵ１３，１４は負荷情報を例えば定期的にホストＣＰＵ１２に通知する。ホストＣＰＵ１２の例えばＯＳ３０は、負荷情報に基づき各サブＣＰＵ１３，１４の負荷率を算出し、処理負荷が分散されるように各サブＣＰＵ１３，１４へのタスクの割り当てを変更する。
【００１４】
したがって、各サブＣＰＵ１３，１４の負荷率に大きな偏りが生じないように（例えば、同程度になるように）タスクを割り当てることができ、情報処理装置１００の各サブＣＰＵ１３，１４の負荷率を分散させることができる。
【００１５】
図２は、本実施例の情報処理装置１００の概略構成図の一例を示す。車載された情報処理装置１００は、ＥＣＵ（Electronic  Control  Unit）又は電子制御ユニットと称されることがある。情報処理装置１００は、複数のＣＰＵコアを有するマルチコア型の設計となっている。複数のＣＰＵコアを搭載することで、従来は別々のＥＣＵで実行されていた処理を、１つのＥＣＵにて処理することが可能になる。これにより、車載されるＥＣＵの数を低減でき、省スペース化や省電力化が可能になる。本実施例ではＣＰＵコアをサブＣＰＵ１３，１４と称している。
【００１６】
情報処理装置１００は、バス１６に接続された、センサ部１１、ホストＣＰＵ１２、サブＣＰＵ１３（以下、サブＥＣＵ１という）、サブＣＰＵ１４（以下、サブＣＰＵ２という）、Flash ROM１５、ＲＡＭ１７、タイマ２３、タイマ２５及びＤＭＡＣ１８を有する。サブＣＰＵ１とサブＣＰＵ２は同じ構成を有するので、サブＣＰＵ１を例にして説明する。なお、サブＣＰＵ１，２の数は、３以上でもよい。
【００１７】
また、ホストＣＰＵ１２と各サブＣＰＵ１，２は、同じ構造でもよいし、異なる構造でもよい。本実施例では、ホストＣＰＵ１２は後述するアイドル検出回路３７を備えていなくてもよいので、ホストＣＰＵ１２とサブＣＰＵ１，２は構造が異なっている。したがって、サブＣＰＵ１，２間の関係では「ＳＭＰ（Symmetric  Multi-Processing）：対称型マルチプロセッサ）」と言え、ホストＣＰＵ１２とサブＣＰＵ１，２の関係ではＡＭＰ（Asymmetric  Multiprocessing：非対称型マルチプロセッサ）と言える。
【００１８】
サブＣＰＵ１は、バス１６に接続された２つのレジスタセット３３、３４、レジスタセット３３、３４に接続されたマルチプレクサ３２、マルチプレクサ３２と接続された演算ユニット３５、Flash  ROM１５と接続されたプログラムカウンタ３１及び命令キュー３６、とを有する。
【００１９】
レジスタセット３３、３４には、センサ部１１が出力したセンサ値、又は、ＲＡＭ１７に記憶されているデータ等がバス１６を介して読み出される。マルチプレクサ３２は、プログラムの指定に従い演算ユニット３５に接続するレジスタセット３３、３４を切り替える。
【００２０】
プログラムカウンタ３１にはホストＣＰＵ１が実行するFlash  ROM１５のアドレスが記憶される。プログラムカウンタ３１がクロックに同期してアドレスをFlash  ROM１５に出力すると、そのアドレスの命令が命令キュー３６に読み出される。
【００２１】
プログラムカウンタ３１は、１つの命令を読み出すことに、命令長の長さ（例えば、１６〜３２ビット）だけ、記憶しているアドレスの値を大きくして次の命令の読み出しに備える。また、演算ユニット３５の実行した命令が分岐命令であれば、演算ユニット３５が分岐先のアドレスをプログラムカウンタ３１にセットする。また、演算ユニット３５の実行した命令がサブルーチンの呼び出し命令であれば、演算ユニット３５はサブルーチンの呼び出し命令の次の命令をスタックに退避させ、サブルーチンの先頭アドレスをプログラムカウンタ３１にセットする。サブルーチンの処理が終了すると（リターン命令が実行されると）、演算ユニット３５がスタックのアドレスをプログラムカウンタ３１にセットする。
【００２２】
命令キュー３６は、ＦＩＦＯ（First  In,  First  Out）型の記憶手段で、複数の命令（例えば、５〜２０程度）を保持させておくことができる。例えば、同期クロックに連動して、命令キュー３６には実行順に命令が読み込まれる。また、例えば、分岐命令やサブルーチンの呼び出し命令が生じた場合、演算ユニット３５が命令キュー３６を初期化（フラッシュ）して、プログラムカウンタ３１が示すアドレスから順番に、命令キュー３６に分岐先の命令が読み込まれる。
【００２３】
演算ユニット３５がプログラムを終了すると、プログラムカウンタ３１に新たなアドレスがセットされなくなり、命令キュー３６の命令もゼロになる。本実施例では、命令キュー３６の命令がゼロの状態をＣＰＵアイドル状態として、アイドル検出回路３７は命令キュー３６の命令がゼロの状態をＩＮＴＣ１に通知する。
【００２４】
命令キュー３６に格納された命令は命令デコーダで解読され、不図示のレジスタファイルに記憶される。レジスタファイルには演算の種別、ソースオペランド（演算対象のデータのアドレス）等が記憶される。ソースオペランドが例えばレジスタセット３３、３４を指定すれば、演算ユニット３５はレジスタセット３３、３４からデータを読み出す。演算ユニット３５は、演算の種別に応じた演算をソースオペランドのデータに施す。図示するように、演算ユニット３５は、一般的なＡＬＵ（Arithmetic  Logic  Unit)３５ａの他、ＬＳＵ（Load  Store  Unit）３５ｂ、ＭＵＬ（Multiply）３５ｃ、ＤＩＶ（Divide）３５ｄ等の演算が可能になっている。演算結果は、不図示のレジスタファイルに記憶され、プログラムの指示に応じてしてＲＡＭ１７に書き込まれる。
【００２５】
ＤＭＡＣ１８は、入力Ｉ／Ｆ２４、タイマＡ１、タイマＡ２からＲＡＭ１７へ、不図示のＩ／ＯからＲＡＭ１７へ、又は、ＲＡＭ１７から不図示のＩ／Ｏへ、演算ユニット３５を介することなくデータを転送する。
【００２６】
また、ＩＮＴＣ２０は、タイマ１９に設定された値が経過するとＣＰＵに割り込みを生じさせる割り込みコントローラである。例えば、サイクル時間毎に処理したいプログラムがある場合、そのプログラムはタイマ１９にサイクル時間を設定してサブＣＰＵ１を停止する。ＩＮＴＣ２０はタイマ１９がゼロになるとタイマ１９に対応した割り込みベクタをサブＣＰＵ１に実行させる。割り込みベクタは指定されたプログラムのアドレスをプログラムカウンタ３１に設定するので、再度、サイクル時間毎に処理したいプログラムが実行される。
【００２７】
ＩＮＴＣ２２（以下、ＩＮＴＣ１という）は、タイマ２１（以下、単にタイマＢという）に設定された時間の間、命令キューの状況に応じてタイマ２３（以下、タイマＡ１という）に割り込みを生じさせる割り込みコントローラである。タイマＡ１は、後に詳述するように、タイマＢに設定された時間の間、命令キューの命令がゼロの時間を計測する。
【００２８】
なお、サブＣＰＵ２と接続されたＩＮＴＣ２６（以下、ＩＮＴＣ２という）とタイマ２５（以下、単にタイマＡ２という）の機能は、サブＣＰＵ１に接続されたＩＮＴＣ１と同じであるので説明を省略する。タイマＢをサブＣＰＵ１とは別に搭載してもよい。
【００２９】
センサ部１１は、１以上のセンサ１〜センサｎ及び入力I/F２４を有する。センサ１〜ｎは、例えば、回転速度センサ、アクセル開度センサ、及び、車内温度センサ等である。回転速度センサはクランクアングルセンサと呼ばれることもある。エンジン制御のタスクは、例えばアクセル開度センサが検出するアクセル開度によりエンジン回転数の維持・増加・減少を判断し、回転速度センサが検出する回転速度に基づき、燃料噴射量、燃料噴射タイミング、吸排気弁の開放タイミング、スロットル開度、イグナイタの点火タイミング等を演算する。
【００３０】
入力I/F２４は、センサ１〜センサｎのセンサ値を選択的に受け付けるインターフェイスである。入力I/F２４はセンサ１〜センサｎからの割り込みを受けて割り込みしたセンサからセンサ値を取得したり、又は、入力I/F２４から予め定められた順番でセンサ１〜ｎに接続する。入力I/F２４は、必要であればセンサ値をＡ／Ｄ変換した後、センサ１〜センサｎのセンサ値をバス１６に送出する。
【００３１】
また、入力I/F２４は、現在、バス１６を流れるセンサ値がどのセンサ１〜センサｎのものかを信号線２７によりホストＣＰＵ１２に通知する。こうすることで、ホストＣＰＵ１２はサブＣＰＵ１，２にセンサ値を取得すべきことを通知できる。
【００３２】
ホストＣＰＵ１２は、処理負荷を分散するため、各サブＣＰＵ１，２が実行しているタスクを把握している。各サブＣＰＵ１，２はバス１６上の全てのセンサ値を取得しうるが、各サブＣＰＵ１、２が全てのセンサ値を取得する必要はなく、サブＣＰＵ１，２は、自身が実行しているタスクに必要なセンサ値だけを取得できればよい。このため、ホストＣＰＵ１２は、バス１６に流れるセンサ値を取得すべきサブＣＰＵ１，２に対し取得するタイミングを指示するか、又は、現在、バス１６を流れるセンサ値の識別情報をサブＣＰＵ１，２に通知する。なお、サブＣＰＵ１，２が全てのセンサ値を取得してもよい。
【００３３】
図３を用いて、ホストＣＰＵ１２の機能について説明する。図３は、ホストＣＰＵ１２の機能ブロック図の一例を示す。ホストＣＰＵ１２は、Flash ROM１５に記憶されたＯＳ３０又はプログラムを実行することで実現される、負荷率算出制御部４１、負荷率算出部４２、負荷率比較部４３、負荷分散部４４及び処理状況登録部４５を有する。これらの機能の１以上をハード的に実装してもよい。
【００３４】
負荷率算出制御部４１は、ホストＣＰＵ１２による各サブＣＰＵ１，２の負荷率の算出を制御する。負荷率算出制御部４１は、主に、負荷率を算出するタイミングを制御する。負荷率算出部４２は負荷情報を用いて負荷率を算出する。負荷率比較部４３は、サブＣＰＵ１、２間の負荷率を比較して、タスクの割り当てを変更すべきか否か、変更すべき場合は負荷率を低減すべきサブＣＰＵ、負荷率を増大可能なサブＣＰＵを特定し、負荷分散部４４に通知する。
【００３５】
負荷分散部４４は、実行タスクテーブル４７を参照して、タスク１〜ｎをサブＣＰＵ１又はサブＣＰＵ２に割り当て、割り当て結果を処理状況登録部４５に通知する。実行タスクテーブル４７は、各サブＣＰＵ１、２が現在、実行しているタスクを登録したテーブル状のデータである。また、センサ対応テーブル４６は、タスクに必要なセンサ１〜センサｎをタスクに対応づけたテーブルである。図では、タスク１にはセンサ１のセンサ値が、タスク２にはセンサ２のセンサ値が、タスクｎにはセンサｎのセンサ値が、それぞれ必要であることが登録されている。
【００３６】
また、サブＣＰＵ１、２から見たタスクとは、例えばＣ言語の１つのメイン関数である。具体的なタスク１〜ｎの内容は多岐にわたる。これは、本実施例の情報処理装置１００が複数のＥＣＵを統合したものであるためである。上記の燃料噴射量等の決定以外では、タスク１〜ｎは、例えば、エンジン制御のための、エンジン回転数を決定する処理、吸気バルブの開放時間の決定処理、空燃比の決定処理、ブレーキ制御のための各輪のホイルシリンダ圧の決定、サスペンション制御ためのダンパー油圧の決定処理、エアコン制御のためのコンプレッサの冷媒吐出量やヒータコアによる加熱量等の決定処理、等である。
【００３７】
また、ハイブリッドＥＣＵが実行していたタスクであれば、タスク１〜ｎは、例えば、アクセル操作量、傾斜、車速等をパラメータとして運転モードを切り換える処理である。このタスクは、運転者が要求する駆動力の増加率や、一定時間内の駆動力の増加量（変化量）が所定値より大きい場合、モータ運転モードから、エンジン＋モータ運転モードに切り替えたる。また、運転者が要求する駆動力が低下すれば、エンジン＋モータ運転モードからモータ運転モードに切り替えたる。なお、センサ対応テーブル４６に、各タスクのおよその処理負荷を登録しておいてもよい。
【００３８】
なお、ホストＣＰＵ１２は、センサ対応テーブル４６を参照して、サブＣＰＵ１、２に取得すべきセンサ値又は取得すべきタイミングを指示する。
【００３９】
処理状況登録部４５は、情報処理装置１００の起動時（電源オン時）に初期の処理状況を実行タスクテーブル４７に登録し、その後、負荷分散部４４からの通知に基づき、実行タスクテーブル４７を更新する。
【００４０】
図４を用いて、負荷情報を算出するまでの手順を説明する。図４は、ＩＮＴＣ１がタイマＡ１を制御する手順を示すフローチャート図の一例である。
負荷率算出制御部４１は、各サブＣＰＵ１、２の負荷率を監視するため、定期的、又は、新たな車載装置の起動等を検出するとサブＣＰＵ１，２の負荷率を算出するタイミングになったと判定する（Ｓ１０のＹｅｓ）。
【００４１】
すると、負荷率算出制御部４１は、タイマＢをリセットすると共にスタートさせる（Ｓ２０）。負荷率算出制御部４１は予め定められた時間（例えば、数ミリ〜数十ミリ、数百ミリ秒）をタイマＢにセットする。
【００４２】
タイマＢはリセット及びスタートされるとＩＮＴＣ１に割り込みするので、ＩＮＴＣ１がタイマＡ１をリセットする（Ｓ３０）。すなわち、タイマＢのリセット・スタートとタイマＡ１のリセットはほぼ同時である。タイマＡ１には例えば「ゼロ」がセットされる。
【００４３】
アイドル検出回路３７は、命令キューに命令が１つもない状況になると、ＩＮＣＴ１と接続された信号線２８をＨｉｇｈ状態に保つ。アイドル検出回路３７は、命令キューに命令が読み込まれると、ＩＮＣＴ１と接続された信号線２８をＬｏｗ状態に保つ。すなわち、アイドル検出回路３７は、ホストＣＰＵ１がアイドル状態であることをＩＮＣＴ１に通知する。
【００４４】
このアイドル状態の時間を計測するため、タイマＢにセットされた値がゼロになるまで（Ｓ４０のＹｅｓ）、ＩＮＣＴ１は信号線２８の状態に応じてホストＣＰＵ１がアイドル状態か否かを判定する（Ｓ５０）。
【００４５】
ＩＮＣＴ１は、ホストＣＰＵ１がアイドル状態の場合（Ｓ５０のＹｅｓ）、タイマＡ１のカウントをスタートさせ（Ｓ６０）、ホストＣＰＵ１がアイドル状態でない場合（Ｓ５０のＮｏ）、タイマＡ１のカウントをストップさせる（Ｓ７０）。このように、タイマＡ１は、ホストＣＰＵ１がアイドル状態の時間を計測する。
【００４６】
タイマＢにセットされた値がゼロになると、タイマＢはＩＮＣＴ１に割り込みする。すなわち、ステップＳ４０に戻り、タイマＢにセットされた値がゼロになると（Ｓ４０のＮｏ）、ＩＮＣＴ１がタイマＡ１に割り込みして、タイマＡ１がそれまでにカウントした値をＲＡＭ１７に記憶させる（Ｓ８０）。この値が、上述した負荷情報である。
【００４７】
同様の処理を、サブＣＰＵ２も実行するので、ＲＡＭ１７には各サブＣＰＵ１，２の負荷情報が記憶されている。
【００４８】
図５を用いて、ホストＣＰＵ１２が負荷を分散する手順を説明する。図５は、ホストＣＰＵ１２が負荷を分散する手順を示すフローチャート図の一例である。
【００４９】
図３の負荷率算出制御部４１は、タイマＢにセットされた値がゼロになったことをタイマＢの割り込み等で検出し、所定クロック数待機した後、負荷率算出部４２に負荷率の算出を指示する。負荷率算出部４２は、ＲＡＭ１７から各サブＣＰＵ１、２の負荷情報を読み出す。
【００５０】
負荷率算出部４２は、タイマＢにセットされた値と負荷情報から負荷率を算出する（Ｓ１１０）。
負荷率＝（負荷情報／タイマＢにセットされた値）×１００〔％〕
したがって、負荷率が大きいサブＣＰＵ１、２ほど、処理負荷が大きいことが分かる。
【００５１】
負荷率比較部４３は、サブＣＰＵ１の負荷率１とサブＣＰＵ２の負荷率２を比較して、負荷率１と負荷率２の差が閾値以上か否かを判定する（Ｓ１２０）。
【００５２】
｜負荷率１−負荷率２｜≧閾値
負荷率１と負荷率２の差が閾値以上である場合（Ｓ１２０のＹｅｓ）、負荷率比較部４３は、負荷率の大きいサブＣＰＵ１又は２と、負荷率の小さいサブＣＰＵ２又は１を、負荷分散部４４に通知する（Ｓ１３０）。負荷率１と負荷率２の差が閾値以上でない場合（Ｓ１２０のＮｏ）、タスクの割り当てが変更されることなく図５の処理は終了する。
【００５３】
なお、サブＣＰＵが３以上ある場合、負荷率比較部４３は、最も大きい負荷率と最も小さい負荷率の差が閾値以上か否かを判定する。最も大きい負荷率と最も小さい負荷率の差が閾値以上である場合、負荷率比較部４３は、最も負荷率の大きいサブＣＰＵと、最も負荷率の小さいサブＣＰＵを、負荷分散部４４に通知する。したがって、サブＣＰＵが３以上ある場合も、負荷分散（タスクの割り当ての変更）を繰り返すことで、サブＣＰＵが２つの場合と同様に負荷を分散できる。以下では、説明のため、サブＣＰＵ１の負荷率１の方がサブＣＰＵ２の負荷率２よりも閾値以上大きいとする。
【００５４】
負荷分散部４４は、実行タスクテーブル４７を参照して、負荷率の大きいサブＣＰＵ１が実行しているタスクと、負荷率の小さいサブＣＰＵ２が実行しているタスクを特定する（Ｓ１４０）。例えば、図３では、サブＣＰＵ１が、タスク１、タスク２、タスク３及びタスク４を、サブＣＰＵ２がタスク５及びタスク６を実行している。
【００５５】
本実施例では、サブＣＰＵ１、２はＳＭＰであるとしたので、サブＣＰＵ１がタスク１〜タスク６のどのタスクを実行してもよいし、サブＣＰＵ２がタスク１〜タスク６のどのタスクを実行してもよい。したがって、負荷分散部４４は、例えば、サブＣＰＵ１が実行しているタスク１〜タスク６のうち、命令キューに入っていないタスクを、サブＣＰＵ２割り当てると決定する。命令キューに入っていないタスクの割り当て先のサブＣＰＵ１、２を変更することで、割り当ての変更によるオーバーヘッドを小さくできる。なお、タスク１〜４が、命令キューに入っているか否かは、負荷分散部４４がサブＣＰＵ１に問い合わせることで取得する。
【００５６】
また、負荷分散部４４は、サブＣＰＵ１が実行しているタスクの内、最も大きい処理負荷のタスクをサブＣＰＵ２に割り当てると決定してもよい。こうすることで、サブＣＰＵ１とサブＣＰＵ２の負荷率の差を大きく改善できる。タスク毎の処理負荷は、センサ対応テーブル４６に登録されているものとする。
【００５７】
負荷分散部４４は、サブＣＰＵ１からサブＣＰＵ２に割り当てを変更するタスクを処理状況登録部４５に通知する（Ｓ１５０）。処理状況登録部４５は、実行タスクテーブル４７において、サブＣＰＵ１に対応づけられているタスクのうち、サブＣＰＵ２に割り当てを変更されるタスクを消去し、消去したタスクをサブＣＰＵ２に対応付けて実行タスクテーブル４７に登録する（Ｓ１６０）。
【００５８】
また、負荷分散部４４は、サブＣＰＵ１に割り当てられていたタスクをサブＣＰＵ２に割り当てる（Ｓ１７０）。負荷分散部４４は、例えば割り当て終了命令とタスク番号をサブＣＰＵ１に通知することで、サブＣＰＵ１に割り当てられていたタスクの終了をサブＣＰＵ１に命令する。これにより、サブＣＰＵ１は終了されたタスクを実行しないようになる。
【００５９】
また、負荷分散部４４は、例えば割り当て命令とタスク番号をサブＣＰＵ２の命令キューに格納することで、サブＣＰＵ２に新たにタスクを割り当てる。また、負荷分散部４４は割り当てるタスクの先頭アドレスをサブＣＰＵ２のプログラムカウンタ３１に設定する。こうすることで、サブＣＰＵ２は新たなタスクの実行を開始できる。
【００６０】
なお、サブＣＰＵ２が既に別のタスクを実行している場合もあるので、負荷分散部４４は、プログラムカウンタ３１に割り当てるタスクの先頭アドレスを設定するタイミングを調整する。例えば、サブＣＰＵ２の命令キューに命令が１つも登録されていない場合、負荷分散部４４は割り当てるタスクの先頭アドレスをサブＣＰＵ２のプログラムカウンタ３１に設定する。命令キューに命令が１つも登録されていないことは、アイドル検出回路３７からの信号を取得することで検出できる。
【００６１】
また、負荷分散部４４は、サブＣＰＵ２の命令キューの最後に、割り当てられたタスクの先頭アドレスをサブＣＰＵ２のバッファ等に格納させる命令を挿入してもよい。この場合、サブＣＰＵ２は、割り当て命令と先頭アドレスから、既に実行しているタスクの終了時に割り当てられたタスクを開始することができる。
【００６２】
また、サブＣＰＵ２の命令キューにおける命令の有無に関係なく、サブＣＰＵ２が新たに割り当てられたタスクを実行するタイミングで、負荷分散部４４が該タスクの先頭アドレスをサブＣＰＵ２のプログラムカウンタ３１に設定してもよい。実行するタイミングとは、例えば、サブＣＰＵ２が実行するタスクが使用するセンサ値が、入力I/F２４からバス１６に出力されたタイミングである。
【００６３】
また、例えば、各サブＣＰＵ１、２に処理対象のタスクとタスクの先頭アドレスが登録されたテーブルを持たせ、該テーブルに、負荷分散部４４が、新たなタスクとそのタスクの先頭アドレスを登録してもよい。この場合、タスクを割り当てた後、ホストＣＰＵ１２は、入力I/F２４がセンサ１〜ｎのいずれのセンサ値をバス１６に出力したかに応じて、該センサのセンサ値を使用するタスクを実行するサブＣＰＵ２に該タスクの実行を指示する。サブＣＰＵ２は、センサ値をレジスタセットに取得し、タスクの先頭アドレスをプログラムカウンタにセットすることで、センサ値に対する処理を開始する。
【００６４】
タスクの割り当ての変更により、サブＣＰＵ１，２の処理負荷を分散することができた。サブＣＰＵ１，２の処理負荷を動的に分散するので、起動している車載装置など車両の状況に応じて常に処理負荷を分散できる。
【００６５】
以上のように、本実施例の情報処理装置１００は、各サブＣＰＵ１、２の負荷率を比較して、各サブＣＰＵ１、２へのタスクの割り当てを変更することで、情報処理装置１００の各サブＣＰＵ１、２の処理負荷を分散させることができる。処理負荷を分散できれば、ＣＰＵリソースを最大限に活用することもできる。また、サブＣＰＵ１、２の能力を大きめ見積もって設計する必要もないので、情報処理装置１００の仕様を最適化でき、コストを低減することができる。また、サブＣＰＵ１，２の処理負荷を動的に算出するので、サブＣＰＵ１，２の処理負荷を事前に算出しておく等の工程を省略できる。
【実施例２】
【００６６】
本実施例では、実施例１の情報処理装置１００のように、動的に算出されたサブＣＰＵ１、２の処理負荷に加え、さらに、センサ値からサブＣＰＵ１、２の負荷率を予測して、サブＣＰＵ１、２の処理負荷を分散させる情報処理装置１００について説明する。
【００６７】
図６は、本実施例の情報処理装置１００によるサブＣＰＵ１，２の負荷率の予測を模式的に説明する図の一例である。情報処理装置１００は、各種のセンサ１〜センサｎが検出するセンサ値に演算を施し、アクチュエータ等の制御量を決定する。演算のタイミングは、エンジンの回転数などのセンサ値が大きいほど早まる傾向にあるので（エンジンでは１回転毎に処理すべきタスクが複数ある）、サブＣＰＵ１、２の負荷率も大きくなる。したがって、センサ値が大きくなる傾向では、近い将来のサブＣＰＵ１、２の負荷率が増大すると予測できる。逆に、センサ値が小さくなる傾向では、近い将来のサブＣＰＵ１、２の負荷率が減少すると予測できる。
【００６８】
情報処理装置１００は、このようにサブＣＰＵ１，２の負荷率を予測して、負荷率が減少傾向にあるサブＣＰＵ１，２に、負荷率が増大傾向にあるサブＣＰＵ１，２のタスクを割り当てる。現在の処理負荷ではなくサブＣＰＵ１，２の将来の負荷率に基づき負荷分散するので、タスクの割り当てにより生じるタイムラグを低減して、負荷分散が可能になる。
【００６９】
図７は、本実施例の情報処理装置１００の概略構成図の一例を示す。図７において図２と同一部には同一の符号を付しその説明は省略する。図７の情報処理装置１００は、微分値算出回路３８を有する。微分値算出回路３８は、センサ値の微分値Ｂを算出する。なお、実施例１と同様、センサ値もバス１６に送出される。ホストＣＰＵ１２は、センサ値の微分値Ｂを取得して、所定時間先の未来のサブＣＰＵ１、２の負荷率を予測する。
【００７０】
〔微分値Ｂ〕
図８は、センサ値とその微分値Ｂを模式的に説明する図の一例である。図８では、センサ１〜センサｎのいずれかのセンサ値が時系列に登録されている。センサ値は時間軸の中央付近でピークを示している。したがって、このセンサのセンサ値を使用するサブＣＰＵ１、２は、センサ値がピークの頃に負荷率が最も高いと考えられる。換言すれば、時間Ｔ１のセンサ値の傾きから所定時間先では負荷率が増大することが、時間Ｔ２のセンサ値の傾きから所定時間先では負荷率が減少することが予測できる。
【００７１】
微分値Ｂを算出することは、センサ値の傾きを算出することと同義なので、微分値Ｂは、例えば、一定時間内のセンサ値の差分を取ることで算出できる。微分値Ｂは例えば以下のようにして算出される。次式において、「Ｄ(t)」は時刻ｔのセンサ値を、「ｔ」は時刻を、「Ｎ」はサンプル数を、それぞれ表す。
Ｂ＝Σ（Ｄ(t)−D(t-1)）／Ｎ  …（１）
「ｔ-（ｔ-1）」はセンサ値のサンプリング時間であるので、「Ｄ(t)-D(t-1)」は、サンプリング時間におけるセンサ値の変化量である。したがって、「Σ（Ｄ(t)-D(t-1)）」は、センサ値の変化量をいくつか合計したものである。センサ値が一様な増大傾向又一様な減少傾向になければ、「Σ（Ｄ(t)-D(t-1)）」はほぼゼロになる。センサ値が一様な増大傾向又一様な減少傾向にあれば、「Σ（Ｄ(t)-D(t-1)）」は比較的大きな正値又は負値となる。「Ｎ」は例えば３〜１０程度であり、小さすぎないように定めることでノイズ等による瞬間的な変動を排除でき、大きすぎないように定めることでセンサ値の増大傾向と減少傾向の時間を両方含めず感度のよい微分値Ｂを算出できる。
【００７２】
なお、図８では、センサ値が大きければ負荷率も大きいという前提で説明したが、センサ値が小さいほど負荷率が大きくなるセンサ値もある。この場合の典型的なセンサ値は、負値を取るセンサであり、センサ値が負値であってもセンサ値の絶対値が大きいほど負荷率が大きくなることがある。このような場合は、式（１）で絶対値を採用すればよい。
【００７３】
また、センサ値の絶対値が小さいほど負荷率が大きくなるセンサ値がある場合、予めホストＣＰＵ１２に当該センサの識別情報を登録しておき、センサ毎に適切な方法で微分値Ｂを算出する。
【００７４】
なお、センサ値の微分値Ｂは、ホストＣＰＵ１２のＯＳ３０又はプログラムが算出することもできる。
【００７５】
〔負荷率の予測〕
図９は、本実施例のホストＣＰＵ１２の機能ブロック図の一例を示す。図９において図３と同一部には同一の符号を付しその説明は省略する。図９のホストＣＰＵ１２は、負荷率予測部４８を有する。負荷率予測部４８は、実行タスクテーブル４７とセンサ対応テーブル４６を参照して、サブＣＰＵ１、２毎に、所定時間未来の予測負荷率Ｙを予測する。
【００７６】
図１０は、負荷率の予測を模式的に説明する図の一例である。図１０では、時間軸（右に行くほど未来を表す）に対しサブＣＰＵ１、２の負荷率算出タイミングと、タスク割り当てタイミングが図示されている。サブＣＰＵ１、２の負荷率算出タイミングに対し、負荷分散部４４がタスクを割り当てるまではタイムラグが生じてしまう。このタイムラグのため、タスク割り当てタイミングのサブＣＰＵ１，２の負荷率が、負荷率算出タイミングの負荷率とは異なっている可能性が生じてしまう。したがって、負荷率予測部４８が、タイムラグ程度の時間だけ先のサブＣＰＵ１、２の負荷率を予測できれば、タスク割り当てタイミングの負荷率を予測できることになる。
【００７７】
ところで、サブＣＰＵ１、２の負荷率がセンサ値及び微分値Ｂと相関するのは、サブＣＰＵ１、２がセンサ値を用いて処理する場合である。したがって、センサ値の微分値Ｂを用いた負荷率の予測の際、負荷率予測部４８は実行タスクテーブル４７とセンサ対応テーブル４６を参照する必要がある。図９の実行タスクテーブル４７では、サブＣＰＵ１がタスク１を実行している。また、センサ対応テーブル４６によれば、タスク１ではセンサ１のセンサ値が必要になる。したがって、負荷率予測部４８がサブＣＰＵ１の負荷率を予測する際は、センサ１のセンサ値の微分値Ｂを用いる。
【００７８】
負荷率予測部４８は、タスク割り当てタイミングのサブＣＰＵ１の予測負荷率Ｙを例えば次式から予測する。次式において、「Ｂ」は、負荷率算出タイミングのセンサ１の微分値Ｂである（厳密には、負荷率と次元を合わせ、センサ値を負荷率に変換するための係数も含まれている）。「ｃ」は、負荷率算出タイミングのサブＣＰＵ１の負荷率である。「ｘ」はタイムラグを表し、負荷分散部４４が負荷率算出タイミングからタスクを割り当てるまでの時間を表す。この時間は、情報処理装置１００の仕様等に応じて変わるものであり、例えば数マイクロ秒から数ミリ秒とすることができる。また、「ｘ」をタスク毎に可変としたり、タスク割り当てタイミングを予測して決定してもよい。
Ｙ＝Ｂｘ＋ｃ  …（２）
図１１は、負荷率予測部４８が、各サブＣＰＵ１、２の予測負荷率Ｙを算出する手順を示すフローチャート図の一例を示す。
【００７９】
予測負荷率Ｙの算出には、負荷率算出タイミングの負荷率が必要なので、まず、図４のフローチャート図で説明したように、ＩＮＴＣ１がタイマＡ１を制御し、負荷率算出部４２が各サブＣＰＵ１、２の負荷率を算出する（Ｓ２１０）。
【００８０】
この負荷率の算出の間にタイマＢにセットされた時間が経過していることになるので、レジスタセット３３、３４又はＲＡＭ１７には各センサ毎に１つ以上の微分値Ｂが記憶されているとしてよい。
【００８１】
負荷率予測部４８は、各センサの微分値Ｂをレジスタセット３３、３４又はＲＡＭ１７から読み出す（Ｓ２２０）。なお、１つのセンサの微分値Ｂが複数個、ＲＡＭ１７に記憶されている場合は最新の微分値Ｂを読み出す。
【００８２】
負荷率予測部４８は、実行タスクテーブル４７を参照して、各サブＣＰＵ１、２が実行しているタスクを特定する（Ｓ２３０）。これにより、サブＣＰＵ１はタスク１〜４を、サブＣＰＵ２はタスク５，６を実行していることが特定される。
【００８３】
負荷率予測部４８は、センサ対応テーブル４６を参照して、タスク毎に、必要なセンサ値を特定する（Ｓ２４０）。例えば、タスク１にセンサ１のセンサ値が、タスク２にセンサ２のセンサ値が、タスク３にセンサ３のセンサ値が、タスク４にセンサ４のセンサ値が、タスク５にセンサ５のセンサ値が、タスク６にセンサ６のセンサ値が、必要であるとする。
【００８４】
負荷率予測部４８は、サブＣＰＵ１、２毎に、実行しているタスクに必要なセンサ値の微分値Ｂを用いて、予測負荷率Ｙを算出する（Ｓ２５０）。
例えば、サブＣＰＵ１の予測負荷率Ｙ１は以下により算出される。ただし、「ｃ１」は、負荷率算出タイミングのサブＣＰＵ１の負荷率、「ｃ２」は、負荷率算出タイミングのサブＣＰＵ２の負荷率である。「Ｂｉ（i＝１〜６）」は、センサ１〜６のセンサ値の微分値である。
Ｙ１＝Ｂ１ｘ＋ｃ１＋Ｂ２ｘ＋ｃ１＋Ｂ３ｘ＋ｃ１＋Ｂ４ｘ＋ｃ１  
また、サブＣＰＵ２の予測負荷率Ｙ２は以下により算出される。
Ｙ２＝Ｂ５ｘ＋ｃ２＋Ｂ６ｘ＋ｃ２  
以上のように、負荷率予測部４８は、各サブＣＰＵ１、２の予測負荷率Ｙを算出することができる。
【００８５】
＜予測負荷率の算出の変形例＞
また、変形例として、負荷率予測部４８がセンサ対応テーブル４６を参照しないで、サブＣＰＵ１、２の予測負荷率を算出する方法について説明する。
【００８６】
図１２は、本実施例のホストＣＰＵ１２の機能ブロック図の一例を示す。図１２において図９と同一部には同一の符号を付しその説明は省略する。図１２のホストＣＰＵ１２は、センサ対応テーブル４６を有していない。
【００８７】
図１２では、Flash  ROM１５のタスク１〜ｎから成るプログラムが図示されている。各タスク１〜ｎは、タスクを識別するための制御タグが記述されている。制御タグは、所定ビット数（例えば、１６、３２，６４等）のビット列である。制御タグは、Flash ROM１５の各タスクの例えば先頭アドレスに記述されており、ホストＣＰＵ１２が制御タグを参照することで、タスク１〜ｎを識別できるようになっている。
【００８８】
プログラム（タスク）に制御タグを記述しておくことで、負荷率予測部４８は、各タスクの処理の内容を検出できる。
図１３は、制御タグをさらに詳細に説明する図の一例である。制御タグに対応づけて、ビット列がＢｉｔ（ｎ）〜Ｂｉｔ（０）まで登録されている。したがって、制御タグは２n+1個のタスクを識別できる。
【００８９】
Ｂｉｔ（ｎ）〜Ｂｉｔ（０）には、タスクの制御内容に応じて「１」又は「０」が登録されている。例えば、図ではＢｉｔ（０）はエンジン制御に使用されるタスクの制御タグでは「ＯＮ＝１」になり、Ｂｉｔ（１）はエアコン制御に使用されるタスクの制御タグでは「ＯＮ＝１」になる。したがって、制御タグ１が付与されたタスク１は、エンジン制御のタスクなので、エンジン制御に必要なセンサ値を必要とすることが分かる。
【００９０】
負荷率予測部４８には、予め、Ｂｉｔ（ｎ）〜Ｂｉｔ（０）とセンサ値（微分値）の対応が登録されている。例えば、エンジン回転数センサの微分値ＢはＢｉｔ（０）と、室温センサの微分値ＢはＢｉｔ（１）と、対応づけられている。こうすることで、例えば、制御タグ１が付与されたタスク１はエンジン制御に使用されるので、エンジン回転数センサの微分値ＢをＢｉｔ（０）＝「１」に乗じることができ、室温センサの微分値ＢをＢｉｔ（１）＝「０」に乗じることができる。このように、Ｂｉｔ（ｎ）〜（０）に「１」又は「０」とすることで、各タスクの負荷率に影響のあるセンサ値の微分値Ｂだけを予測負荷率Ｙの算出に取り込むことができる。
【００９１】
したがって、負荷率予測部４８は、上記（１）式と同様にサブＣＰＵ１、２の予測負荷率Ｙを算出することができる。図１１の実行タスクテーブル４７では、サブＣＰＵ１がタスク１を実行している。負荷率予測部４８は、タスク１の制御タグを取得し、各センサ１〜ｎの微分値Ｂを機械的に制御タグのＢｉｔ（ｎ）〜（０）と乗じることで、タスク１に必要なセンサ１〜ｎの微分値Ｂを取捨できる。
【００９２】
このように、負荷率予測部４８は実行タスクテーブル４７と制御タグから、各サブＣＰＵ１、２のタスク割り当てタイミングの予測負荷率Ｙを算出することができる。
【００９３】
図１４は、本変形例において、負荷率予測部４８が、各サブＣＰＵ１、２の予測負荷率Ｙを算出する手順を示すフローチャート図の一例を示す。図１４のステップＳ２３０までの処理は図１１と同様である。
【００９４】
ステップＳ２３０までの処理により、負荷率予測部４８は、実行タスクテーブル４７を参照して、各サブＣＰＵ１、２が実行しているタスクを特定する（Ｓ２３０）。これにより、サブＣＰＵ１はタスク１〜４を、サブＣＰＵ２はタスク５，６を実行していることが特定される。
【００９５】
負荷率予測部４８は、各タスクの制御タグをFlash ROM１５から読み出す（Ｓ３１０）。制御タグは一度、ホストＣＰＵ１２で取得しておけば、以降はホストＣＰＵ１２に記憶しておくことができる。
【００９６】
負荷率予測部４８は、制御タグのＢｉｔ（ｎ）〜（０）を予め決められた対応にしたがい各センサの微分値Ｂに乗じて、微分値Ｂを取捨する（Ｓ３２０）。
【００９７】
以降の処理は図１１と同様であり、負荷率予測部４８は、サブＣＰＵ１、２毎に、実行しているタスクに必要なセンサ値の微分値Ｂを用いて、予測負荷率Ｙを算出する（Ｓ２５０）。
例えば、サブＣＰＵ１の予測負荷率Ｙ１は以下により算出される。
Ｙ１＝Ｂ１ｘ＋ｃ１＋Ｂ２ｘ＋ｃ１＋Ｂ３ｘ＋ｃ１＋Ｂ４ｘ＋ｃ１  
また、サブＣＰＵ２の予測負荷率Ｙ２は以下により算出される。
Ｙ２＝Ｂ５ｘ＋ｃ２＋Ｂ６ｘ＋ｃ２  
この変形を含めて、負荷率予測部４８がサブＣＰＵ１の負荷率を予測する際は、センサ１のセンサ値の微分値Ｂを用いればよいことが分かる。
【００９８】
なお、既存のソフトウェアで制御タグが埋め込まれていないプログラムでは、負荷率予測部４８は、制御タグのＢｉｔ（ｎ）〜Ｂｉｔ（０）を全て「ＯＦＦ＝０」として予測負荷率Ｙを算出する。予測精度は劣化するが、既存のソフトウェアと制御タグが含まれるソフトウェアが混在していても不具合を生じないようにできる。
【００９９】
＜センサ値が複数ある場合の予測について＞
図１１又は図１４のステップＳ２５０のように、各センサに起因する予測負荷率Ｙを線形加算することで、あるセンサの微分値Ｂが正値で、あるセンサの微分値Ｂが負値の場合のように、センサ毎に負荷率の増減の傾向が一致しない場合でも、負荷率予測部４８は、各サブＣＰＵ１、２の全体の傾向を把握することが可能になる。
【０１００】
逆に、各サブＣＰＵ１、２の大多数の微分値Ｂが正値又は負値になれば、各サブＣＰＵ１、２の負荷率の傾向を増幅して把握することが可能になる。
【０１０１】
予測負荷率Ｙを線形加算するのでなく、各サブＣＰＵ１、２で処理するセンサ値の微分値Ｂの平均を算出してから、予測負荷率Ｙを算出しても同様の効果を得られる。この場合、予測負荷率Ｙは、例えば次式から算出される。
Ｙ１＝（Ｂ１〜Ｂ４の平均）・ｘ＋ｃ１  
Ｙ２＝（Ｂ５、Ｂ６の平均）・ｘ＋ｃ２
また、予測負荷率Ｙの算出に、全てのセンサ値の微分値Ｂを考慮するのでなく代表値を用いて予測負荷率Ｙを算出してもよい。代表値は、例えば、中央値、最大値、又は、最小値である。中央値を採用した場合、予測負荷率Ｙは次式から算出される。
Ｙ１＝（Ｂ１〜Ｂ４の中央値）・ｘ＋ｃ１  
Ｙ２＝（Ｂ５又はＢ６）・ｘ＋ｃ２
微分値Ｂの中央値に基づき予測負荷率Ｙを算出することで、各サブＣＰＵ１、２の負荷率の代表的な傾向を把握することが可能になる。
【０１０２】
最大値又は最小値を採用した場合、予測負荷率Ｙは次式から算出される。
Ｙ１＝（Ｂ１〜Ｂ４の最大値又は最小値）・ｘ＋ｃ１  
Ｙ２＝（Ｂ５又はＢ６）・ｘ＋ｃ２
微分値Ｂの最大値に基づき予測負荷率Ｙを算出することで、各サブＣＰＵ１、２の負荷率の傾向が大きくなるものと予測しやすくなり、タスクの割り当ての変更を行いやすくなる。微分値Ｂの最小値に基づき予測負荷率Ｙを算出することで、各サブＣＰＵ１、２の負荷率の傾向が小さくなるものと予測しやすくなり、タスクの割り当ての変更を行いにくくなる。
【０１０３】
〔予測負荷率Ｙに基づく負荷分散〕
予測負荷率Ｙに基づく負荷分散について説明する。負荷分散の方法は、予測負荷率Ｙの算出方法に影響されないので、図９又は図１２のどちらのホストＣＰＵ１２の機能ブロック図を用いてもよい。
【０１０４】
図１５は、ホストＣＰＵ１２が負荷を分散する手順を示すフローチャート図の一例である。図１５のフローチャート図は、図１１又は図１４の予測負荷率Ｙの算出後に実行される。
【０１０５】
負荷率比較部４３は、サブＣＰＵ１の予測負荷率Ｙ１とサブＣＰＵ２の予測負荷率Ｙ２を比較して、予測負荷率Ｙ１と予測負荷率Ｙ２の差が閾値以上か否かを判定する（Ｓ４１０）。
【０１０６】
｜予測負荷率Ｙ１−予測負荷率Ｙ２｜  ≧  閾値
予測負荷率Ｙ１と予測負荷率Ｙ２の差が閾値以上である場合（Ｓ４１０のＹｅｓ）、負荷率比較部４３は、予測負荷率Ｙ１の大きい例えばサブＣＰＵ１と、予測負荷率Ｙ２の小さい例えばサブＣＰＵ２を、負荷分散部４４に通知する（Ｓ４２０）。予測負荷率Ｙ１と予測負荷率Ｙ２の差が閾値以上でない場合（Ｓ４１０のＮｏ）、タスクの割り当てが変更されることなく図１５の処理は終了する。
【０１０７】
なお、サブＣＰＵが３以上ある場合、負荷率比較部４３は、最も大きい予測負荷率Ｙと最も小さい予測負荷率Ｙの差が閾値以上か否かを判定する。最も大きい予測負荷率Ｙと最も小さい予測負荷率Ｙの差が閾値以上である場合、負荷率比較部４３は、最も予測負荷率Ｙの大きいサブＣＰＵと、最も予測負荷率Ｙの小さいサブＣＰＵを、負荷分散部４４に通知する。したがって、サブＣＰＵが３以上ある場合も、負荷分散（タスクの割り当ての変更）を繰り返すことで、サブＣＰＵが２つの場合と同様に負荷を分散できる。以下では、説明のため、サブＣＰＵ１の予測負荷率Ｙ１の方がサブＣＰＵ２の予測負荷率Ｙ２よりも閾値以上大きいとする。
【０１０８】
負荷分散部４４は、実行タスクテーブル４７を参照して、予測負荷率Ｙ１の大きいサブＣＰＵ１が実行しているタスクと、予測負荷率Ｙ２の小さいサブＣＰＵ２が実行しているタスクを特定する（Ｓ４３０）。例えば、図９又は図１２では、サブＣＰＵ１が、タスク１、タスク２、タスク３及びタスク４を、サブＣＰＵ２がタスク５及びタスク６を実行している。
【０１０９】
本実施例では、サブＣＰＵ１、２はＳＭＰであるとしたので、サブＣＰＵ１がタスク１〜タスク６のどのタスクを実行してもよいし、サブＣＰＵ２がタスク１〜タスク６のどのタスクを実行してもよい。したがって、負荷分散部４４は、例えば、サブＣＰＵ１が実行しているタスク１〜タスク６のうち、命令キューに入っていないタスクを、サブＣＰＵ２割り当てると決定する。命令キューに入っていないタスクの割り当て先のサブＣＰＵを変更することで、割り当ての変更によるオーバーヘッドを小さくできる。なお、タスク１〜４が、命令キューに入っているか否かは、負荷分散部４４がサブＣＰＵ１に問い合わせることで取得する。
【０１１０】
また、負荷分散部４４は、サブＣＰＵ１が実行しているタスクの内、最も大きい処理負荷のタスクをサブＣＰＵ２に割り当てると決定してもよい。こうすることで、サブＣＰＵ１とサブＣＰＵ２の負荷率の差を大きく改善できる。タスク毎の処理負荷は、センサ対応テーブル４６又は制御タグに登録されているものとする。
【０１１１】
負荷分散部４４は、サブＣＰＵ１からサブＣＰＵ２に割り当てを変更するタスクを処理状況登録部４６に通知する（Ｓ４４０）。処理状況登録部４６は、実行タスクテーブル４７において、サブＣＰＵ１に対応づけられているタスクのうち、サブＣＰＵ２に割り当てを変更されるタスクを消去し、消去したタスクをサブＣＰＵ２に対応付けて実行タスクテーブル４７に登録する（Ｓ４５０）。
【０１１２】
また、負荷分散部４４は、サブＣＰＵ１に割り当てられていたタスクをサブＣＰＵ２に割り当てる（Ｓ４６０）。割り当ての方法は、実施例１で説明した場合と同様であるが、タイムラグに相当する時間「ｘ」が経過した頃に、サブＣＰＵ２がタスクを実行できるように、負荷分散部４４はタスクを割り当てる。
【０１１３】
本実施例では、サブＣＰＵ１，２のタスク割り当てタイミングにおける予測負荷率Ｙに基づき負荷を分散させるので、負荷率の算出からタスクの割の変更までにタイムラグがあっても、タスク割り当てタイミングの処理負荷がサブＣＰＵ１、２間で分散されるようにすることができる。
【０１１４】
以上説明したように、本実施形態の情報処理装置１００は、各サブＣＰＵ１、２の負荷率に基づき各サブＣＰＵ１、２の処理負荷を分散することができる。また、タスク割り当てタイミングにおける各サブＣＰＵ１、２の予測負荷率Ｙに基づき、各サブＣＰＵ１、２の処理負荷を分散することができる。
【符号の説明】
【０１１５】
１１：センサ部、  １２：ホストＣＰＵ、  １３、１４：サブＣＰＵ
１５：Flash ROM   ３１：プログラムカウンタ    ３６：命令キュー
３７：アイドル検出回路    ３８：微分値算出回路  ４１：負荷率算出制御部
４２：負荷率算出部        ４３：負荷率比較部    ４４：負荷分散部
４５：処理状況登録部      ４６：センサ対応テーブル
４７：実行タスクテーブル  ４８：負荷率予測部
【図１】
2011141782.tif 000003
【図２】
2011141782.tif 000004
【図３】
2011141782.tif 000005
【図４】
2011141782.tif 000006
【図５】
2011141782.tif 000007
【図６】
2011141782.tif 000008
【図７】
2011141782.tif 000009
【図８】
2011141782.tif 000010
【図９】
2011141782.tif 000011
【図１０】
2011141782.tif 000012
【図１１】
2011141782.tif 000013
【図１２】
2011141782.tif 000014
【図１３】
2011141782.tif 000015
【図１４】
2011141782.tif 000016
【図１５】
2011141782.tif 000017