(57)【特許請求の範囲】
【請求項１】
シングルコアプロセッサで処理可能なように記述された逐次プログラムからマルチコアプロセッサ（２１）で処理可能なように並列化した分割プログラムを生成するコンピュータが実行する並列化コンパイル方法であって、
前記逐次プログラムは複数のマクロタスクによって構成され、前記複数のマクロタスクに含まれる少なくとも２以上のマクロタスクは相互にデータ依存関係を有しており、
前記逐次プログラムを前記分割プログラムにコンパイルするにあたって、前記データ依存関係の少なくとも一部を無効化する無効化情報の有無を判断する無効化手順と、
前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記データ依存関係の少なくとも一部を無効化して前記分割プログラムをコンパイルする生成手順と、
前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記無効化手順において無効化情報有りとされた前記２以上のマクロタスクに含まれる第１マクロタスクが、別のマクロタスクとデータ依存関係を有していたものの、前記２以上のマクロタスクに含まれる第２マクロタスクとのデータ依存関係を有することにより前記別のマクロタスクとのデータ依存関係が不要になったためそのデータ依存関係が解消されているか否かを判断するタイミング判断手順と、を備え、
前記生成手順では、前記分割プログラムのコンパイルにあたって、前記別のマクロタスクと前記第１マクロタスクとのデータ依存関係を回復させる、ことを特徴とする並列化コンパイル方法。
【請求項２】
シングルコアプロセッサで処理可能なように記述された逐次プログラムからマルチコア
プロセッサ（２１）で処理可能なように並列化した分割プログラムをコンピュータに生成させるための並列化コンパイラ（１）であって、
前記逐次プログラムは複数のマクロタスクによって構成され、前記複数のマクロタスクに含まれる少なくとも２以上のマクロタスクは相互にデータ依存関係を有しており、
前記逐次プログラムを前記分割プログラムにコンパイルするにあたって、前記データ依存関係の少なくとも一部を無効化する無効化情報の有無を判断する無効化手順と、
前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記データ依存関係の少なくとも一部を無効化して前記分割プログラムをコンパイルする生成手順と、
前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記無効化手順において無効化情報有りとされた前記２以上のマクロタスクに含まれる第１マクロタスクが、別のマクロタスクとデータ依存関係を有していたものの、前記２以上のマクロタスクに含まれる第２マクロタスクとのデータ依存関係を有することにより前記別のマクロタスクとのデータ依存関係が不要になったためそのデータ依存関係が解消されているか否かを判断するタイミング判断手順と、を前記コンピュータに実行可能にさせるように構成され、
前記生成手順では、前記分割プログラムのコンパイルにあたって、前記別のマクロタスクと前記第１マクロタスクとのデータ依存関係を回復させる、ことを特徴とする並列化コンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シングルコアプロセッサ用に記述された逐次プログラムからマルチコアプロセッサ用に並列化した分割プログラムを生成する並列化コンパイル方法、及び並列化コンパイラに関する。
【背景技術】
【０００２】
自動車における制御系，情報系の高度化，統合化のためには、それらを実現するためのプロセッサの高能力化が重要となる。例えば、安全，快適で燃費の良い自動車開発のために重要なエンジン制御系を高度化するためには、制御アルゴリズムの高度化や新たな制御機能の実現等、計算負荷の増大が避けられない。このような問題を解決する為には、リアルタイム制御を実現しているプロセッサの高速化が必須となる。
【０００３】
しかし、従来のようにプロセッサの動作周波数を向上させることは、消費電力が周波数の三乗に比例して増大するため、困難となっている。このため、１チップ上に低動作周波数のプロセッサコアを複数集積し、電力削減のために低周波数化・低電圧化したプロセッサコアを並列動作させることで、処理の高速化と低電力化を同時に実現可能なマルチコアプロセッサへの移行が急ピッチで行われている。
【０００４】
マルチコアプロセッサにて、シングルコアプロセッサよりも高速な処理を行うためには、シングルコアプロセッサ用の逐次プログラムの処理を分割し、プロセッサコア間の通信が最小になる形で各プロセッサコアに各処理を割り当てる必要がある。従来、このような逐次プログラムの並列化の作業は人手で行う必要があったが、このような作業は大変困難で長期間を要し、開発費の増加や並列化されたプログラムの信頼性等、多くの課題が生じている。
【０００５】
下記特許文献１では、開発期間や開発費を抑えつつ、信頼性が高く、高速な処理が可能な車載装置用の組込みシステム向けの並列化プログラムを作成することができる並列化コンパイル方法が提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１５−１８０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従来の並列化手法では、複数のマクロタスク間のデータ依存関係と分割後の処理時間とを勘案し、シングルコアプロセッサ用に記述された逐次プログラムをマルチコアプロセッサ用の分割プログラムにコンパイルしていた。しかしながら、特に自動車分野の逐次プログラムでは、逐次プログラムに含まれる複数のマクロタスク間のデータ依存関係が複雑であり、それら全てのデータ依存関係を勘案することも難しい。またデータ依存関係を勘案した分割プログラムを生成しても、そのデータ依存関係に縛られて処理時間が平均化されず並列化の効果を十分に発揮できていない状況にあった。
【０００８】
本発明はこのような課題に鑑みてなされたものであり、その目的は、逐次プログラムを構成するマクロタスクが相互に複雑なデータ依存関係を有している場合であっても、処理時間の平均化を図ることが可能な並列化コンパイル方法、及び並列化コンパイラを提供することにある。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明に係る並列化コンパイル方法は、シングルコアプロセッサで処理可能なように記述された逐次プログラムからマルチコアプロセッサで処理可能なように並列化した分割プログラムを生成する並列化コンパイル方法であって、前記逐次プログラムは複数のマクロタスクによって構成され、前記複数のマクロタスクに含まれる少なくとも２以上のマクロタスクは相互にデータ依存関係を有しており、前記逐次プログラムを前記分割プログラムにコンパイルするにあたって、前記データ依存関係の少なくとも一部を無効化する無効化情報の有無を判断する無効化手順と、前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記データ依存関係の少なくとも一部を無効化して前記分割プログラムをコンパイルする生成手順と、を備えることを特徴とする。
【００１０】
上記課題を解決するために、本発明に係る並列化コンパイル方法は、シングルコアプロセッサで処理可能なように記述された逐次プログラムからマルチコアプロセッサで処理可能なように並列化した分割プログラムを生成するコンピュータが実行する並列化コンパイル方法であって、前記逐次プログラムは複数のマクロタスクによって構成され、前記複数のマクロタスクに含まれる少なくとも２以上のマクロタスクは相互にデータ依存関係を有しており、前記逐次プログラムを前記分割プログラムにコンパイルするにあたって、前記データ依存関係の少なくとも一部を無効化する無効化情報の有無を判断する無効化手順と、前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記データ依存関係の少なくとも一部を無効化して前記分割プログラムをコンパイルする生成手順と、前記無効化手順における判断の結果、前記無効化情報が有る場合に、前記無効化手順において無効化情報有りとされた前記２以上のマクロタスクに含まれる第１マクロタスクが、別のマクロタスクとデータ依存関係を有していたものの、前記２以上のマクロタスクに含まれる第２マクロタスクとのデータ依存関係を有することにより前記別のマクロタスクとのデータ依存関係が不要になったためそのデータ依存関係が解消されているか否かを判断するタイミング判断手順と、を備え、前記生成手順では、前記分割プログラムのコンパイルにあたって、前記別のマクロタスクと前記第１マクロタスクとのデータ依存関係を回復させる、ことを特徴とする。
【発明の効果】
【００１２】
本発明によれば、逐次プログラムを構成するマクロタスクが相互に複雑なデータ依存関係を有している場合であっても、処理時間の平均化を図ることが可能な並列化コンパイル方法、及び並列化コンパイラを提供することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１実施形態、第２実施形態、第３実施形態に係る並列化コンパイラを示すブロック図である。
【図２】本発明の第１実施形態、第２実施形態、第３実施形態に係る車載装置を示すブロック図である。
【図３】本発明の第１実施形態に係る並列化コンパイル方法を説明するためのフローチャートである。
【図４】データ依存関係無効化情報が無い場合の並列化コンパイル方法を説明するための図である。
【図５】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【図６】本発明の第２実施形態に係る並列化コンパイル方法を説明するためのフローチャートである。
【図７】本発明の第２実施形態に係る並列化コンパイル方法を説明するための図であって、データ依存関係の一例を説明するための図である。
【図８】データ依存関係無効化情報が無い場合の並列化コンパイル方法を説明するための図である。
【図９】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【図１０】データ依存関係無効化情報が有り同期条件も有る場合の並列化コンパイル方法を説明するための図である。
【図１１】データ依存関係無効化情報が有り同期条件も有る場合の並列化コンパイル方法を説明するための図である。
【図１２】本発明の第３実施形態に係る並列化コンパイル方法を説明するためのフローチャートである。
【図１３】本発明の第３実施形態に係る並列化コンパイル方法を説明するための図であって、データ依存関係の一例を説明するための図である。
【図１４】データ依存関係無効化情報が無い場合の並列化コンパイル方法を説明するための図である。
【図１５】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【図１６】データ依存関係無効化情報が有り擬似依存条件も有る場合の並列化コンパイル方法を説明するための図である。
【図１７】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【図１８】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【図１９】データ依存関係無効化情報が有る場合の並列化コンパイル方法を説明するための図である。
【発明を実施するための形態】
【００１４】
以下、添付図面を参照しながら本発明の実施形態について説明する。説明の理解を容易にするため、各図面において同一の構成要素に対しては可能な限り同一の符号を付して、重複する説明は省略する。
【００１５】
１．自動並列化コンパイラについて
【００１６】
本実施形態（第１実施形態、第２実施形態、第３実施形態）の自動並列化コンパイラは、組込みシステム向けのシングルコアプロセッサシステム用のソースプログラム（逐次プログラム）から、組込みシステム向けのマルチコアプロセッサシステム用の並列化プログラム（分割プログラム）を生成する機能を有している。
【００１７】
１−１．自動並列化コンパイラの設計概念
本実施形態の自動並列化コンパイラは、以下の機能を有している。
（１）マルチグレイン並列処理
（２）コンパイル時のスタティックスケジューリングコードの挿入
（３）実行時のダイナミックスケジューリングコードの生成
（４）階層型マクロデータフローの実現
（５）マクロタスクの分割／融合，Loop distribution／interchange等の並列性抽出
（６）データローカライズによるデータ転送効率の向上
（７）コンパイラによる電力削減
【００１８】
１−２．自動並列化コンパイラの内部処理
自動並列化コンパイラは、Front End（ＦＥ），Middle Path（ＭＰ），Back End（ＢＥ）の３つのステージを有している。各ステージは実行形態として独立しており、ＦＥ，ＭＰから生成される中間言語によりコード授受が行われる。
【００１９】
ＦＥは、逐次プログラムのソースコードを字句解析・構文解析を行い、ＭＰにおいてparse可能な中間言語を生成する部位である。ＦＥの生成する中間言語は、基本的に４つのオペランドを持つ解析木（parse tree）で表現されており、全体として１つのブロックを形成していて構造化は行われていない。
【００２０】
ＭＰは、制御依存性解析・データ依存性解析・最適化等を行う部位であり、そのデータを用いて粗粒度・中粒度・近細粒度並列化のマルチグレイン並列処理を行う。
【００２１】
ＢＥは、ＭＰが生成した並列化中間言語を読み込んで実際のマシンコードを生成する部位である。当該部位は、ターゲットとなっているマルチコアアーキテクチャのアセンブラコードを生成するＢＥの他、OpenMP用の並列化FortranコードやＣコードを生成するＢＥを有している。さらには、当該部位は、後述する並列化ＡＰＩによりメモリ配置，データ転送を含めて並列化したコードを生成するＢＥ等、多様なアーキテクチャに対応したコードを出力するＢＥを有している。
【００２２】
１−３．自動並列化コンパイラの並列性解析
自動並列化コンパイラは、逐次プログラムを、基本ブロック（ＢＢ），繰り返しブロック（ＲＢ），サブルーチンブロック（ＳＢ）の３種類の粗粒度タスク（マクロタスク（ＭＴ））に分割するマクロデータフロー処理を行う。しかし、マクロデータフロー処理では、プログラムの形状によってはプロセッサの利用効率が上がらず、十分な粗粒度並列性が抽出できないという問題点がある。
【００２３】
そこで、自動並列化コンパイラでは、従来の単階層マクロデータフロー処理手法を拡張し、ＭＴ内部に対してマクロデータフロー処理を階層的に利用する階層型マクロデータフロー処理を採用している。階層的マクロデータフロー処理では、ＭＴの階層的な定義を行い、各階層のマクロタスクに対してマクロタスク間の並列性の解析を行う。
【００２４】
＜マクロフローグラフ（ＭＦＧ）の生成＞
自動並列化コンパイラは、まず、生成された各階層のマクロタスクに対して、マクロタスク間の制御依存性とデータ依存性を解析する。この解析結果は、マクロフローグラフ（ＭＦＧ）として表される。
【００２５】
＜マクロタスクグラフ（ＭＴＧ）の生成＞
ＭＦＧは、マクロタスク間の制御依存性とデータ依存性を表すが、並列性は表していない。並列性を抽出するためには、各マクロタスクに対し、制御依存性とデータ依存性の両方を考慮した最早実行可能条件解析を行う必要がある。最早実行可能条件とは、そのＭＴが最も早い時点で実行可能になる条件であり、次のような実行条件から求められる。
（１）ＭＴｉがＭＴｊにデータ依存するならば、ＭＴｊの実行が終了するまでＭＴｉは実行できない。
（２）ＭＴｊの条件分岐先が確定すれば、ＭＴｊの実行が終了しなくても、ＭＴｊに制御依存するＭＴｉは実行できる。
【００２６】
したがって、最早実行可能条件の一般形は次のようになる。
（ＭＴｉが制御依存するＭＴｊがＭＴｉに分岐する）ＡＮＤ（（ＭＴｉがデータ依存するＭＴｋ（０≦ｋ≦｜Ｎ｜））が終了）ＯＲ（ＭＴｋが実行されないことが決定する））
マクロタスクの最早実行可能条件は、マクロタスクグラフ（ＭＴＧ）で表される。
【００２７】
１−４．マルチグレイン並列処理
自動並列化コンパイラでは、従来のループ並列化に加え、ループ間，サブルーチン間における粗粒度タスク間の並列性を利用する粗粒度タスク並列処理や、ステートメント間の並列性を利用する近細粒度並列処理を効果的に組み合わせたマルチグレイン並列処理（参考文献１（本多弘樹, 岩田雅彦, 笠原博徳、「Fortranプログラム粗粒度タスク間の並列性検出手法」、電子情報通信学会論文誌、１９９０年）参照）を実現している。
【００２８】
＜粗粒度タスク並列処理＞
自動並列化コンパイラは、ＢＢ，ＲＢ，ＳＢ等のＭＴ間の制御依存性とデータ依存性を表現したマクロフローグラフ（ＭＦＧ）を生成し、さらに、ＭＦＧから最早実行可能条件解析により引きだしたＭＴ間の並列性を、マクロタスクグラフ（ＭＴＧ）として表現する（参考文献１，参考文献２（笠原，合田，吉田，岡本，本多、「Fortranマクロデータフロー処理のマクロタスク生成手法」、信学論、１９９２年、Vol.J75-D-I、No.8、pp.511-525）参照）。
【００２９】
その後、自動並列化コンパイラは、ＭＴＧ上のＭＴを、１つ以上のプロセッサエレメント（ＰＥ）をグルーピングしたプロセッサグループ（ＰＧ）に割り当てる。
【００３０】
＜中粒度並列処理＞
ＰＧに割り当てられたＭＴが、DOALLループ、或いはイタレーションレベルで並列処理が可能なものであれば、そのＭＴには、プロセッサクラスタ内のプロセッサによって中粒度並列処理がなされる。この中粒度並列処理は、ＤＯループイタレーション間の並列性を利用する並列処理のことであり、マルチコアプロセッサにおける並列処理では最も一般的なものである。
【００３１】
＜近細粒度並列処理＞
ステートメントレベルの近細粒度タスクに対する並列処理を、近細粒度並列処理という。これによって、依存の無いステートメントも並列実行が可能になり、実行時間が短縮される。
【００３２】
１−５．マクロタスクスケジューリング
粗粒度タスク並列処理では、各階層で生成されたマクロタスクは、ＰＧに割り当てられて実行される。どのＰＧにマクロタスクを割り当てるかを決定するスケジューリング手法として、下記のダイナミックスケジューリングとスタティックスケジューリングがあり、これらは、マクロタスクグラフの形状や実行時非決定性等を元に選択される。
【００３３】
＜ダイナミックスケジューリング＞
条件分岐等の実行時不確定性が存在する場合には、ダイナミックスケジューリングによって実行時にマクロタスクをＰＧに割り当てる。ダイナミックスケジューリングルーチンは、マクロタスクの終了や分岐方向の決定に応じてマクロタスク実行管理テーブルを操作し、各マクロタスクの最早実行可能条件を検査する。
【００３４】
マクロタスクが実行可能であれば、レディキューにマクロタスクが投入される。レディキュー内のマクロタスクは、その優先順位に従ってソートされ、レディキューの先頭のマクロタスクが、アイドル状態のプロセッサクラスタに割り当てられる。
【００３５】
また、ダイナミックスケジューリングコード生成時には、一つの専用のプロセッサがスケジューリングを行う集中スケジューリング方式と、スケジューリング機能を各プロセッサに分散した分散スケジューリング方式を、使用するプロセッサ台数，システムの同期オーバーヘッドに応じて使い分けることができる。
【００３６】
＜スタティックスケジューリング＞
一方、スタティックスケジューリングは、マクロタスクグラフがデータ依存エッジのみを持つ場合に使用され、自動並列化コンパイラが、コンパイル時にＰＧへのマクロタスクの割り当てを決める方式である。
【００３７】
スタティックスケジューリングは、実行時スケジューリングオーバーへッドを無くし、データ転送と同期のオーバーへッドを最小化することが可能であるため、粒度の細かいタスクのスケジューリングに対しても効果的に利用できる。
【００３８】
また、スタティックスケジューリングの際、タスクのコストは自動並列化コンパイラでのタスクコスト推定値を適用するが、自動並列化コンパイラのプロファイル自動フィードバック機能を用いることで、実コストでタスクスケジューリングを行うことも可能である。
【００３９】
プロファイル自動フィードバック機能を用いる場合、第１フェーズとして、逐次プログラムをＭＴに分解し、ＭＴ毎にプロファイラ関数を挿入して逐次プログラムを生成する。このプロファイラ関数では、タスク実行コスト（clock cycle）とタスク実行回数を計測する。このプロファイラ関数が挿入された逐次プログラムを一度ターゲットとなるマシン上で実行することで、ターゲットとなるマシン上でのタスク実行コストとタスク実行回数の情報を持つファイルを出力する。
【００４０】
そして、第２フェーズにて、この出力ファイルと逐次プログラムを入力として、実コストに基づきスケジューリングした並列化プログラムが生成される。
【００４１】
１−６．データローカライゼーション
自動並列化コンパイラは、プログラム全域に渡るキャッシュ最適化を行うことが可能である。自動並列化コンパイラは、ループ間などの並列性を解析した後、ループ間にデータ依存があることが分かると、依存があるループ間でのキャッシュのグローバル最適化を試みる（参考文献３（特許第４１７７６８１号公報）参照）。
【００４２】
具体的には、各ループでアクセスされる配列を調査し、同一の分割ループは同一の配列部分にアクセスするように調整することにより、同一の分割ループを同一プロセッサに割り当てる。これにより、同一の分割ループでは、全ての配列データがキャッシュ上で再利用されるようになる。
【００４３】
このローカライズ技術は、
（１）任意のサイズのローカルメモリ或いは分散共有メモリが与えられた時に、ＤＭＡ（ＤＴＵ）（参考文献４（特許第４４７６２６７号公報）参照）を用いアクセスされる前に、前記プロセッサに近接したローカル或いは分散共有メモリに事前ロードし、プログラム全域で再利用する。
（２）送付先のメモリが一杯の場合には、送付先プロセッサのＤＴＵが、メモリからの掃き出し優先順位に従ってデータを共有メモリ等へ掃き出したことを同期フラグで知らされたら、自動的に空いたメモリにデータを転送する。
（３）将来再利用されるデータであるが、暫くの間使用されず、メモリの領域を開ける必要がある場合には、ＣＰＵによるタスク実行の裏側でＤＴＵが当該データを集中共有メモリに待避し、使用時までに再ロードする。
といったローカルメモリ管理，データ転送技術へと進化している（参考文献５（英国特許第２４７８８７４号明細書）。
【００４４】
１−７．並列化プログラムの生成
自動並列化コンパイラにおける並列化プログラムの生成は、自動並列化ＡＰＩ（参考文献７（早稲田大学、「Optimally Scheduled Advanced Multiprocessor Application Program Interface」、２００８年）参照）を用い、並列化Ｃ或いは並列化Fortranのような、source-to-sourceで並列化を行うことが可能である。
【００４５】
この場合には、自動並列化コンパイラは、様々なプラットフォームにおいて並列化プログラムを実行可能とするため、後述する自動並列化ＡＰＩ標準解釈系を用いて、各プロセッサ用のＣ或いはFortranのディレクティブ部分をランタイムライブラリコールに変換する。その後、自動並列化コンパイラは、各プロセッサ用のコードを逐次コンパイラでコンパイルしてバイナリを生成し、このバイナリをリンクすると、対象となるマルチコアプロセッサ上で並列化プログラムを実行可能となる。
【００４６】
２．組み込みシステム用の逐次プログラムの並列化手順と手法
次に、組み込みシステム用の逐次プログラムの特徴について述べ、本実施形態の自動並列化コンパイラによる並列化手法について説明する。なお、組み込みシステムとは、例えば、車載装置であっても良いし、車載装置以外の電子装置であっても良い。また、逐次プログラムは、モデルベース設計により自動生成されたもの（一例として、MathWork社のMatlab（登録商標），Simulink（登録商標）にて自動生成されたもの）であっても良い。
【００４７】
自動並列化コンパイラは、条件分岐と代入文により構成され、処理が細かい逐次プログラムに対して、インライン展開やリネーミングを行い、並列性を抽出する。また、リアルタイム性を順守するために条件分岐隠蔽のためのタスク融合を行い、オーバーヘッドが低くなるようにスタティックスケジューリングを行う。さらに、実コストでスタティックスケジューリングを行うために、プロファイル自動フィードバック機能を適用しても良い。
【００４８】
また、逐次プログラムにおいて、条件コンパイルスイッチ（プリプロセッサへの命令）により、仕向地や機能やハードウェアの構成等が異なる組み込みシステムの各種別に応じてコンパイルの対象となる記述を選択する条件付コンパイルが行われる場合がある。このような場合、逐次プログラムの各条件コンパイルスイッチの引数として、いずれかの種別に対応する情報（仕向地等を示す情報）を設定することで、逐次プログラムから、該種別に対応するバイナリコードが生成される。
【００４９】
これに対し、本実施形態の自動並列化コンパイラは、条件付コンパイルによるコンパイル対象の選択を無視し、逐次プログラムの全ての部分を対象としてマクロタスクの分割や並列性の抽出やスタティックスケジューリング等を行い、並列化プログラムを生成する。その後、並列化プログラムから、条件付コンパイルによりコンパイルの対象外となる記述を特定し、該記述を除いた状態で、マルチコアプロセッサを動作させるためのバイナリデータを生成する。
【００５０】
２−１．自動並列化コンパイラの動作環境等について
自動並列化コンパイラ１は、例えば、ＤＶＤ，ＣＤ−ＲＯＭ，ＵＳＢメモリ，メモリカード（登録商標）等の光ディスク，磁気ディスク，半導体製メモリ等として構成された記憶媒体１８に記憶された状態で、ユーザに提供される（図１参照）。無論、ネットワークを経由してユーザに提供されても良い。
【００５１】
そして、自動並列化コンパイラ１がインストールされたパーソナルコンピュータ（ＰＣ）１０は、自動並列化コンパイル装置として動作する。ＰＣ１０は、ディスプレイ１１，ＨＤＤ１２，ＣＰＵ１３，ＲＯＭ１４，ＲＡＭ１５，入力装置１６，読取部１７等を備える。
【００５２】
ディスプレイ１１は、ＣＰＵ１３から受けた映像信号を、ユーザに対して映像として表示する。
【００５３】
入力装置１６は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ１３に出力する。
【００５４】
読取部１７は、自動並列化コンパイラ１等が記憶された記憶媒体１８からデータを読み取る部位である。
【００５５】
ＲＡＭ１５は読み出し、書き込み可能な揮発性メモリであり、ＲＯＭ１４は読み出し専用の不揮発性メモリであり、ＨＤＤ１２は読み出し，書き込みが可能な不揮発性メモリである。ＲＯＭ１４，ＨＤＤ１２には、ＣＰＵ１３が読み出して実行するプログラム等が予め記憶されている。
【００５６】
ＲＡＭ１５は、ＣＰＵ１３がＲＯＭ１４，ＨＤＤ１２に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域や、作業用のデータを一時的に保存するための記憶領域として用いられる。
【００５７】
ＣＰＵ１３は、ＯＳをＨＤＤ１２から読み出して実行し、ＨＤＤ１２に記録されている各種プログラムをＯＳ上のプロセスとして実行する。また、ＣＰＵ１３は、このプロセスにおいて、必要に応じて入力装置１６から信号の入力を受け付け、ディスプレイ１１に映像信号を出力し、ＲＡＭ１５，ＨＤＤ１２に対してデータの読み出し／書き込みの制御を行う。
【００５８】
ＰＣ１０には、読取部１７を介して記憶媒体１８から読み取られた自動並列化コンパイラ１がインストールされており、自動並列化コンパイラ１は、ＨＤＤ１２に保存され、ＯＳ上のプロセスとして実行されるアプリケーションの１つとなっている。
【００５９】
なお、この自動並列化コンパイル装置は、車載装置等といった組み込みシステム向けの並列化プログラムの開発に用いられる。しかしながら、これに限定されることは無く、例えば情報家電等といった様々な用途の組込みシステム向けの並列化プログラムの開発や、組込みシステム以外の他の用途の並列化プログラムの開発に用いることができる。
【００６０】
３．車載装置の構成について
続いて、本実施形態の自動並列化コンパイラ１により生成された並列化プログラムにより動作する車載装置２０の構成について説明する（図２参照）。無論、自動並列化コンパイラ１は、車載装置２０に限らず、同様の構成を有する様々な電子装置を動作させる並列化プログラムを生成可能である。
【００６１】
車載装置２０は、マルチコアプロセッサ２１，通信部２２，センサ部２３，入出力ポート２４等を備える。
【００６２】
マルチコアプロセッサ２１は、ＲＯＭ２１ａと、ＲＡＭ２１ｂと、複数のコア２１ｃ，２１ｄ…等を有している。
【００６３】
ＲＯＭ２１ａは、自動並列化コンパイラ１により生成された並列化プログラム２１ａ−１（バイナリデータ）が保存されている。マルチコアプロセッサ２１は、並列化プログラム２１ａ−１に従い動作し、車載装置２０を統括制御する。
【００６４】
ＲＡＭ２１ｂは、コア２１ｃ，２１ｄ…等によりアクセスされる部位である。通信部２２は、車内ＬＡＮ等を介して接続された他のＥＣＵと通信を行う部位である。
【００６５】
センサ部２３は、制御対象等の状態を検出するための各種センサから構成される部位である。入出力ポート２４は、制御対象を制御するための各種信号の送受信を行う部位である。
【００６６】
［具体例について］
続いて、本実施形態の自動並列化コンパイラ１により並列化プログラムを生成する処理の具体例について説明する。以下の説明において、処理Ａ等といった記載がなされるが、これは、各種演算や代入や分岐処理や関数コール等からなる一連の処理の記述を意味する。
【００６７】
（第１実施形態）
図３に示されるように、第１実施形態に係る並列化コンパイル方法では、ステップＳ１０１においてデータ依存関係無効化情報の有無を判断する（無効化手順）。データ依存関係無効化情報が有ればステップＳ１０３の処理に進み、データ依存関係無効化情報が無ければステップＳ１０２の処理に進む。
【００６８】
ステップＳ１０２では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを図４に示す。図４に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄを含んでおり、処理Ａと処理Ｂとの間にデータ依存関係が有るものとする。処理Ａの処理時間は１００、処理Ｂの処理時間は２０、処理Ｃの処理時間は３０、処理Ｄの処理時間は３５とする（これら処理時間の値は相対値である）。
【００６９】
処理Ａと処理Ｂとの依存関係があるので、処理Ａと処理Ｂがコア０に割り当てられる。この前提で全体の処理時間を最短なものとするように、処理Ｃと処理Ｄがコア１に割り当てられる。この例の場合、コア０の処理時間は１２０となり、コア１の処理時間は６５となる。
【００７０】
ステップＳ１０３では、データ依存関係無効化情報を取得する。本例の場合、処理Ａと処理Ｂとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。ステップＳ１０３に続くステップＳ１０４では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する（生成手順）。
【００７１】
この分割プログラムの生成における具体例の一つを図５に示す。図５に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄを含んでおり、処理Ａと処理Ｂとの間にデータ依存関係が有るものとする。処理Ａの処理時間は１００、処理Ｂの処理時間は２０、処理Ｃの処理時間は３０、処理Ｄの処理時間は３５とする（これら処理時間の値は相対値である）。
【００７２】
まず、処理Ａと処理Ｂとの依存関係が無効化される。処理Ａと処理Ｂとの依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア０に処理Ａが割り当てられ、コア１に処理Ｂ、処理Ｃ、処理Ｄが割り当てられる。この例の場合、コア０の処理時間は１００となり、コア１の処理時間は８５となる。ステップＳ１０２の処理で説明した例と比較すると、全体の処理時間が改善されている。
【００７３】
（第２実施形態）
図６に示されるように、第２実施形態に係る並列化コンパイル方法では、ステップＳ２０１においてデータ依存関係無効化情報の有無を判断する（無効化手順）。データ依存関係無効化情報が有ればステップＳ２０３の処理に進み、データ依存関係無効化情報が無ければステップＳ２０２の処理に進む。
【００７４】
ステップＳ２０２では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを図８に示す。図８に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄ、処理Ｅを含んでいる。処理Ａから処理Ｅは、図７に示されるようなデータ依存関係が有る。図７に示されるように、処理Ｂと処理Ｄとの間、処理Ｃと処理Ｄ及び処理Ｅとの間、処理Ｄと処理Ｅとの間にそれぞれデータ依存関係が有るものとする。処理Ａの処理時間は１５、処理Ｂの処理時間は１０、処理Ｃの処理時間は５０、処理Ｄの処理時間は３０、処理Ｅの処理時間は２０とする（これら処理時間の値は相対値である）。
【００７５】
これらデータ依存関係を考慮し、全体の処理時間を最短なものとするように、処理Ａ、処理Ｂ、処理Ｄ、処理Ｅがコア０に割り当てられ、処理Ｃがコア１に割り当てられる。処理Ｂと処理Ｄとの間には、処理Ｃと処理Ｄとのデータ依存関係を維持するように待ち時間が設けられる。この例の場合、コア０の処理時間は１００となり、コア１の処理時間は５０となる。
【００７６】
ステップＳ２０３では、データ依存関係無効化情報を取得する。本例の場合、処理Ｃと処理Ｄとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。
【００７７】
ステップＳ２０３に続くステップＳ２０４では、参照データ周期タイミング（処理同期タイミング）の依存関係有無を判断する（タイミング判断手順）。参照データ周期タイミングの依存関係が有ればステップＳ２０６の処理に進み、参照データ周期タイミングの依存関係が無ければステップＳ２０５の処理に進む。
【００７８】
このように参照データ周期タイミングを確認するのは、各処理の処理時間に基づいて分割プログラムを生成しても、処理時間は一定値ではなく平均値や最大値であるため、実際の処理時間が増減する場合があるためである。このように処理時間の増減が発生すると、データ依存関係の無効化が許可されても、処理の前後関係は維持したい処理同士において不都合が発生するので、その前後関係を維持することが別途必要となる。ステップＳ２０４ではこの点を確認している。
【００７９】
ステップＳ２０５では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する（生成手順）。
【００８０】
この分割プログラムの生成における具体例の一つを図９に示す。図９に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄ、処理Ｅを含んでおり、図７に示されたようなデータ依存関係が有るものとする。
【００８１】
まず、図７に示されたデータ依存関係が無効化される。データ依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア０に処理Ｂ、処理Ｄ、処理Ａが割り当てられ、コア１に処理Ｃ、処理Ｅが割り当てられる。この例の場合、コア０の処理時間は５５となり、コア１の処理時間は７０となる。
【００８２】
ステップＳ２０６では、参照データ周期タイミング同期設定が取得される。本例では、処理Ｃの後に処理Ｄを実行することが、処理周期毎に入れ替わらないことが条件となっている。
【００８３】
ステップＳ２０６に続くステップＳ２０７では、同期条件付きの並列化処理が実行され、分割プログラムが生成される。図１０に、同期条件付きの並列化処理の一例を示す。図１０に示される例は、開始同期の例であって、コア１に処理Ｂ、処理Ｄ、処理Ａが割り当てられ、コア０に処理Ｃ、処理Ｅが割り当てられている。処理Ｄを処理Ｃの処理順が入れ替わらないようにするため、処理Ｃの開始時期を調整するための待ち時間が設けられている。この例では、コア０の処理時間が５５となり、コア１の処理時間が８０となる。
【００８４】
図１１に、同期条件付きの並列化処理の別例を示す。図１１に示される例は、終了同期の例であって、コア１に処理Ｂ、処理Ｄ、処理Ａが割り当てられ、コア０に処理Ｃ、処理Ｅが割り当てられている。処理Ｄを処理Ｃの処理順が入れ替わらないようにするため、処理Ｄの終了時期を調整するための待ち時間が設けられている。この例では、コア０の処理時間が６５となり、コア１の処理時間が７０となる。
【００８５】
図１０に示した開始同期を用いるか、図１１に示した終了同期を用いるかは、優先したい別の条件によって定まる。例えば、全体の処理時間を短くしたい条件であれば、図１１に示した終了同期を用い、処理時間の短い方をより重視するのであれば図１０に示した開始同期を用いる。優先したい別の条件としては、この他に各コアの処理量や、メモリの容量等が用いられる。
【００８６】
（第３実施形態）
図１２に示されるように、第３実施形態に係る並列化コンパイル方法では、ステップＳ３０１においてデータ依存関係無効化情報の有無を判断する（無効化手順）。データ依存関係無効化情報が有ればステップＳ３０３の処理に進み、データ依存関係無効化情報が無ければステップＳ３０２の処理に進む。
【００８７】
ステップＳ３０２では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを図１４に示す。図１４に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄ、処理Ｅを含んでいる。処理Ａから処理Ｅは、図１３に示されるようなデータ依存関係が有る。図１３に示されるように、処理Ａと処理Ｃとの間、処理Ｂと処理Ｃとの間、処理Ｃと処理Ｄとの間、処理Ｄと処理Ｅとの間にそれぞれデータ依存関係が有るものとする。処理Ａの処理時間は１５、処理Ｂの処理時間は１０、処理Ｃの処理時間は３０、処理Ｄの処理時間は５０、処理Ｅの処理時間は２０とする（これら処理時間の値は相対値である）。
【００８８】
これらデータ依存関係を考慮し、全体の処理時間を最短なものとするように、処理Ａ、処理Ｃ、処理Ｄ、処理Ｅがコア０に割り当てられ、処理Ｂがコア１に割り当てられる。この例の場合、コア０の処理時間は１１５となり、コア１の処理時間は１０となる。
【００８９】
ステップＳ３０３では、データ依存関係無効化情報を取得する。本例の場合、処理Ｃと処理Ｄとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。
【００９０】
ステップＳ３０３に続くステップＳ３０４では、参照データ周期タイミング（処理同期タイミング）の依存関係有無を判断する（タイミング判断手順）。参照データ周期タイミングの依存関係が有ればステップＳ３０６の処理に進み、参照データ周期タイミングの依存関係が無ければステップＳ３０５の処理に進む。
【００９１】
このように参照データ周期タイミングを確認するのは、各処理の処理時間に基づいて分割プログラムを生成しても、処理時間は一定値ではなく平均値や最大値であるため、実際の処理時間が増減する場合があるためである。このように処理時間の増減が発生すると、データ依存関係の無効化が許可されても、処理の前後関係は維持したい処理同士において不都合が発生するので、その前後関係を維持することが別途必要となる。ステップＳ３０４ではこの点を確認している。
【００９２】
ステップＳ３０５では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する（生成手順）。
【００９３】
この分割プログラムの生成における具体例の一つを図１５に示す。図１５に示されるように、逐次プログラムであるＣソフトが処理Ａ、処理Ｂ、処理Ｃ、処理Ｄ、処理Ｅを含んでおり、図１３に示されたようなデータ依存関係が有るものとする。
【００９４】
まず、図１３に示されたデータ依存関係が無効化される。データ依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア０に処理Ａ、処理Ｂ、処理Ｃが割り当てられ、コア１に処理Ｄ、処理Ｅが割り当てられる。この例の場合、コア０の処理時間は５５となり、コア１の処理時間は７０となる。
【００９５】
ステップＳ３０６では、擬似データ依存設定が取得される。本例では、処理Ｃと処理Ｄとのデータ依存関係が逆になることが条件となっている。具体的には、処理Ｃが完了してから処理Ｄが実行されるデータ依存関係にあるところ、その関係が逆転し、処理Ｄが完了してから処理Ｃが実行されるデータ依存関係になることが条件となっている。
【００９６】
ステップＳ３０６に続くステップＳ３０７では、擬似データ依存条件付きの並列化処理が実行され、分割プログラムが生成される。図１６に、擬似データ依存条件付きの並列化処理の一例を示す。図１６に示される例は、コア０に処理Ａ、処理Ｂ、処理Ｃが割り当てられ、コア１に処理Ｄ、処理Ｅが割り当てられている。処理Ｄに対して処理Ｃの処理順が入れ替わらないようにするため、擬似的なデータ依存関係が付与されている。この例では、コア０の処理時間が８０となり、コア１の処理時間が７０となる。
【００９７】
本実施形態では、無効化情報有りとされた２以上のマクロタスクに含まれる第１マクロタスクが、別のマクロタスクとデータ依存関係を有していたものの、２以上のマクロタスクに含まれる第２マクロタスクとのデータ依存関係を有することにより別のマクロタスクとのデータ依存関係が不要になったためそのデータ依存関係が解消されているか否かを判断し、分割プログラムのコンパイルにあたって、別のマクロタスクと第１マクロタスクとのデータ依存関係を回復させることができる。
【００９８】
この具体的な例を図１７を参照しながら説明する。図１７の（Ａ）では、処理Ｘと処理Ｃとの間、処理Ａと処理Ｃとの間、処理Ｂと処理Ｃとの間、処理Ｃと処理Ｄとの間、処理Ｄと処理Ｅとの間にそれぞれデータ依存関係があるものとしている。例えば、処理Ｘが初期値ｃを与える処理であり、処理Ｃは演算ａ＋ｂによって値ｃを与える処理であり、処理Ｄが値ｃによって値ｄを得る処理である場合、処理Ｘと処理Ｄとの間のデータ依存関係は冗長であるので解消される。
【００９９】
この状態で、処理Ｃと処理Ｄとの間のデータ依存性が解消されると、処理Ｄにおいて処理Ｘの結果が必要になるので、解消していた処理Ｘと処理Ｄとの間のデータ依存関係を回復させる。
【０１００】
更に別例について図１８を参照しながら説明する。図１８の（Ａ）では、処理Ａ及び処理Ｂと処理Ｃとの間、処理Ｃと処理Ｄとの間、処理Ｄと処理Ｅとの間にそれぞれデータ依存関係がある。処理Ａが値ａを与える処理であり、処理Ｂが値ｂを与える処理であり、処理Ｃがａ＋ｂの演算によって値ｃを与える処理であり、処理Ｄがｃ＋ａ＋ｂの演算に寄って値ｄを与える処理であるものとする。
【０１０１】
処理Ｃと処理Ｄとの間のデータ依存関係が解消されると、処理Ｄにおいて処理Ａ及び処理Ｂの処理結果が必要になるので、図１８の（Ｂ）に示されるように、処理Ａ及び処理Ｂと処理Ｄとの間のデータ依存関係を構築する。
【０１０２】
更に別例について図１９を参照しながら説明する。図１９の（Ａ）では、処理Ａ及び処理Ｂと処理Ｃとの間、処理Ｃと処理Ｄとの間、処理Ｄと処理Ｅとの間にそれぞれデータ依存関係がある。処理Ｃと処理Ｄとの間のデータ依存関係が解消されると図１９の（Ｂ）の状態になる。ここで、処理周期毎の順序変化を解消するため、処理Ｄから処理Ｃへの擬似データ依存関係を構築する（図１９の（Ｃ）参照）。
【符号の説明】
【０１０３】
１：自動並列化コンパイラ
２０：車載装置
２１：マルチコアプロセッサ
【図１】
0006427054.tif 000002
【図２】
0006427054.tif 000003
【図３】
0006427054.tif 000004
【図４】
0006427054.tif 000005
【図５】
0006427054.tif 000006
【図６】
0006427054.tif 000007
【図７】
0006427054.tif 000008
【図８】
0006427054.tif 000009
【図９】
0006427054.tif 000010
【図１０】
0006427054.tif 000011
【図１１】
0006427054.tif 000012
【図１２】
0006427054.tif 000013
【図１３】
0006427054.tif 000014
【図１４】
0006427054.tif 000015
【図１５】
0006427054.tif 000016
【図１６】
0006427054.tif 000017
【図１７】
0006427054.tif 000018
【図１８】
0006427054.tif 000019
【図１９】
0006427054.tif 000020