(57)【特許請求の範囲】
【請求項１】
コアが一つであるシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）から複数の前記コアを有するマルチコアマイコン用に並列化した並列プログラムを生成する並列化方法であって、
複数の前記処理は、異なる前記コアに割り振られた、実行順序が先である先行処理と、
前記先行処理の実行が完了した後に実行させる後行処理とを含み、
異なる前記コア間で前記実行順序を維持するために、前記先行処理の実行が完了した際に、完了状態の記憶処理を前記並列プログラムに挿入する記憶処理挿入手順（Ｓ１１）と、
異なる前記コア間で前記実行順序を維持するために、前記完了状態が記憶されるのを待って、前記完了状態が記憶されたことを条件に前記後行処理の実行に移行させる待ち処理を前記並列プログラムに挿入する待ち処理挿入手順（Ｓ１２）と、
前記記憶処理を実行した前記コアに対して、前記記憶処理を実行した前記コアが前記先行処理後に実行した、前記先行処理及び前記後行処理のいずれでもない前記処理が完了すると、前記記憶処理を再度実行させる再記憶処理を前記並列プログラムに挿入する再記憶処理挿入手順（Ｓ１３）と、を有することを特徴とする並列化方法。
【請求項２】
前記再記憶処理挿入手順は、前記記憶処理を実行した前記コアが前記先行処理及び前記後行処理のいずれでもない前記処理が完了した後に前記待ち処理を実行する場合、前記記憶処理を実行した前記コアによる前記待ち処理中に実行される前記再記憶処理を挿入することを特徴とする請求項１に記載の並列化方法。
【請求項３】
前記再記憶処理時に、前記再記憶処理時の記憶内容と前記再記憶処理前の記憶内容とを比較し、両記憶内容が異なる場合に異常と判断する判断処理を前記並列プログラムに挿入する判断処理挿入手順を有することを特徴とする請求項１又は２に記載の並列化方法。
【請求項４】
コアが一つであるシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）から複数の前記コアを有するマルチコアマイコン用に並列化した並列プログラムを生成する並列化ツールであって、
複数の前記処理は、異なる前記コアに割り振られた、実行順序が先である先行処理と、前記先行処理の実行が完了した後に実行させる後行処理とを含み、
異なる前記コア間で前記実行順序を維持するために、前記先行処理の実行が完了した際に、完了状態の記憶処理を前記並列プログラムに挿入する記憶処理挿入ステップ（Ｓ１１）と、
異なる前記コア間で前記実行順序を維持するために、前記完了状態が記憶されるのを待って、前記完了状態が記憶されたことを条件に前記後行処理の実行に移行させる待ち処理を前記並列プログラムに挿入する待ち処理挿入ステップ（Ｓ１２）と、
前記記憶処理を実行した前記コアに対して、前記記憶処理を実行した前記コアが前記先行処理後に実行した、前記先行処理及び前記後行処理のいずれでもない前記処理が完了すると、前記記憶処理を再度実行させる再記憶処理を前記並列プログラムに挿入する再記憶処理挿入ステップ（Ｓ１３）と、を有することを特徴とする並列化ツール。
【請求項５】
前記再記憶処理挿入ステップは、前記記憶処理を実行した前記コアが前記先行処理及び前記後行処理のいずれでもない前記処理が完了した後に前記待ち処理を実行する場合、前記記憶処理を実行した前記コアによる前記待ち処理中に実行される前記再記憶処理を挿入することを特徴とする請求項４に記載の並列化ツール。
【請求項６】
前記再記憶処理時に、前記再記憶処理時の記憶内容と前記再記憶処理前の記憶内容とを比較し、両記憶内容が異なる場合に異常と判断する判断処理を前記並列プログラムに挿入する判断処理挿入ステップを有することを特徴とする請求項４又は５に記載の並列化ツール。
【請求項７】
コアが一つであるシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）を複数の前記コアを有するマルチコアマイコン用に並列化した並列プログラムと、前記並列プログラムで動作する前記マルチコアマイコンとを備えた車載装置であって、
複数の前記処理は、異なる前記コアに割り振られた、実行順序が先である先行処理と、前記先行処理の実行が完了した後に実行させる後行処理とを含み、
前記マルチコアマイコンは、
異なる前記コア間で前記実行順序を維持するために、前記先行処理の実行が完了した際に、完了状態を記憶する記憶処理（Ｓ２１）と、
異なる前記コア間で前記実行順序を維持するために、前記完了状態が記憶されるのを待って、前記完了状態が記憶されたことを条件に前記後行処理の実行に移行させる待ち処理（Ｓ３２、Ｓ４３）と、
前記記憶処理を実行した前記コアが行う処理であり、前記記憶処理を実行した前記コアが前記先行処理後に実行した、前記先行処理及び前記後行処理のいずれでもない前記処理が完了すると、前記記憶処理を再度実行する再記憶処理（Ｓ３１、Ｓ４２）と、を有することを特徴とする車載装置。
【請求項８】
前記記憶処理を実行した前記コアは、自身が前記先行処理及び前記後行処理のいずれでもない前記処理が完了した後に前記待ち処理を実行する場合、自身による前記待ち処理中に前記再記憶処理を実行することを特徴とする請求項７に記載の車載装置。
【請求項９】
前記マルチコアマイコンは、前記再記憶処理時に、前記再記憶処理時の記憶内容と前記再記憶処理前の記憶内容とを比較し、両記憶内容が異なる場合に異常と判断する判断処理を有することを特徴とする請求項７又は８に記載の車載装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シングルコアマイコン用のプログラムから、マルチコアマイコン用のプログラムを生成する並列化方法、並列化ツール、及び並列化方法で生成されたマルチコアマイコン用のプログラムを実装した車載装置に関する。
【背景技術】
【０００２】
従来、シングルコアマイコン用にプログラムから、マルチコアマイコン用のプログラムを生成する並列化方法の一例として特許文献１に開示された並列化コンパイル方法がある。
【０００３】
この並列化コンパイル方法では、シングルプロセッサシステムにより実行される組込みシステム用の逐次プログラムを複数のマクロタスクに分割した後、制御依存性を有するマクロタスクを一つのマクロタスクに融合する。その後、並列化コンパイル方法では、データ依存性に基づき並列実行可能なマクロタスクを抽出すると共に、スタティックスケジューリングを行い、並列プログラムを生成する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１５−１８０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、並列化方法では、並列化解析後、各コアへの通常処理の割り付けと、演算順序を維持するための同期処理を挿入することが考えられる。この同期処理としては、通常処理が完了したことを示す変数をセットする状態セットと、他コアにおいて変数がセットされることを待って自コアの通常処理に移行する待ち処理とを含む。
【０００６】
しかしながら、この変数は、ノイズなどによって、意図せず変わってしまうことも考えられる。このように変数が変わってしまった場合、マルチコアマイコンでは、少なくとも一つのコアにおいて、待ち処理が継続して、通常処理が実行できないデッドロック状態となるという問題がある。
【０００７】
本発明は、上記問題点に鑑みなされたものであり、デッドロックからの復帰を早めることができる並列化方法、並列化ツール、車載装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するために本発明は、
一つのコアを有するシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）から複数のコアを有するマルチコアマイコン用に並列化した並列プログラムを生成する並列化方法であって、
複数の処理は、異なるコアに割り振られた、実行順序が先である先行処理と、先行処理の実行が完了した後に実行させる後行処理とを含み、
異なるコア間で実行順序を維持するために、先行処理の実行が完了した際に、完了状態の記憶処理を並列プログラムに挿入する記憶処理挿入手順（Ｓ１１）と、
異なるコア間で実行順序を維持するために、完了状態が記憶されるのを待って、完了状態が記憶されたことを条件に後行処理の実行に移行させる待ち処理を並列プログラムに挿入する待ち処理挿入手順（Ｓ１２）と、
記憶処理を実行したコアに対して、記憶処理を実行したコアが先行処理後に実行した、先行処理及び後行処理のいずれでもない処理が完了すると、記憶処理を再度実行させる再記憶処理を並列プログラムに挿入する再記憶処理挿入手順（Ｓ１３）と、を有することを特徴とする。
【０００９】
このように、本発明は、先行処理の実行が完了した際に、完了状態の記憶処理を並列プログラムに挿入するとともに、完了状態が記憶されたことを条件に後行処理の実行に移行させる待ち処理を並列プログラムに挿入する。このため、本発明は、異なるコアに割り振られた先行処理と後行処理の実行順序を維持可能な並列プログラムを生成できる。
【００１０】
さらに、本発明は、記憶処理を再度実行させる再記憶処理を並列プログラムに挿入するため、意図せず完了状態が消えた場合であっても、再度完了状態を記憶可能な並列プログラムとすることができる。このため、本発明は、意図せず完了状態が消えて、後行処理の実行に移行できないデッドロックになった場合に、早期にデッドロックから復帰可能な並列プログラムを生成できる。
【００１１】
また、本発明のさらなる特徴は、
一つのコアを有するシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）から複数のコアを有するマルチコアマイコン用に並列化した並列プログラムを生成する並列化ツールであって、
複数の処理は、異なるコアに割り振られた、実行順序が先である先行処理と、先行処理の実行が完了した後に実行させる後行処理とを含み、
異なるコア間で実行順序を維持するために、先行処理の実行が完了した際に、完了状態の記憶処理を並列プログラムに挿入する記憶処理挿入ステップ（Ｓ１１）と、
異なるコア間で実行順序を維持するために、完了状態が記憶されるのを待って、完了状態が記憶されたことを条件に後行処理の実行に移行させる待ち処理を並列プログラムに挿入する待ち処理挿入ステップ（Ｓ１２）と、
記憶処理を実行したコアに対して、記憶処理を実行したコアが先行処理後に実行した、先行処理及び後行処理のいずれでもない処理が完了すると、記憶処理を再度実行させる再記憶処理を並列プログラムに挿入する再記憶処理挿入ステップ（Ｓ１３）と、を有する点になる。
【００１２】
これによって、上記と同様に、早期にデッドロックから復帰可能な並列プログラムを生成できる。
【００１３】
また、本発明のさらなる特徴は、
一つのコアを有するシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）を複数のコアを有するマルチコアマイコン用に並列化した並列プログラムと、並列プログラムで動作するマルチコアマイコンとを備えた車載装置であって、
複数の処理は、異なるコアに割り振られた、実行順序が先である先行処理と、先行処理の実行が完了した後に実行させる後行処理とを含み、
マルチコアマイコンは、
異なるコア間で実行順序を維持するために、先行処理の実行が完了した際に、完了状態を記憶する記憶処理（Ｓ２１）と、
異なるコア間で実行順序を維持するために、完了状態が記憶されるのを待って、完了状態が記憶されたことを条件に後行処理の実行に移行させる待ち処理（Ｓ３１、Ｓ４３）と、
記憶処理を実行したコアが行う処理であり、記憶処理を実行したコアが先行処理後に実行した、先行処理及び後行処理のいずれでもない処理が完了すると、記憶処理を再度実行する再記憶処理（Ｓ３２、Ｓ４２）と、を有する点にある。
【００１４】
これによって、車載装置は、先行処理の実行が完了した際に完了状態を記憶し、完了状態が記憶されるのを待って完了状態が記憶されたことを条件に後行処理の実行に移行するので、異なるコア間で実行順序を維持できる。さらに、車載装置は、記憶処理を実行したコアが行う処理であり、先行処理後に実行した他の処理が完了すると記憶処理を再度実行するため、意図せず完了状態が消えた場合であっても、再度完了状態を記憶できる。このため、車載装置は、意図せず完了状態が消えて、後行処理の実行に移行できないデッドロックになった場合であっても、早期にデッドロックから復帰できる。
【００１５】
なお、特許請求の範囲、及びこの項に記載した括弧内の符号は、ひとつの態様として後述する実施形態に記載の具体的手段との対応関係を示すものであって、発明の技術的範囲を限定するものではない。
【図面の簡単な説明】
【００１６】
【図１】実施形態における並列化ツールの概略構成を示すブロック図である。
【図２】実施形態における車載装置の概略構成を示すブロック図である。
【図３】実施形態におけるコンピュータの処理動作を示すフローチャートである。
【図４】実施形態における処理実行順と同期ロジックを示す図面である。
【図５】実施形態における車載装置の状態セット処理を示すフローチャートである。
【図６】実施形態における車載装置の待ち処理を示すフローチャートである。
【図７】実施形態における車載装置の正常時の処理動作を示すタイムチャートである。
【図８】実施形態における車載装置のノイズ発生時の処理動作を示すタイムチャートである。
【図９】比較例における車載装置のノイズ発生時の処理動作を示すタイムチャートである。
【図１０】変形例１における車載装置の処理動作を示すフローチャートである。
【図１１】変形例２における処理実行順と同期ロジックを示す図面である。
【発明を実施するための形態】
【００１７】
以下において、図面を参照しながら、発明を実施するための複数の形態を説明する。各形態において、先行する形態で説明した事項に対応する部分には同一の参照符号を付して重複する説明を省略する場合がある。各形態において、構成の一部のみを説明している場合は、構成の他の部分については先行して説明した他の形態を参照し適用することができる。
【００１８】
本実施形態では、一つのコアを有するシングルコアマイコン用のシングルプログラムにおける並列可能な複数の処理（Ｔ１〜Ｔ１４）を第１コア２１ｃと第２コア２１ｄを有するマルチコアマイコン用に並列化した並列プログラム２１ａ１を生成する例を採用する。なお、並列プログラム２１ａ１を生成する際には、特開２０１５−１８０７号公報に記載されているように、シングルプログラムを解析して、複数の処理を第１コア２１ｃと第２コア２１ｄに割り振る処理などを行う。この点に関しては、特開２０１５−１８０７号公報を参照されたい。
【００１９】
以下においては、処理を処理ブロックとも称する。本実施形態では、複数の処理ブロックとして、図４に示すように、第１処理ブロックＴ１〜第１４処理ブロックＴ１４を採用する。また、複数の処理ブロックＴ１〜Ｔ１４は、異なるコアに割り振られた、実行順序が先である先行処理と、先行処理の実行が完了した後に実行させる後行処理とを含んでいる。後行処理は、先行処理の影響を受ける処理であり、例えば、先行処理で内容が更新される可能性があるデータなどを用いる処理である。例えば、第１処理ブロックＴ１と第８処理ブロックＴ８とは、第１処理ブロックＴ１が先行処理であり、第８処理ブロックＴ８が後行処理である。また、第３処理ブロックＴ３と第８処理ブロックＴ８とは、第８処理ブロックＴ８が先行処理であり、第３処理ブロックＴ３が後行処理である。
【００２０】
まず、コンピュータ１０と、車載装置２０の構成に関して説明する。コンピュータ１０は、並列化手順を実行する並列化ツールに相当する。図１に示すように、コンピュータ１０は、ディスプレイ１１、ＨＤＤ１２、ＣＰＵ１３、ＲＯＭ１４、ＲＡＭ１５、入力装置１６、読取部１７などを備えて構成されている。また、コンピュータ１０は、記憶媒体１８に記憶された記憶内容を読み取り可能に構成されている。なお、ＨＤＤは、hard disk driveの略称である。ＣＰＵは、Central Processing Unitの略称である。ＲＯＭは、Read Only Memoryの略称である。ＲＡＭは、Random Access Memoryの略称である。コンピュータ１０及び記憶媒体１８の構成は、特開２０１５−１８０７号公報に記載されたパーソナルコンピュータ１００及び記憶媒体１８０を参照されたい。
【００２１】
自動並列化コンパイラ１は、並列化方法に相当する。つまり、自動並列化コンパイラ１は、並列化方法が記述されたプログラムである。自動並列化コンパイラ１は、特開２０１５−１８０７号公報に記載されたものに加えて、状態セット処理の挿入手順、待ち処理の挿入手順、再状態セット処理の挿入手順を含んでいる。
【００２２】
状態セット処理の挿入手順は、コア２１ｃ，２１ｄ間で実行順序を維持するために、先行処理の実行が完了した際に、完了状態を記憶する状態セット処理Ｆ１〜Ｆ９を並列プログラム２１ａ１に挿入する手順である。つまり、状態セット処理の挿入手順は、コア２１ｃ，２１ｄが先行処理の実行を完了した際に、コア２１ｃ，２１ｄに状態セット処理を実行せるためである。
【００２３】
ここでは、完了状態の記憶方法として状態フラグＡ１、Ａ３、Ａ４、Ａ１３、Ｂ１、Ｂ１０、Ｂ１１、Ｂ１２、Ｂ１４を採用している。各状態フラグは、１がセットされている場合に完了状態を示し、１がセットされていない場合、すなわち０の場合に完了状態でないことを示す。このため、車載装置２０は、複数の先行処理の夫々に対応して状態フラグをセットできるように構成されている。この状態セット処理の挿入手順は、記憶処理挿入手順に相当する。また、状態セット処理は、完了状態の記憶処理に相当する。
【００２４】
待ち処理の挿入手順は、コア２１ｃ，２１ｄ間で実行順序を維持するために、状態フラグがセットされるのを待って、状態フラグがセットされたことを条件に後行処理の実行に移行させる待ち処理Ｗ１〜Ｗ９を並列プログラム２１ａ１に挿入する手順である。よって、待ち処理Ｗ１〜Ｗ９の挿入手順は、先行処理が完了するのを待って、先行処理が完了したことを条件に後行処理の実行に移行させる待ち処理Ｗ１〜Ｗ９を挿入する手順と言える。つまり、待ち処理Ｗ１〜Ｗ９の挿入手順は、コア２１ｃ，２１ｄに対して、状態フラグがセットされるのを待って、状態フラグがセットされたことを条件に後行処理の実行に移行させるためである。この待ち処理Ｗ１〜Ｗ９の挿入手順は、待ち処理挿入手順に相当する。
【００２５】
再状態セット処理の挿入手順は、状態セット処理を実行したコア２１ｃ，２１ｄに対して、先行処理後に実行した他の処理ブロックが完了すると、状態セット処理を再度実行させる再状態セット処理Ｗ１〜Ｗ９を、並列プログラム２１ａ１に挿入する手順である。つまり、再状態セット処理の挿入手順は、状態セット処理を実行したコア２１ｃ，２１ｄに対して、先行処理後に実行した他の処理ブロックが完了すると、状態セット処理を再度実行させるためである。この再状態セット処理の挿入手順は、再記憶処理挿入手順に相当する。
【００２６】
また、本実施形態では、全コアの処理を同時に完了させるための同期処理として、並列プログラム２１ａ１の最後に、状態セット処理と待ち処理を挿入する手順を有した自動並列化コンパイラ１を採用している。一例として、自動並列化コンパイラ１では、図４に示すように、状態セット処理Ｆ４と待ち処理Ｗ５、及び状態セット処理Ｆ９と待ち処理Ｗ９を挿入する手順を採用している。これによって、自動並列化コンパイラ１は、第１コア２１ｃと第２コア２１ｄが同時に処理を完了可能な並列プログラム２１ａ１を生成できる。
【００２７】
なお、本実施形態では、状態セット処理を実行したコア２１ｃ，２１ｄが他の処理ブロックが完了した後に待ち処理Ｗ１〜Ｗ９を実行する例を採用している。さらに、本実施形態では、状態セット処理を実行したコア２１ｃ，２１ｄによる待ち処理Ｗ１〜Ｗ９中に実行される再状態セット処理を挿入する再状態セット処理の挿入手順を採用している。よって、本実施形態では、待ち処理と再記憶処理とに同じ符号Ｗ１〜Ｗ９を付与している。しかしながら、本発明はこれに限定されない。並列化方法は、状態セット処理Ｆ１〜Ｆ９後に実行される再状態セット処理を挿入する再状態セット処理の挿入手順であってもよい。
【００２８】
車載装置２０は、図２に示すように、マルチコアプロセッサ２１、ＲＯＭ２１ａ、ＲＡＭ２１ｂ、第１コア２１ｃ、第２コア２１ｄ、通信部２２、センサ部２３、入出力ポート２４を備えて構成されている。車載装置２０は、例えば、自動車に搭載されたエンジン制御装置やハイブリッド制御装置などに適用できる。ここでは、一例として、車載装置２０をエンジン制御装置に適用した例を採用する。この場合、並列プログラム２１ａ１は、エンジン制御などの自動車制御プログラムと言える。なお、マルチコアプロセッサは、マルチコアマイコンに相当する。また、コアは、プロセッサエレメントとも称することができる。
【００２９】
ＲＡＭ２１ｂ、通信部２２、センサ部２３、入出力ポート２４は、特開２０１５−１８０７号公報に記載されたＲＡＭ４２０．通信部４３０、センサ部４５０、入出力ポート４６０を参照されたい。
【００３０】
ＲＯＭ２１ａには、並列化方法で生成された並列プログラム２１ａ１が記憶されている。第１コア２１ｃと第２コア２１ｄは、並列プログラム２１ａ１を実行することで、エンジン制御を行う。
【００３１】
次に、図３、図４を用いて、コンピュータ１０の処理動作に関して説明する。ＣＰＵ１３は、入力装置１６によって挿入処理の実行指示がなされた場合に、図３に示すフローチャートを実行する。ＣＰＵ１３は、自動並列化コンパイラ１を実行することで、シングルプログラムから並列プログラム２１ａ１を生成する。ＣＰＵ１３は、特開２０１５−１８０７号公報に記載された手順に従って並列プログラム２１ａ１を生成する際に、下記のステップＳ１１〜Ｓ１３を実行する。
【００３２】
ステップＳ１１では、状態セット処理の挿入ステップを行う（記憶処理挿入ステップ）。ＣＰＵ１３は、自動並列化コンパイラ１における状態セット処理の挿入手順を実行する。つまり、ＣＰＵ１３は、状態セット処理Ｆ１〜Ｆ９を並列プログラム２１ａ１に挿入する。本実施形態では、図４に示すように、例えば、第１処理ブロックＴ１の後に状態セット処理Ｆ１、第８処理ブロックＴ８の後に状態セット処理Ｆ８を挿入する。このように、ステップＳ１１は、状態セット処理の挿入手順を実行する処理であるため、記憶処理挿入手順とも言える。
【００３３】
ステップＳ１２では、待ち処理の挿入ステップを行う（待ち処理挿入ステップ）。ＣＰＵ１３は、自動並列化コンパイラ１における待ち処理の挿入手順を実行する。つまり、ＣＰＵ１３は、待ち処理Ｗ１〜Ｗ９を並列プログラム２１ａ１に挿入する。本実施形態では、図４に示すように、例えば、第８処理ブロックＴ８の前に待ち処理Ｗ６、第３処理ブロックＴ３の前に待ち処理Ｗ１を挿入する。このように、ステップＳ１２は、待ち処理の挿入手順を実行する処理であるため、待ち処理挿入手順とも言える。
【００３４】
ステップＳ１３では、再状態セット処理の挿入ステップを行う（再記憶処理挿入ステップ）。ＣＰＵ１３は、自動並列化コンパイラ１における再状態セット処理の挿入手順を実行する。つまり、ＣＰＵ１３は、再状態セット処理を並列プログラム２１ａ１に挿入する。このように、ステップＳ１３は、再状態セット処理の挿入手順を実行する処理であるため、再記憶処理挿入手順とも言える。
【００３５】
また、本実施形態では、全コアの処理を同時に完了させるための同期処理として、並列プログラム２１ａ１の最後に、状態セット処理と待ち処理を挿入するコンピュータ１０を採用している。一例として、コンピュータ１０は、図４に示すように、状態セット処理Ｆ４と待ち処理Ｗ５、及び状態セット処理Ｆ９と待ち処理Ｗ９を挿入する。これによって、コンピュータ１０は、第１コア２１ｃと第２コア２１ｄｇが同時に処理を完了可能な並列プログラム２１ａ１を生成できる。
【００３６】
本実施形態では、待ち処理中に実行される再状態セット処理を挿入する例を採用している。このため、本実施形態では、図４に示すように、例えば、第８処理ブロックＴ８の前に再状態セット処理を含む待ち処理Ｗ６、第３処理ブロックＴ３の前に再状態セット処理を含む待ち処理Ｗ１を挿入する。本実施形態では、例えば図４の第３処理ブロックの前に挿入しているdo{A1=1}while(B8=0)のように、再状態セット処理を含む待ち処理をdo-while文で表している。この場合、第１コア２１ｃは、状態フラグＢ８が０の間は１がセットされるのを待つとともに状態フラグＡ１に１をセットし、状態フラグＢ８に１がセットされたことを条件に第３処理ブロックＴ３の実行に移行させる。このように、コンピュータ１０は、待ち処理Ｗ１〜Ｗ９中に実行される再状態セット処理を並列プログラム２１ａ１に挿入するため、再状態セット処理によるオーヘッドを小さくできる並列プログラム２１ａ１を生成できる。また、本実施形態の並列化方法は同様の効果を奏することができる。
【００３７】
なお、本発明はこれに限定されない。コンピュータ１０は、状態セット処理Ｆ１〜Ｆ９後に実行される再状態セット処理を挿入してもよい。
【００３８】
このように、本実施形態では、コンピュータ１０が、特開２０１５−１８０７号公報に記載された並列化方法に加えて、ステップＳ１３を実行することで、並列プログラム２１ａ１を生成する。しかしながら、本発明はこれに限定されない。作業者などが、特開２０１５−１８０７号公報に記載された並列化方法に加えて、ステップＳ１３を行うことで、並列プログラム２１ａ１を生成してもよい。
【００３９】
このようにして生成された並列プログラム２１ａ１の一例を図４に示す。この例では、第１コア２１ｃに第１処理ブロックＴ１〜第６処理ブロックＴ６、第１３処理ブロックＴ１３が割り振られており、第２コア２１ｄに第７処理ブロックＴ７〜第１２処理ブロックＴ１２、第１４処理ブロックＴ１４が割り振られている。また、並列プログラム２１ａ１では、第１処理ブロックＴ１や第８処理ブロックＴ８の後に、状態セット処理Ｆ１、Ｆ５が挿入されている。さらに、並列プログラム２１ａ１では、第３処理ブロックＴ３や第８処理ブロックＴ８の前に、再状態セット処理を含む待ち処理Ｗ１、Ｗ６が挿入されている。
【００４０】
以上のように、コンピュータ１０は、先行処理の実行が完了した際に、状態セット処理を並列プログラム２１ａ１に挿入するとともに、状態フラグに１が記憶されたことを条件に後行処理の実行に移行させる待ち処理を並列プログラム２１ａ１に挿入する。このため、コンピュータ１０は、第１コア２１ｃと第２コア２１ｄに割り振られた先行処理と後行処理の実行順序を維持可能な並列プログラム２１ａ１を生成できる。
【００４１】
さらに、コンピュータ１０は、状態セット処理を再度実行させる再状態セット処理を並列プログラム２１ａ１に挿入するため、意図せず状態フラグの値が消えた場合であっても、再度状態フラグに１をセット可能な並列プログラムとすることができる。このため、コンピュータ１０は、意図せず状態フラグの値が消えて、後行処理の実行に移行できないデッドロックになった場合に、早期にデッドロックから復帰可能な並列プログラム２１ａ１を生成できる。
【００４２】
また、コンピュータ１０は、待ち処理中に実行される再状態セット処理を並列プログラム２１ａ１に挿入するため、再状態セット処理によるオーヘッドを小さくできる並列プログラムを生成できる。なお、自動並列化コンパイラ１は、コンピュータ１０と同様の効果を奏することができる。
【００４３】
次に、図４に加えて、図５〜図９を用いて、第１コア２１ｃ及び第２コア２１ｄの処理動作に関して説明する。
【００４４】
第１コア２１ｃと第２コア２１ｄは、図４の並列プログラム２１ａ１における自身に割り振られた処理を上から順番に実行すると同時に、コア間で順序を守るべく同期をとって処理を実行していく。つまり、第１コア２１ｃは、処理実行のトリガに応じて、第１処理ブロックＴ１から順番に処理を実行する。一方、第２コア２１ｄは、処理実行のトリガに応じて、第７処理ブロックＴ７から順番に処理を実行する。
【００４５】
また、第１コア２１ｃと第２コア２１ｄは、図５に示すように、処理ブロックの実行が完了して状態セット処理を実行する際には、状態フラグをセットする（ステップＳ２１）。つまり、第１コア２１ｃと第２コア２１ｄは、処理ブロックの実行が完了したことを記憶するために、状態フラグに１をセットする。例えば、第１コア２１ｃは、図４、図７に示すように、第１処理ブロックＴ１の実行が完了すると、タイミングｔｍ１で状態セット処理Ｆ１を実行して状態フラグＡ１に１をセットする。第２コア２１ｄは、第８処理ブロックＴ８の実行が完了すると、タイミングｔｍ４で状態セット処理Ｆ５を実行して状態フラグＢ８に１をセットする。各処理ブロックと各状態フラグとは、一対一の対応関係をなしている。よって、第１コア２１ｃと第２コア２１ｄは、複数の処理ブロックＴ１〜Ｔ１４のうち、どの処理ブロックの実行が完了しているかを記憶しておくと言える。
【００４６】
この状態セット処理Ｆ１〜Ｆ９は、第１コア２１ｃと第２コア２１ｄ間で実行順序を維持するための処理である。言い換えると、状態セット処理Ｆ１〜Ｆ９は、第１コア２１ｃと第２コア２１ｄにおける同期のために、処理ブロックの実行が完了したことを記録するブロックである。
【００４７】
よって、第１コア２１ｃと第２コア２１ｄは、相手コアとの間で実行順序を維持するために、先行処理の実行が完了した際に、その先行処理の完了状態を記憶する。第１コア２１ｃは、自身に割り振られた先行処理の後に、第２コア２１ｄに割り振られた後行処理が実行されるように、状態セット処理を実行する。また、第１コア２１ｃは、自身に割り振られた先行処理の実行が完了したことを、後行処理が割り振られた第２コア２１ｄに知らせるために、状態セット処理を実行すると言える。例えば、第１コア２１ｃは、自身に割り振られた第１処理ブロックＴ１の後に、第２コア２１ｄに割り振られた第８処理ブロックＴ８が実行されるように、状態セット処理Ｆ１を実行する。
【００４８】
同様に、第２コア２１ｄは、自身に割り振られた先行処理の後に、第２コア２１ｄに割り振られた後行処理が実行されるように、状態セット処理を実行する。また、第２コア２１ｄは、自身に割り振られた先行処理の実行が完了したことを、後行処理が割り振られた第１コア２１ｃに知らせるために、状態セット処理を実行すると言える。例えば、第２コア２１ｄは、自身に割り振られた第８処理ブロックＴ８の後に、第１コア２１ｃに割り振られた第３処理ブロックＴ３が実行されるように、状態セット処理Ｆ５を実行する。
【００４９】
また、第１コア２１ｃと第２コア２１ｄは、待ち処理を実行する際、図６に示すフローチャートを実行する。ステップＳ３２では、先行処理の状態フラグが０であるか否かを判定する。第１コア２１ｃと第２コア２１ｄは、先行処理の状態フラグが０と判定した場合、ステップＳ３１へ進み、先行処理の状態フラグが１と判定した場合、図６の処理を終了する。
【００５０】
第１コア２１ｃと第２コア２１ｄは、先行処理の状態フラグが１と判定した場合、次の処理ブロックの実行に移行する。つまり、第１コア２１ｃと第２コア２１ｄは、先行処理の状態フラグが１になるのを待って、後行処理の実行に移行する。例えば、第２コア２１ｄは、図４、図７に示すように、待ち処理Ｗ６において、タイミングｔｍ２で状態フラグＡ１に１がセットされていると判定した場合、第８処理ブロックＴ８の実行に移行する。また、第１コア２１ｃは、待ち処理Ｗ１において、タイミングｔｍ３から状態フラグＢ８が０であるか否かを判定し、タイミングｔｍ４で状態フラグＢ８に１がセットされていると判定した場合、第３処理ブロックＴ３の実行に移行する。
【００５１】
なお、先行処理の状態フラグが１であるか否か、すなわち相手コアの処理ブロックの実行が完了したか否かを確認することを、以下ではポーリングとも称する。また、先行処理の実行が完了したことを待って、後行処理の実行に移行することを、待ち合わせ処理とも称する。また、相手コアの処理ブロックの実行が完了したか否かを確認する方法は、状態フラグの再セットが定期的に実施されればポーリング以外の方法でもよい。
【００５２】
ステップＳ３１では、自身の状態フラグを再セットする。第１コア２１ｃと第２コア２１ｄは、再度、自身の状態フラグに１をセットして、ステップＳ３２へ進む。このように、第１コア２１ｃと第２コア２１ｄは、先行処理の状態フラグが０の間は１がセットされるのを待つとともに、自身がセットした状態フラグに１をセットする。例えば、第１コア２１ｃは、待ち処理Ｗ１において、状態フラグＢ８が０であるタイミングｔｍ３〜ｔｍ４の間、状態フラグＡ１に１をセットする。
【００５３】
なお、図７の例における状態フラグＡ１は、タイミングｔｍ１で１がセットされてから０になることなく、１が維持されている。つまり、図７は、正常時の状態フラグＡ１を示している。このように、状態フラグが正常の場合、第１コア２１ｃと第２コア２１ｄは、ステップＳ３１において、１がセットされた状態フラグに再度１をセットすることになる。
【００５４】
しかしながら、状態フラグは、ノイズなどによって値が変わってしまうこともある。つまり、状態フラグは、意図せず完了状態である１が消えて０になってしまうことがある。この点に関して、図９を用いて説明する。比較例の並列プログラムは、ステップＳ３１の処理が含まれておらず、その他の本実施形態と同様である。
【００５５】
比較例の並列プログラムを実行する第１コアは、タイミングｔｍ２１で状態フラグＡ１に１をセットする。しかしながら、状態フラグＡ１は、タイミングｔｍ２２で、ノイズなどによって意図せず１が消えて０となってしまう。
【００５６】
このため、第２コアは、タイミングｔｍ２３でポーリングを開始しても、状態フラグＡ１が０のままなので、第８処理ブロックＴ８を実行できない。つまり、第２コアは、ポーリングが継続されてデッドロック状態となってしまう。さらに、この比較例では、第２コアが第８処理ブロックＴ８を実行できないため、状態フラグＢ８に１がセットされない。このため、第１コアは、タイミングｔｍ２４でポーリングを開始しても、状態フラグＢ８が０のままなので、第３処理ブロックＴ３を実行できない。つまり、第１コアは、ポーリングが継続されてデッドロック状態となってしまう。
【００５７】
ここで、図８を用いて、状態フラグの値が意図せず変わってしまった場合の第１コア２１ｃと第２コア２１ｄの処理動作に関して説明する。並列プログラム２１ａ１は、再状態セット処理を含む待ち処理Ｗ１〜Ｗ９を有している。そして、第１コア２１ｃと第２コア２１ｄは、この並列プログラムを実行するため、上記のように、先行処理の状態フラグが０の間は１がセットされるのを待つとともに、自身がセットした状態フラグに１をセットする。
【００５８】
第１コア２１ｃは、タイミングｔｍ１１で状態フラグＡ１に１をセットする。しかしながら、状態フラグＡ１は、タイミングｔｍ１２で、ノイズなどによって意図せず１が消えて０となってしまう。一方、第２コア２１ｄは、タイミングｔｍ１３でポーリングを開始する。
【００５９】
この場合、第１コア２１ｃは、タイミングｔｍ１４でポーリングを開始する。そして、第１コア２１ｃは、状態フラグＢ８が０であるため、タイミングｔｍ１５以降で、状態フラグＡ１に１をセットする。これによって、第１コア２１ｃは、ノイズなどで０になった状態フラグＡ１を再度１に戻すことができる。従って、第２コア２１ｄは、タイミングｔｍ１５以降で、第８処理ブロックＴ８を実行に移行できる。
【００６０】
以上のように、車載装置２０の第１コア２１ｃと第２コア２１ｄは、先行処理の実行が完了した際に状態フラグに１をセットし、状態フラグに１がセットされるのを待ち、状態フラグに１がセットされたことを条件に後行処理の実行に移行する。このため、車載装置２０は、第１コア２１ｃと第２コア２１ｄとの間で実行順序を維持できる。
【００６１】
さらに、車載装置２０の第１コア２１ｃと第２コア２１ｄは、状態セット処理を実行したコアが行う処理であり、先行処理後に実行した他の処理ブロックの実行が完了すると状態セット処理を再度実行する。このため、車載装置２０の第１コア２１ｃと第２コア２１ｄは、意図せず状態フラグの値が消えた場合であっても、再度状態フラグに１をセットできる。このため、車載装置２０は、意図せず状態フラグの値が消えて、後行処理の実行に移行できないデッドロックになった場合であっても、早期にデッドロックから復帰できる。
【００６２】
また、車載装置２０の第１コア２１ｃと第２コア２１ｄは、再状態セット処理を含む待ち処理Ｗ１〜Ｗ９を実行するため、再状態セット処理によるオーヘッドを小さくできる。つまり、車載装置２０の第１コア２１ｃと第２コア２１ｄは、先行処理の実行を待っている間に、すなわち、エンジン制御における有効な演算などを行っていない間に、再状態セット処理を行うため、再状態セット処理によるオーヘッドを小さくできる。
【００６３】
以上、本発明の好ましい実施形態について説明した。しかしながら、本発明は、上記実施形態に何ら制限されることはなく、本発明の趣旨を逸脱しない範囲において、種々の変形が可能である。以下において、本発明のその他の形態である変形例１、２に関して説明する。上記実施形態及び変形例１、２は、夫々単独で実施することも可能であるが、適宜組み合わせて実施することも可能である。本発明は、実施形態において示された組み合わせに限定されることなく、種々の組み合わせによって実施可能である。
【００６４】
（変形例１）
変形例１の自動並列化コンパイラ１は、異常判断処理を並列プログラム２１ａ１に挿入する異常判断処理挿入手順を有していてもよい。また、変形例１のコンピュータ１０は、異常判断処理を並列プログラム２１ａ１に挿入する異常判断処理挿入ステップを有していてもよい。よって、変形例１の第１コア２１ｃと第２コア２１ｄは、異常判断処理を実行することになる。なお、異常判断処理は、判断処理に相当する。
【００６５】
なお、変形例１の異常判断処理は、再状態セット時に、状態フラグが０であるか否かによって、状態フラグに異常が生じているか否かを判断する処理である。つまり、異常判断処理は、再状態セット時に、再状態セット時の状態フラグの値と、再状態セット前の状態フラグの値とを比較し、両値が異なる場合に異常と判断するとも言える。この異常判断処理は、変形例２の異常判断処理とは異なる。なお、ここでは、便宜的に上記実施形態と同じ符号を用いている。
【００６６】
変形例１の第１コア２１ｃと第２コア２１ｄは、待ち処理を実行する際、図１０に示すフローチャートを実行する。
【００６７】
ステップＳ４０では、状態フラグのいずれかが０であるか否かを判定する。第１コア２１ｃと第２コア２１ｄは、状態フラグのいずれかが０であると判定した場合、ステップＳ４１へ進み、状態フラグのいずれかが０であると判定しなかった場合、ステップＳ４２へ進む。例えば、第１コア２１ｃは、待ち処理Ｗ２を実行する場合、状態フラグＡ１、Ａ３、Ａ４のいずれかが０と判定した場合はステップＳ４１へ進む。状態フラグＡ１、Ａ３、Ａ４は、再状態セット時に１がセットされる。よって、状態フラグＡ１、Ａ３、Ａ４のいずれかが０の場合、再状態セット時の記憶内容と再状態セット前の記憶内容とが異なることになる。
【００６８】
また、第１コア２１ｃは、状態フラグＡ１、Ａ３、Ａ４の全てが１であると判定した場合はステップＳ４２へ進む。なお、第１コア２１ｃは、待ち処理Ｗ１を実行する場合、状態フラグＡ１が０であるか否かを判定することになる。よって、ステップＳ４０で判定する状態フラグの数は、一つの場合と複数の場合がある。
【００６９】
ステップＳ４１では、異常フラグをセットする。第１コア２１ｃと第２コア２１ｄは、状態フラグが異常であることを記憶するために、異常フラグに１をセットする。異常フラグは、１がセットされている場合に異常状態を示し、１がセットされていない場合、すなわち０の場合に異常状態でないことを示す。
【００７０】
なお、ステップＳ４２は、上記ステップＳ３１と同様である。また、ステップＳ４３は、上記３２と同様である。
【００７１】
このように、変形例１の自動並列化コンパイラ１及びコンピュータ１０は、判断処理を並列プログラム２１ａ１に挿入するため、意図せず状態フラグの値が消えたか否かを判断可能な並列プログラムを生成できる。また、変形例１の第１コア２１ｃと第２コア２１ｄは、意図せず状態フラグの値が消えたか否か、すなわち状態フラグに異常が生じたか否かを判断できる。
【００７２】
さらに、変形例１の自動並列化コンパイラ１及びコンピュータ１０は、異常と判断した場合に異常フラグをセットする処理を並列プログラム２１ａ１に挿入するため、状態フラグに異常が生じたことを記憶可能な並列プログラムを生成できる。また、変形例１の第１コア２１ｃと第２コア２１ｄは、異常と判断した場合に異常フラグをセットするため、状態フラグに異常が生じたことを記憶できる。
【００７３】
（変形例２）
変形例２では、記憶処理Ｒ１〜Ｒ９の内容、待ち処理の内容、再記憶処理の内容が上記実施形態と異なる。よって、変形例２の自動並列化コンパイラ１は、変形例２における記憶処理、待ち処理、再記憶処理の夫々を並列プログラムに挿入する手順を有している。また、コンピュータ１０は、変形例２における記憶処理、待ち処理、再記憶処理の夫々を並列プログラムに挿入するステップを有している。さらに、第１コア２１ｃと第２コア２１ｄは、変形例２における記憶処理、待ち処理、再記憶処理を有した並列プログラムに従って動作する。なお、ここでは、便宜的に上記実施形態と同じ符号を用いている。
【００７４】
変形例２の記憶処理Ｒ１〜Ｒ９は、第１コア２１ｃと第２コア２１ｄ間で実行順序を維持するために、先行処理の実行が完了した際に、ＲＡＭにおける状態値Ａ、Ｂをインクリメントすることで完了状態を記憶する。例えば、第１コア２１ｃは、図１１に示すように、第１処理ブロックＴ１の実行が完了すると、記憶処理Ｒ１で状態値Ａをインクリメントとし、第３処理ブロックＴ３の実行が完了すると、記憶処理Ｒ２で状態値Ａをさらにインクリメントとする。同様に、第２コア２１ｄは、第８処理ブロックＴ８の実行が完了すると、記憶処理Ｒ５で状態値Ｂをインクリメントとし、第１０処理ブロックＴ１０の実行が完了すると、記憶処理Ｒ６で状態値Ｂをさらにインクリメントとする。なお、第１コア２１ｃと第２コア２１ｄは、最初の処理ブロックを実行する前に、ＲＡＭの状態値Ａ、Ｂに初期値を書き込む。例えば、状態値Ａ、Ｂは、初期値が０で、インクリメントする毎に１、２，３と更新される。また、状態値Ａ、Ｂの更新方法はインクリメントでなく値の書き込みでもよい。
【００７５】
変形例２の待ち処理ＷＲ１〜ＷＲ９は、第１コア２１ｃと第２コア２１ｄ間で実行順序を維持するために、状態値Ａ、Ｂがインクリメントされるのを待って、状態値Ａ、Ｂがインクリメントされたことを条件に後行処理の実行に移行させる。また、変形例２の再記憶処理は、記憶処理を実行した第１コア２１ｃと第２コア２１ｄに対して、先行処理後に実行した他の処理ブロックが完了すると、記憶処理を再度実行させる。なお、変形例２の再記憶処理は、記憶処理を再度実行させるとき、一つ前の値を状態値として書き込ませる。ここでは、再記憶処理を含む待ち処理ＷＲ１〜ＷＲ９を採用している。
【００７６】
例えば、第１コア２１ｃは、図１１の待ち処理ＷＲ１で、状態値Ｂが１より小さい間は１が書き込まれるのを待つとともに状態値Ａに一つ前の値１を書き込み、状態値Ｂが１以上になったことを条件に第３処理ブロックＴ３の実行に移行させる。同様に、第１コア２１ｃは、待ち処理ＷＲ２で、状態値Ｂが２より小さい間は２が書き込まれるのを待つとともに状態値Ａに一つ前の値３を書き込み、状態値Ｂが２以上になったことを条件に第５処理ブロックＴ５の実行に移行させる。また、第２コア２１ｄは、待ち処理ＷＲ７で、状態値Ａが２より小さい間は２が書き込まれるのを待つとともに状態値Ｂに一つ前の値１を書き込み、状態値Ａが２以上になったことを条件に第１０処理ブロックＴ１０の実行に移行させる。
【００７７】
なお、変形例２の自動並列化コンパイラ１は、異常判断処理を並列プログラム２１ａ１に挿入する異常判断処理挿入手順を有していてもよい。また、変形例２のコンピュータ１０は、異常判断処理を並列プログラム２１ａ１に挿入する異常判断処理挿入ステップを有していてもよい。よって、変形例２の第１コア２１ｃと第２コア２１ｄは、異常判断処理を実行することになる。
【００７８】
変形例２の異常判断処理は、再記憶処理時の状態値が、再記憶処理前の状態値と一緒であるか否かによって、状態値に異常が生じているか否かを判断する処理である。例えば、第１コア２１ｃは、待ち処理ＷＲ３で状態値Ａとして３を書き込む再に、ＲＡＭ２１ｂの状態値Ａが３でなかった場合、異常と判断する。そして、第１コア２１ｃは、異常と判断した場合、異常フラグに１をセットする。
【００７９】
また、本変形例では、上記実施形態と同様に、同期処理として、並列プログラム２１ａ１の最後に、状態セット処理と待ち処理を挿入する手順を有した自動並列化コンパイラ１を採用している。本変形例では、同期処理として、並列プログラム２１ａ１の最後に、状態セット処理と待ち処理を挿入するコンピュータ１０を採用している。同期処理は、記憶処理Ｒ４と待ち処理ＷＲ５、及び記憶処理Ｒ９と待ち処理ＷＲ９である。
【００８０】
変形例２の自動並列化コンパイラ１及びコンピュータ１０は、変形例１と同様の効果を奏することができる。また、変形例２の第１コア２１ｃと第２コア２１ｄは、変形例１と同様の効果を奏することができる。
【符号の説明】
【００８１】
１  自動並列化コンパイラ、１０  コンピュータ、１１  ディスプレイ、１２  ＨＤＤ、１３  ＣＰＵ、１４  ＲＯＭ、１５  ＲＡＭ、１６  入力装置、１７  読取部、１８  記憶媒体、２０  車載装置、２１  マルチコアプロセッサ、２１ａ  ＲＯＭ、２１ａ１  並列プログラム、２１ｂ  ＲＡＭ、２１ｃ  第１コア、２１ｄ  第２コア、２２  通信部、２３  センサ部、２４  入出力ポート
【図１】
0006488953.tif 000002
【図２】
0006488953.tif 000003
【図３】
0006488953.tif 000004
【図４】
0006488953.tif 000005
【図５】
0006488953.tif 000006
【図６】
0006488953.tif 000007
【図７】
0006488953.tif 000008
【図８】
0006488953.tif 000009
【図９】
0006488953.tif 000010
【図１０】
0006488953.tif 000011
【図１１】
0006488953.tif 000012