以下に、本発明の並列化プログラム生成方法の概略及び実施例を添付の図面を用いて詳細に説明する。
図3は、本発明による並列化プログラム生成方法の概略を示す図である。
ステップS1で逐次プログラムからプログラム依存グラフ(PDG:Program Dependence Graph)を生成する。次に、ステップS2で、手続きとして他のプロセッサエレメントで実行するに適した処理量となるまで依存関係を縮退することにより、手続きを頂点とする縮退プログラム依存グラフを作成する。ステップS3で、作成した縮退プログラム依存グラフから、非投機的に手続きの起動と同期を制御する手続き制御プログラムを生成する。またステップS4で、縮退プログラム依存グラフから、その各頂点に相当する手続きプログラムを生成する。
まず逐次プログラムからプログラム依存グラフを生成する処理(図3のステップS1)について説明する。
プログラム依存グラフとは、例えば非特許文献2乃至4等に説明されるように、プログラムの文を頂点とし、文と文の間の関係を辺で表現したグラフである。非特許文献2乃至4に記載されるプログラム依存グラフは、次のような頂点集合Vと辺集合Eの組で表現されるものであり、逐次プログラムを解析することにより生成できる。
[V:頂点集合]
エントリ:プログラムの開始ポイントを表す。
初期定義:プログラム開始時の初期値の定義を表す。
プリディケート: If-then-elseまたはwhile-loopの条件判定を表す。
代入文:プログラムの代入文を表す。
最終使用:プログラム終了時の変数の参照を表す。
[E:辺集合]
[制御依存辺: v→c L w]プリディケート頂点vに対して、その条件判定結果により、頂点wに到達するか否かが決まることを表す。Lは条件判定のフラグを表し、L=Tのときは条件判定結果が真の場合に頂点wを実行し、L=Fのときは結果が偽の場合に頂点wを実行する。
[データ依存辺]
[ループ独立フロー依存辺: v→li x w]頂点vで代入された変数xの値を、頂点wで参照するような場合のデータ依存関係を表す。ここでは、ループを繰り越さない場合のみを表す。
[ループ繰り越しフロー依存辺: v→lc(L) x w]頂点vで代入された変数xの値を、頂点wで参照するような場合のデータ依存関係を表す。ループLを繰り越す場合を表す。
[定義順序関係: v→do(u) x w]頂点v及び頂点wが変数xの値を代入し、頂点uで参照するような場合の、頂点vと頂点wの順序関係を表す。制御の流れによっては、v, w, u, あるいは、v, uの順に実行される可能性がある場合に、v, wの実行順序を表すものである。
以下において、縮退プログラム依存グラフを作成する処理(図3のステップS2)について説明する。
上記のような一般的なプログラム依存グラフでは、文または代入式を頂点としたグラフとなっている。文または代入式を頂点とした場合、大規模なソフトウェアではグラフの頂点数が数千〜数万となってしまう。一般的に、コンパイラのグラフを用いた最適化の問題の計算量は、グラフの規模に対して指数関数的に増大することが知られている。したがって、例えば数個の手続きなどを対象とした頂点数が数十程度のグラフの場合には、解析が可能であるが、現実的な規模のソフトウェア全体に対する最適化は困難といえる。
そこで、プログラム依存グラフの頂点数及び辺数を低減すべく、プログラム依存グラフの依存関係を縮退して頂点を融合し、粗粒度のプログラム依存グラフを作成する。依存関係を縮退することによりグラフの規模を1/10〜1/100とすることで、現実的な時間にて、プログラムの最適化を可能にする。
依存関係の縮退は、次のような方法で、縮退可能な依存関係及び頂点の集合を求め、依存関係を削除して頂点を1つの頂点に融合することにより実行される。
1.構文規則に基づく縮退
一般にプログラム依存グラフから等価な逐次プログラムの制御の流れを再構成することは、困難と言われている。これは、制御の依存関係のみの表現となっているため、依存関係を満足する制御の流れは一意に決定できない上に、グラフを変形するような最適化を行なった場合、依存関係を満足するような制御の流れが存在しないような場合も出てくるためである。
しかし、表現するプログラムの制御構造を、if文、while文、及び、代入文に限定し、プログラム依存グラフの制御依存部分グラフ(頂点と制御依存辺のみで構成される部分グラフ)の形が木構造となる場合は、プログラムの制御の流れを再構成できることが知られている(非特許文献2)。そこで、プログラムにおけるif文、while文でない制御文に対して、入り口と出口がそれぞれ1つとなるようなプログラムのブロックを求める。ブロック全体とブロック内部の依存関係を1つの頂点に縮退することで、安全に制御の流れを再構成可能な範囲の縮退プログラム依存グラフを作成する。
2.結合度に基づく縮退
プログラム依存グラフを探索して、頂点間の結合の強さを求める。結合度は、データ依存辺とその大きさ、及び、制御依存辺、処理の大きさから計算されるものとする。ある結合度以上の頂点に対して、縮約可能な条件を満足する場合は、頂点を結合し依存関係を縮約する。ここで、次の2つ条件を満たすときに、頂点を結合しての縮約が可能となる。
1)プログラム依存グラフに対応するCFG(Control Flow Graph:制御フローグラフ)上で頂点集合外から頂点集合内への分岐は頂点集合の先頭頂点へのみであり、頂点集合内から頂点集合外への分岐は頂点集合の最後の頂点のみである。
2)頂点間のデータ依存パスに外部の頂点が含まれない。
以上のようにして、「構文規則に基づく縮退」又は「結合度に基づく縮退」により、頂点数が大幅に削減された縮退プログラム依存グラフを生成することができる。縮退プログラム依存グラフは、次の要素から構成される。
[V:頂点集合]
エントリ:プログラムの開始ポイントを表す。
初期定義:プログラム開始時の初期値の定義を表す。
プリディケート: If-then-elseまたはwhile-loopの条件判定を表す。
文の集合: プログラムを構成する文の集合を表す。
最終使用:プログラム終了時の変数の参照を表す。
[E:辺集合]
[制御依存辺: v→c L w]プリディケート頂点vに対して、その条件判定結果により、頂点wに到達するか否かが決まることを表す。Lは条件判定のフラグを表し、L=Tのときは条件判定結果が真の場合に頂点wを実行し、L=Fのときは結果が偽の場合に頂点wを実行する。
[データ依存辺]
[ループ独立フロー依存辺: v→li x w]頂点vで代入された変数xの値を、頂点wで参照するような場合のデータ依存関係を表す。ここでは、ループを繰り越さない場合のみを表す。
[ループ繰り越しフロー依存辺: v→lc(L) x w]頂点vで代入された変数xの値を、頂点wで参照するような場合のデータ依存関係を表す。ループLを繰り越す場合を表す。
[定義順序関係: v→do(u) x w]頂点v及び頂点wが変数xの値を代入し、頂点uで参照するような場合の、頂点vと頂点wの順序関係を表す。制御の流れによっては、v, w, u, あるいは、v, uの順に実行される可能性がある場合に、v, wの実行順序を表すものである。
以下において、手続き制御プログラムを生成する処理(図3のステップS3)及び手続きプログラムを生成する処理(図3のステップS4)について説明する。
まず手続きプログラムの生成について説明する。上記のようにして生成された縮退プログラム依存グラフの頂点は、入力逐次プログラムの文の部分集合であって、文の間の制御の流れの情報を有している。従って、着目する1つの頂点へのデータフロー入力辺が表す変数を入力とし、データフロー出力辺が表す変数を出力とする、1つの手続きプログラムを1つの頂点に対して生成する。また、制御の流れより手続きプログラムの本文を、また、本文の実行に必要な局所変数をそれぞれ生成する。
図4は、手続きプログラム生成方法の概要を示す図である。図5は、図4の手続きプログラム生成方法により生成される手続きプログラムを示す図である。
図4のステップS1において、着目頂点についてデータフロー入力辺が表す変数を入力として、入力変数を引数として受信するためのプログラム部分を生成する。これにより、図5に示す入力変数の引数受信部分10が生成される。ステップS2において必要な変数を探索する。更にステップS3において、探索により見つかった変数について変数宣言を生成する。これにより、図5に示す変数宣言部分11が生成される。
ステップS4において、着目頂点の文の間の制御の流れの情報に基づいて、プログラムの本文を生成する。これにより、図5に示すプログラム本体部分12が生成される。ステップS5において、着目頂点のデータフロー出力辺が表す変数を出力として返すためのプログラム部分を生成する。これにより、図5に示す出力変数のセット部分13が生成される。
このように、手続きプログラムとしては、頂点が表す文/文の集合を実行する手続きとする。また、入力変数を手続きの引数とし、出力変数を復帰値あるいは、出力変数を格納するアドレスを引数として受け取るような手続きを作成する。
次に手続き制御プログラムの生成について説明する。非特許文献2に記載される技術に基づいて、縮退したプログラム依存グラフから制御の流れを安全に再構成することができる。具体的には、縮退したプログラム依存グラフの制御依存部分木について、プログラムの実行順序関係を計算し、基本ブロックを求める。基本ブロックとは、分岐(IF、GOTO、LOOP等)や合流を含まない順番に実行される頂点の列のことを言う。各中間節点が表す制御構造と子頂点が表す「手続き」の呼び出しを行なうプログラムを生成することで、並列プログラムを生成することができる。「手続き」を実行する上で必要となる入力および出力データの送受信と待ち合わせを行なうコードも生成する。基本ブロック内の手続き呼び出しおよびデータ転送の依存関係に関しては、依存関係待ち合わせのメカニズムを用いて制御する。
以下に、本発明の実施例について詳細に説明する。第1の実施例は、依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を共有メモリで実現する例であり、第2の実施例は、依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を分散メモリで実現する例である。まず第1の実施例と第2の実施例に共通な部分について説明する。
図6は、手続き制御プログラムの生成方法を示すフローチャートである。まずステップS1で、頂点間の実行順序関係を計算する。縮退したプログラム依存グラフは、データ及び制御の依存関係のみを表現したグラフであって頂点間の実行順序は明示されていないので、これから適切な制御の流れを再構成する必要がある。そこで、縮退したプログラム依存グラフの制御依存部分木について、各中間節点の子頂点の実行順序を計算する。この結果、頂点間の半順序関係を求めることができる。この実行順序関係を用いて、制御プログラムを生成することとなる。またその課程において、逆依存関係、出力依存関係が抽出される。
次にステップS2で、求めた実行順序(制御の流れ)から、基本ブロックを抽出する。
次にステップS3で、制御プログラムの変数と初期値代入文を生成する。この際、静的単一代入形式(非特許文献5、320頁)に変換することで、並列性を向上されることも考えられる。ここで変数としては、データの受け渡しを行うための変数を生成する。
次にステップS4で、S1で求めた実行順序順に制御依存部分グラフを探索し、制御プログラムを生成する。プリディケート頂点については、その頂点が表す制御構造を生成する。そして、制御構造の本文として、当該頂点の下位の部分木の制御プログラムを生成する。基本ブロックについては依存関係に基づく非同期遠隔手続きを行う文を生成する。これについては以下に詳細に説明する。
更にステップS5で、手続きの終了の待ち合わせを行う文を生成する。
図7は、頂点間の実行順序関係を決定する方法を示すフローチャートである。図7の処理は、図6のステップS1に相当する。図7に示す処理の入力は縮退したプログラム依存グラフPDGであり、出力は縮退したプログラム依存グラフPDG及びその制御の流れである。
ステップS1で、縮退したプログラム依存グラフPDGのエントリ頂点(プログラムの開始ポイント)をvとする。ステップS2で、頂点v以下の制御の流れを再構成する。以上で処理を終了する。
図8は、頂点v以下の制御の流れを再構成する処理(図7のステップS2)を示すフローチャートである。図8の処理の入力は、縮退したプログラム依存グラフPDG及び頂点vである。
ステップS1で、Region(v, T) = {u | u ∈ V, v→c Tu ∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップS2に進む。ここでRegion(v, T)とは、頂点uの集合であって、頂点vから頂点uへのL=Fの制御依存関係が存在するものである。ここでVは頂点集合、Eは辺集合、v→c TuはL=Fの制御依存辺を示すものである。
ステップS2で、Region(v, T)の実行順序関係を計算する。ステップS3で、Region(v, F) = {u | u ∈ V, v→c Fu ∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップS4に進む。ここでRegion(v, F)とは、頂点uの集合であって、頂点vから頂点uへのL=Fの制御依存関係が存在するものである。以上で処理を終了する。
図9は、Regionの実行順序関係を計算する処理を示すフローチャートである。この処理は、図8のステップS2及びステップS4の各々に対応する。図9の処理の入力は、縮退したプログラム依存グラフPDG及びV'(着目Region)である。
ステップS1で、着目領域V'の各頂点vについて、ステップS2乃至S3の処理を繰り返すループを開始する。ステップS2で、vがプレディケート頂点(If-then-else又はwhile-loopの条件判定を表す頂点)であるか否かを判断する。vがプレディケート頂点である場合のみ、ステップS3を実行する。ステップS3で、頂点v以下の実行順序関係を計算する。
次に、ステップS4で、逆依存及び出力依存を求める。ここでは制御の流れに起因するデータ依存関係(逆依存、出力依存)を抽出する。具体的には、着目領域(Region)を越えるデータ依存関係から、着目領域内の逆依存及び出力依存を表出する。
次に、ステップS5で、逆依存及び出力依存を求める。ここでは着目領域(Region)内の実行順序を決定する。即ち、実行順序が一意に定まらないRegion内頂点の集合について適切な実行順序制約を決定する。具体的には、求められた逆依存関係や出力依存関係などによる実行順序制約をもとに、Region内の逆依存関係や出力依存関係を明らかにして、実行順序を決定する。実行順序が任意となる場合は、実行順序を仮定して逆依存関係、出力依存関係を求め、矛盾が起きない実行順序が得られるまで試行を繰返す。
最後にステップS6でスケジューリングを行う。即ち、上で求めた実行順次関係に基づいて頂点の実行順を決定する。これは、半順序関係の成立するグラフのスケジューリングという一般的な問題に帰着できる。従って、トポロジカル・ソートや、頂点の実行時間の概算を重みとしたリスト・スケジューリングなどのよく知られたスケジューリング手法を適用することができる。
図10は、逆依存及び出力依存を求める処理(図9のステップS4)を示すフローチャートである。図10の処理の入力は、縮退したプログラム依存グラフPDG及びV'(着目Region)である。
ステップS1で、着目領域V'を越える変数参照を抽出してVdefとする。ステップS2で、着目領域V'を越える変数代入を抽出してVuseとする。ステップS3で、Vuse及びV'に基づいて逆依存辺を追加する。ステップS4で、Vdef及びV'に基づいて出力依存辺を追加する。以上で処理を終了する。
図11は、着目領域を越える変数参照を抽出する処理を示すフローチャートである。図11の処理は図10のステップS1に相当し、縮退したプログラム依存グラフPDG及びV'(着目Region)を入力とする。
ステップS1で、頂点の集合Vuseを空にする。ステップS2で、着目領域V'内の各フロー依存辺について以降の処理を繰り返すループを開始する。ここでフロー依存辺としては、ループ独立フロー依存辺とループ繰り越しフロー依存辺とを含む。ステップS3で、フロー依存辺eの依存元頂点をuとするとともに、辺eの依存先頂点をvとする。
ループ繰り越しフロー依存辺である場合には、ステップS4で、依存先頂点vが着目領域V'に含まれるという条件が満たされるか否かを判定する。またループ独立フロー依存辺である場合には、ステップS5で、依存元頂点uが着目領域V'に含まれず且つ依存先頂点vが着目領域V'に含まれるという条件が満たされるか否かを判定する。この判定結果がyesの場合のみ、ステップS6を実行する。ステップS6で、頂点の集合Vuseに依存先頂点vを追加する。
最後に、ステップS7で、頂点の集合Vuseを値として返す。以上で処理を終了する。
図12は、着目領域を越える変数代入を抽出する処理を示すフローチャートである。図12の処理は図10のステップS2に相当し、縮退したプログラム依存グラフPDG及びV'(着目Region)を入力とする。
ステップS1で、頂点の集合Vdefを空にする。ステップS2で、着目領域V'内の各フロー依存辺について以降の処理を繰り返すループを開始する。ここでフロー依存辺としては、ループ独立フロー依存辺とループ繰り越しフロー依存辺とを含む。ステップS3で、フロー依存辺eの依存元頂点をuとするとともに、辺eの依存先頂点をvとする。
ループ繰り越しフロー依存辺である場合には、ステップS4で、依存先頂点vが着目領域V'に含まれるという条件が満たされるか否かを判定する。またループ独立フロー依存辺である場合には、ステップS5で、依存元頂点uが着目領域V'に含まれ且つ依存先頂点vが着目領域V'に含まれないという条件が満たされるか否かを判定する。何れかの判定結果がyesの場合のみ、ステップS6を実行する。ステップS6で、頂点の集合Vdefに依存先頂点vを追加する。
最後に、ステップS7で、頂点の集合Vdefを値として返す。以上で処理を終了する。
図13は、逆依存の追加処理を示すフローチャートである。図13の処理は図10のステップS3に相当し、縮退したプログラム依存グラフPDG、V'(着目Region)、及び頂点集合Vuseを入力とする。
ステップS1で、頂点集合Vuseの各頂点vに対して以降の処理を繰り返すループを開始する。ステップS2で、頂点vで使用する各変数xに対して以降の処理を繰り返すループを開始する。ステップS3で、着目領域V'の各頂点uに対して以降の処理を繰り返すループを開始する。
ステップS4で、頂点uが変数xを定義するか否かを判定する。判定結果がyesの場合のみ、ステップS5を実行する。ステップS5において、vからuへの逆依存辺を追加する。以上で処理を終了する。
図14は、出力依存の追加処理を示すフローチャートである。図14の処理は図10のステップS4に相当し、縮退したプログラム依存グラフPDG、V'(着目Region)、及び頂点集合Vdefを入力とする。
ステップS1で、頂点集合Vdefの各頂点uに対して以降の処理を繰り返すループを開始する。ステップS2で、頂点uで使用する各変数xに対して以降の処理を繰り返すループを開始する。ステップS3で、着目領域V'の各頂点vに対して以降の処理を繰り返すループを開始する。
ステップS4で、頂点vが変数xを定義するか否かを判定する。判定結果がyesの場合のみ、ステップS5を実行する。ステップS5において、vからuへの出力依存辺を追加する。以上で処理を終了する。
図15は、逆依存及び出力依存を求める処理(図9のステップS5)を示すフローチャートである。図15の処理の入力は、縮退したプログラム依存グラフPDG及びV'(着目Region)である。
ステップS1で、着目領域内の全域木を求めSとする。変数xを定義する頂点vとその変数xを使用するRegionR内の頂点との集合として、頂点vの変数xに関する全域木が、
Span(v, x) = {v}∪{u| v→li xu ∈ ER}
と定義される。図16は、全域木を説明するための図である。図16に示されるプログラム依存グラフにおいて、頂点viにおいて変数xが定義され、2つの頂点v1及びv2が変数xを使用する。この場合、頂点vi、v1、及びv2で全域木21を形成する。また頂点vjにおいて変数xが定義され、2つの頂点v3及びv4が変数xを使用する。この場合、頂点vj、v3、及びv4で全域木22を形成する。図17は、全域木を模式的に示す図である。全域木Span(vi, x)及び全域木Span(vj, x)が、データ依存グラフとして図17に示されるように構成される。
図15に戻り、ステップS2で、実行順が未決定である2つの任意の全域木を順次選択して以降の処理を繰り返すループが開始される。ステップS3で、着目領域に閉路がなく、同一変数xに対する独立した全域木Span(h0,x)及びSpan(h1,x)が存在するか否かを判定する。ここで、「独立した」とは、2つの全域木 Span(h0,x)及びSpan(h1,x)について、Span(h0,x)に含まれる頂点とSpan(h1,x)に含まれる頂点との間に辺(依存関係)がないことを言う。
ステップS4でR(Region)のオリジナルをスタックに退避させる。ステップS5で、h0→h1の出力依存辺を追加し、推移閉包を求める。ステップS6で、全域木間の順序関係を計算する。
ステップS7で、R(Region)に閉路が存在するか否かを判定する。存在しない場合には、以降の処理ステップS8〜ステップS11をスキップする。存在する場合には、ステップS8に進む。ステップS8で、スタックが空か否かを判断する。空の場合にはエラー終了する。空でない場合には、ステップS9で、Rのオリジナルをスタックから取り出す。
以上の処理は、頂点h0からh1への出力依存関係をグラフに追加したときに、巡回グラフとならない場合には追加した依存関係を確定させ、巡回グラフになった場合には元のグラフに戻すことに相当する。元のグラフに戻した後は、以降に示すように、頂点h1からh0への出力依存関係をグラフに追加する。即ち、ステップS10で、h1→h0の出力依存辺を追加し、推移閉包を求める。ステップS11で、全域木間の順序関係を計算する。
以上の処理により、2つの全域木 Span(h0,x)及びSpan(h1,x)に対する実行順序が決定する。更に、実行順が未決定である2つの任意の全域木を順次選択して同様の処理を繰り返し、全ての全域木間の順序関係が決定されたところで終了する。
図18は、全域木間の順序関係を計算する処理を示すフローチャートである。図18の処理は、図15のステップS6及びステップS11に相当する。図18の処理の入力は、縮退したプログラム依存グラフPDG及びV'(着目Region)である。
ステップS1で、着目領域内の各辺e(頂点v→頂点w)について以降の処理を繰り返すループを開始する。ステップS2で、頂点wで定義され、頂点vで参照される各変数xについて以降の処理を繰り返すループを開始する。
ステップS3で、Va ← { u | v ∈ Span(u, x) }とするとともに、Vb ← { u | w ∈ Span(u, x) }とする。これは、頂点vを要素として含む変数xに関する全域木における変数xを定義する頂点の集合を求めるとともに、頂点wを要素として含む変数xに関する全域木における変数xを定義する頂点の集合を求めることである。
ステップS4で、Vaの各頂点vaについて以降の処理を繰り返すループを開始する。ステップS5で、Vbの各頂点vbについて以降の処理を繰り返すループを開始する。更にステップS6で、Span(va, x)の頂点であってSpan(vb, x)の頂点でない各頂点vcについて以降の処理を繰り返すループを開始する。
ステップS7で、vc→vbがE(辺集合)に含まれるか否かを判定する。判定結果がyesの場合のみステップS8を実行する。ステップS8で、vc→vbの逆依存辺を追加し、推移閉包を求める。以降、各ループの処理を繰り返す。
図19は、図18の処理による逆依存辺の追加について説明する図である。図19には、頂点vの変数xに関する全域木Span(v,x)と頂点wの変数xに関する全域木Span(w,x)とが示される。頂点vを要素として含む変数xに対する全域木Span(va, x)(即ちSpan(v,x))の各頂点vc(即ちv、25、26)に対して、全域木Span(vb, x)(即ちSpan(w,x))のヘッドvb(変数を定義している頂点w)への逆依存辺32、33を追加する。
図20は、頂点間の実行順序関係を決定する方法の変形例を示すフローチャートである。図20のフローチャートに示す処理を、図7のフローチャートに示す処理の代わりに用いてもよい。即ち、頂点間の実行順序関係を決定する処理において、前段階のステップS0として、SSA(静的単一代入形式)を適用する処理を実行してもよい。即ち、縮退プログラム依存グラフを静的単一代入形式に変換してもよい。この場合、図9に示すステップS7の処理(逆依存、出力依存を求め着目領域内の実行順序を決定する処理:図15のフローチャート)を省略することができる。
以上により、頂点間の実行順序関係を決定し、逆/出力依存関係を抽出することができる。即ち、図6のステップS1の処理が実行される。
図21は、基本ブロックを抽出する処理のフローチャートを示す図である。図21に示す処理は、図6のステップS2の処理に相当する。図21の処理の入力は、実行順序関係が決定された縮退したプログラム依存グラフである。
求めた制御の流れの順に頂点を探索し、頂点の種類に応じた処理を行なう。以下の説明においてBは基本ブロックの集合であり、Biはi番目の基本ブロックである。またvは現在の頂点(着目頂点)であり、uは現在の頂点の1つ前の頂点である。
まずステップS2で、最初の基本ブロックB0を空集合として生成する。次にステップS2で、uをエントリ頂点(プログラムの開始ポイント)として、vをエントリ頂点の次の頂点とする。ステップS4で、現在の頂点vが最終頂点であるか否かを判断する。最終頂点である場合には、処理を終了して基本ブロックの集合Bが生成される。
現在の頂点vが最終頂点でない場合には、ステップS5に進み、現在の頂点vがプレディケート頂点(If-then-else又はwhile-loopの条件判定を表す頂点)であるか否かを判断する。プリディケート頂点である場合には、ステップS6に進み、iをインクリメントしてからBiの要素をvとすることで、新たなプリディケートのみの基本ブロックBiを形成する。その後ステップS7で、更にiをインクリメントして、新たな空集合の基本ブロックBiを形成する。
現在の頂点vがプレディケート頂点でない場合(S5でNoの場合)には、ステップS8で、現在の頂点vと1つ前の頂点uとが、同一のプレディケート頂点からの制御依存関係を有し、且つその制御依存関係が同一の条件判定フラグに基づくものであるか否かを判定する。この判定結果がNOとなるのは、例えばuとvとが、IF文の内部と外部とに対応する場合や、IF文のTHEN節とELSE節とに対応する場合等である。即ち、ステップS8においては、同一の条件判定に応じて双方共に実行される2つの頂点であるか否かが判定されている。
ステップS8の判定がYESの場合には、ステップS9で、現在の基本ブロックに現在の頂点vを追加する。ステップS8の判定がNOの場合には、ステップS10で、iをインクリメントして新たな空集合の基本ブロックBiを形成する。その後ステップS11で、この新たに生成された基本ブロックBiに現在の頂点vを追加する。その後ステップS12でuとvとをそれぞれ次の頂点に更新し、ステップS4に戻り以降の処理を繰り返す。
以上の処理により、分岐(IF、GOTO、LOOP等)や合流を含まない順番に実行される頂点の列である各基本ブロックBiを生成し、これらの基本ブロックを要素とする基本ブロックの集合Bを生成することができる。分岐や合流を含まない頂点の列とは、固定の1つの実行順に従い順番に実行される頂点の列のことである。図21のフローチャートから分かるように、各プレディケート頂点は単独で1つの基本ブロックBiを構成し、プレディケート頂点でない1つの基本ブロックBiには、途中で分岐も合流もなく固定の1つの実行順に従い順番に実行される頂点の列が含まれることになる。
本発明では、異なる基本ブロックをまたいでの手続き間の依存関係については、先行手続きの終了待ち合わせを行ってから、後続手続きを実行するようにする。また同一の基本ブロック内部で依存関係がある手続きの実行については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより手続きを実行する。即ち、基本ブロック間をまたいでの依存関係がある手続きについては先行手続きを待ち合わせる命令の後に後続手続きを実行する命令を配置することにより、依存関係を満たすように手続き制御する。また同一の基本ブロック内部で依存関係がある手続きについては後続手続きの先行手続きへの依存関係を明示的に登録する命令を生成するようにして、依存関係を満たすように手続き制御する。このような構成とすることで、複雑な制御の依存関係が存在する基本ブロック間については、手続きの実行を待ち合わせにより実現することで制御プログラムの生成を容易なものとし、実行順が固定である同一基本ブロック内については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより無駄な待ち合わせ時間をなくすことができる。
以上により、基本ブロックを抽出することができる。即ち、図6のステップS2の処理が実行される。
以下において、制御プログラムを生成する処理や生成した制御プログラムの具体例等について説明する。以下の説明は、依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を共有メモリで実現する第1の実施例と、依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を分散メモリで実現する第2の実施例とで異なる。
まず依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を共有メモリで実現する第1の実施例について説明する。
図22は、制御プログラムを生成する処理のフローチャートを示す図である。図22に示す処理は、図6のステップS4(及びS5)の処理に相当する。図22の処理の入力は、実行順序関係が決定された縮退したプログラム依存グラフ及び基本ブロックの集合Bである。
ステップS1において、プログラムの先頭を表すエントリ頂点vEntryの直下の子頂点vを要素とする基本ブロックの集合をB'とする。ステップS2において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS3で、Biについての手続き制御プログラムを生成する。ステップS4で、手続きの終了待ち合わせを生成する。
図23は、基本ブロックの集合B'の要素Bi以下の手続き制御プログラムを生成する処理を示すフローチャートである。図23の処理は、図22のステップS3に相当する。図23に示す処理の入力は縮退したプログラム依存グラフPDG及び基本ブロック要素Biである。
なおここでは、全ての手続き呼び出しを待ち合わせる方法と、制御の流れによって、待ち合わせが行なわれない可能性がある全ての手続き呼び出しを待ち合わせる方法の2つが考えられる。制御の流れによらず必ず待ち合わせが行なわれる頂点V'の集合は次のように表現できる。
従って、待ち合わせが行なわれない頂点の集合V''は、プログラム・ブロック頂点の集合VPBと頂点集合V'の差分V''=VPB-V'として表現できる。
図23のステップS1で、基本ブロックBiの要素(頂点)の種類を判定する。基本ブロックBiの要素である頂点の種類を判定することによって、基本ブロックBiがプログラム・ブロックの集合であるか、プレディケート頂点であるかが分かる。
ステップS1の判定の結果、基本ブロックBiがプログラム・ブロックの集合の場合は、基本ブロックBiに属する頂点の手続きを呼び出す文とその間の依存関係を登録する文とを生成することとなる。具体的には、まずステップS2において、基本ブロックBiの先行手続きに対する待ち合わせを生成する。この際、ブロック外からブロック内へのフロー依存関係に関して、手続きの終了待ち合わせを生成する。また同時に、定義順序関係及び逆依存関係、出力依存関係に関しても、手続きの終了待ち合わせを生成する。これは、共有メモリ上の同一変数に対して、データが読み書きされる順を保証するための待ち合わせである。ここでは、次の5種類の依存関係について、出力元頂点の手続き終了待ち合わせを生成する。
1.Biへのループ繰越フロー依存辺
2.BxからBi(i≠x)へのループ独立フロー依存辺
3.Biへの定義順序関係、
4.Biへの逆依存関係、
5.Biへの出力依存関係
なお同一頂点への待ち合わせが複数ある場合は、1つの待ち合わせに集約する。
次にステップS3で、基本ブロックBiの各頂点vについて、実行順序の順番で以降の処理を繰り返すループを開始する。ステップS4で、頂点vの非同期遠隔手続き呼び出しを生成する。ステップS5で、基本ブロックBiに属する頂点から頂点vへのループ独立フロー依存関係に関して依存関係を登録する文を生成する。基本ブロックBiの全ての頂点vについてこれらの処理を繰り返した後に、ステップS6で、実行開始を指示する文を生成する。
ステップS1の判定の結果、基本ブロックBiがプリディケート頂点vの場合は、頂点vの表す制御構造を生成する。まずステップS7で、基本ブロックBiの要素vの先行手続きに対する待ち合わせを生成する。即ち、条件式で参照する変数の値を確定するために、入力フロー依存辺について、先行する手続き呼び出しを待ち合わせる文を生成する。ここでは、当該頂点の外のループを繰り越すフロー依存辺と、当該頂点へのループ独立フロー依存辺との2種類のデータ依存入力辺について、出力元頂点の手続き終了待ち合わせを生成する。
次にステップS8で、頂点vのプレディケートの種類を判定する。プレディケートがループである場合には、ステップS9に進む。プレディケートがif文である場合には、ステップS14に進む。
ステップS8の判定結果がループを示す場合には、ステップS9において、入力逐次プログラムにおいて相当するfor文或いはwhile文を生成する。次にステップS10において、頂点vへのL=Tの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS11において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS12で、Biについての手続き制御プログラムを生成する。このステップS12は入れ子構造となっており、BiについてステップS12を実行することは、このBiについて図23全体のフローチャートを実行することに相当する。
ループの終了後、ステップS13で、頂点vへのループを繰り越す先行手続きの終了待ち合わせを生成する。これは、ループを繰り越して条件を判定するので、本文の末尾に、条件式への入力データ待ち合わせ(自ループを繰り越す入力フロー依存辺)を行なう文を追加するものである。
ステップS8の判定結果がif文を示す場合には、ステップS14において、if文を生成する。次にステップS15で、then節を生成する。ステップS16で、頂点vへのL=Tの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS17において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS18で、Biについての手続き制御プログラムを生成する。このステップS18は入れ子構造となっており、BiについてステップS18を実行することは、このBiについて図23全体のフローチャートを実行することに相当する。なおステップS17及びS18で生成された文が、then節の本文を構成することになる。
次にステップS19で、頂点vへのL=Fの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS20で、基本ブロックの集合B'が空集合であるか否かを判定し、空集合の場合には処理を終了する。基本ブロックの集合B'が空集合でない場合、ステップS21で、else節を生成する。ステップS22で、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS23で、Biについての手続き制御プログラムを生成する。このステップS23は入れ子構造となっており、BiについてステップS23を実行することは、このBiについて図23全体のフローチャートを実行することに相当する。なおステップS22及びS23で生成された文が、else節の本文を構成することになる。
以上の処理を実行することで、基本ブロックBi以下の手続き制御プログラムが生成される。図24は、第1の実施例の場合の手続き制御プログラムの構造を示す図である。
図24に示されるように、本発明の第1の実施例の場合の制御プログラムは、変数の宣言初期化部分41、プレディケートへの入力データ待合わせ部分42、プレディケートの制御構造の生成部分43、基本ブロックへの入力データ・依存関係の待ち合わせ部分44、基本ブロック内のスレッド起動と依存関係登録部分45、及び手続きの終了の待ち合わせ終了処理部分46を含む。基本ブロックへの入力データ・依存関係の待ち合わせ部分44では、非同期遠隔手続き呼び出しの起動、依存関係の登録、手続きのディスパッチ(実行開始)を行う。
なお第1の実施例においては、複数のプロセッサに共通の共有メモリを用いる。共有メモリを用いる場合、非同期遠隔手続き呼び出しを指示した段階では、先行する手続きの結果が得られていない可能性があり、引数として値を渡すことができない場合がある。そこで、手続きの入出力データは、共有メモリ上の適切な場所に格納されるものとし、そのアドレスを渡すこととする。
即ち、手続きの生成においては、入力変数の値が格納されるアドレスと出力結果を格納するアドレスとを手続きの引数とするように、手続きを構成する。更に、頂点の部分プログラムが使用したり定義したりする変数であって、入力の変数以外の変数を求め、それらの変数に対する宣言部を生成する。更に、部分プログラムを出力し、最後に、引数として受け取ったアドレスに対して、出力する変数の値を代入する文を生成する。
このように共有メモリの場合は、特定のメモリ領域への値の書き込み/参照という形で、入出力データを受け渡す。そのため、データの依存関係から、値を書き込む手続きの完了を待ち合わせて、後続の値を参照する手続きを実行することとなる。
以下に、第1の実施例により生成された手続きプログラム及び手続き制御プログラムについて、その構成及び動作を具体的な例を用いて説明する。
図25は、(a)入力逐次プログラムの部分及び(b)対応する縮退プログラム依存グラフを示す図である。図25(a)に示す入力逐次プログラムからプログラム依存グラフを生成し、頂点を結合して縮退することにより、(b)に示す縮退プログラム依存グラフが生成される。頂点v0からv6が存在し、頂点v4は縮退により文の集合となっている。
図26は、図25の縮退プログラム依存グラフから第1の実施例に従い生成される手続き制御プログラムである。最初に変数の宣言があり、使用する変数x,y,z,a,b,pを宣言する。その後、まず頂点v0に対応する手続きv0の開始を登録する(文51)。その後のディスパッチ命令(dispatch)により、実行可能手続きである手続きv0が実行される。
図25(a)に示す逐次プログラムのwhile文の中は、(b)に示す縮退プログラム依存グラフの頂点v2乃至v5に対応し、1つの基本ブロックに相当する。この基本ブロック中の頂点v2乃至v5のうちで、v3は定義順序関係に従いv0を待ち合わせる必要があり、v2はループ繰越フロー依存に従いv5を待ち合わせる必要がある。従って、文52でこれらの待ち合わせを実現する。
基本ブロック中のグラフの頂点v2乃至v5については、手続きと依存関係の登録文53により、手続きと依存関係とを登録する。即ち、頂点v2乃至v5に対応する手続きv2乃至v5を登録すると共に、v3がv2に依存し、v5がv4に依存することが登録される。即ち、a=C(x)はx=B(z)が終了しないと実行できないし、z=F(y)はy=E(p)が終了しないと実行できない。なお手続き及び依存関係の登録と手続きの実行とについては、図2に示した仕組みと同様であり、手続き呼出しプログラム3が管理する各プロセッサ毎のキューに手続きと依存関係を登録し、実行可能状態となった手続きを順次実行していく。具体的に、これらの手続きと依存関係の登録文53の後に、ディスパッチ文54により実行を指示する。このディスパッチ命令により、上記頂点v2乃至v5に対応する手続きv2乃至v5は、各々実行可能状態となると直ちに実行される。
whileループの最後で、v4の終了待ち合わせを設定する。これはv4によりwhile文の条件の変数pが計算されるためである。
whileループの後、v6に対応する手続きv6を実行する前には、v3に対する手続き終了待ち合わせが設定される(文56)。これはv6がv3に依存し、且つv6とv3とが異なる基本ブロックに属するからである。
図27は、以上の手続き制御プログラムの動作を手続きプログラムの実行とともに示す模式図である。図27では、プロセッサ0と手続きv0、v2乃至v6にそれぞれ対応するプロセッサとが用いられる。プロセッサ0により手続き制御プログラムを実行する。
まず手続きv0の手続きプログラム61が、対応するプロセッサにより実行される。while文の条件が成立すると、手続きv0が実行中であるので、v0の終了を待ち合わせする。
手続きv0が終了し、手続きと依存関係が登録され、ディスパッチ命令が実行されると、手続きv2とv4とにそれぞれ対応する手続きプログラム62及び64が、対応するプロセッサにより実行される。また登録された依存関係に基づいて、v2が終了すると直ちに、手続きv3の手続きプログラム63が対応するプロセッサにより実行される。同様に、登録された依存関係に基づいて、v4が終了すると直ちに、手続きv5の手続きプログラム65が対応するプロセッサにより実行される。
なおv2はループ繰越フロー依存に従いv5を待ち合わせる必要がある。従って、while文の次のループに入った際に、手続きv5の手続きプログラム65が実行中の間はv2やv4の手続きは実行されずに、手続きv5の終了を待ち合わせることになる。
while文のループが終了すると、手続きv3の終了を待ち合わせてから、手続きv6の手続きプログラム66が対応するプロセッサにより実行される。
この例において、手続きv1が第1の基本ブロックに属し、手続きv2乃至v5が第2の基本ブロックに属し、手続きv3が第3の基本ブロックに属する。このように、異なる基本ブロックをまたいでの手続き間の依存関係(例えばv3からv0への依存関係)については、先行手続きの終了待ち合わせを行ってから、後続手続きを実行するようにする。また同一の基本ブロック内部で依存関係がある手続きv2乃至v5の実行については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより手続きを実行する。このような構成とすることで、複雑な制御の依存関係が存在する基本ブロック間については、手続きの実行を待ち合わせにより実現することで制御プログラムの生成を容易なものとし、実行順が固定である同一基本ブロック内については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより無駄な待ち合わせ時間をなくすことができる。
以下に、依存関係待ち合わせ付き非同期遠隔手続き呼び出し方式を分散メモリで実現する第2の実施例について説明する。図28は、第2の実施例の場合の制御プログラムを生成する処理のフローチャートを示す図である。図28に示す処理は、図6のステップS4(及びS5)の処理に相当する。図28の処理の入力は、実行順序関係が決定された縮退したプログラム依存グラフ及び基本ブロックの集合Bである。
ステップS1において、プログラムの先頭を表すエントリ頂点vEntryの直下の子頂点vを要素とする基本ブロックの集合をB'とする。ステップS2において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS3で、Biについての手続き制御プログラムを生成する。ステップS4で、手続きの出力データ転送待ち合わせを生成する。
図29は、基本ブロックの集合B'の要素Bi以下の手続き制御プログラムを生成する処理を示すフローチャートである。図29の処理は、図28のステップS3に相当する。図29に示す処理の入力は縮退したプログラム依存グラフPDG及び基本ブロック要素Biである。
図29のステップS1で、基本ブロックBiの要素(頂点)の種類を判定する。基本ブロックBiの要素である頂点の種類を判定することによって、基本ブロックBiがプログラム・ブロックの集合であるか、プレディケート頂点であるかが分かる。
ステップS1の判定の結果、基本ブロックBiがプログラム・ブロックの集合の場合は、基本ブロックBiに属する頂点の手続きを呼び出す文とその間の依存関係を登録する文とを生成することとなる。具体的には、まずステップS2において、基本ブロックBiへの入力の待ち合わせを生成する。この際、ブロック外からブロック内へのフロー依存関係に関して、データ転送の待ち合わせを生成する。また定義順序関係及び逆依存関係、出力依存関係に関しても、データ転送の待ち合わせを生成する。即ち、次の5種類の辺について待ち合わせを生成する。
1.Biの要素へのループ繰越フロー依存辺
2.Bxの要素からBiの要素(i≠x)へのループ独立フロー依存辺
3.Biの要素への定義順序関係
4.Biの要素への逆依存関係
5.Biの要素への出力依存関係
なお逆依存関係がある場合は、先行頂点の手続きの終了待ち合わせを生成する。これは、制御プログラム上の同一変数に対して、データが転送される順を保証するための待ち合わせである。
次にステップS3で、基本ブロックBiの各頂点vについて、実行順序の順番で以降の処理を繰り返すループを開始する。ステップS4−1で、基本ブロックを越える頂点vへの入力データ転送指示及び実行結果の出力データ転送指示を生成する。具体的には、ブロックを越えるデータ依存関係がある場合は、制御プロセッサ上の変数にデータがあるため、手続きを実行するプロセッサに対してこのデータを転送する。具体的には、次の2種類の辺について制御プロセッサから遠隔プロセッサへのデータ転送を生成する。
1.頂点vへのループ繰越フロー依存辺
2.Biの要素でないuから頂点vへのループ独立フロー依存辺
次にステップS4−2で、頂点vの遠隔手続き呼び出しを行う文を生成する。
更にステップS5−1で、入力データ転送への依存関係を登録する文を生成する。ブロック内のデータ依存の場合は、先行する手続きから直接データが転送されるため、これに対する依存関係を登録する。
更にステップS5−2で、頂点vからの実行結果のデータ転送を指示する文を生成する。この際、基本ブロック越えない手続きへのデータ依存の場合は、後続手続きを実行するプロセッサに直接データ転送する。また基本ブロックを越えるデータ転送の場合は、制御プロセッサへとデータを転送する。またステップS5−2では、これらのデータ転送指示から手続き呼び出しへの依存関係を登録する文も併せて生成する。
基本ブロックBiの全ての頂点vについて上記の処理を繰り返した後に、ステップS6で、実行開始を指示する文を生成する。
ステップS1の判定の結果、基本ブロックBiがプリディケート頂点vの場合は、頂点vの表す制御構造を生成する。まずステップS7で、基本ブロックBiの要素vへのデータ転送待ち合わせを生成する。即ち、条件式で参照する変数の値を確定するために、入力フロー依存辺の待ち合わせを行なう文を生成する。ここでは、当該頂点の外のループを繰り越すフロー依存辺と、当該頂点へのループ独立フロー依存辺との2種類の辺について待ち合わせを生成する。
次にステップS8で、頂点vのプレディケートの種類を判定する。プレディケートがループである場合には、ステップS9に進む。プレディケートがif文である場合には、ステップS14に進む。
ステップS8の判定結果がループを示す場合には、ステップS9において、入力逐次プログラムにおいて相当するfor文或いはwhile文を生成する。次にステップS10において、頂点vへのL=Tの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS11において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS12で、Biについての手続き制御プログラムを生成する。このステップS12は入れ子構造となっており、BiについてステップS12を実行することは、このBiについて図29全体のフローチャートを実行することに相当する。
ループの終了後、ステップS13で、プレディケート頂点vへのデータ転送待ち合わせを生成する。これは、ループを繰り越して条件を判定するので、本文の末尾に、条件式への入力データ待ち合わせ(自ループを繰り越す入力フロー依存辺)を行なう文を追加するものである。
ステップS8の判定結果がif文を示す場合には、ステップS14において、if文を生成する。次にステップS15で、then節を生成する。ステップS16で、頂点vへのL=Tの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS17において、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS18で、Biについての手続き制御プログラムを生成する。このステップS18は入れ子構造となっており、BiについてステップS18を実行することは、このBiについて図29全体のフローチャートを実行することに相当する。なおステップS17及びS18で生成された文が、then節の本文を構成することになる。
次にステップS19で、頂点vへのL=Fの制御依存関係がある頂点uを要素とする基本ブロックの集合をB'とする。ステップS20で、基本ブロックの集合B'が空集合であるか否かを判定し、空集合の場合には処理を終了する。基本ブロックの集合B'が空集合でない場合、ステップS21で、else節を生成する。ステップS22で、B'の各要素Biについて、iの昇順に以降の処理を繰り返すループを開始する。ステップS23で、Biについての手続き制御プログラムを生成する。このステップS23は入れ子構造となっており、BiについてステップS23を実行することは、このBiについて図29全体のフローチャートを実行することに相当する。なおステップS22及びS23で生成された文が、else節の本文を構成することになる。
以上の処理を実行することで、基本ブロックBi以下の手続き制御プログラムが生成される。図30は、第2の実施例の場合の手続き制御プログラムの構造を示す図である。
図30に示されるように、本発明の第2の実施例の場合の制御プログラムは、変数の宣言初期化部分71、プレディケートへの入力データ待合わせ部分72、プレディケートの制御構造の生成部分73、基本ブロックへの入力データ待ち合わせ部分74、基本ブロック内のスレッド起動と依存関係登録部分75、及び手続き及びデータ転送の待ち合わせ終了処理部分76を含む。基本ブロックへの入力データ待ち合わせ部分74では、手続きの入力データの転送指示、遠隔手続き呼び出しの起動指示、手続きの出力データの転送指示、及び依存関係の登録を行う。第2の実施例では、手続き間の待ち合わせは、データ転送の待ち合わせとなる。
第2の実施例では、各プロセッサに設けた個別のメモリである分散メモリを使用する。この場合、手続きの入力データは、制御プロセッサから実行するプロセッサに転送するものとし、出力データは遠隔プロセッサから制御プロセッサに転送されるものとする。ただし、基本ブロック内については、手続きを実行するプロセッサ間で、直接データの転送を行うものとする。
即ち、手続きの生成においては、入出力変数のためのデータ領域は予め用意し、入力データは予め実行するプロセッサ上に転送されているものとする。また、実行結果は、実行するプロセッサ上に格納し、制御プログラムによって必要とされるプロセッサへ適宜その値を転送されるものとする。
更に、頂点の部分プログラムが使用したり定義したりする変数であって、入力の変数以外の変数を求め、それらの変数に対する宣言部を生成する。更に、部分プログラムを出力し、最後に、引数として受け取ったアドレスに対して、出力する変数の値を代入する文を生成する。
以下に、第2の実施例により生成された手続きプログラム及び手続き制御プログラムについて、その構成及び動作を具体的な例を用いて説明する。
この例で用いる入力逐次プログラムの部分及び縮退プログラム依存グラフは、第1の実施例の場合と同じであり、図25(a)及び(b)にそれぞれ示すものである。図25(a)に示す入力逐次プログラムからプログラム依存グラフを生成し、頂点を結合して縮退することにより、(b)に示す縮退プログラム依存グラフが生成される。頂点v0からv6が存在し、頂点v4は縮退により文の集合となっている。
図31は、図25の縮退プログラム依存グラフから第2の実施例に従い生成される手続き制御プログラムを示す図である。最初に変数の宣言があり、使用する変数x,y,z,a,b,pを宣言する。第2の実施例では分散メモリを想定しているので、各頂点v0及びv2乃至v6に対応する手続きv0及びv2乃至v6のそれぞれについて、入力のデータ転送指示及び入力のデータ転送に対する手続きの依存関係、並びに、実行結果のデータ転送指示及び手続きに対する実行結果のデータ転送指示の依存関係が規定される。例えば、頂点v0に対応する手続きv0の場合、入力のデータ転送指示81、手続きv0の呼び出し指示82、入力のデータ転送に手続きv0が依存するという依存関係の指定83、実行結果のデータ転送指示84、及び手続きv0に実行結果のデータ転送が依存するという依存関係の指定85が規定されており、これらが登録されることになる。その後のディスパッチ命令により手続きv0が実行される。
データ転送指示及びその依存関係の指示が含まれていることを除いて、プログラムの制御構造は図26の場合と同様である。従って、詳細な説明については省略する。
図32は、以上の手続き制御プログラムの動作を手続きプログラムの実行とともに示す模式図である。図32では、プロセッサ0と手続きv0、v2乃至v6にそれぞれ対応するプロセッサとが用いられる。また更に、データ転送ユニットDTU#0乃至DTU#3が用いられる。プロセッサ0により手続き制御プログラムを実行する。
まずデータ転送ユニットDTU#0により、データaを手続きv0のプロセッサに転送する。それに応じて、手続きv0の手続きプログラム91が、対応するプロセッサにより実行される。while文の条件が成立すると、手続きv0の実行結果の転送が未完了であるので、v0からのデータ転送を待ち合わせする。
手続きv0からデータaがプロセッサ0に転送されると、それに応答して、手続きv2とv4とにそれぞれ対応する手続きプログラム92及び94が、対応するプロセッサにより実行される。この際、データ転送ユニットDTU#1によりデータz及びxを転送する。またデータ転送ユニットDTU#2によりデータpを転送する。
また登録された依存関係に基づいて、データ転送ユニットDTU#1を介した手続きv2の出力データxの転送に応答して、手続きv3の手続きプログラム93が対応するプロセッサにより実行される。同様に、登録された依存関係に基づいて、データ転送ユニットDTU#3を介した手続きv4の出力データyの転送に応答して、手続きv5の手続きプログラム95が対応するプロセッサにより実行される。
なおv2はループ繰越フロー依存に従いv5のデータzを待ち合わせる必要がある。従って、while文の次のループに入った際に、手続きv5の手続きプログラム95が実行中の間はv2やv4の手続きは実行されずに、手続きv5の終了によるデータzの転送を待ち合わせることになる。
while文のループが終了すると、手続きv3の出力データaの転送を待ち合わせてから、手続きv6の手続きプログラム96が対応するプロセッサにより実行される。
この例において、手続きv1が第1の基本ブロックに属し、手続きv2乃至v5が第2の基本ブロックに属し、手続きv3が第3の基本ブロックに属する。このように、異なる基本ブロックをまたいでの手続き間の依存関係(例えばv3からv0への依存関係)については、先行手続きからのデータ転送待ち合わせを行ってから、後続手続きを実行するようにする。また同一の基本ブロック内部で依存関係がある手続きv2乃至v5の実行については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより手続きを実行する。このような構成とすることで、複雑な制御の依存関係が存在する基本ブロック間については、手続きの実行を待ち合わせにより実現することで制御プログラムの生成を容易なものとし、実行順が固定である同一基本ブロック内については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより無駄な待ち合わせ時間をなくすことができる。
図33は、本発明による並列化プログラム生成方法を実行する装置の構成を示す図である。
図33に示されるように、本発明による並列化プログラム生成方法を実行する装置は、例えばパーソナルコンピュータやエンジニアリングワークステーション等のコンピュータにより実現される。図33の装置は、コンピュータ510と、コンピュータ510に接続されるディスプレイ装置520、通信装置523、及び入力装置よりなる。入力装置は、例えばキーボード521及びマウス522を含む。コンピュータ510は、CPU511、RAM512、ROM513、ハードディスク等の二次記憶装置514、可換媒体記憶装置515、及びインターフェース516を含む。
キーボード521及びマウス522は、ユーザとのインターフェースを提供するものであり、コンピュータ510を操作するための各種コマンドや要求されたデータに対するユーザ応答等が入力される。ディスプレイ装置520は、コンピュータ510で処理された結果等を表示すると共に、コンピュータ510を操作する際にユーザとの対話を可能にするために様々なデータ表示を行う。通信装置523は、遠隔地との通信を行なうためのものであり、例えばモデムやネットワークインターフェース等よりなる。
本発明による並列化プログラム生成方法は、コンピュータ510が実行可能なコンピュータプログラムとして提供される。このコンピュータプログラムは、可換媒体記憶装置515に装着可能な記憶媒体Mに記憶されており、記憶媒体Mから可換媒体記憶装置515を介して、RAM512或いは二次記憶装置514にロードされる。或いは、このコンピュータプログラムは、遠隔地にある記憶媒体(図示せず)に記憶されており、この記憶媒体から通信装置523及びインターフェース516を介して、RAM512或いは二次記憶装置514にロードされる。
キーボード521及び/又はマウス522を介してユーザからプログラム実行指示があると、CPU511は、記憶媒体M、遠隔地記憶媒体、或いは二次記憶装置514からプログラムをRAM512にロードする。CPU511は、RAM512の空き記憶空間をワークエリアとして使用して、RAM512にロードされたプログラムを実行し、適宜ユーザと対話しながら処理を進める。なおROM513は、コンピュータ510の基本動作を制御するための制御プログラムが格納されている。
上記コンピュータプログラム(並列化プログラム生成プログラム即ち並列化プログラム生成コンパイラ)を実行することにより、コンピュータ510が、上記各実施例で説明されたように並列化プログラム生成方法を実行する。
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。