(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0014】
以下、添付図面を参照しながら本発明の実施形態について説明する。説明の理解を容易にするため、各図面において同一の構成要素に対しては可能な限り同一の符号を付して、重複する説明は省略する。
【0016】
本実施形態(第1実施形態、第2実施形態、第3実施形態)の自動並列化コンパイラは、組込みシステム向けのシングルコアプロセッサシステム用のソースプログラム(逐次プログラム)から、組込みシステム向けのマルチコアプロセッサシステム用の並列化プログラム(分割プログラム)を生成する機能を有している。
【0017】
1−1.自動並列化コンパイラの設計概念
本実施形態の自動並列化コンパイラは、以下の機能を有している。
(1)マルチグレイン並列処理
(2)コンパイル時のスタティックスケジューリングコードの挿入
(3)実行時のダイナミックスケジューリングコードの生成
(4)階層型マクロデータフローの実現
(5)マクロタスクの分割/融合,Loop distribution/interchange等の並列性抽出
(6)データローカライズによるデータ転送効率の向上
(7)コンパイラによる電力削減
【0018】
1−2.自動並列化コンパイラの内部処理
自動並列化コンパイラは、Front End(FE),Middle Path(MP),Back End(BE)の3つのステージを有している。各ステージは実行形態として独立しており、FE,MPから生成される中間言語によりコード授受が行われる。
【0019】
FEは、逐次プログラムのソースコードを字句解析・構文解析を行い、MPにおいてparse可能な中間言語を生成する部位である。FEの生成する中間言語は、基本的に4つのオペランドを持つ解析木(parse tree)で表現されており、全体として1つのブロックを形成していて構造化は行われていない。
【0020】
MPは、制御依存性解析・データ依存性解析・最適化等を行う部位であり、そのデータを用いて粗粒度・中粒度・近細粒度並列化のマルチグレイン並列処理を行う。
【0021】
BEは、MPが生成した並列化中間言語を読み込んで実際のマシンコードを生成する部位である。当該部位は、ターゲットとなっているマルチコアアーキテクチャのアセンブラコードを生成するBEの他、OpenMP用の並列化FortranコードやCコードを生成するBEを有している。さらには、当該部位は、後述する並列化APIによりメモリ配置,データ転送を含めて並列化したコードを生成するBE等、多様なアーキテクチャに対応したコードを出力するBEを有している。
【0022】
1−3.自動並列化コンパイラの並列性解析
自動並列化コンパイラは、逐次プログラムを、基本ブロック(BB),繰り返しブロック(RB),サブルーチンブロック(SB)の3種類の粗粒度タスク(マクロタスク(MT))に分割するマクロデータフロー処理を行う。しかし、マクロデータフロー処理では、プログラムの形状によってはプロセッサの利用効率が上がらず、十分な粗粒度並列性が抽出できないという問題点がある。
【0023】
そこで、自動並列化コンパイラでは、従来の単階層マクロデータフロー処理手法を拡張し、MT内部に対してマクロデータフロー処理を階層的に利用する階層型マクロデータフロー処理を採用している。階層的マクロデータフロー処理では、MTの階層的な定義を行い、各階層のマクロタスクに対してマクロタスク間の並列性の解析を行う。
【0024】
<マクロフローグラフ(MFG)の生成>
自動並列化コンパイラは、まず、生成された各階層のマクロタスクに対して、マクロタスク間の制御依存性とデータ依存性を解析する。この解析結果は、マクロフローグラフ(MFG)として表される。
【0025】
<マクロタスクグラフ(MTG)の生成>
MFGは、マクロタスク間の制御依存性とデータ依存性を表すが、並列性は表していない。並列性を抽出するためには、各マクロタスクに対し、制御依存性とデータ依存性の両方を考慮した最早実行可能条件解析を行う必要がある。最早実行可能条件とは、そのMTが最も早い時点で実行可能になる条件であり、次のような実行条件から求められる。
(1)MTiがMTjにデータ依存するならば、MTjの実行が終了するまでMTiは実行できない。
(2)MTjの条件分岐先が確定すれば、MTjの実行が終了しなくても、MTjに制御依存するMTiは実行できる。
【0026】
したがって、最早実行可能条件の一般形は次のようになる。
(MTiが制御依存するMTjがMTiに分岐する)AND((MTiがデータ依存するMTk(0≦k≦|N|))が終了)OR(MTkが実行されないことが決定する))
マクロタスクの最早実行可能条件は、マクロタスクグラフ(MTG)で表される。
【0027】
1−4.マルチグレイン並列処理
自動並列化コンパイラでは、従来のループ並列化に加え、ループ間,サブルーチン間における粗粒度タスク間の並列性を利用する粗粒度タスク並列処理や、ステートメント間の並列性を利用する近細粒度並列処理を効果的に組み合わせたマルチグレイン並列処理(参考文献1(本多弘樹, 岩田雅彦, 笠原博徳、「Fortranプログラム粗粒度タスク間の並列性検出手法」、電子情報通信学会論文誌、1990年)参照)を実現している。
【0028】
<粗粒度タスク並列処理>
自動並列化コンパイラは、BB,RB,SB等のMT間の制御依存性とデータ依存性を表現したマクロフローグラフ(MFG)を生成し、さらに、MFGから最早実行可能条件解析により引きだしたMT間の並列性を、マクロタスクグラフ(MTG)として表現する(参考文献1,参考文献2(笠原,合田,吉田,岡本,本多、「Fortranマクロデータフロー処理のマクロタスク生成手法」、信学論、1992年、Vol.J75-D-I、No.8、pp.511-525)参照)。
【0029】
その後、自動並列化コンパイラは、MTG上のMTを、1つ以上のプロセッサエレメント(PE)をグルーピングしたプロセッサグループ(PG)に割り当てる。
【0030】
<中粒度並列処理>
PGに割り当てられたMTが、DOALLループ、或いはイタレーションレベルで並列処理が可能なものであれば、そのMTには、プロセッサクラスタ内のプロセッサによって中粒度並列処理がなされる。この中粒度並列処理は、DOループイタレーション間の並列性を利用する並列処理のことであり、マルチコアプロセッサにおける並列処理では最も一般的なものである。
【0031】
<近細粒度並列処理>
ステートメントレベルの近細粒度タスクに対する並列処理を、近細粒度並列処理という。これによって、依存の無いステートメントも並列実行が可能になり、実行時間が短縮される。
【0032】
1−5.マクロタスクスケジューリング
粗粒度タスク並列処理では、各階層で生成されたマクロタスクは、PGに割り当てられて実行される。どのPGにマクロタスクを割り当てるかを決定するスケジューリング手法として、下記のダイナミックスケジューリングとスタティックスケジューリングがあり、これらは、マクロタスクグラフの形状や実行時非決定性等を元に選択される。
【0033】
<ダイナミックスケジューリング>
条件分岐等の実行時不確定性が存在する場合には、ダイナミックスケジューリングによって実行時にマクロタスクをPGに割り当てる。ダイナミックスケジューリングルーチンは、マクロタスクの終了や分岐方向の決定に応じてマクロタスク実行管理テーブルを操作し、各マクロタスクの最早実行可能条件を検査する。
【0034】
マクロタスクが実行可能であれば、レディキューにマクロタスクが投入される。レディキュー内のマクロタスクは、その優先順位に従ってソートされ、レディキューの先頭のマクロタスクが、アイドル状態のプロセッサクラスタに割り当てられる。
【0035】
また、ダイナミックスケジューリングコード生成時には、一つの専用のプロセッサがスケジューリングを行う集中スケジューリング方式と、スケジューリング機能を各プロセッサに分散した分散スケジューリング方式を、使用するプロセッサ台数,システムの同期オーバーヘッドに応じて使い分けることができる。
【0036】
<スタティックスケジューリング>
一方、スタティックスケジューリングは、マクロタスクグラフがデータ依存エッジのみを持つ場合に使用され、自動並列化コンパイラが、コンパイル時にPGへのマクロタスクの割り当てを決める方式である。
【0037】
スタティックスケジューリングは、実行時スケジューリングオーバーへッドを無くし、データ転送と同期のオーバーへッドを最小化することが可能であるため、粒度の細かいタスクのスケジューリングに対しても効果的に利用できる。
【0038】
また、スタティックスケジューリングの際、タスクのコストは自動並列化コンパイラでのタスクコスト推定値を適用するが、自動並列化コンパイラのプロファイル自動フィードバック機能を用いることで、実コストでタスクスケジューリングを行うことも可能である。
【0039】
プロファイル自動フィードバック機能を用いる場合、第1フェーズとして、逐次プログラムをMTに分解し、MT毎にプロファイラ関数を挿入して逐次プログラムを生成する。このプロファイラ関数では、タスク実行コスト(clock cycle)とタスク実行回数を計測する。このプロファイラ関数が挿入された逐次プログラムを一度ターゲットとなるマシン上で実行することで、ターゲットとなるマシン上でのタスク実行コストとタスク実行回数の情報を持つファイルを出力する。
【0040】
そして、第2フェーズにて、この出力ファイルと逐次プログラムを入力として、実コストに基づきスケジューリングした並列化プログラムが生成される。
【0041】
1−6.データローカライゼーション
自動並列化コンパイラは、プログラム全域に渡るキャッシュ最適化を行うことが可能である。自動並列化コンパイラは、ループ間などの並列性を解析した後、ループ間にデータ依存があることが分かると、依存があるループ間でのキャッシュのグローバル最適化を試みる(参考文献3(特許第4177681号公報)参照)。
【0042】
具体的には、各ループでアクセスされる配列を調査し、同一の分割ループは同一の配列部分にアクセスするように調整することにより、同一の分割ループを同一プロセッサに割り当てる。これにより、同一の分割ループでは、全ての配列データがキャッシュ上で再利用されるようになる。
【0043】
このローカライズ技術は、
(1)任意のサイズのローカルメモリ或いは分散共有メモリが与えられた時に、DMA(DTU)(参考文献4(特許第4476267号公報)参照)を用いアクセスされる前に、前記プロセッサに近接したローカル或いは分散共有メモリに事前ロードし、プログラム全域で再利用する。
(2)送付先のメモリが一杯の場合には、送付先プロセッサのDTUが、メモリからの掃き出し優先順位に従ってデータを共有メモリ等へ掃き出したことを同期フラグで知らされたら、自動的に空いたメモリにデータを転送する。
(3)将来再利用されるデータであるが、暫くの間使用されず、メモリの領域を開ける必要がある場合には、CPUによるタスク実行の裏側でDTUが当該データを集中共有メモリに待避し、使用時までに再ロードする。
といったローカルメモリ管理,データ転送技術へと進化している(参考文献5(英国特許第2478874号明細書)。
【0044】
1−7.並列化プログラムの生成
自動並列化コンパイラにおける並列化プログラムの生成は、自動並列化API(参考文献7(早稲田大学、「Optimally Scheduled Advanced Multiprocessor Application Program Interface」、2008年)参照)を用い、並列化C或いは並列化Fortranのような、source-to-sourceで並列化を行うことが可能である。
【0045】
この場合には、自動並列化コンパイラは、様々なプラットフォームにおいて並列化プログラムを実行可能とするため、後述する自動並列化API標準解釈系を用いて、各プロセッサ用のC或いはFortranのディレクティブ部分をランタイムライブラリコールに変換する。その後、自動並列化コンパイラは、各プロセッサ用のコードを逐次コンパイラでコンパイルしてバイナリを生成し、このバイナリをリンクすると、対象となるマルチコアプロセッサ上で並列化プログラムを実行可能となる。
【0046】
2.組み込みシステム用の逐次プログラムの並列化手順と手法
次に、組み込みシステム用の逐次プログラムの特徴について述べ、本実施形態の自動並列化コンパイラによる並列化手法について説明する。なお、組み込みシステムとは、例えば、車載装置であっても良いし、車載装置以外の電子装置であっても良い。また、逐次プログラムは、モデルベース設計により自動生成されたもの(一例として、MathWork社のMatlab(登録商標),Simulink(登録商標)にて自動生成されたもの)であっても良い。
【0047】
自動並列化コンパイラは、条件分岐と代入文により構成され、処理が細かい逐次プログラムに対して、インライン展開やリネーミングを行い、並列性を抽出する。また、リアルタイム性を順守するために条件分岐隠蔽のためのタスク融合を行い、オーバーヘッドが低くなるようにスタティックスケジューリングを行う。さらに、実コストでスタティックスケジューリングを行うために、プロファイル自動フィードバック機能を適用しても良い。
【0048】
また、逐次プログラムにおいて、条件コンパイルスイッチ(プリプロセッサへの命令)により、仕向地や機能やハードウェアの構成等が異なる組み込みシステムの各種別に応じてコンパイルの対象となる記述を選択する条件付コンパイルが行われる場合がある。このような場合、逐次プログラムの各条件コンパイルスイッチの引数として、いずれかの種別に対応する情報(仕向地等を示す情報)を設定することで、逐次プログラムから、該種別に対応するバイナリコードが生成される。
【0049】
これに対し、本実施形態の自動並列化コンパイラは、条件付コンパイルによるコンパイル対象の選択を無視し、逐次プログラムの全ての部分を対象としてマクロタスクの分割や並列性の抽出やスタティックスケジューリング等を行い、並列化プログラムを生成する。その後、並列化プログラムから、条件付コンパイルによりコンパイルの対象外となる記述を特定し、該記述を除いた状態で、マルチコアプロセッサを動作させるためのバイナリデータを生成する。
【0050】
2−1.自動並列化コンパイラの動作環境等について
自動並列化コンパイラ1は、例えば、DVD,CD−ROM,USBメモリ,メモリカード(登録商標)等の光ディスク,磁気ディスク,半導体製メモリ等として構成された記憶媒体18に記憶された状態で、ユーザに提供される(
図1参照)。無論、ネットワークを経由してユーザに提供されても良い。
【0051】
そして、自動並列化コンパイラ1がインストールされたパーソナルコンピュータ(PC)10は、自動並列化コンパイル装置として動作する。PC10は、ディスプレイ11,HDD12,CPU13,ROM14,RAM15,入力装置16,読取部17等を備える。
【0052】
ディスプレイ11は、CPU13から受けた映像信号を、ユーザに対して映像として表示する。
【0053】
入力装置16は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をCPU13に出力する。
【0054】
読取部17は、自動並列化コンパイラ1等が記憶された記憶媒体18からデータを読み取る部位である。
【0055】
RAM15は読み出し、書き込み可能な揮発性メモリであり、ROM14は読み出し専用の不揮発性メモリであり、HDD12は読み出し,書き込みが可能な不揮発性メモリである。ROM14,HDD12には、CPU13が読み出して実行するプログラム等が予め記憶されている。
【0056】
RAM15は、CPU13がROM14,HDD12に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域や、作業用のデータを一時的に保存するための記憶領域として用いられる。
【0057】
CPU13は、OSをHDD12から読み出して実行し、HDD12に記録されている各種プログラムをOS上のプロセスとして実行する。また、CPU13は、このプロセスにおいて、必要に応じて入力装置16から信号の入力を受け付け、ディスプレイ11に映像信号を出力し、RAM15,HDD12に対してデータの読み出し/書き込みの制御を行う。
【0058】
PC10には、読取部17を介して記憶媒体18から読み取られた自動並列化コンパイラ1がインストールされており、自動並列化コンパイラ1は、HDD12に保存され、OS上のプロセスとして実行されるアプリケーションの1つとなっている。
【0059】
なお、この自動並列化コンパイル装置は、車載装置等といった組み込みシステム向けの並列化プログラムの開発に用いられる。しかしながら、これに限定されることは無く、例えば情報家電等といった様々な用途の組込みシステム向けの並列化プログラムの開発や、組込みシステム以外の他の用途の並列化プログラムの開発に用いることができる。
【0060】
3.車載装置の構成について
続いて、本実施形態の自動並列化コンパイラ1により生成された並列化プログラムにより動作する車載装置20の構成について説明する(
図2参照)。無論、自動並列化コンパイラ1は、車載装置20に限らず、同様の構成を有する様々な電子装置を動作させる並列化プログラムを生成可能である。
【0061】
車載装置20は、マルチコアプロセッサ21,通信部22,センサ部23,入出力ポート24等を備える。
【0062】
マルチコアプロセッサ21は、ROM21aと、RAM21bと、複数のコア21c,21d…等を有している。
【0063】
ROM21aは、自動並列化コンパイラ1により生成された並列化プログラム21a−1(バイナリデータ)が保存されている。マルチコアプロセッサ21は、並列化プログラム21a−1に従い動作し、車載装置20を統括制御する。
【0064】
RAM21bは、コア21c,21d…等によりアクセスされる部位である。通信部22は、車内LAN等を介して接続された他のECUと通信を行う部位である。
【0065】
センサ部23は、制御対象等の状態を検出するための各種センサから構成される部位である。入出力ポート24は、制御対象を制御するための各種信号の送受信を行う部位である。
【0066】
[具体例について]
続いて、本実施形態の自動並列化コンパイラ1により並列化プログラムを生成する処理の具体例について説明する。以下の説明において、処理A等といった記載がなされるが、これは、各種演算や代入や分岐処理や関数コール等からなる一連の処理の記述を意味する。
【0067】
(第1実施形態)
図3に示されるように、第1実施形態に係る並列化コンパイル方法では、ステップS101においてデータ依存関係無効化情報の有無を判断する(無効化手順)。データ依存関係無効化情報が有ればステップS103の処理に進み、データ依存関係無効化情報が無ければステップS102の処理に進む。
【0068】
ステップS102では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを
図4に示す。
図4に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理Dを含んでおり、処理Aと処理Bとの間にデータ依存関係が有るものとする。処理Aの処理時間は100、処理Bの処理時間は20、処理Cの処理時間は30、処理Dの処理時間は35とする(これら処理時間の値は相対値である)。
【0069】
処理Aと処理Bとの依存関係があるので、処理Aと処理Bがコア0に割り当てられる。この前提で全体の処理時間を最短なものとするように、処理Cと処理Dがコア1に割り当てられる。この例の場合、コア0の処理時間は120となり、コア1の処理時間は65となる。
【0070】
ステップS103では、データ依存関係無効化情報を取得する。本例の場合、処理Aと処理Bとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。ステップS103に続くステップS104では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する(生成手順)。
【0071】
この分割プログラムの生成における具体例の一つを
図5に示す。
図5に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理Dを含んでおり、処理Aと処理Bとの間にデータ依存関係が有るものとする。処理Aの処理時間は100、処理Bの処理時間は20、処理Cの処理時間は30、処理Dの処理時間は35とする(これら処理時間の値は相対値である)。
【0072】
まず、処理Aと処理Bとの依存関係が無効化される。処理Aと処理Bとの依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア0に処理Aが割り当てられ、コア1に処理B、処理C、処理Dが割り当てられる。この例の場合、コア0の処理時間は100となり、コア1の処理時間は85となる。ステップS102の処理で説明した例と比較すると、全体の処理時間が改善されている。
【0073】
(第2実施形態)
図6に示されるように、第2実施形態に係る並列化コンパイル方法では、ステップS201においてデータ依存関係無効化情報の有無を判断する(無効化手順)。データ依存関係無効化情報が有ればステップS203の処理に進み、データ依存関係無効化情報が無ければステップS202の処理に進む。
【0074】
ステップS202では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを
図8に示す。
図8に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理D、処理Eを含んでいる。処理Aから処理Eは、
図7に示されるようなデータ依存関係が有る。
図7に示されるように、処理Bと処理Dとの間、処理Cと処理D及び処理Eとの間、処理Dと処理Eとの間にそれぞれデータ依存関係が有るものとする。処理Aの処理時間は15、処理Bの処理時間は10、処理Cの処理時間は50、処理Dの処理時間は30、処理Eの処理時間は20とする(これら処理時間の値は相対値である)。
【0075】
これらデータ依存関係を考慮し、全体の処理時間を最短なものとするように、処理A、処理B、処理D、処理Eがコア0に割り当てられ、処理Cがコア1に割り当てられる。処理Bと処理Dとの間には、処理Cと処理Dとのデータ依存関係を維持するように待ち時間が設けられる。この例の場合、コア0の処理時間は100となり、コア1の処理時間は50となる。
【0076】
ステップS203では、データ依存関係無効化情報を取得する。本例の場合、処理Cと処理Dとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。
【0077】
ステップS203に続くステップS204では、参照データ周期タイミング(処理同期タイミング)の依存関係有無を判断する(タイミング判断手順)。参照データ周期タイミングの依存関係が有ればステップS206の処理に進み、参照データ周期タイミングの依存関係が無ければステップS205の処理に進む。
【0078】
このように参照データ周期タイミングを確認するのは、各処理の処理時間に基づいて分割プログラムを生成しても、処理時間は一定値ではなく平均値や最大値であるため、実際の処理時間が増減する場合があるためである。このように処理時間の増減が発生すると、データ依存関係の無効化が許可されても、処理の前後関係は維持したい処理同士において不都合が発生するので、その前後関係を維持することが別途必要となる。ステップS204ではこの点を確認している。
【0079】
ステップS205では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する(生成手順)。
【0080】
この分割プログラムの生成における具体例の一つを
図9に示す。
図9に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理D、処理Eを含んでおり、
図7に示されたようなデータ依存関係が有るものとする。
【0081】
まず、
図7に示されたデータ依存関係が無効化される。データ依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア0に処理B、処理D、処理Aが割り当てられ、コア1に処理C、処理Eが割り当てられる。この例の場合、コア0の処理時間は55となり、コア1の処理時間は70となる。
【0082】
ステップS206では、参照データ周期タイミング同期設定が取得される。本例では、処理Cの後に処理Dを実行することが、処理周期毎に入れ替わらないことが条件となっている。
【0083】
ステップS206に続くステップS207では、同期条件付きの並列化処理が実行され、分割プログラムが生成される。
図10に、同期条件付きの並列化処理の一例を示す。
図10に示される例は、開始同期の例であって、コア1に処理B、処理D、処理Aが割り当てられ、コア0に処理C、処理Eが割り当てられている。処理Dを処理Cの処理順が入れ替わらないようにするため、処理Cの開始時期を調整するための待ち時間が設けられている。この例では、コア0の処理時間が55となり、コア1の処理時間が80となる。
【0084】
図11に、同期条件付きの並列化処理の別例を示す。
図11に示される例は、終了同期の例であって、コア1に処理B、処理D、処理Aが割り当てられ、コア0に処理C、処理Eが割り当てられている。処理Dを処理Cの処理順が入れ替わらないようにするため、処理Dの終了時期を調整するための待ち時間が設けられている。この例では、コア0の処理時間が65となり、コア1の処理時間が70となる。
【0085】
図10に示した開始同期を用いるか、
図11に示した終了同期を用いるかは、優先したい別の条件によって定まる。例えば、全体の処理時間を短くしたい条件であれば、
図11に示した終了同期を用い、処理時間の短い方をより重視するのであれば
図10に示した開始同期を用いる。優先したい別の条件としては、この他に各コアの処理量や、メモリの容量等が用いられる。
【0086】
(第3実施形態)
図12に示されるように、第3実施形態に係る並列化コンパイル方法では、ステップS301においてデータ依存関係無効化情報の有無を判断する(無効化手順)。データ依存関係無効化情報が有ればステップS303の処理に進み、データ依存関係無効化情報が無ければステップS302の処理に進む。
【0087】
ステップS302では、従来と同等の並列化処理を実行し、分割プログラムを生成する。この分割プログラムの生成における具体例の一つを
図14に示す。
図14に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理D、処理Eを含んでいる。処理Aから処理Eは、
図13に示されるようなデータ依存関係が有る。
図13に示されるように、処理Aと処理Cとの間、処理Bと処理Cとの間、処理Cと処理Dとの間、処理Dと処理Eとの間にそれぞれデータ依存関係が有るものとする。処理Aの処理時間は15、処理Bの処理時間は10、処理Cの処理時間は30、処理Dの処理時間は50、処理Eの処理時間は20とする(これら処理時間の値は相対値である)。
【0088】
これらデータ依存関係を考慮し、全体の処理時間を最短なものとするように、処理A、処理C、処理D、処理Eがコア0に割り当てられ、処理Bがコア1に割り当てられる。この例の場合、コア0の処理時間は115となり、コア1の処理時間は10となる。
【0089】
ステップS303では、データ依存関係無効化情報を取得する。本例の場合、処理Cと処理Dとの間ではデータ依存関係を無効化しても構わないというデータ依存関係無効化情報があるものとする。
【0090】
ステップS303に続くステップS304では、参照データ周期タイミング(処理同期タイミング)の依存関係有無を判断する(タイミング判断手順)。参照データ周期タイミングの依存関係が有ればステップS306の処理に進み、参照データ周期タイミングの依存関係が無ければステップS305の処理に進む。
【0091】
このように参照データ周期タイミングを確認するのは、各処理の処理時間に基づいて分割プログラムを生成しても、処理時間は一定値ではなく平均値や最大値であるため、実際の処理時間が増減する場合があるためである。このように処理時間の増減が発生すると、データ依存関係の無効化が許可されても、処理の前後関係は維持したい処理同士において不都合が発生するので、その前後関係を維持することが別途必要となる。ステップS304ではこの点を確認している。
【0092】
ステップS305では、依存関係無効化部分を付与し、並列化処理を実行し、分割プログラムを生成する(生成手順)。
【0093】
この分割プログラムの生成における具体例の一つを
図15に示す。
図15に示されるように、逐次プログラムであるCソフトが処理A、処理B、処理C、処理D、処理Eを含んでおり、
図13に示されたようなデータ依存関係が有るものとする。
【0094】
まず、
図13に示されたデータ依存関係が無効化される。データ依存関係が無くなったので、全体の処理時間を最短なものとなるように並列化される。本例の場合は、コア0に処理A、処理B、処理Cが割り当てられ、コア1に処理D、処理Eが割り当てられる。この例の場合、コア0の処理時間は55となり、コア1の処理時間は70となる。
【0095】
ステップS306では、擬似データ依存設定が取得される。本例では、処理Cと処理Dとのデータ依存関係が逆になることが条件となっている。具体的には、処理Cが完了してから処理Dが実行されるデータ依存関係にあるところ、その関係が逆転し、処理Dが完了してから処理Cが実行されるデータ依存関係になることが条件となっている。
【0096】
ステップS306に続くステップS307では、擬似データ依存条件付きの並列化処理が実行され、分割プログラムが生成される。
図16に、擬似データ依存条件付きの並列化処理の一例を示す。
図16に示される例は、コア0に処理A、処理B、処理Cが割り当てられ、コア1に処理D、処理Eが割り当てられている。処理Dに対して処理Cの処理順が入れ替わらないようにするため、擬似的なデータ依存関係が付与されている。この例では、コア0の処理時間が80となり、コア1の処理時間が70となる。
【0097】
本実施形態では、無効化情報有りとされた2以上のマクロタスクに含まれる第1マクロタスクが、別のマクロタスクとデータ依存関係を有していたものの、2以上のマクロタスクに含まれる第2マクロタスクとのデータ依存関係を有することにより別のマクロタスクとのデータ依存関係が不要になったためそのデータ依存関係が解消されているか否かを判断し、分割プログラムのコンパイルにあたって、別のマクロタスクと第1マクロタスクとのデータ依存関係を回復させることができる。
【0098】
この具体的な例を
図17を参照しながら説明する。
図17の(A)では、処理Xと処理Cとの間、処理Aと処理Cとの間、処理Bと処理Cとの間、処理Cと処理Dとの間、処理Dと処理Eとの間にそれぞれデータ依存関係があるものとしている。例えば、処理Xが初期値cを与える処理であり、処理Cは演算a+bによって値cを与える処理であり、処理Dが値cによって値dを得る処理である場合、処理Xと処理Dとの間のデータ依存関係は冗長であるので解消される。
【0099】
この状態で、処理Cと処理Dとの間のデータ依存性が解消されると、処理Dにおいて処理Xの結果が必要になるので、解消していた処理Xと処理Dとの間のデータ依存関係を回復させる。
【0100】
更に別例について
図18を参照しながら説明する。
図18の(A)では、処理A及び処理Bと処理Cとの間、処理Cと処理Dとの間、処理Dと処理Eとの間にそれぞれデータ依存関係がある。処理Aが値aを与える処理であり、処理Bが値bを与える処理であり、処理Cがa+bの演算によって値cを与える処理であり、処理Dがc+a+bの演算に寄って値dを与える処理であるものとする。
【0101】
処理Cと処理Dとの間のデータ依存関係が解消されると、処理Dにおいて処理A及び処理Bの処理結果が必要になるので、
図18の(B)に示されるように、処理A及び処理Bと処理Dとの間のデータ依存関係を構築する。
【0102】
更に別例について
図19を参照しながら説明する。
図19の(A)では、処理A及び処理Bと処理Cとの間、処理Cと処理Dとの間、処理Dと処理Eとの間にそれぞれデータ依存関係がある。処理Cと処理Dとの間のデータ依存関係が解消されると
図19の(B)の状態になる。ここで、処理周期毎の順序変化を解消するため、処理Dから処理Cへの擬似データ依存関係を構築する(
図19の(C)参照)。