(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（登録商標）にて自動生成されたもの）であっても良い。
【００４８】
自動並列化コンパイラは、条件分岐と代入文により構成され、処理が細かい逐次プログラムに対して、インライン展開やリネーミングを行い、並列性を抽出する。また、リアルタイム性を順守するために条件分岐隠蔽のためのタスク融合を行い、オーバーヘッドが低くなるようにスタティックスケジューリングを行う。さらに、実コストでスタティックスケジューリングを行うために、プロファイル自動フィードバック機能を適用しても良い。
【００４９】
また、逐次プログラムにおいて、条件コンパイルスイッチ（プリプロセッサへの命令）により、仕向地や機能やハードウェアの構成等が異なる組み込みシステムの各種別に応じてコンパイルの対象となる記述を選択する条件付コンパイルが行われる場合がある。このような場合、逐次プログラムの各条件コンパイルスイッチの引数として、いずれかの種別に対応する情報（仕向地等を示す情報）を設定することで、逐次プログラムから、該種別に対応するバイナリコードが生成される。
【００５０】
これに対し、本実施形態の自動並列化コンパイラは、条件付コンパイルによるコンパイル対象の選択を無視し、逐次プログラムの全ての部分を対象としてマクロタスクの分割や並列性の抽出やスタティックスケジューリング等を行い、並列化プログラムを生成する。その後、並列化プログラムから、条件付コンパイルによりコンパイルの対象外となる記述を特定し、該記述を除いた状態で、マルチコアプロセッサを動作させるためのバイナリデータを生成する。
【００５１】
２−１．自動並列化コンパイラの動作環境等について
自動並列化コンパイラ１は、例えば、ＤＶＤ，ＣＤ−ＲＯＭ，ＵＳＢメモリ，メモリカード（登録商標）等の光ディスク，磁気ディスク，半導体製メモリ等として構成された記憶媒体１８に記憶された状態で、ユーザに提供される（図１参照）。無論、ネットワークを経由してユーザに提供されても良い。
【００５２】
そして、自動並列化コンパイラ１がインストールされたパーソナルコンピュータ（ＰＣ）１０は、自動並列化コンパイル装置として動作する。ＰＣ１０は、ディスプレイ１１，ＨＤＤ１２，ＣＰＵ１３，ＲＯＭ１４，ＲＡＭ１５，入力装置１６，読取部１７等を備える。
【００５３】
ディスプレイ１１は、ＣＰＵ１３から受けた映像信号を、ユーザに対して映像として表示する。
【００５４】
入力装置１６は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ１３に出力する。
【００５５】
読取部１７は、自動並列化コンパイラ１等が記憶された記憶媒体１８からデータを読み取る部位である。
【００５６】
ＲＡＭ１５は読み出し、書き込み可能な揮発性メモリであり、ＲＯＭ１４は読み出し専用の不揮発性メモリであり、ＨＤＤ１２は読み出し，書き込みが可能な不揮発性メモリである。ＲＯＭ１４，ＨＤＤ１２には、ＣＰＵ１３が読み出して実行するプログラム等が予め記憶されている。
【００５７】
ＲＡＭ１５は、ＣＰＵ１３がＲＯＭ１４，ＨＤＤ１２に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域や、作業用のデータを一時的に保存するための記憶領域として用いられる。
【００５８】
ＣＰＵ１３は、ＯＳをＨＤＤ１２から読み出して実行し、ＨＤＤ１２に記録されている各種プログラムをＯＳ上のプロセスとして実行する。また、ＣＰＵ１３は、このプロセスにおいて、必要に応じて入力装置１６から信号の入力を受け付け、ディスプレイ１１に映像信号を出力し、ＲＡＭ１５，ＨＤＤ１２に対してデータの読み出し／書き込みの制御を行う。
【００５９】
ＰＣ１０には、読取部１７を介して記憶媒体１８から読み取られた自動並列化コンパイラ１がインストールされており、自動並列化コンパイラ１は、ＨＤＤ１２に保存され、ＯＳ上のプロセスとして実行されるアプリケーションの１つとなっている。
【００６０】
なお、この自動並列化コンパイル装置は、車載装置等といった組み込みシステム向けの並列化プログラムの開発に用いられる。しかしながら、これに限定されることは無く、例えば情報家電等といった様々な用途の組込みシステム向けの並列化プログラムの開発や、組込みシステム以外の他の用途の並列化プログラムの開発に用いることができる。
【００６１】
３．車載装置の構成について
続いて、本実施形態の自動並列化コンパイラ１により生成された並列化プログラムにより動作する車載装置２０の構成について説明する（図２参照）。無論、自動並列化コンパイラ１は、車載装置２０に限らず、同様の構成を有する様々な電子装置を動作させる並列化プログラムを生成可能である。
【００６２】
車載装置２０は、マルチコアプロセッサ２１，通信部２２，センサ部２３，入出力ポート２４等を備える。
【００６３】
マルチコアプロセッサ２１は、ＲＯＭ２１ａと、ＲＡＭ２１ｂと、複数のコア２１ｃ，２１ｄ…等を有している。
【００６４】
ＲＯＭ２１ａは、自動並列化コンパイラ１により生成された並列化プログラム２１ａ−１（バイナリデータ）が保存されている。マルチコアプロセッサ２１は、並列化プログラム２１ａ−１に従い動作し、車載装置２０を統括制御する。
【００６５】
ＲＡＭ２１ｂは、コア２１ｃ，２１ｄ…等によりアクセスされる部位である。通信部２２は、車内ＬＡＮ等を介して接続された他のＥＣＵと通信を行う部位である。
【００６６】
センサ部２３は、制御対象等の状態を検出するための各種センサから構成される部位である。入出力ポート２４は、制御対象を制御するための各種信号の送受信を行う部位である。
【００６７】
［具体例について］
続いて、本実施形態の自動並列化コンパイラ１により並列化プログラムを生成する処理の具体例について説明する。以下の説明において、処理ａ等といった記載がなされるが、これは、各種演算や代入や分岐処理や関数コール等からなる一連の処理の記述を意味する。
【００６８】
図３に示す具体例は、変更規模最小化オプションが無い場合の並列化処理を示すものであって、（Ａ）はマクロタスク追加前の逐次プログラム及びそれを並列化処理した分割プログラムを示し、（Ｂ）はマクロタスク追加後の逐次プログラム及びそれを並列化処理した分割プログラムを示している。
【００６９】
図３の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００７０】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｃとが割り付けられ、コア１には処理ｂと処理ｄと処理ｅとが割り付けられる。
【００７１】
図３の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムにマクロタスクである処理ｘが追加されている。処理ａから処理ｅまでと処理ｘをコア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｘと処理ｄとが割り付けられ、コア１には処理ｂと処理ｃと処理ｅとが割り付けられる。
【００７２】
図３の（Ａ）と（Ｂ）とを比較すると、確かに全体の処理時間が最も短くなるという観点からは最適な並列化であるといえるけれども、（Ａ）ではコア０に割り付けられていた処理ｃが（Ｂ）ではコア１に割り付けられ、（Ａ）ではコア１に割り付けられていた処理ｄが（Ｂ）ではコア０に割り付けられている。このように、処理ｃ及び処理ｄは、コア間を移動するように割り付けられることなる。
【００７３】
このように予め割り付けられた処理がコア間を移動するのを許容しないようにする変更規模最小化オプションについて説明する。図４に示す具体例は、変更規模最小化オプションが有る場合の並列化処理を示すものであって、（Ａ）はマクロタスク追加前の逐次プログラム及びそれを並列化処理（第１手順）した分割プログラムを示し、（Ｂ）はマクロタスク追加（第２手順）後の逐次プログラム及びそれを並列化処理（第３手順）した分割プログラムを示している。
【００７４】
図４の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００７５】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｃとが割り付けられ、コア１には処理ｂと処理ｄと処理ｅとが割り付けられる。
【００７６】
図４の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムにマクロタスクである処理ｘが追加されている。変更規模最小化オプションが有る場合は、図４の（Ａ）に示す既に各コアに割り付けられた処理を変更しないようにする。具体的には、コア０への処理ａ、処理ｃの割り付け、コア１への処理ｂ、処理ｄ、処理ｅの割り付けを動かすこと無く、より処理時間の短いコア１に処理ｘを割り付ける。
【００７７】
図３の（Ｂ）と図４の（Ｂ）とを比較すると、全体の処理時間が最も短くなるという観点からは図３の（Ｂ）に示す並列化が優れているけれども、既に割り付けられた処理の移動が最小限になっているという観点からは図４の（Ｂ）に示す並列化が優れている。
【００７８】
図４に示した変更規模最小化オプション有りの場合の並列化処理の変形例について、図５を参照しながら説明する。図５に示す具体例は、変更規模最小化オプションが有る場合の並列化処理を示すものであって、（Ａ）はマクロタスク追加前の逐次プログラム及びそれを並列化処理（第１手順）した分割プログラムを示し、（Ｂ）はマクロタスク追加（第２手順）後の逐次プログラム及びそれを並列化処理（第３手順）した分割プログラムを示している。
【００７９】
図５の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００８０】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｂと処理ｃが割り付けられ、コア１には処理ｃと処理ｅとが割り付けられる。これら処理ａから処理ｅの割り付けが図４の（Ａ）に示した並列化とは異なっている。
【００８１】
図５の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムにマクロタスクである処理ｘが追加されている。変更規模最小化オプションが有る場合は、図５の（Ａ）に示す既に各コアに割り付けられた処理を極力変更しないようにする。具体的には、コア０への処理ａ、処理ｂ、処理ｄの割り付け、コア１への処理ｃ、処理ｅの割り付けを動かすこと無く、より処理時間の短いコア０に処理ｘを割り付ける。
【００８２】
続いて、マクロタスクを削除する場合の並列化について説明する。図６に示す具体例は、変更規模最小化オプションが無い場合の並列化処理を示すものであって、（Ａ）はマクロタスク削除前の逐次プログラム及びそれを並列化処理（第１手順）した分割プログラムを示し、（Ｂ）はマクロタスク削除（第２手順）後の逐次プログラム及びそれを並列化処理（第３手順）した分割プログラムを示している。
【００８３】
図６の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００８４】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｃとが割り付けられ、コア１には処理ｂと処理ｄと処理ｅとが割り付けられる。
【００８５】
図６の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムからマクロタスクである処理ｄが削除されている。処理ａから処理ｅまでと処理ｘをコア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ｃが割り付けられ、コア１には処理ａと処理ｂと処理ｅとが割り付けられる。
【００８６】
図６の（Ａ）と（Ｂ）とを比較すると、確かに全体の処理時間が最も短くなるという観点からは最適な並列化であるといえるけれども、（Ａ）ではコア０に割り付けられていた処理ａが（Ｂ）ではコア１に割り付けられている。このように、処理ａは、コア間を移動するように割り付けられることなる。
【００８７】
このように予め割り付けられた処理がコア間を移動するのを許容しないようにする変更規模最小化オプションについて説明する。図７に示す具体例は、変更規模最小化オプションが有る場合の並列化処理を示すものであって、（Ａ）はマクロタスク削除前の逐次プログラム及びそれを並列化処理（第１手順）した分割プログラムを示し、（Ｂ）はマクロタスク削除（第２手順）後の逐次プログラム及びそれを並列化処理（第３手順）した分割プログラムを示している。
【００８８】
図７の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００８９】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｃとが割り付けられ、コア１には処理ｂと処理ｄと処理ｅとが割り付けられる。
【００９０】
図７の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムからマクロタスクである処理ｄが削除されている。変更規模最小化オプションが有る場合は、図７の（Ａ）に示す既に各コアに割り付けられた処理を変更しないようにする。具体的には、コア０への処理ａ、処理ｃの割り付け、コア１への処理ｂ、処理ｅの割り付けを動かすこと無く、コア１に割り付けられていた処理ｄのみを削除する。
【００９１】
図６の（Ｂ）と図７の（Ｂ）とを比較すると、全体の処理時間が最も短くなるという観点からは図６の（Ｂ）に示す並列化が優れているけれども、既に割り付けられた処理の移動が最小限になっているという観点からは図７の（Ｂ）に示す並列化が優れている。
【００９２】
続いて、図７を参照しながら説明した並列化について、処理ａと処理ｄとの間にデータ依存性があり、処理ｄと処理ｅとの間にもデータ依存性がある場合について図８を参照しながら説明する。
【００９３】
図８に示す具体例は、変更規模最小化オプションが有る場合の並列化処理を示すものであって、（Ａ）はマクロタスク削除前の逐次プログラム及びそれを並列化処理（第１手順）した分割プログラムを示し、（Ｂ）はマクロタスク削除（第２手順）後の逐次プログラム及びそれを並列化処理（第３手順）した分割プログラムを示している。
【００９４】
図８の（Ａ）では、逐次プログラムとして、処理ａ、処理ｂ、処理ｃ、処理ｄ、処理ｅが順次実行されるように構成されている。各処理に必要となる時間は、処理ａ、処理ｂ、及び処理ｅが同じ時間で、処理ｄはその倍の時間、処理ｃは更にその倍の時間が必要となっている。
【００９５】
処理ａから処理ｅまでを、コア０とコア１とに分割し、全体の処理時間が最も短くなるように並列化すると、コア０には処理ａと処理ｃとが割り付けられ、コア１には処理ｂと処理ｄと処理ｅとが割り付けられる。
【００９６】
図８の（Ｂ）では、逐次プログラムとして（Ａ）の逐次プログラムからマクロタスクである処理ｄが削除されている。変更規模最小化オプションが有る場合は、図８の（Ａ）に示す既に各コアに割り付けられた処理を変更しないようにする。具体的には、コア０への処理ａ、処理ｃの割り付け、コア１への処理ｂ、処理ｅの割り付けを動かすことは無い。
【００９７】
しかしながら、図８に示す例では、上記したように、処理ａと処理ｄとの間にデータ依存性があり、処理ｄと処理ｅとの間にもデータ依存性がある。ここで処理ｄを単純に削除してしまうと、処理ｄを介して処理ａと処理ｅとの間にあったデータ依存性が切れてしまい、処理ｅの実行に不具合が生じる可能性がある。そこで本例では、処理ｄの処理コマンドのみを削除し、処理ｄと処理ａとが依存関係にあり、処理ｄと処理ｅとも依存関係にあるという情報は残しておいている。このため、コア１では、処理ｄの処理コマンド分の負荷が低減されると共に、処理ｅの確実な実行が確保される。
【符号の説明】
【００９８】
１：自動並列化コンパイラ
２０：車載装置
２１：マルチコアプロセッサ
【図１】
0006427053.tif 000002
【図２】
0006427053.tif 000003
【図３】
0006427053.tif 000004
【図４】
0006427053.tif 000005
【図５】
0006427053.tif 000006
【図６】
0006427053.tif 000007
【図７】
0006427053.tif 000008
【図８】
0006427053.tif 000009