(57)【要約】【課題】同期処理を行う複数のコアの一方が、同期待ちの時間を抑制して非同期処理を実行可能なマルチプロセッサを提供すること。【解決手段】依存関係のあるプログラムを並列に処理する複数のプロセッサ２１と、他のプロセッサが行った処理結果に同期処理を施す同期処理手段３６と、プロセッサ毎にプロセッサの現在の実行プログラムアドレス値を保持するＰＣ３７と、他のプロセッサの現在ＰＣ値を読み出す読み出し手段３３と、他のプロセッサが同期処理を開始するアドレス位置を記憶するアドレス位置記憶手段３５と、現在ＰＣ値とアドレス位置とに基づいて他のプロセッサの同期処理開始までの進捗情報を算出する進捗情報算出手段３４と、進捗情報に基づき他のプロセッサが同期処理を開始する前に自プロセッサが非同期処理を実行可能であると判定した場合に、非同期処理を実行する非同期処理手段３８と、を有するマルチプロセッサ１１を提供する。【選択図】図３
2014191655.tif 000002
【特許請求の範囲】
【請求項１】
依存関係のあるプログラムを並列に処理する複数のプロセッサと、
他のプロセッサが行った処理結果に同期処理を施す同期処理手段と、
プロセッサ毎にプロセッサの現在の実行プログラムアドレス値を保持するプログラムカウンタと、
他のプロセッサの現在の実行プログラムアドレス値を読み出す読み出し手段と、
他のプロセッサが同期処理を開始するアドレス位置を記憶するアドレス位置記憶手段と、
前記読み出し手段が読み出した実行プログラムアドレス値と、前記アドレス位置記憶手段に記憶された前記アドレス位置とに基づいて他のプロセッサの同期処理開始までの進捗情報を算出する進捗情報算出手段と、
前記進捗情報に基づき他のプロセッサが同期処理を開始する前に自プロセッサが非同期処理を実行可能であると判定した場合に、非同期処理を実行する非同期処理手段と、
を有することを特徴とするマルチプロセッサ。
【請求項２】
前記読み出し手段が読み出した実行プログラムアドレス値と、前記アドレス位置記憶手段に記憶された前記アドレス位置との差分に基づいて、自プロセッサが処理する予定の非同期処理のプログラムサイズを算出するプログラムサイズ算出手段と、
前記プログラムサイズ算出手段が算出したプログラムサイズに応じて非同期処理手段が実行する非同期処理を決定する非同期処理決定手段と、
を有することを特徴とする請求項１記載のマルチプロセッサ。
【請求項３】
前記非同期処理決定手段は、処理時間が前記差分以下の非同期処理のうち、最も処理時間が大きい非同期処理を非同期処理手段が実行する非同期処理に決定する、
ことを特徴とする請求項２記載のマルチプロセッサ。
【請求項４】
依存関係のあるプログラムを並列に処理する複数のプロセッサが共通に提供する機能毎に前記同期処理手段を有し、
前記アドレス位置記憶手段は、機能毎に異なる前記アドレス位置を記憶しており、
前記進捗情報算出手段は、前記同期処理手段が同期処理を終了させ機能が切り替わる毎に、前記アドレス位置記憶手段から切り替えて読み出した前記アドレス位置と、前記読み出し手段が読み出した実行プログラムアドレス値とに基づいて他のプロセッサの同期処理開始までの進捗情報を算出する、
ことを特徴とする請求項１〜３いずれか１項記載のマルチプロセッサ。
【請求項５】
依存関係のあるプログラムを実行する他のプロセッサが複数ある場合、
前記進捗情報算出手段は、全ての前記他のプロセッサから前記読み出し手段が読み出した実行プログラムアドレス値と、前記アドレス位置記憶手段に記憶された前記アドレス位置とに基づいて他のプロセッサの同期処理開始までの前記進捗情報を算出し、
前記進捗情報に基づき全ての前記他のプロセッサのうち１つでも同期処理を開始する前に、自プロセッサが非同期処理を実行可能である場合、非同期処理手段が非同期処理を実行する、
ことを特徴とする請求項１〜４いずれか１項記載のマルチプロセッサ。
【請求項６】
前記非同期処理は自己診断処理である、ことを特徴とする請求項１〜５いずれか１項記載のマルチプロセッサ。
【請求項７】
請求項１〜６いずれか１項記載のマルチプロセッサを搭載した車両用の電子制御ユニット。
【請求項８】
依存関係のあるプログラムを並列に処理する複数のプロセッサのうちの少なくとも１つのプロセッサに、
他のプロセッサが有する、プロセッサの現在の実行プログラムアドレス値を保持するプログラムカウンタから現在の実行プログラムアドレス値を読み出す読み出しステップと、
前記読み出しステップで読み出された実行プログラムアドレス値と、他のプロセッサが同期処理を開始するアドレス位置を記憶するアドレス位置記憶手段に記憶された前記アドレス位置とに基づいて他のプロセッサの同期処理開始までの進捗情報を算出する進捗情報算出ステップと、
前記進捗情報に基づき他のプロセッサが同期処理を開始する前に自プロセッサが非同期処理を実行可能であると判定した場合に、非同期処理を実行する非同期処理ステップと、
自プロセッサが非同期処理を実行可能でないと判定した場合に、同期処理を実行する同期処理ステップと、
を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
依存関係のあるプログラムを並列に処理する複数のプロセッサを備えたマルチプロセッサに関する。
【背景技術】
【０００２】
１つのＣＰＵが複数のコアを有するマルチコアや、複数のＣＰＵが搭載されたマルチプロセッサと呼ばれる中央処理装置が知られている（以下、このような中央処理装置を単にマルチコアと称することとする）。マルチコアでは、複数のコアを有効に活用する試みとして、複数のコアが同じ処理を行い比較するロックステップによる信頼性向上や、複数のコアが異なる処理を行うことで負荷を分散する負荷分散などが可能である。
【０００３】
例えば、負荷分散のためデュアルコアで２つのコアに処理を分割した場合、一方のコア１が行う処理の処理時間と、他方のコア２が行う処理の処理時間を均等にすることで、稼働率が向上し複数のコアが有効に活用される。しかし、各制御の依存関係を考慮しつつ、均等に分割することは非常に困難である。また、分岐などの発生によりコアの処理時間が変動することもある。
【０００４】
そこで、複数のコアの稼働率を向上させる技術が考えられている（例えば、特許文献１参照。）。特許文献１には、処理が終了してアイドリング状態となったプロセッサがタスクメモリをアクセスし、多くのタスクを保持するプロセッサのタスクリストからタスクを取り出し実行するマルチプロセッサシステムが記載されている。
【０００５】
また、マルチコアではないが、処理の依存関係を考慮する技術が考えられている（例えば、特許文献２参照。）。特許文献２には、依存間関係にあるデコード済み命令が使用するリソースが現在から何サイクル後に使用可能になるのかでデコード済み命令の発行タイミングとして決定し、決定した発行タイミングでデコード済み命令が使用するリソースを確保する情報処理装置が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１１−０５３３２７号公報
【特許文献２】特開２０１２−１７３７５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１では、複数のコアが実行する処理の依存関係が考慮されておらず、引用文献２では依存関係にある命令が発行されるまでの間にコアが行う処理について考慮されていないという問題がある。すなわち、従来は、複数のコアが実行する命令に依存関係がある場合に、処理が終了したコアは自動的に稼働率を向上するための処理を行うだけであり、稼働率を向上するための処理に行うことが適切か否かが判断されていない。
【０００８】
図１を用いて説明する。図１（ａ）では、逐次処理を複数のコアで実行した場合の不都合を説明している。この逐次処理では４つの命令があり、４行目の命令を実行するためには、３行目までの命令の実行が完了している必要がある。プログラマなどが依存関係を考慮して１，２行目の命令をコア１に、３，４行目の命令をコア２に分散させた場合、コア２はコア１が１，２行目の実行を完了させないと、４行目の命令を実行できない。このようにコア２がコア１の実行完了まで待つことを同期待ちと称する。
【０００９】
上記のように、各コアの処理時間のバランスが悪い場合、コア２の同期待ちの時間が長くなるが、コア２はループを繰り返すなどの無駄な処理を行うだけである。同期待ちの時間がほぼ一定であれば、その時間内に終了する処理（以下、非同期処理という）を割り当てることができる。しかし、例えば１行目のfunc()のように処理時間が変動する命令があり、同期待ちの時間は変動する可能性がある。例えば、if文やswitch文による条件分岐で処理の内容が変化すれば、処理時間も変動する。また、ループ数が動的に決定されるfor文が存在すれば処理時間が変動する。したがって、ソフトウェアの設計段階で同期処理をコア１，２に均等に割り当てるように最適化することは困難である。このため、同期待ちの時間にコア２が非同期処理を実行すると、別の同期待ちが発生するという不都合が生じうる。
【００１０】
図１（ｂ）はコア２が非同期処理を実行した場合の不都合を説明している。コア２が３行目の命令を実行した後、非同期処理（図では監視処理）を実行している。しかし、コア１が１，２行目の処理を短時間に実行したため、コア２が非同期処理を完了するまでの時間の方が、コア１が１，２行目を実行する処理時間よりも長くなっている。このため、コア１がコア２と同期するためには、コア２が４行目の命令を実行するまでの同期待ちが発生する。
【００１１】
したがって、複数のコアが実行する命令に依存関係がある同期処理では、処理が終了したコアが、他方のコアの処理が終了するまでに処理を実行すべきか又はするべきでないかについて適切に判断することが好ましい。
【００１２】
本発明は、上記課題に鑑み、同期処理を行う複数のコアの一方が、同期待ちの時間を抑制して非同期処理を実行可能なマルチプロセッサを提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明は、依存関係のあるプログラムを並列に処理する複数のプロセッサと、他のプロセッサが行った処理結果に同期処理を施す同期処理手段と、プロセッサ毎にプロセッサの現在の実行プログラムアドレス値を保持するプログラムカウンタと、他のプロセッサの現在の実行プログラムアドレス値を読み出す読み出し手段と、他のプロセッサが同期処理を開始するアドレス位置を記憶するアドレス位置記憶手段と、前記読み出し手段が読み出した実行プログラムアドレス値と、前記アドレス位置記憶手段に記憶された前記アドレス位置とに基づいて他のプロセッサの同期処理開始までの進捗情報を算出する進捗情報算出手段と、前記進捗情報に基づき他のプロセッサが同期処理を開始する前に自プロセッサが非同期処理を実行可能であると判定した場合に、非同期処理を実行する非同期処理手段と、を有することを特徴とする。
【発明の効果】
【００１４】
同期処理を行う複数のコアの一方が、同期待ちの時間を抑制して非同期処理を実行可能なマルチプロセッサを提供することができる。
【図面の簡単な説明】
【００１５】
【図１】逐次処理を複数のコアで実行した場合の不都合を説明している。
【図２】制御系ソフトウェアのタスクと分割例を説明する図の一例である。
【図３】本実施形態のマルチコアプロセッサによる同期処理の概略を説明する図の一例である。
【図４】マイコンの概略構成図の一例である。
【図５】同期処理の処理手順を説明する図の一例である。
【図６】コア１，コア２の機能を模式的に示す機能ブロック図の一例である。
【図７】目標ＰＣ位置について説明する図の一例である。
【図８】コア２が監視処理を実行する手順を示すフローチャート図の一例である。
【図９】同期開始通知領域のサイズ（監視可能閾値）の決定方法を説明する図の一例である。
【図１０】分岐処理を避ける方法について説明する図の一例である。
【図１１】コアが３つの場合の同期処理と監視処理を模式的に示す図の一例である。
【図１２】コア１，コア２の機能を模式的に示す機能ブロック図の一例である（実施例２）。
【図１３】コア２が監視処理を実行する手順を示すフローチャート図の一例である。
【発明を実施するための形態】
【００１６】
以下、本発明を実施するための形態について図面を参照しながら説明する。しかしながら、本発明の技術的範囲が、本実施の形態に限定されるものではない。
【実施例１】
【００１７】
〔制御系ソフトウェアのマルチコアへの対応例〕
まず、１つのＣＰＵが実行していたソフトウェアの複数のコアへの負荷分散について説明する。
【００１８】
図２は、制御系ソフトウェアのタスクと分割例を説明する図の一例である。
図２（ａ）は実装したいシングルコア用の制御系ソフトウェアを模式的に示している。シングルコアは、Ａ〜Ｄの４つのタスクを有しており、現状では、１５０％程度の処理負荷となっている。このパーセント表示は例えば処理時間と相関し、マイコンは１００％くらいの時間内に４つのタスクの実行を完了させることが望まれることを示している。
【００１９】
そこで、図２（ｂ）に示すように、ソフトウェア設計時にタスクＡ〜Ｄを２つのコアに分散することで、各コアの処理負荷を１００％くらいに抑制する。タスクは独立した処理であるため（タスクＡがタスクＢと同期しながら処理する必要性が低い）ため、タスク単位の負荷分散は比較的容易である。
【００２０】
しかし、図２（ｂ）に示すように、タスク単位の負荷分散では、各タスクの実行時間が均一とは限らないため、コア１の処理負荷が１００％を超える反面、コア２の稼働率が１００％未満となり、ＣＰＵ全体の稼働率が低下する場合がある。
【００２１】
そこで、図２（ｃ）に示すように、１つのタスク（図ではタスクＤ）をコア１とコア２に負荷分散することで、ＣＰＵ全体の稼働率を向上させることができる。したがって、マイコンの処理能力を有効活用できるようになる。しかし、図１にて説明したように１つのタスクには依存関係のある処理が含まれることが多いので、タスクを分割すると依存関係のある処理を異なるコアが実行する必要が生じうる。
【００２２】
図３は、本実施形態のマルチコアプロセッサ（以下、単にマルチコアという）による同期処理の概略を説明する図の一例である。逐次処理のタスクＤを、コア１とコア２が分担して処理する。コア１の処理とコア２の処理に依存関係がある場合、コア２はコア１の処理が終了するまで同期待ちする。
【００２３】
同期待ちの時間は変動しうるので、同期待ちの時間が分からないと、ＣＰＵ全体として同期待ちの時間を有効活用できない。
【００２４】
そこで、本実施形態では、マルチコアにおいて依存関係にある命令を実行しているタスクのうち、先に処理を実行完了したコア（図３ではコア２）が同期待ちの時間を動的に検出し、検出した時間に基づき非同期処理を実行するか否かを判断する。具体的には、処理を実行中のコア（図３ではコア１）のＰＣ（プログラムカウンタ）の値を取得し、この値をコア１が実行している命令の現在位置として、現在位置と目標位置の差から、コア２が非同期処理を実行できるか否かを判断する。そして、実行可能な場合にのみ非同期処理を実行する。なお、ＰＣの値は特許請求の範囲の「実行プログラムアドレス値」の一例である。
【００２５】
実行可否判断では、非同期処理の実行に必要な時間が考慮されるので、同期処理の待ち時間と同程度の場合にだけ非同期処理を行うと判断でき、同期処理を行うマルチコアの稼働率を向上させることができる。
【００２６】
なお、本実施例では、１つのタスクを分割した場合を例に説明するが、タスクＡ〜Ｄをタスク単位で負荷分散した場合においても、タスクＡ〜Ｄに依存関係がある場合、本実施形態の負荷分散の手法は有効である。
【００２７】
〔構成例〕
図４は、マイコン１００の概略構成図の一例を示す。マイコン１００はシステムバスＢ１に接続された、ＣＰＵ１１、ＲＡＭ１２、ＲＯＭ１３、ＩＮＴＣ１４、ＷＤＴ１５、ＤＭＡＣ１６、周辺バス１７を介して接続された複数のＩ／Ｏ１９、及び、通信コントローラ１８を有している。マイコン１００は、この他、タイマなどマイコンに一般的な構成を有している。
【００２８】
ＣＰＵ１１は少なくとも２つ以上のコア２１（以下、各コアをコア１，２と称す）及び共有メモリ２０を有する。各コアは共有メモリ２０を介してＰＣの値やデータを送受信したり、同期を取るためのフラグの状態を操作したり通知したりする。また、コア間は専用線で接続されており、コア１がコア２に（及びその逆に）ＰＣの値やデータ、フラグの状態を操作したり通知したりすることができる。
【００２９】
なお、コア１，２の構造は同一でも異なっていてもよい。また、１つのチップに複数のコアを有するのでなく、マイコン１００が複数のＣＰＵを有していてもよい。
【００３０】
ＣＰＵ１１は、ＲＯＭ１３に記憶されたプログラムを実行することでマイコン全体を制御する。ＲＡＭ１２にはプログラムやデータが展開され、ＲＡＭ１２はＣＰＵ１１がアクセスする作業メモリになる。また、ＲＯＭ１３にはプログラムの他、プラットホームが記憶されている。プラットホームは、例えばＯＳ（Operating  System）やデバイスドライバなどである。ＯＳとしては、ＯＳＥＫ（Open system together with interfaces for automotive electronics）、ＡＵＴＯＳＡＲ（AUTomotive Open System Architecture） ＯＳなどのリアルタイムＯＳがあるが、これらに限定されるものではない。
【００３１】
ＩＮＴＣ１４は割込みマスク・マスクの解除などの設定が可能なレジスタと割込み要求が設定されるレジスタなどを有し、レジスタを監視して、周辺機器からの割り込み要求を割込みの優先順位に基づき調停してＣＰＵ１１に通知する。ＷＤＴ１５は、動作クロックをカウントして計測した時間が予め定められたリセット時間に達すると（オーバーフローすると）、異常を検出する回路である。ＷＤＴ１５がオーバーフローすると、例えばマイコン１００がリセットされるなどのフェールセーフが行われる。ＤＭＡＣ１６は、ＲＡＭ１２と周辺回路の間やＲＡＭ１２内で、ＣＰＵ１１を介することなくデータを転送する。
【００３２】
Ｉ／Ｏ１９はＵＡＲＴ、Ｉ２Ｃなど、外部と通信する入出力インタフェースである。通信コントローラ１８は、マイコン１００が通信バス４０に接続された他のＥＣＵ（Electronic Control Unit）と通信するための通信回路である。通信コントローラ１８はメッセージを受信するとＩＮＴＣ１４を介してＣＰＵ１１に通知する。また、ＣＰＵ１１がメッセージを送信する際は、アプリケーションにより作成されたデータから通信コントローラ１８がメッセージを作成し通信バス４０に出力する。
【００３３】
マイコン１００はＥＣＵに搭載されることが可能である。ＥＣＵには、エンジンを制御するエンジンＥＣＵ、電気モータを制御するモータ用ＥＣＵ、ボディＥＣＵ、ナビＥＣＵなどがあり、本実施形態のマイコンはどのようなＥＣＵに搭載してもよい。
【００３４】
〔同期処理について〕
図５（ａ）は比較のために示した従来の同期処理の処理手順を説明する図の一例である。図では、コア１が処理１を実行する時間は、コア２が処理２を実行する時間より長い。  処理２の実行が完了したコア２は、コア１に処理終了通知を出力する。処理終了通知は、処理が終了したので同期処理が可能であることを通知することである。処理終了通知により、コア１は同期処理が実行可能であることを検出できる。このため、コア１は処理１が完了次第、同期処理を実行できる。
【００３５】
しかし、コア２は、処理２の実行が完了した時、コア１が処理１を実行中なので同期処理を実行できない。このため、コア２は、コア１がコア２に処理終了通知を出力するまで、同期待ち状態となる。図では、コア２は、処理２の後、すぐに同期処理を開始しているが、大半は無限ループなどによる同期待ちの時間である。
【００３６】
コア１は処理１の後に、コア２は処理２の後に、それぞれ同期処理を実行する。すなわち、コア１はコア２に処理結果（例えば、図１のＸ）を通知し、コア２はコア１による処理の実行結果を用いて、同期処理を行う（例えば図１のＺ＝Ｘ＋Ｙ）。このように、コア１又はコア２の双方が同期処理を行う。
図５（ｂ）は本実施形態の同期処理の処理手順を説明する図の一例である。図５（ｂ）ではコア２が先に処理２を実行完了した例を示している。コア１及びコア２が実行する処理１，２は、同期処理の直前の処理（処理１，２の終了付近の前の所定領域）において、「同期開始通知領域」を有している。同期開始通知領域は、処理の終了付近のアドレス範囲である。
(i)先に処理２の実行を終えたコア２は、コア１に処理終了通知を出力する。
(ii)コア２は、コア１のＰＣの値を読み出し、コア１のＰＣが同期開始通知領域か否かを判定する。
(iii) 同期開始通知領域ではないので、コア２は非同期処理（図では監視処理）を実行する。監視処理について後述する。
(iv)  非同期処理の実行が完了すると、コア２は、コア１のＰＣの値を読み出し、コア１のＰＣが同期開始通知領域か否かを判定する。
(v) 同期開始通知領域ではないので、コア２は非同期処理（図では監視処理）を実行する。
(vi)  非同期処理の実行が完了すると、コア２は、コア１のＰＣの値を読み出し、コア１のＰＣが同期開始通知領域か否かを判定する。
(vii) 同期開始通知領域なので、コア２は同期処理を実行する。
(viii)  コア１は処理１の実行が終了すると、コア２に処理終了通知を出力する。これによりコア２はコア１の処理結果を取得して実質的な同期処理を行うことができる。コア１は、すでにコア２の処理終了通知を取得しているので、コア２のＰＣを取得しない。コア１がコア２のＰＣを取得してもよいが同期開始通知領域ではないので、コア１は同期処理を実行すると判定できる。
(ix) コア１は、同期処理を実行する。
【００３７】
このように同期開始通知領域が処理の終了付近のアドレス範囲であることを利用して、コア２は、コア１が処理１の終了間近であることを検出できる。コア１が処理１の終了間近であればコア２は同期処理を行い、コア１が処理１の終了間近でなければ非同期処理を行う。したがって、コア１による処理１の処理時間とコア２による処理２の処理時間が均一でなくても、また、処理時間が動的に変動しても、コア２の同期待ちの時間を所定値以下（同期開始通知領域の実行時間以下）に抑制することができる。
【００３８】
〔機能ブロック〕
図６は、コア１，コア２の機能を模式的に示す機能ブロック図の一例である。本実施形態の特徴部に関してはコア１とコア２の構成は同じでよい。ただし、メイン処理実行部３２，４２が行う処理は、それぞれが逐次処理の一部なので異なっている。
【００３９】
コア１はメイン処理実行部３２により各処理の実行手順が制御されている。メイン処理実行部３２は、機能Ａ〜Ｃを順次提供し、各機能を提供する毎に、処理終了通知をコア２に出力する。処理終了通知は、コア１と２から参照可能な共有メモリのフラグをＯＮ（又はＯＦＦ）にセットすること、コア１からコア２及びコア２コア１にHigh信号（又はLow信号）を送信することなどで行われる。
【００４０】
また、機能Ａを提供した後にコア２の処理結果と同期するための同期処理Ａ部３６ａ、機能Ｂを提供した後にコア２の処理結果と同期するための同期処理Ｂ部３６ｂ、機能Ｃを提供した後にコア２の処理結果と同期するための同期処理Ｃ部３６ｃ、を有している。
【００４１】
従来、コア１では各機能が以下の順番で動作していた。監視処理部３８が行う監視処理は、コア１とコア２の不均一性を考慮して挿入されており、挿入されない場合もある。
機能Ａ提供部→メイン処理実行部→（監視処理部）→同期処理Ａ部
機能Ｂ提供部→メイン処理実行部→（監視処理部）→同期処理Ｂ部
機能Ｃ提供部→メイン処理実行部→（監視処理部）→同期処理Ｃ部
本実施形態では、以下のように、監視処理部３８、ＰＣ取得部３３、及び、判定部３４が、同期処理Ａ部（又は、同期処理Ｂ部、同期処理Ｃ部）の前に実行される。機能Ｂ，Ｃについても同様である。
機能Ａ提供部→メイン処理実行部→「ＰＣ取得部→判定部→（０回以上、監視処理部が動作する）」→同期処理Ａ部
例えば、機能Ａ提供部３１ａはセンサから信号を検出する機能Ａを提供し、機能Ｂ提供部３１ｂは燃料噴射量を計算する機能Ｂを提供し、機能Ｃ提供部３１ｃは点火タイミングを計算する機能を提供する。なお、機能Ａ〜Ｃは一例であって、マイコン１００が搭載される電子制御ユニットの種類などで異なるものである。
【００４２】
コア２の機能Ａ〜Ｃは、コア１の機能Ａ〜Ｃと同期して共通の機能Ａ〜Ｃを提供する。具体的には、機能Ａでは例えば、センサの検出信号を加工するための係数を演算する処理を行う。機能Ｂでは例えば、燃料を噴射するなどの処理を行い、機能Ｃでは例えば、点火するどの処理を行う。
【００４３】
同期処理Ａ部３６ａはセンサの検出信号をコア２に送出する。同期処理Ａ部４６ａは、コア１が送出したセンサ信号に、係数を乗じる同期処理を行う。同様に、同期処理Ｂ部３６ｂはセンサの検出信号をコア２に送出する。同期処理Ａ部４６ａは、コア１が送出したセンサ信号に、係数を乗じる同期処理を行う。同様に、コア１の同期処理Ｂ部３６ｂは次回のサイクルで噴射するための燃料噴射量をコア２に出力する同期処理を行い、コア２の同期処理Ｂ部４６ｂは次回のサイクルで噴射するための燃料噴射量をコア１から取得する同期処理を行う。コア１の同期処理Ｃ部３６ｃは次回のサイクルの点火タイミングをコア２に出力する同期処理を行い、コア２の同期処理Ｃ部４６ｃは次回のサイクルの点火タイミングをコア１から取得する同期処理を行う。
【００４４】
このように、同期処理は、主に、コア１又はコア２が他方のコアの処理結果を利用した処理である。また、利用した処理を行わなくても、同期が完了したことを確認する処理でもよい。
【００４５】
監視処理部３８は非同期処理の一例であり、ＣＰＵ全体の稼働率を向上させるために行われる処理の一例である。監視処理は、ＲＯＭ１３のプログラムのＳＵＭチェック、マイコン１００や周辺機器の異常検出、などを行う。つまり、メイン処理が行われていない空いた時間を利用して行われる処理なので、メイン処理や同期処理以外の処理であればどのような処理でもよい。
【００４６】
ＰＣ取得部３３は、コア２のＰＣ４７の値を取得する。分岐処理やループ処理の例外を除けば、コア２はＲＯＭ１３のアドレス順にプログラムを実行する。上記のように、同期開始通知領域は、ＲＯＭ１３に記憶されたプログラムの終わり近くのアドレス領域である。したがって、判定部３４は、ＰＣ４７の値と予め登録されている目標ＰＣ位置３５とを比較して、コア２が同期開始通知領域のプログラムを実行しているか否かを判定できる。  目標ＰＣ位置３５，４５については図７で説明するが、同期処理のプログラムが記憶されたアドレスと同期開始通知領域の間のアドレスを目標ＰＣ位置とする。同期処理のプログラムが記憶されたアドレスの手前が目標ＰＣ位置なので、目標ＰＣ位置は、機能Ａ〜Ｃのどの機能が提供されているかによって異なる。このため、メイン処理実行部３２は、提供している機能Ａ〜Ｃを判定部３４に通知するか、機能を切り替える毎に判定部３４に通知する。これにより、判定部３４は目標ＰＣ位置を切り替えることができる。
【００４７】
図７は、目標ＰＣ位置について説明する図の一例である。コア１について示すがコア２についても同様である。ＲＯＭ１３にはアドレスの小さい方から順に監視処理モジュール、モジュールＡ〜Ｃ、メイン処理モジュール、同期開始通知領域Ａ、同期処理モジュールＡ、同期開始通知領域Ｂ、同期処理モジュールＢ、同期開始通知領域Ｃ、及び、同期処理モジュールＣが記憶されている。このように、同期開始通知領域Ａ〜Ｃは、ＲＯＭ１３のアドレスの終わり近くである。なお、同期開始通知領域Ａ〜Ｃは、独立した機能を提供するプログラムの格納領域ではなく、アドレスの領域である。例えば、同期開始通知領域Ａは、メイン処理の最終アドレス付近の領域であり、同期開始通知領域Ｂは、メイン処理が機能Ｂを提供する処理の終わり付近で実行されるアドレス領域であり、同期開始通知領域Ｃは、メイン処理が機能Ｃを提供する処理の終わり付近で実行されるアドレス領域である。
【００４８】
目標ＰＣ位置１は、同期開始通知領域Ａと同期処理モジュールＡの境界のアドレス、目標ＰＣ位置２は、同期開始通知領域Ｂと同期処理モジュールＢの境界のアドレス、目標ＰＣ位置３は、同期開始通知領域Ｃと同期処理モジュールＣの境界のアドレス、である。
【００４９】
したがって、コア２のＰＣ取得部４３がコア１のＰＣ３７の値を取得した場合に、同期開始通知領域Ａであれば、コア２が同期処理Ａを実行すべきことを検出できる。同様に、同期開始通知領域Ｂであれば、コア２が同期処理Ｂを実行すべきことを検出でき、同期開始通知領域Ｃであれば、コア２が同期処理Ｃを実行すべきことを検出できる。
【００５０】
また、コア２が実行する監視処理モジュールが、同期開始通知領域と同等の処理量（処理時間）であれば、監視処理によりコア１に同期待ちの時間が発生することを防止できる。したがって、コア２の監視処理モジュールは、コア１の同期開始通知領域と同等の処理量となるように設計されている。監視処理モジュールと同期開始通知領域との処理時間の調整については後述する。
【００５１】
〔動作手順〕
図８は、コア２が監視処理を実行する手順を示すフローチャート図の一例である。
コア２のメイン処理実行部４２は、コア２のメイン処理の実行が完了したためコア２の処理完了通知をコア１に出力する（Ｓ１０）。具体的には、フラグをＯＮにセットする。
【００５２】
ＰＣ取得部４３はコア１からＰＣ３７の値を取得する（Ｓ２０）。
【００５３】
判定部４４は、同期中の処理に応じて目標ＰＣ位置４５を読み出し、目標ＰＣ位置と現在のＰＣ３７の値の差ΔＰを算出する（Ｓ３０）。
【００５４】
判定部４４は、差ΔＰが監視可能閾値より大きいか否かを判定する（Ｓ４０）。監視可能閾値は同期開始通知領域の容量とほぼ等しい閾値である。差ΔＰが監視可能閾値より大きい場合（Ｓ４０のＹｅｓ）、コア１は同期開始通知領域以外か又は同期処理モジュール以外を実行しているので、判定部４４は監視処理モジュールを実行すると判断する（Ｓ５０）。
【００５５】
監視処理の実行後、コア２は再度、ステップＳ２０からの処理を実行する。
【００５６】
差ΔＰが監視可能閾値より大きくない場合（Ｓ４０のＮｏ）、コア１は同期開始通知領域又は同期処理モジュールを実行しているので、判定部４４は監視処理モジュールを実行できないと判断し、コア１から処理終了通知を取得する（Ｓ６０）。すなわち、コア２はコア１から処理終了通知を取得するまで待機する（Ｓ７０）。そして、コア１から処理終了通知を取得すると、同期処理モジュールを実行して同期を完了させる。
【００５７】
なお、図８はコア２が先にメイン処理を終了した場合のフローチャート図であるが、コア１が先にメイン処理を終了した場合も同様の手順で実行できる。
【００５８】
〔同期開始通知領域のサイズ（監視可能閾値）の決定方法〕
同期開始通知領域はＲＯＭ１３のアドレスの終わり付近の領域と説明したが、同期開始通知領域のサイズは、処理時間に変換した場合にコア２の監視処理モジュールの実行時間と同程度であることが好ましい。
【００５９】
図９は、同期開始通知領域のサイズ（監視可能閾値）の決定方法を説明する図の一例である。図９（ａ）は、同期開始通知領域の処理時間と監視処理モジュールの処理時間の時間差が大きい場合を示している。
(i)コア２がコア１のＰＣを読み出すが、同期開始通知領域でないため、コア２は監視処理を実行する。
(ii)監視処理の終了後、コア２がコア１のＰＣを読み出すが、同期開始通知領域でないため、コア２は監視処理を実行する。
(iii)しかし、コア１の同期処理通知領域の処理時間に対し、コア２の監視処理モジュールの処理時間が大きいので、コア１に同期待ち時間が発生してしまう（コア１はメイン処理の後、同期処理を開始しているが、実際に同期を取るまでにはコア２の監視処理の終了まで、遅延時間分、待つ必要がある）。
【００６０】
図９（ｂ）は同期開始通知領域の処理時間と監視処理モジュールの処理時間がほぼ等しい場合を示している。
(i)コア２がコア１のＰＣを読み出すが、同期開始通知領域でないため、コア２は監視処理を実行する。
(ii)監視処理の終了後、コア２がコア１のＰＣを読み出すが、同期開始通知領域でないため、コア２は監視処理を実行する。
(iii)監視処理の終了後、コア２がコア１のＰＣを読み出すが、同期開始通知領域であるため、コア２は監視処理を実行しない。
(iv)したがって、コア２は同期処理を実行することができる。この後、コア１が同期開始通知領域の処理を終わらせるまで、コア２は待機するが、図９（ａ）の場合よりも同期完了までの時間を低減できることがわかる。
【００６１】
このように、コア１の同期開始通知領域の処理時間とコア２の監視処理モジュールの処理時間をほぼ等しくすることで、コア２が監視処理中にコア１が同期処理を開始することを防止できる。
【００６２】
なお、コア１の同期開始通知領域の処理時間よりもコア２の監視処理モジュールの処理時間の方が短くても、コア２が監視処理中にコア１が同期処理を開始することを防止できる。しかし、コア２の監視処理モジュールの処理時間の方が短か過ぎると、コア２の同期待ち時間が長くなるため、コア１の同期開始通知領域の処理時間よりもコア２の監視処理モジュールの処理時間の方があまりに短いことは好ましくない。したがって、コア１の同期開始通知領域の処理時間とコア２の監視処理モジュールの処理時間はほぼ等しいか、又は、コア２の監視処理モジュールの処理時間がコア１の同期開始通知領域の処理時間よりもやや短い程度（例えば７０から９０％）であることが好ましい。
【００６３】
〔同期開始通知領域の処理時間、監視処理モジュールの処理時間の調整方法〕
同期開始通知領域の処理時間、監視処理モジュールの処理時間の調整方法としては、例えば以下の２つが挙げられる。
【００６４】
方法１：ＲＯＭの容量と処理時間がほぼ等しい場合
コア１の同期開始通知領域のサイズとコア２の監視処理モジュールのサイズをほぼ同じにすればよい。具体的には、以下のように処理する。
・関数コールは避ける（コールされた関数のサイズが不特定であるため）
・分岐処理を避ける（分岐先の処理により実行されるプログラムサイズが変わるため）
・for文などの繰り返し処理は避ける（プログラムサイズと処理時間が一致しないため）
関数コールを避けるには、プログラマなどが関数を直接、同期開始通知領域又は監視処理モジュールに記述する。分岐処理を避ける方法は次述する。for文などの繰り返し処理を避けるには、繰り返しの数だけ処理を記述する。
【００６５】
方法２：ＲＯＭの容量が同じでも処理時間が異なる場合
コア１の同期開始通知領域の処理時間とコア２の監視処理モジュールの処理時間がほぼ同じにする。具体的には、以下のように処理する。
・分岐処理を避ける（分岐先の処理により実行されるプログラムサイズが変わるため）
・ループ数の動的な決定は避ける（ループ数で処理時間が変わるため）
ループ数の動的な決定を避けるには、ループ数を動的に決定する必要がある処理を同期開始通知領域又は監視処理モジュールから移動する。
【００６６】
図１０は、分岐処理を避ける方法について説明する図の一例である。
図１０（ａ）はif文、switch文を含む従来処理を模式的に示している。この処理は、車の速度等の走行状態に応じて最大限の燃費性能を発揮できるように、制御パターンを切り替える処理である。図の制御パターンは燃料消費量の計算であるが、どのような処理でもよい。
【００６７】
従来は、if文やswitch文により、パターンＡ（０〜１０km/h）、パターンＢ（１０〜３０km/h）、パターンＣ（３０〜５０km/h）、パターンＤ（５０〜８０km/h）、パターンＥ（８０〜km/h）、のいずれかの適切な燃料噴射量の計算に切り替えられていた。
【００６８】
本実施形態では、図１０（ｂ）に示すように、走行状況が変わっても同じパターンＸを制御パターンとする。これにより、最大限の燃費性能を発揮できない可能性があっても、全車速領域で有効な燃料噴射量を行う。分岐処理がなくなるため、方法１及び２において、同期開始通知領域のサイズと監視処理モジュールのサイズを、サイズ及び処理時間のどちらで比較した場合でもほぼ同じにすることができる。
【００６９】
以上説明したように、本実施形態のマイコン１００は、同期開始通知領域を実行しているか否かを監視して監視処理を行うことで、先に処理が終了したコア又は後に処理が終了したコアが同期待ちする時間を短くできる。
【００７０】
〔コアが３つ以上の場合〕
図１１は、コアが３つの場合の同期処理と監視処理を模式的に示す図の一例である。図では３つのコアが依存関係のあるメイン処理１〜３を実行しているものとする。この場合、コア１はコア２、コア３からＰＣの値を読み出し、コア２はコア１、コア３からＰＣの値を読み出し、コア３はコア２、コア１からＰＣの値を読み出す。
(i)  最も先に処理が終了したコア２は処理終了通知をコア１とコア３に出力する。
(ii)  コア２は、コア１とコア３のＰＣの値を取得する。
(iii)  コア１とコア３のどちらも同期開始通知領域でないので、コア２は監視処理を行う。
(iv)  監視処理が終了したコア２は、コア１とコア３のＰＣの値を取得する。
(v)  コア３は同期開始通知領域でだが、コア１が同期開始通知領域でないので、コア２は監視処理を行う。
(vi)  コア３は、同期開始通知領域まで処理が終わったので、処理終了通知をコア１に出力する。
(vii)  コア３はコア１からＰＣの値を取得する。
(viii)  コア１が同期開始通知領域でないので、コア３は監視処理を実行する。
(ix)  コア２，３はコア１からＰＣの値を取得する。
(x)  コア２，３は、同期開始通知領域なので、コア２，３は同期処理を開始する。また、コア１も同期処理を実行する。
【００７１】
このように、３つ以上のコアが同期処理を実行する場合、最後の１つのコアが同期開始通知領域のアドレスに到達するまで、他のコアは監視処理を実行することができる。したがって、ＣＰＵの稼働率を向上させることができる。
【実施例２】
【００７２】
本実施例では、目標ＰＣ位置と現在のＰＣの値の差ΔＰに応じて、非同期処理を動的に選択するマイコン１００について説明する。コアが複数の非同期処理を有する場合、目標ＰＣ位置と現在のＰＣの値のΔＰが小さくてもΔＰ以下のサイズ（処理時間）の非同期処理を実行できるため、さらにＣＰＵの稼働率を向上させることができる。
【００７３】
図１２は、コア１，コア２の機能を模式的に示す機能ブロック図の一例である。本実施例において、実施例１にて同一の符号を付した構成要素については、同様の機能を果たすので、一度説明した構成要素の説明を省略あるいは相違点についてのみ説明する場合がある。
【００７４】
本実施例ではコア１，２が処理決定部５１，６１、サイズ決定部５２，６２、及び、複数の監視処理部３８，４８（以下、区別するため監視処理部ｘ、ｙ、ｚという）をそれぞれ有している。以下、コア２を例に説明する。サイズ決定部６２は、判定部４４が算出したΔＰに基づき、ΔＰに対応する処理時間で実行可能なサイズ又は処理時間を決定する。サイズに基づき決定する場合、コア２が実行可能なサイズはΔＰと等しい。処理時間に基づき決定する場合、同期開始通知領域のサイズは実施例１と同様の調整により処理時間と相関するようになっているので、ΔＰから処理時間を算出する。
【００７５】
処理決定部６１は、監視処理部ｘの監視処理モジュールｘ〜ｚのサイズ及び処理時間を保持している。したがって、処理決定部６１は、判定部４４が算出したΔＰ以下の監視処理モジュールｘ〜ｚを決定できる。処理決定部６１は、ΔＰよりもサイズ又は処理時間が小さい監視処理モジュールｘ〜ｚのうち最もサイズ又は処理時間が大きい監視処理モジュールｘ〜ｚを実行する監視処理に決定する。これにより、サイズ又は処理時間が大きい監視処理モジュールを実行しやすくなる。
【００７６】
図１３は、コア２が監視処理を実行する手順を示すフローチャート図の一例である。図８と異なる主要ステップを説明する。図１３では、ステップＳ４０で差ΔＰが監視可能閾値より大きいと判定された場合（Ｓ４０のＹｅｓ）、サイズ決定部６２はΔＰからサイズ又は処理時間を決定し、処理決定部６１がΔＰ以下の監視処理部を決定する（Ｓ４５）。以降の処理は実施例１と同様である。
【００７７】
本実施例によれば、算出したΔＰのサイズ又は処理時間により実行する非同期処理を決定するので、同期処理が始まるまでの時間に応じて適切な非同期処理を決定できる。
【符号の説明】
【００７８】
１１      ＣＰＵ
２１      コア
１３      ＲＯＭ
３２、４２    メイン処理実行部
３３，４３    ＰＣ取得部
３５，４５    目標ＰＣ位置
３８、４８    監視処理部
１００    マイコン
【図１】
2014191655.tif 000003
【図２】
2014191655.tif 000004
【図３】
2014191655.tif 000005
【図４】
2014191655.tif 000006
【図５】
2014191655.tif 000007
【図６】
2014191655.tif 000008
【図７】
2014191655.tif 000009
【図８】
2014191655.tif 000010
【図９】
2014191655.tif 000011
【図１０】
2014191655.tif 000012
【図１１】
2014191655.tif 000013
【図１２】
2014191655.tif 000014
【図１３】
2014191655.tif 000015