(57)【特許請求の範囲】
【請求項１】
逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、
該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、
該縮退プログラム依存グラフの頂点の実行順序を計算し、
該縮退プログラム依存グラフの頂点に相当する手続きを生成し、
前記実行順序に従って該手続きを呼び出す手続き呼び出しを生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを生成する
各段階をコンピュータが実行することを特徴とする並列化プログラム生成方法。
【請求項２】
前記入力データ及び出力データの転送の状態を示す変数を生成し、該変数の示す該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための前記文を該手続き呼び出しの前に配置し、更に該変数の示す前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための前記文を該手続き呼び出しの前に配置することを特徴とする請求項１記載の並列化プログラム生成方法。
【請求項３】
前記変数を設定する命令を配置する段階を更に含むことを特徴とする請求項２記載の並列化プログラム生成方法。
【請求項４】
逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、
該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、
該縮退プログラム依存グラフの頂点の実行順序を計算し、
該縮退プログラム依存グラフの頂点に相当する手続きを生成し、
前記実行順序に従って該手続きを呼び出す手続き呼び出しを生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを生成する
各段階をコンピュータに実行させることを特徴とする並列化プログラム生成プログラム。
【請求項５】
逐次プログラムと並列化プログラム生成プログラムとを格納するメモリと、
該メモリに格納された該並列化プログラム生成プログラムを実行することで該メモリに格納された該逐次プログラムから並列化プログラムを生成する演算処理ユニットを含み、該演算処理ユニットは、該並列化プログラム生成プログラムを実行することにより、
前記メモリに格納された該逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを前記演算処理ユニットにより生成し、生成された前記プログラム依存グラフを前記メモリに格納し、
前記メモリに格納された該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを前記演算処理ユニットにより生成し、生成された前記縮退プログラム依存グラフを前記メモリに格納し、
前記メモリに格納された該縮退プログラム依存グラフの頂点の実行順序を前記演算処理ユニットにより計算し、計算された前記実行順序を前記メモリに格納し、
前記メモリに格納された該縮退プログラム依存グラフの頂点に相当する手続きを前記演算処理ユニットにより生成し、生成された前記手続きを前記メモリに格納し、
前記メモリに格納された前記実行順序に従って前記メモリに格納された該手続きを呼び出す手続き呼び出しを前記演算処理ユニットにより生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを前記演算処理ユニットにより生成し、前記生成された前記手続き制御プログラムを前記メモリに格納する
ことを特徴とする並列化プログラム生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にプログラム生成方法、装置、及びプログラムに関し、詳しくは並列化プログラム生成方法、装置、及びプログラムに関する。
【背景技術】
【０００２】
近年、シングル・プロセッサでのプログラム性能には限界があることが知られてきた。従来、性能を上げるためには、プロセッサの動作周波数を高くすることで単位時間あたりの処理量を増やす方法と、命令を並列に実行することで同時に実行できる処理を増やす方法とがとられてきた。
【０００３】
しかし動作周波数を高くすると消費電力が大きくなるという問題があるとともに、動作周波数の向上には物理的な限界があるという問題がある。また、命令レベルの並列性は高々２〜４程度であり（非特許文献１）、投機的な実行などを導入することにより多少並列性を上げることはできるが、それにも限界があることが知られている。
【０００４】
そこで、命令レベルよりも大きな粒度でプログラムを並列化し、複数のプロセッサにて実行することにより、処理性能を向上させる方法が注目されている。しかしながら、制御による分岐が多い逐次プログラムを効果的な並列プログラムへ変換する画一的な方法は、これまでのところ知られていない。
【０００５】
逐次プログラムを分割して複数のプロセッサ上で並列に実行するプログラムを生成する手法として、ループに着目したデータ・レベル並列化という方法と、制御に着目した投機的なスレッド実行という方法が知られている。
【０００６】
特許文献１では、ループの中におけるデータの依存関係を解析し、配列を分割して、ループの処理を複数のプロセッサで実行させる。この手法は、数値計算等の規則的なループの処理が多い場合に有効である。
【０００７】
また特許文献２は、逐次プログラムにおける分岐に着目して、投機的なスレッド実行に置換する手法を示す。この手法では、制御の流れに基づいてプログラムを並列化するので、プログラムの潜在的な並列性を充分に抽出できているとはいえない。また、投機的スレッド実行機構を持たないマルチプロセッサにおいては予測失敗時のロールバックのコストが大きいので、分岐予測ヒット率が低いアプリケーションにはこの手法は適さない。
【０００８】
マルチコア・システムにおいて、プログラムの実行性能を向上させるべく処理の一部を他プロセッサで並列に実行する方式が知られている。その一つに遠隔非同期呼び出しがある。この遠隔非同期呼び出しを分散メモリシステムのマルチコア・システムにおいて実現する場合、手続きの入力となるデータ及び出力となるデータをプロセッサ間で転送する必要がある。このデータ転送は、プロセッサ・コア間のバスなどを介して行なわれる。しかしながら、処理データが大量になりまたコア数が増大すると、コア間のデータ転送がバスの混雑を引き起こしてしまう。バスの混雑により、リアルタイム性が保存できない、あるいは、並列化しても性能が上がらないなどの問題が発生する。
【０００９】
特許文献３では、ループの中におけるデータの依存関係を解析し、配列を分割して、ループの処理を複数のプロセッサで実行するような手法において、プロセッサ間通信の要否を実行時に判断して通信を行うことにより、無駄な通信を行わない方式が知られている。しかし、同一プログラムのデータ領域を分割するタイプであるため、制御の流れが複雑で手続き単位で並列化するような手法に対しては、適用することが難しい。
【特許文献１】特許第３０２８８２１号公報
【特許文献２】特許第３６４１９９７号公報
【特許文献３】特開平７−１１４５１６号公報
【非特許文献１】David W. Wall. Limitsof Instruction-Level Parallelism. Proceedings ofthe fourth international conference on Architectural support for programminglanguages pp. 176-188 May. 1991.
【非特許文献２】S. Horwitz, J. Prins, and T. Reps, “Integrating non-interferingversions of programs,” ACM Transactions on Programming Languages and Systems,vol. 11, no. 3, pp. 345-387, 1989.
【非特許文献３】Jeanne Ferrante, Karl J. Ottenstein, Joe D. Warren, ”The ProgramDependence Graph and Its Use in Optimization,” ACM Transactions on ProgrammingLanguages and Systems, pp. 319-419, vol. 9 no. 3, July 1987.
【非特許文献４】Susan Horwitz, Jan Prins, Thomas Reps, “On the adequacy of programdependence graphs for representing programs,” Proceedings of the 15thAnnual ACM Symposium on the Principles of Programming Languages, pp. 146-157,Jan., 1988.
【非特許文献５】中田育男著:“コンパイラの構成と最適化”，朝倉書店，１９９９
【発明の開示】
【発明が解決しようとする課題】
【００１０】
以上を鑑みて本発明は、並列に動作する複数のプロセッサ間で、使われない可能性のあるデータ転送を回避した並列化プログラムを生成する方法、プログラム、及び装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
並列化プログラム生成方法は、逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の実行順序を計算し、該縮退プログラム依存グラフの頂点に相当する手続きを生成し、前記実行順序に従って該手続きを呼び出す手続き呼び出しを生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを生成する各段階をコンピュータが実行することを特徴とする
【００１２】
並列化プログラム生成プログラムは、逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の実行順序を計算し、該縮退プログラム依存グラフの頂点に相当する手続きを生成し、前記実行順序に従って該手続きを呼び出す手続き呼び出しを生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを生成する各段階をコンピュータに実行させることを特徴とする。
【００１３】
並列化プログラム生成装置は、逐次プログラムと並列化プログラム生成プログラムとを格納するメモリと、該メモリに格納された該並列化プログラム生成プログラムを実行することで該メモリに格納された該逐次プログラムから並列化プログラムを生成する演算処理ユニットを含み、該演算処理ユニットは、該並列化プログラム生成プログラムを実行することにより、前記メモリに格納された該逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを前記演算処理ユニットにより生成し、生成された前記プログラム依存グラフを前記メモリに格納し、前記メモリに格納された該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを前記演算処理ユニットにより生成し、生成された前記縮退プログラム依存グラフを前記メモリに格納し、前記メモリに格納された該縮退プログラム依存グラフの頂点の実行順序を前記演算処理ユニットにより計算し、計算された前記実行順序を前記メモリに格納し、前記メモリに格納された該縮退プログラム依存グラフの頂点に相当する手続きを前記演算処理ユニットにより生成し、生成された前記手続きを前記メモリに格納し、前記メモリに格納された前記実行順序に従って前記メモリに格納された該手続きを呼び出す手続き呼び出しを前記演算処理ユニットにより生成し、該手続き呼び出しの入力データ及び出力データに関して、該入力データの転送状態に基づいて転送元手続きの終了を待ち合わせた上で該入力データの転送を指示させるための文を該手続き呼び出しの前に配置し、更に前回の出力データの転送状態に基づいて該出力データの転送を待ち合わせるための文を該手続き呼び出しの前に配置することにより、前記逐次プログラムを並列化して得られる複数の前記手続きを複数のプロセッサにより実行させると共にプロセッサ間のデータ転送を制御するために前記手続きの実行をプロセッサに制御させるための手続き制御プログラムを前記演算処理ユニットにより生成し、前記生成された前記手続き制御プログラムを前記メモリに格納することを特徴とする。
【発明の効果】
【００１４】
本発明の少なくとも１つの実施例によれば、制御の流れグラフではなく、制御の依存関係のグラフに基づくため、制御の流れ（分岐）を超えたプログラムの並列性を抽出することができる。また、縮退したプログラム依存グラフを用いることにより、大きな粒度での並列化を実現することができる。更に、依存関係待ち合わせに基づく並列化プログラムを生成すること、及び、手続きの実行に必要なデータを実行が確定した段階で初めて転送することによって、制御によるデータ転送待ち合わせを削減しつつプロセッサ間のデータ転送の頻度を抑制することができる。不要なデータ転送が削減されるので、データ転送による転送路の消費電力を削減することができる。
【発明を実施するための最良の形態】
【００１５】
以下に、本発明の並列化プログラム生成方法の概略及び実施例を添付の図面を用いて詳細に説明する。
【００１６】
本発明の並列化プログラム生成方法では、まず逐次プログラムからプログラム依存グラフを生成する。次に、他プロセッサエレメントで実行するに適した処理量となるまで、依存関係を縮退し、文の集合を頂点とするプログラム依存グラフを作成する。作成したプログラム依存グラフに基づいて、プログラムを並列化する。このとき、遠隔手続きとして実行される部分プログラムについては、プロセッサエレメントが実行する手続に対応する各頂点において、入出力データを格納するための変数を生成する必要がある。その後、各頂点に相当する「手続き」と、手続きを遠隔プロセッサエレメント上で実行させてデータ転送や同期を制御する「制御プログラム」とを生成する。また並列実行のメカニズムとして、待ち付き制御付き非同期遠隔手続き呼び出しと、データ転送方式と、データ転送制御方式とを用いる。
【００１７】
具体的には、本発明の並列化プログラム生成方法は、次の５つの構成要素を含む。
（１）プログラム解析手法：縮退プログラム依存グラフ
（２）並列実行方式：待ち付き制御付き非同期遠隔手続き呼び出しとデータ転送
（３）データ転送制御方式：データ転送制御情報と制御関数
（４）並列プログラム生成手法：遠隔手続き呼び出し用変数生成方法
（５）並列プログラム生成手法：制御プログラム生成方法
図１は、本発明による並列化プログラム生成方法の概略を示す図である。
【００１８】
ステップＳ１で、逐次プログラムの依存関係を解析して縮退プログラム依存グラフを生成する。即ち、逐次プログラムからプログラム依存グラフ（ＰＤＧ：Program Dependence Graph）を生成し、更に各プロセッサエレメントで実行するに適した処理量となるまで依存関係を縮退することにより、手続きを頂点とする縮退プログラム依存グラフを作成する。このステップＳ１が上記の（１）プログラム解析手法に相当する。
【００１９】
ステップＳ２で、変数を生成する。実行するマルチプロセッサシステムが分散メモリの場合、手続きへの入出力データをプロセッサ上のメモリ領域に転送し、プロセッサがその領域を用いて計算を行ない、結果を他の適切な領域に転送することになる。そのために用いるデータ変数の複製領域を生成する。このステップＳ２が、上記の（４）並列プログラム生成手法（遠隔手続き呼び出し用変数生成方法）に相当する。
【００２０】
ステップＳ３で、作成した縮退プログラム依存グラフから、非投機的に手続きの起動と同期を制御する手続き制御プログラムを生成する。このステップＳ３が上記の（５）並列プログラム生成手法（制御プログラム生成方法）に相当する。
【００２１】
またステップＳ４で、縮退プログラム依存グラフから、その各頂点に相当する手続きプログラムを生成する。また上記（２）並列実行方式である待ち付き制御付き非同期遠隔手続き呼び出しとデータ転送とに対応する構成として、並列実行ライブラリ１００を用いる。また更に上記（３）データ転送制御方式であるデータ転送制御情報と制御関数とに対応する構成として、データ転送制御ライブラリ１０１を用いる。
【００２２】
以下に、上記５つの構成要素について詳細に説明する。
（１）プログラム解析手法：縮退プログラム依存グラフ
大規模な組み込みソフトウェアの解析を行なう方法として、依存関係を縮退したプログラム依存グラフという考え方がある。これを利用することによって、大規模ソフトウェアの解析及び並列化が可能となる。
【００２３】
まず逐次プログラムからプログラム依存グラフを生成する処理（図１のステップＳ１の前半の処理）について説明する。プログラム依存グラフとは、例えば非特許文献２乃至４等に説明されるように、プログラムの文を頂点とし、文と文の間の関係を辺で表現したグラフである。非特許文献２乃至４に記載されるプログラム依存グラフは、次のような頂点集合Vと辺集合Eの組で表現されるものであり、逐次プログラムを解析することにより生成できる。
【００２４】
［V:頂点集合］
エントリ:プログラムの開始ポイントを表す。
【００２５】
初期定義:プログラム開始時の初期値の定義を表す。
【００２６】
プリディケート: If-then-elseまたはwhile-loopの条件判定を表す。
【００２７】
代入文:プログラムの代入文を表す。
【００２８】
最終使用:プログラム終了時の変数の参照を表す。
【００２９】
［E:辺集合］
［制御依存辺: v→cL w］プリディケート頂点vに対して、その条件判定結果により、頂点wに到達するか否かが決まることを表す。Lは条件判定のフラグを表し、L=Tのときは条件判定結果が真の場合に頂点wを実行し、L=Fのときは結果が偽の場合に頂点wを実行する。
【００３０】
［データ依存辺］
［ループ独立フロー依存辺: v→lix 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の実行順序を表すものである。
【００３３】
以下において、縮退プログラム依存グラフを作成する処理（図１のステップＳ１の後半の処理）について説明する。上記のような一般的なプログラム依存グラフでは、文または代入式を頂点としたグラフとなっている。文または代入式を頂点とした場合、大規模なソフトウェアではグラフの頂点数が数千〜数万となってしまう。一般的に、コンパイラのグラフを用いた最適化の問題の計算量は、グラフの規模に対して指数関数的に増大することが知られている。したがって、例えば数個の手続きなどを対象とした頂点数が数十程度のグラフの場合には、解析が可能であるが、現実的な規模のソフトウェア全体に対する最適化は困難といえる。
【００３４】
そこで、プログラム依存グラフの頂点数及び辺数を低減すべく、プログラム依存グラフの依存関係を縮退して頂点を融合し、粗粒度のプログラム依存グラフを作成する。依存関係を縮退することによりグラフの規模を1/10〜1/100とすることで、現実的な時間にて、プログラムの最適化を可能にする。
【００３５】
依存関係の縮退は、次のような方法で、縮退可能な依存関係及び頂点の集合を求め、依存関係を削除して頂点を1つの頂点に融合することにより実行される。
【００３６】
１．構文規則に基づく縮退
一般にプログラム依存グラフから等価な逐次プログラムの制御の流れを再構成することは、困難と言われている。これは、制御の依存関係のみの表現となっているため、依存関係を満足する制御の流れは一意に決定できない上に、グラフを変形するような最適化を行なった場合、依存関係を満足するような制御の流れが存在しないような場合も出てくるためである。
【００３７】
しかし、表現するプログラムの制御構造を、if文、while文、及び、代入文に限定し、プログラム依存グラフの制御依存部分グラフ(頂点と制御依存辺のみで構成される部分グラフ)の形が木構造となる場合は、プログラムの制御の流れを再構成できることが知られている（非特許文献２）。そこで、プログラムにおけるif文、while文でない制御文に対して、入り口と出口がそれぞれ1つとなるようなプログラムのブロックを求める。ブロック全体とブロック内部の依存関係を1つの頂点に縮退することで、安全に制御の流れを再構成可能な範囲の縮退プログラム依存グラフを作成する。
【００３８】
２．結合度に基づく縮退
プログラム依存グラフを探索して、頂点間の結合の強さを求める。結合度は、データ依存辺とその大きさ、及び、制御依存辺、処理の大きさから計算されるものとする。ある結合度以上の頂点に対して、縮約可能な条件を満足する場合は、頂点を結合し依存関係を縮約する。ここで、次の２つ条件を満たすときに、頂点を結合しての縮約が可能となる。
【００３９】
１）プログラム依存グラフに対応するＣＦＧ(Control
Flow Graph：制御フローグラフ)上で頂点集合外から頂点集合内への分岐は頂点集合の先頭頂点へのみであり、頂点集合内から頂点集合外への分岐は頂点集合の最後の頂点のみである。
【００４０】
２）頂点間のデータ依存パスに外部の頂点が含まれない。
【００４１】
以上のようにして、「構文規則に基づく縮退」又は「結合度に基づく縮退」により、頂点数が大幅に削減された縮退プログラム依存グラフを生成することができる。縮退プログラム依存グラフは、次の要素から構成される。
【００４２】
［V:頂点集合］
エントリ:プログラムの開始ポイントを表す。
【００４３】
初期定義:プログラム開始時の初期値の定義を表す。
【００４４】
プリディケート: If-then-elseまたはwhile-loopの条件判定を表す。
【００４５】
文の集合: プログラムを構成する文の集合を表す。
【００４６】
最終使用:プログラム終了時の変数の参照を表す。
【００４７】
［E:辺集合］
［制御依存辺: v→cL w］プリディケート頂点vに対して、その条件判定結果により、頂点wに到達するか否かが決まることを表す。Lは条件判定のフラグを表し、L=Tのときは条件判定結果が真の場合に頂点wを実行し、L=Fのときは結果が偽の場合に頂点wを実行する。
【００４８】
［データ依存辺］
［ループ独立フロー依存辺: v→lix 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の実行順序を表すものである。
（２）並列実行方式：待ち付き制御付き非同期遠隔手続き呼び出しとデータ転送
集中制御方式の並列化プログラムを生成する方法として、例えば、手続を非同期の遠隔呼び出しとして呼び出すことにより並列にスレッドを実行する方式、手続に実行開始するメッセージを送信することにより並列にスレッドを実行する方式、スレッド間で共有メモリを利用して入出力変数の受け渡しを行なうことにより並列にスレッドを実行する方式等が考えられる。しかしこれらの方式では、第１の手続（スレッド）の実行結果を利用する第２の手続がある場合、第１の手続の終了を待つ命令とそれに続く第２の手続を実行する命令とを、他の手続の実行に要する時間などを見積もって、プログラム中の適当な場所に配置しておくことになる。この場合、第１の手続が予想以上に早く終了した場合などに、第２の手続を実行するまでに、不必要な待ち時間が発生してしまう。
【００５１】
図２は、無駄な待ち時間の発生について説明するための図である。図２において、プロセッサ０乃至プロセッサ３の４つのプロセッサが用いられる。プロセッサ０でスレッド制御プログラム１（各スレッドに対応する手続の実行及び終了待ちを制御するプログラム）を実行する。図２の例では、まずプロセッサ０から、プロセッサ１乃至プロセッサ３に対して手続Ａ乃至Ｃの実行を順番に要求する（start A()〜start C()）。その後プロセッサ０は、手続Ａの終了を待って（wait A()）、手続Ａの実行結果を利用する手続Ｄの実行を要求する（start D()）。その後、手続Ｂの終了を待って（wait B()）、手続Ｂの実行結果を利用する手続Ｅの実行を要求する（start Ｅ()）。更にその後、手続Ｃの終了を待って（wait C()）、手続Ｃの実行結果を利用する手続Ｆの実行を要求する（start F()）。
【００５２】
この例では、手続Ｃが終了してから手続Ｆの実行を要求するまでに待ち時間が発生している。これは、スレッド制御プログラム中において、手続Ｂの終了待ち合わせ（wait B()）と手続Ｅの実行要求（start Ｅ()）が、手続Ｃの終了待ち合わせ（wait C()）と手続Ｆの実行要求（start F()）よりも前に配置されているからである。このような命令配置順のために、手続Ｂが終了しないと、手続Ｃの終了待ち合わせ及び手続Ｆの実行要求が実行されないことになる。
【００５３】
このような命令配置は、手続Ｂが手続Ｃよりも早く実行が終了するであろうという見積もりに基づくものである。手続Ｃの方が手続Ｂよりも早く終了することが分かっていたならば、手続Ｃの終了待ち合わせ及び手続Ｆの実行要求を、手続Ｂの終了待ち合わせ及び手続Ｅの実行要求よりも前に配置することが考えられる。しかし実際には、手続の実行にかかる時間は処理データの内容等にも依存するので、終了時間を正確に見積もることは不可能である。従って、単純な遠隔手続呼び出し、共有メモリによるスレッド、メッセージ送信等の上記方式では、図２に示すような待ち時間を無くすことはできない。
【００５４】
本願の出願人は、非同期遠隔手続呼び出し方式として、並列化プログラムの各スレッドの実行を制御する際に、各手続毎に他の手続に対する依存関係を実行条件として指定し、各手続をプロセッサ毎の実行キューに投入し、実行条件が満たされた手続を実行していくという方式を既に提案している。このような方式を、依存関係待ち合わせ付き非同期遠隔手続呼び出し方式と呼ぶ。
【００５５】
図３は、依存関係待ち合わせ付き非同期遠隔手続呼び出し方式による手続実行の制御について説明するための図である。図３において、プロセッサ０乃至プロセッサ３の４つのプロセッサが用いられる。プロセッサ０でスレッド制御プログラム２（各スレッドに対応する手続きの実行及び依存関係を制御するプログラム）を実行する。この際プロセッサ０は、手続き呼出しプログラム３を実行することにより、スレッド制御プログラム２に規定される各手続きを各プロセッサ毎のキューを用いて管理する。
【００５６】
図３の例では、まず制御プログラム２の命令start A()に従って、プロセッサ１の実行キュー４に手続Ａが投入される。また制御プログラム２の命令start B()に従って、プロセッサ２の実行キュー５に手続Ｂが投入される。更に制御プログラム２の命令start C()に従って、プロセッサ３の実行キュー６に手続Ｃが投入される。
【００５７】
同様に、制御プログラム２の命令start D()、start E()、及びstart F()に従って、実行キュー４乃至６にそれぞれ手続Ｄ、Ｅ、及びＦが投入される。またスレッド制御プログラム２中のdep(x, y, …)は依存関係を指定する命令であり、手続Ｘの依存先が手続Ｙ、・・・であることを示す。即ち、手続Ｘを実行するためには、手続Ｙ、・・・の実行が終了している必要があることを示す。制御プログラム２の命令dep(D, A)に従って、プロセッサ１の実行キュー４中の手続Ｄに対して、依存先の手続がＡであることが登録される。また制御プログラム２の命令dep(E, A, B)に従って、プロセッサ２の実行キュー５中の手続Ｅに対して、依存先の手続がＡ及びＢであることが登録される。更に、制御プログラム２の命令dep(F, A, C)に従って、プロセッサ３の実行キュー６中の手続Ｆに対して、依存先の手続がＡ及びＣであることが登録される。
【００５８】
このようにして各プロセッサ毎に設けた実行キューに投入されている手続を、キューの順番に従って対応するプロセッサで実行する。この際、依存先が登録されていない手続（図３においてＮＵＬＬで示されている手続）については無条件に実行し、依存先が登録されている手続については、依存先の手続の終了を検出してから実行する。このようにプロセッサ毎にキューを設け、実行条件が満たされたキュー内の手続き（実行可能手続き）から順番に実行していくことで、図２に示したような待ち時間を無くすことができる。
【００５９】
以上説明したように、上記の依存関係待ち合わせ付き非同期遠隔手続呼び出し方式を用いれば、並列化プログラムの実行時における不要な待ち合わせ時間の発生を防ぐことができる。従って、大規模なソフトウェアを対象として、逐次プログラムを並列化することにより、マルチプロセッサ上で効果的に動作する非投機的な並列化プログラムを生成する際には、上記の依存関係待ち合わせ付き非同期遠隔手続呼び出し方式に適用可能な並列化プログラムを生成することが望ましい。
【００６０】
本願の出願人は、依存関係待ち合わせ付き非同期遠隔手続呼び出し方式に適用可能な並列化プログラム生成方法を既に提案している。この並列化プログラム生成方法では、まずプログラムの実行順序関係を計算し、分岐（ＩＦ、ＧＯＴＯ、ＬＯＯＰ等）や合流を含まない順番に実行される頂点の列である基本ブロックを求める。そして、同一の基本ブロック内部で依存関係がある手続きの実行については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより手続きを実行する。また、異なる基本ブロックをまたいでの手続き間の依存関係については、先行手続きの終了待ち合わせを行ってから、後続手続きを実行するようにしている。このような構成とすることで、複雑な制御の依存関係が存在する基本ブロック間については、手続きの実行を待ち合わせにより実現することで制御プログラムの生成を容易なものとし、また実行順が固定である同一基本ブロック内については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより無駄な待ち合わせ時間をなくすことができる。
【００６１】
ここでは、処理間の依存関係のみに着目しているが、分散メモリ環境の場合には、プロセッサ間の入出力データの転送を行なう必要がある。データ転送についても、同様の実行キューを用いて制御することで、データ転送間、あるいは、データ転送と手続きの間の依存関係に基づいて並列実行をさせることができる。
（３）データ転送制御方式：データ転送制御情報と制御関数
制御の流れによって、手続き間データ転送の転送元が変化する場合がある。また先行ループにおいて必要なデータの転送が完了する前に、次ループの処理がこのデータを上書きしてしまう可能性がある場合がある。そのような場合に、適切な転送元からのデータ転送及び上書きを防ぐための待ち合わせによるデータ転送を実現するために、データ転送制御情報と制御関数とが必要になる。
【００６２】
例えば、図４のようなプログラムを並列化して実行する場合を考える。この際、例えばプロセッサエレメントＰＥ０が初期値代入「ｘ＝１；ｙ＝０」及びｗｈｉｌｅ文を実行し、プロセッサエレメントＰＥ１が「ｙ＝ｆ（ｘ）」を実行し、プロセッサエレメントＰＥ２が「ｚ＝ｇ（ｙ）」を実行するとする。ＰＥ２により実行する「ｚ＝ｇ（ｙ）」の入力変数ｙは、ループの判定結果に依存して、ＰＥ１により実行される「ｙ＝ｆ（ｘ）」の結果となる場合と、ＰＥ０により設定される初期値「ｙ＝０」となる場合がある。即ち、制御の流れによって、手続き間データ転送の転送元が変化する。
【００６３】
無駄なデータ転送を避けるためには、データ転送はそのデータが実際に必要となる直前に転送することが望ましい。即ち、データ変数ｙについては、「ｚ＝ｇ（ｙ）」を実行する直前にデータ転送することが望ましい。そのような直前のデータ転送を実現するためには、上記のように手続き間データ転送の転送元が変化することを考慮して、転送元データのアドレスを制御の流れに従って管理する必要がある。
【００６４】
また待ち時間を削減するためには、転送元「ｙ＝ｆ（ｘ）」の手続きの完了を待ち合わせて「ｚ＝ｇ（ｙ）」を実行することが望ましい。従って、転送元の識別子も管理する。
【００６５】
また「ｚ＝ｇ（ｙ）」を起動後に、処理が再度内側のループ（ｗｈｉｌｅ（Ｐ）のループ）の実行に入ったとする。この場合、起動中の「ｚ＝ｇ（ｙ）」が入力ｙとして必要とする「ｙ＝ｆ（ｘ）」のデータが手続「ｚ＝ｇ（ｙ）」へデータ転送される前に、次のループの「ｙ＝ｆ（ｘ）」が実行されて、必要なデータｙが上書きされてしまう可能性がある。そこで、データの転送状況を制御情報として管理し、データ転送状況がデータ転送予約に設定されると、データ転送が完了するまでは上書きをするような手続きの実行を抑制するように管理する。
【００６６】
具体的には、データ転送制御情報として、
・転送元データのアドレス；
・転送元遠隔手続き呼び出しの識別子；
・データの転送状況(未転送、転送予約、転送済) ；
・データ転送の識別子；
を用いることになる。データ転送状況が「未転送」であれば、転送先の手続きの実行が未確定であって、データの転送が行なわれていない状態を示す。「転送予約」であれば、転送先の手続きの実行が確定し、データ転送が指示されている状態を示す。ただし、データ転送が完了しているかどうかは不明である。「転送済」であれば、手続きへのデータ転送が完了した状態を示す。この場合、次回の転送先手続き実行に対応する新たな値は定義されていない。
【００６７】
またデータ転送制御関数としては、
・wait_for_use
(self, f)；
・wait_for_def_and_move(self)
・regist_dependence(self,
id)
・def_data(self,
f, addr)
を用いる。ここで“self”は、手続きｇの入力ｙに関するデータ転送制御情報を表す構造体である。
【００６８】
図５は、データ上書き抑制のための待ち合わせ制御を行なう関数wait_for_use (self, f)の内容を示す図である。上記の例（図４の例）のように手続きｆの出力データを使用（参照）する手続きｇがある場合に、手続きｇが、前回の手続きｆの結果を必要としている場合、手続きｇへのデータ転送を待ち合わせる。具体的には、転送元の手続が「ｆ」で転送状況が「転送予約」の場合に、データ転送識別子（前回の手続きｆの結果を転送する処理の識別子）が示すデータ転送を待ち合わせ、その後、転送状況を「転送済」にする。データ上書きをする可能性がある次回の手続ｆは、転送状況が「転送済」になってから実行すればよい。この関数を用いることにより、データ上書きを回避することができる。
【００６９】
図６は、参照データ取得のための待ち合わせ制御関数wait_for_def_and_move(self)の内容を示す図である。手続きｇの入力データを定義（代入）する手続きｆを待ち合わせ、手続ｆが終了するとデータ転送を指示する。具体的には、転送状況が「未転送」であり且つ転送元の手続の識別子がある（ｆがφでない）場合、「転送元遠隔手続き呼び出し識別子」が示す転送元の手続ｆが終了するのを待ち合わせる。転送元の手続ｆが終了すると、転送状況を「転送予約」に設定し、「転送元アドレス」から当該ＰＥへの転送動作「move」を開始する。またデータ転送識別子としては転送動作「move」を識別する値が設定される。
【００７０】
図７は、データ転送が行なわれる場合にデータ転送から手続への依存関係を登録する関数regist_dependence(self, id)の内容を示す図である。ここで識別子ｉｄは、例えば上記の例であれば手続ｇを示す値である。具体的には、転送状況が「転送予約」である場合に、手続ｇの実行はデータ転送識別子が示すデータ転送に依存すること、即ち入力変数ｙがデータ転送されて初めて手続ｇが実行可能であることを登録する。依存関係を登録する関数がｄｅｐｅｎｄ（）である。
図８は、手続きで参照するデータについて値の代入に関する情報を登録する関数def_data(self, f, addr)の内容を示す図である。手続きgで参照するデータはｙであり、この値を持っているのは手続きｆであり、転送するデータのアドレスはaddrである。従って、「転送元遠隔手続き呼び出し識別子」として手続きｆの識別子を登録し、更に「転送元アドレス」として変数ｙのアドレスaddrを登録する。
（４）並列プログラム生成手法：遠隔手続き呼び出し用変数生成方法
実行するマルチプロセッサシステムが分散メモリの場合、手続きへの入出力データをプロセッサ上のメモリ領域に転送し、プロセッサがその領域を用いて計算を行ない、結果を他の適切な領域に転送することになる。この場合のデータ変数の割り付け方としては、１）プロセッサ毎に使用する可能性のある変数の複製領域を作成する方式と、２）手続き毎に使用する可能性のある変数の複製領域を作成する方式とが考えられる。プロセッサ毎に変数の複製領域を作成する方式では、同一のプロセッサが実行する第１の手続きと第２の手続きとが同一の変数ｘを使用する場合、このプロセッサのメモリ領域には１つの変数ｘの領域しか設けない。また手続き毎に変数の複製領域を作成する方式では、同一のプロセッサが実行する第１の手続きと第２の手続きとが同一の変数ｘを使用する場合、このプロセッサのメモリ領域には第１の手続きの変数ｘの領域と第２の手続きの変数ｘの領域とをそれぞれ別個に設ける。また更に、両方式の組み合わせとして、３）プロセッサ毎に使用する可能性のある変数の複製領域を作成し、逆依存関係又は出力依存関係による待ち合わせが発生する場合は、手続き毎の異なる領域を作成する方式が考えられる。これら第１乃至第３の方式において、同一の変数に対する複製領域の各々について、異なる名前を付けて区別する。
【００７１】
逆依存関係は、第１の命令においてある変数の値が使われた後に第２の命令においてその変数が定義される可能性がある場合に対応し、第１の命令から第２の命令に逆依存関係が存在すると言う。また出力依存関係は、第１の命令においてある変数の値が定義された後に第２の命令においてその変数が定義される可能性がある場合に対応し、第１の命令から第２の命令に出力依存関係が存在すると言う。何れの関係においても、第２の命令を実行してから第１の命令を実行するように実行順序を逆にすることはできない。本発明では、データ転送を遅らせることにより制御が複雑化するので、逆依存／出力依存関係が発生しない上記２）又は３）の方式を用いる。
【００７２】
以下において、変数生成方法の第１の実施例として、２）手続き毎に使用する可能性のある変数の複製領域を作成する方式により変数を生成する方法について説明する。
【００７３】
図９は、変数生成方法の第１の実施例である手続き毎に変数を生成する処理のフローチャートを示す図である。図９に示す処理は、図１のステップＳ２の処理に相当する。
【００７４】
ステップＳ１で、縮約したプログラム依存グラフの各頂点ｖについて以降の処理を繰り返すループを開始する。
【００７５】
ステップＳ２で、着目頂点ｖがプログラム・ブロック頂点の場合、その頂点の手続きを実行するプロセッサに対して、既にその頂点（手続き）に対応する変数を作成済みか否かを判定する。実行するプロセッサについて変数が作成済みの場合はステップＳ４に進む。実行するプロセッサについて変数が未作成の場合は、ステップＳ３で変数を作成し、その後ステップＳ４に進む。
【００７６】
ステップＳ４で、変数の名前を付けかえる。即ち、例えばプロセッサＰＥ１に手続きＰ１の変数ｘを作成してある場合、この変数ｘがプロセッサＰＥ１の手続きＰ１の変数ｘであることを示すような変数名（例えばＰＥ１＿Ｐ１＿ｘ）に変更する。以上の処理を、縮約したプログラム依存グラフの各頂点について実行する。その後、ステップＳ５で、依存関係を抽出する。
【００７７】
次にステップＳ６で、頂点間の実行順序関係を計算し、求めた実行順序(制御の流れ)から基本ブロックを抽出する。
【００７８】
上記のように手続き毎に変数を作成することにより、全ての逆依存関係及び出力依存関係が削除されることになる。従って、逆依存関係及び出力依存関係については抽出する必要がない。
【００７９】
図１０は、頂点間の実行順序関係を決定する方法を示すフローチャートである。図１０の処理は、図９のステップＳ６の前半部分に相当する。図１０に示す処理の入力は縮退したプログラム依存グラフＰＤＧであり、出力は縮退したプログラム依存グラフＰＤＧ及びその制御の流れである。
【００８０】
ステップＳ１で、縮退したプログラム依存グラフＰＤＧのエントリ頂点（プログラムの開始ポイント）をｖとする。ステップＳ２で、頂点ｖ以下の制御の流れを再構成する。以上で処理を終了する。
【００８１】
図１１は、頂点ｖ以下の制御の流れを再構成する処理（図１０のステップＳ２）を示すフローチャートである。図１１の処理の入力は、縮退したプログラム依存グラフＰＤＧ及び頂点ｖである。
【００８２】
ステップＳ１で、Region(v, T) = {u | u ∈ V, v→cTu
∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップＳ２に進む。ここでRegion(v, T)とは、頂点uの集合であって、頂点vから頂点uへのL=Fの制御依存関係が存在するものである。ここでＶは頂点集合、Ｅは辺集合、v→cTuはL=Fの制御依存辺を示すものである。
【００８３】
ステップＳ２で、Region(v, T)の実行順序関係を計算する。ステップＳ３で、Region(v, F) = {u | u ∈ V, v→cFu
∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップＳ４に進む。ここでRegion(v, F)とは、頂点uの集合であって、頂点vから頂点uへのL=Fの制御依存関係が存在するものである。以上で処理を終了する。
【００８４】
図１２は、Regionの実行順序関係を計算する処理を示すフローチャートである。この処理は、図１１のステップＳ２及びステップＳ４の各々に対応する。図１２の処理の入力は、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）である。
【００８５】
ステップＳ１で、着目領域Ｖ’の各頂点ｖについて、ステップＳ２乃至Ｓ３の処理を繰り返すループを開始する。ステップＳ２で、ｖがプレディケート頂点（If-then-else又はwhile-loopの条件判定を表す頂点）であるか否かを判断する。ｖがプレディケート頂点である場合のみ、ステップＳ３を実行する。ステップＳ３で、頂点ｖ以下の実行順序関係を計算する。
【００８６】
次に、ステップＳ４で、逆依存及び出力依存を求める。ここでは制御の流れに起因するデータ依存関係(逆依存、出力依存)を抽出する。具体的には、着目領域（Region）を越えるデータ依存関係から、着目領域内の逆依存及び出力依存を表出する。
【００８７】
次に、ステップＳ５で、逆依存及び出力依存を求める。ここでは着目領域（Region）内の実行順序を決定する。即ち、実行順序が一意に定まらないRegion内頂点の集合について適切な実行順序制約を決定する。具体的には、求められた逆依存関係や出力依存関係などによる実行順序制約をもとに、Region内の逆依存関係や出力依存関係を明らかにして、実行順序を決定する。実行順序が任意となる場合は、実行順序を仮定して逆依存関係、出力依存関係を求め、矛盾が起きない実行順序が得られるまで試行を繰返す。
【００８８】
最後にステップＳ６でスケジューリングを行う。即ち、上で求めた実行順次関係に基づいて頂点の実行順を決定する。これは、半順序関係の成立するグラフのスケジューリングという一般的な問題に帰着できる。従って、トポロジカル・ソートや、頂点の実行時間の概算を重みとしたリスト・スケジューリングなどのよく知られたスケジューリング手法を適用することができる。この際、各頂点の各ＰＥ（プロセッサエレメント）への割り付けも行われる。
【００８９】
図１３は、逆依存及び出力依存を求める処理（図１２のステップＳ４）を示すフローチャートである。図１３の処理の入力は、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）である。
【００９０】
ステップＳ１で、着目領域Ｖ’を越える変数参照を抽出してＶｄｅｆとする。ステップＳ２で、着目領域Ｖ’を越える変数代入を抽出してＶｕｓｅとする。ステップＳ３で、Ｖｕｓｅ及びＶ’に基づいて逆依存辺を追加する。ステップＳ４で、Ｖｄｅｆ及びＶ’に基づいて出力依存辺を追加する。以上で処理を終了する。
【００９１】
図１４は、着目領域を越える変数参照を抽出する処理を示すフローチャートである。図１４の処理は図１３のステップＳ１に相当し、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）を入力とする。
【００９２】
ステップＳ１で、頂点の集合Ｖｕｓｅを空にする。ステップＳ２で、着目領域Ｖ’内の各フロー依存辺について以降の処理を繰り返すループを開始する。ここでフロー依存辺としては、ループ独立フロー依存辺とループ繰り越しフロー依存辺とを含む。ステップＳ３で、フロー依存辺ｅの依存元頂点をｕとするとともに、辺ｅの依存先頂点をｖとする。
【００９３】
ループ繰り越しフロー依存辺である場合には、ステップＳ４で、依存先頂点ｖが着目領域Ｖ’に含まれるという条件が満たされるか否かを判定する。またループ独立フロー依存辺である場合には、ステップＳ５で、依存元頂点ｕが着目領域Ｖ’に含まれず且つ依存先頂点ｖが着目領域Ｖ’に含まれるという条件が満たされるか否かを判定する。この判定結果がｙｅｓの場合のみ、ステップＳ６を実行する。ステップＳ６で、頂点の集合Ｖｕｓｅに依存先頂点ｖを追加する。
【００９４】
最後に、ステップＳ７で、頂点の集合Ｖｕｓｅを値として返す。以上で処理を終了する。
【００９５】
図１５は、着目領域を越える変数代入を抽出する処理を示すフローチャートである。図１５の処理は図１３のステップＳ２に相当し、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）を入力とする。
【００９６】
ステップＳ１で、頂点の集合Ｖｄｅｆを空にする。ステップＳ２で、着目領域Ｖ’内の各フロー依存辺について以降の処理を繰り返すループを開始する。ここでフロー依存辺としては、ループ独立フロー依存辺とループ繰り越しフロー依存辺とを含む。ステップＳ３で、フロー依存辺ｅの依存元頂点をｕとするとともに、辺ｅの依存先頂点をｖとする。
【００９７】
ループ繰り越しフロー依存辺である場合には、ステップＳ４で、依存先頂点ｖが着目領域Ｖ’に含まれるという条件が満たされるか否かを判定する。またループ独立フロー依存辺である場合には、ステップＳ５で、依存元頂点ｕが着目領域Ｖ’に含まれ且つ依存先頂点ｖが着目領域Ｖ’に含まれないという条件が満たされるか否かを判定する。何れかの判定結果がｙｅｓの場合のみ、ステップＳ６を実行する。ステップＳ６で、頂点の集合Ｖｄｅｆに依存先頂点ｖを追加する。
【００９８】
最後に、ステップＳ７で、頂点の集合Ｖｄｅｆを値として返す。以上で処理を終了する。
【００９９】
図１６は、逆依存の追加処理を示すフローチャートである。図１６の処理は図１３のステップＳ３に相当し、縮退したプログラム依存グラフＰＤＧ、V’（着目Region）、及び頂点集合Ｖｕｓｅを入力とする。
【０１００】
ステップＳ１で、頂点集合Ｖｕｓｅの各頂点ｖに対して以降の処理を繰り返すループを開始する。ステップＳ２で、頂点ｖで使用する各変数ｘに対して以降の処理を繰り返すループを開始する。ステップＳ３で、着目領域Ｖ’の各頂点ｕに対して以降の処理を繰り返すループを開始する。
【０１０１】
ステップＳ４で、頂点ｕが変数ｘを定義するか否かを判定する。判定結果がｙｅｓの場合のみ、ステップＳ５を実行する。ステップＳ５において、ｖからｕへの逆依存辺を追加する。以上で処理を終了する。
【０１０２】
図１７は、出力依存の追加処理を示すフローチャートである。図１７の処理は図１３のステップＳ４に相当し、縮退したプログラム依存グラフＰＤＧ、V’（着目Region）、及び頂点集合Ｖｄｅｆを入力とする。
【０１０３】
ステップＳ１で、頂点集合Ｖｄｅｆの各頂点ｕに対して以降の処理を繰り返すループを開始する。ステップＳ２で、頂点ｕで使用する各変数ｘに対して以降の処理を繰り返すループを開始する。ステップＳ３で、着目領域Ｖ’の各頂点ｖに対して以降の処理を繰り返すループを開始する。
【０１０４】
ステップＳ４で、頂点ｖが変数ｘを定義するか否かを判定する。判定結果がｙｅｓの場合のみ、ステップＳ５を実行する。ステップＳ５において、ｖからｕへの出力依存辺を追加する。以上で処理を終了する。
【０１０５】
図１８は、逆依存及び出力依存を求める処理（図１２のステップＳ５）を示すフローチャートである。図１８の処理の入力は、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）である。
【０１０６】
ステップＳ１で、着目領域内の全域木を求めＳとする。変数xを定義する頂点vとその変数ｘを使用するRegionＲ内の頂点との集合として、頂点ｖの変数xに関する全域木が、
Span(v,
x) = {v}∪{u| v→lixu ∈ ER}
と定義される。図１９は、全域木を説明するための図である。図１９に示されるプログラム依存グラフにおいて、頂点ｖｉにおいて変数ｘが定義され、２つの頂点ｖ１及びｖ２が変数ｘを使用する。この場合、頂点ｖｉ、ｖ１、及びｖ２で全域木２１を形成する。また頂点ｖｊにおいて変数ｘが定義され、２つの頂点ｖ３及びｖ４が変数ｘを使用する。この場合、頂点ｖｊ、ｖ３、及びｖ４で全域木２２を形成する。図２０は、全域木を模式的に示す図である。全域木Span(vｉ, x)及び全域木Span(vｊ, x)が、データ依存グラフとして図２０に示されるように構成される。
【０１０７】
図１８に戻り、ステップＳ２で、実行順が未決定である２つの任意の全域木を順次選択して以降の処理を繰り返すループが開始される。ステップＳ３で、着目領域に閉路がなく、同一変数xに対する独立した全域木Span(h0,x)及びSpan(h1,x)が存在するか否かを判定する。ここで、「独立した」とは、２つの全域木 Span(h0,x)及びSpan(h1,x)について、Span(h0,x)に含まれる頂点とSpan(h1,x)に含まれる頂点との間に辺（依存関係）がないことを言う。
【０１０８】
ステップＳ４でR（Region）のオリジナルをスタックに退避させる。ステップＳ５で、h0→h1の出力依存辺を追加し、推移閉包を求める。ステップＳ６で、全域木間の順序関係を計算する。
【０１０９】
ステップＳ７で、Ｒ（Region）に閉路が存在するか否かを判定する。存在しない場合には、以降の処理ステップＳ８〜ステップＳ１１をスキップする。存在する場合には、ステップＳ８に進む。ステップＳ８で、スタックが空か否かを判断する。空の場合にはエラー終了する。空でない場合には、ステップＳ９で、Ｒのオリジナルをスタックから取り出す。
【０１１０】
以上の処理は、頂点h0からh1への出力依存関係をグラフに追加したときに、巡回グラフとならない場合には追加した依存関係を確定させ、巡回グラフになった場合には元のグラフに戻すことに相当する。元のグラフに戻した後は、以降に示すように、頂点h1からh0への出力依存関係をグラフに追加する。即ち、ステップＳ１０で、h1→h0の出力依存辺を追加し、推移閉包を求める。ステップＳ１１で、全域木間の順序関係を計算する。
【０１１１】
以上の処理により、２つの全域木 Span(h0,x)及びSpan(h1,x)に対する実行順序が決定する。更に、実行順が未決定である２つの任意の全域木を順次選択して同様の処理を繰り返し、全ての全域木間の順序関係が決定されたところで終了する。
【０１１２】
図２１は、全域木間の順序関係を計算する処理を示すフローチャートである。図２１の処理は、図１８のステップＳ６及びステップＳ１１に相当する。図２１の処理の入力は、縮退したプログラム依存グラフＰＤＧ及びV’（着目Region）である。
【０１１３】
ステップＳ１で、着目領域内の各辺ｅ（頂点ｖ→頂点ｗ）について以降の処理を繰り返すループを開始する。ステップＳ２で、頂点ｗで定義され、頂点ｖで参照される各変数ｘについて以降の処理を繰り返すループを開始する。
【０１１４】
ステップＳ３で、Va ← { u | v ∈ Span(u, x) }とするとともに、Vb ← { u | w ∈ Span(u, x) }とする。これは、頂点ｖを要素として含む変数ｘに関する全域木における変数ｘを定義する頂点の集合を求めるとともに、頂点ｗを要素として含む変数ｘに関する全域木における変数ｘを定義する頂点の集合を求めることである。
【０１１５】
ステップＳ４で、Ｖａの各頂点ｖａについて以降の処理を繰り返すループを開始する。ステップＳ５で、Ｖｂの各頂点ｖｂについて以降の処理を繰り返すループを開始する。更にステップＳ６で、Span(va, x)の頂点であってSpan(vb, x)の頂点でない各頂点ｖｃについて以降の処理を繰り返すループを開始する。
【０１１６】
ステップＳ７で、ｖｃ→ｖｂがＥ（辺集合）に含まれるか否かを判定する。判定結果がｙｅｓの場合のみステップＳ８を実行する。ステップＳ８で、ｖｃ→ｖｂの逆依存辺を追加し、推移閉包を求める。以降、各ループの処理を繰り返す。
【０１１７】
図２２は、図２１の処理による逆依存辺の追加について説明する図である。図２２には、頂点ｖの変数ｘに関する全域木Span(v,x)と頂点ｗの変数ｘに関する全域木Span(w,x)とが示される。頂点ｖを要素として含む変数ｘに対する全域木Span(va, x)（即ちSpan(v,x)）の各頂点ｖｃ（即ちｖ、２５、２６）に対して、全域木Span(vb, x)（即ちSpan(ｗ,x)）のヘッドｖｂ（変数を定義している頂点ｗ）への逆依存辺３２、３３を追加する。
【０１１８】
図２３は、基本ブロックを抽出する処理のフローチャートを示す図である。図２３に示す処理は、図９のステップＳ６の後半部分の処理に相当する。図２３の処理の入力は、実行順序関係が決定された縮退したプログラム依存グラフである。
【０１１９】
制御の流れとして求めた半順序関係を、トポロジカル・ソートや、リスト・スケジューリングなどの手法を用いてＰＥに割り付けソートする。ソートした順（求めた制御の流れの順）に頂点を探索し、頂点の種類に応じた処理を行なう。以下の説明においてＢは基本ブロックの集合であり、Ｂｉはｉ番目の基本ブロックである。またｖは現在の頂点（着目頂点）であり、ｕは現在の頂点の１つ前の頂点である。
【０１２０】
まずステップＳ２で、最初の基本ブロックＢ０を空集合として生成する。次にステップＳ２で、ｕをエントリ頂点（プログラムの開始ポイント）として、ｖをエントリ頂点の次の頂点とする。ステップＳ４で、現在の頂点ｖが最終頂点であるか否かを判断する。最終頂点である場合には、処理を終了して基本ブロックの集合Ｂが生成される。
【０１２１】
現在の頂点ｖが最終頂点でない場合には、ステップＳ５に進み、現在の頂点ｖがプレディケート頂点（If-then-else又はwhile-loopの条件判定を表す頂点）であるか否かを判断する。プリディケート頂点である場合には、ステップＳ６に進み、ｉをインクリメントしてからＢｉの要素をｖとすることで、新たなプリディケートのみの基本ブロックＢｉを形成する。その後ステップＳ７で、更にｉをインクリメントして、新たな空集合の基本ブロックＢｉを形成する。
【０１２２】
現在の頂点ｖがプレディケート頂点でない場合（Ｓ５でＮｏの場合）には、ステップＳ８で、現在の頂点ｖと１つ前の頂点ｕとが、同一のプレディケート頂点からの制御依存関係を有し、且つその制御依存関係が同一の条件判定フラグに基づくものであるか否かを判定する。この判定結果がＮＯとなるのは、例えばｕとｖとが、ＩＦ文の内部と外部とに対応する場合や、ＩＦ文のＴＨＥＮ節とＥＬＳＥ節とに対応する場合等である。即ち、ステップＳ８においては、同一の条件判定に応じて双方共に実行される２つの頂点であるか否かが判定されている。
【０１２３】
ステップＳ８の判定がＹＥＳの場合には、ステップＳ９で、現在の基本ブロックに現在の頂点ｖを追加する。ステップＳ８の判定がＮＯの場合には、ステップＳ１０で、ｉをインクリメントして新たな空集合の基本ブロックＢｉを形成する。その後ステップＳ１１で、この新たに生成された基本ブロックＢｉに現在の頂点ｖを追加する。その後ステップＳ１２でｕとｖとをそれぞれ次の頂点に更新し、ステップＳ４に戻り以降の処理を繰り返す。
【０１２４】
以上の処理により、分岐（ＩＦ、ＧＯＴＯ、ＬＯＯＰ等）や合流を含まない順番に実行される頂点の列である各基本ブロックＢｉを生成し、これらの基本ブロックを要素とする基本ブロックの集合Ｂを生成することができる。分岐や合流を含まない頂点の列とは、固定の１つの実行順に従い順番に実行される頂点の列のことである。図２３のフローチャートから分かるように、各プレディケート頂点は単独で１つの基本ブロックＢｉを構成し、プレディケート頂点でない１つの基本ブロックＢｉには、途中で分岐も合流もなく固定の１つの実行順に従い順番に実行される頂点の列が含まれることになる。
【０１２５】
本発明では、異なる基本ブロックをまたいでの手続き間の依存関係については、先行手続きの出力データ転送の終了待ち合わせを行ってから、後続手続きを実行するようにする。また同一の基本ブロック内部で依存関係がある手続きの実行については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより手続きを実行する。即ち、基本ブロック間をまたいでの依存関係がある手続きについては先行手続きの出力データ転送を待ち合わせる命令の後に後続手続きを実行する命令を配置することにより、依存関係を満たすように手続き制御する。また同一の基本ブロック内部で依存関係がある手続きについては後続手続きの先行手続きの出力データ転送への依存関係を明示的に登録する命令を生成するようにして、依存関係を満たすように手続き制御する。このような構成とすることで、複雑な制御の依存関係が存在する基本ブロック間については、手続きの実行を待ち合わせにより実現することで制御プログラムの生成を容易なものとし、実行順が固定である同一基本ブロック内については、依存関係待ち合わせ付き非同期遠隔手続呼び出しにより無駄な待ち合わせ時間をなくすことができる。
【０１２６】
以上により、基本ブロックを抽出することができる。即ち、図９のステップＳ６の後半部分の処理が実行される。
【０１２７】
以下において、変数生成方法の第２の実施例として、３）プロセッサ毎に使用する可能性のある変数の複製領域を作成し、逆依存関係又は出力依存関係による待ち合わせが発生する場合は、手続き毎の異なる領域を作成する方式により変数を生成する方法について説明する。
【０１２８】
図２４は、変数生成方法の第２の実施例である必要に応じてプロセッサ毎又は手続き毎に変数を生成する処理のフローチャートを示す図である。図２４に示す処理は、図１のステップＳ２の処理に相当する。
【０１２９】
まずステップＳ１で、頂点間の実行順序関係を計算し、求めた実行順序(制御の流れ)から基本ブロックを抽出する。縮退したプログラム依存グラフは、データ及び制御の依存関係のみを表現したグラフであって頂点間の実行順序は明示されていないので、これから適切な制御の流れを再構成する必要がある。そこで、縮退したプログラム依存グラフの制御依存部分木について、各中間節点の子頂点の実行順序を計算する。この結果、頂点間の半順序関係を求めることができる。この実行順序関係を用いて、制御プログラムを生成することとなる。またその課程において、逆依存関係、出力依存関係が抽出される。更に、求めた実行順序(制御の流れ)から、基本ブロックを抽出する。この処理は、第１の実施例において説明した図９のステップＳ６と同一の処理である。
【０１３０】
ステップＳ２で、縮約したプログラム依存グラフの各頂点ｖについて以降の処理を繰り返すループを開始する。
【０１３１】
ステップＳ３で、着目頂点ｖがプログラム・ブロック頂点の場合、その頂点の手続きを実行するプロセッサに対して、既にその頂点（手続き）に対応する変数を作成済みか否かを判定する。実行するプロセッサについて変数が作成済みの場合はステップＳ５に進む。実行するプロセッサについて変数が未作成の場合は、ステップＳ４で変数を作成し、その後ステップＳ５に進む。
【０１３２】
ステップＳ５で、変数の名前を付けかえる。即ち、例えばプロセッサＰＥ１に変数ｘを作成してある場合、この変数ｘがプロセッサＰＥ１の変数ｘであることを示すような変数名（例えばＰＥ１＿ｘ）に変更する。以上の処理を、縮約したプログラム依存グラフの各頂点について実行する。
【０１３３】
その後、ステップＳ６で、全ての逆依存関係及び出力依存関係を探索して、各依存関係に対して以下の処理を繰り返し実行する。
【０１３４】
ステップＳ７で、着目している依存関係（逆依存関係又は出力依存関係）が、ステップＳ４の変数名変更により解消されているか否かを判断する。依存関係が解消されているものについては、その依存関係を削除する。依存関係が解消されていない場合（未解決の場合）は、ステップＳ７で、処理を実行するプロセッサ上に、着目依存関係に対応する手続きの変数を複製して作成し、その後ステップＳ８に進む。
【０１３５】
変数xに関する逆依存関係v→antix wが未解決となる条件は、次の２通りである。
【０１３６】
第１条件：PE(v)=PE(w)
第２条件：∃ u∈V w→f x u∈E かつ PE(v)=PE(u)
ここでPE(v)は頂点vが実行されるプロセッサPEを表し、上記第１の条件では、逆依存関係にある頂点vとwが同一のプロセッサPEに割り付けられていることを示している。頂点vとwが、同一PEであるPEiに対して割り付けられているため、PEiの変数xに関して逆依存関係となる。頂点vとwで異なる変数を使うように変数を複製することとなる。例えば、頂点wの変数をx’に変更することが考えられる。
【０１３７】
上記第２の条件では、頂点wで代入された値が、頂点uで参照される場合を示している。頂点vと頂点uが同一のPEであるPEi に割り付けられているとすると、頂点wで代入された値が頂点uで参照するために、PEiの変数xに転送されることとなる。これを解決するために、頂点vとuで異なる変数を使うように変数を複製することとなる。例えば、頂点uの変数をx’に変更することが考えられる。
【０１３８】
変数xに関する出力依存関係v→outputx wが未解決となる条件は、次の２通りである。
【０１３９】
第１条件：PE(v)=PE(w)
第２条件：¬∃u∈V  w→f x
u∈E  PE(v)=PE(u)
上記第１条件では、頂点vとwが、同一PEであるPEiに対して割り付けられているため、PEiの変数xに関して出力依存関係となる。頂点vとwで異なる変数を使うように変数を複製することとなる。例えば、頂点wの変数をx’に変更することが考えられる。
【０１４０】
上記第２の条件では、頂点wで代入された値が、頂点uで参照されることを想定する。ここで、頂点vと頂点uが同一のPEであるPEi に割り付けられているとすると、頂点wで代入された値が頂点uで参照するためにPEiの変数xに転送されることとなる。頂点vにおける変数xへの代入と衝突するため、これを解決するには頂点vとuで異なる変数を使うように変数を複製することとなる。例えば、頂点uの変数をx’に変更することが考えられる。
【０１４１】
なお、定義順序関係に相当する場合は、定義順序関係として扱い、出力依存関係は削除するものとする。
【０１４２】
ステップＳ９で、変数の名前を付けかえる。即ち、例えばプロセッサＰＥ１に手続きＰ１の変数ｘ及び手続きＰ２の変数ｘを作成してある場合、これらの変数の変数名を例えばＰＥ１＿Ｐ１＿ｘ及びＰＥ１＿Ｐ２＿ｘのように各プロセッサ及び各手続きに固有の名前に変更する。以上の処理を、各逆依存関係及び出力依存関係について実行する。
（５）並列プログラム生成手法：制御プログラム生成方法
上記説明したような図１のステップＳ２の変数生成処理により、変数の生成、プログラムの実行順序関係の計算、および、基本ブロックの抽出が完了している。このようにして求められた実行順序関係と基本ブロックとに基づいて制御プログラムを生成する。各中間節点が表す制御構造と子頂点が表す「手続き」の呼び出しを行なうプログラムを生成することで、並列プログラムを生成する「手続き」を実行する上で必要となる入力および出力データの送受信と待ち合わせを行なうコードも生成する。基本ブロック内の手続き呼び出しおよびデータ転送の依存関係に関しては、依存関係待ち合わせのメカニズムを用いて制御し、データ転送の制御には、データ転送の制御方式を用いる。
【０１４３】
図２５は、手続き制御プログラムの構造を示す図である。
【０１４４】
図２５に示されるように、制御プログラムは、変数の宣言初期化部分４１、プレディケートへの入力データ待合わせ部分４２、プレディケートの制御構造４３、基本ブロックの出力データ転送完了待ち合わせ部分４４、基本ブロックへの入力データ転送指示部分４５、基本ブロック内の手続呼び出しと依存関係登録部分４６、及び、手続き及びデータ転送の待ち合わせ終了処理部分４６を含む。基本ブロック内の手続呼び出しと依存関係登録部分４６では、非同期遠隔手続き呼び出しの起動指示、基本ブロック内のデータ転送指示、出力データ転送情報の登録、依存関係の登録、手続きのディスパッチ（実行開始）を行う。
【０１４５】
データを参照する箇所とデータを上書きする可能性のある箇所について、データ転送指示とデータ転送完了待ち合わせそれぞれ行なう。つまり、条件判定を行なうプレディケート頂点について、参照する変数のデータ転送を指示し、待ち合わせる。また、手続きの実行によって未転送のデータを上書きすることがないように前ループでの出力データ転送を待ち合わせる。その後、基本ブロック内の手続きを実行するために必要なデータの転送、遠隔手続き呼び出しの起動、基本ブロック内のデータ転送を指示し、依存関係を登録し、実行を開始する。プログラムの最後では、処理の結果を得るべく、遠隔手続き呼び出しの出力データを制御プロセッサに転送させ、終了処理を行なう。
【０１４６】
まず手続きプログラムの生成について説明する。縮退プログラム依存グラフの頂点は、入力逐次プログラムの文の部分集合であって、文の間の制御の流れの情報を有している。従って、着目する１つの頂点へのデータフロー入力辺が表す変数を入力とし、データフロー出力辺が表す変数を出力とする、１つの手続きプログラムを１つの頂点に対して生成する。また、制御の流れより手続きプログラムの本文を、また、本文の実行に必要な局所変数をそれぞれ生成する。
【０１４７】
図２６は、手続きプログラム生成方法の概要を示す図である。図２７は、図２６の手続きプログラム生成方法により生成される手続きプログラムを示す図である。
【０１４８】
図２６のステップＳ１において、着目頂点についてデータフロー入力辺が表す変数を入力として、入力変数を引数として受信するためのプログラム部分を生成する。これにより、図２７に示す入力変数の引数受信部分１０が生成される。ステップＳ２において必要な変数を探索する。更にステップＳ３において、探索により見つかった変数について変数宣言を生成する。これにより、図２７に示す変数宣言部分１１が生成される。
【０１４９】
ステップＳ４において、着目頂点の文の間の制御の流れの情報に基づいて、プログラムの本文を生成する。これにより、図２７に示すプログラム本体部分１２が生成される。ステップＳ５において、着目頂点のデータフロー出力辺が表す変数を出力として返すためのプログラム部分を生成する。これにより、図２７に示す出力変数のセット部分１３が生成される。
【０１５０】
このように、手続きプログラムとしては、頂点が表す文／文の集合を実行する手続きとする。また、入力変数を手続きの引数とし、出力変数を復帰値あるいは、出力変数を格納するアドレスを引数として受け取るような手続きを作成する。
【０１５１】
次に手続き制御プログラムの生成について説明する。非特許文献２に記載される技術に基づいて、縮退したプログラム依存グラフから制御の流れを安全に再構成することができる。具体的には、縮退したプログラム依存グラフの制御依存部分木について、プログラムの実行順序関係を計算し、基本ブロックを求める。基本ブロックとは、分岐（ＩＦ、ＧＯＴＯ、ＬＯＯＰ等）や合流を含まない順番に実行される頂点の列のことを言う。各中間節点が表す制御構造と子頂点が表す「手続き」の呼び出しを行なうプログラムを生成することで、並列プログラムを生成することができる。「手続き」を実行する上で必要となる入力データのデータ転送および出力結果のデータ転送とそれらの待ち合わせを行なうコードも生成する。基本ブロック内の手続き呼び出しおよびデータ転送の依存関係に関しては、依存関係待ち合わせのメカニズムを用いて制御する。
【０１５２】
本発明によるプログラムの実行は、図３に示されるのと同様に、手続要求側プロセッサ（制御プロセッサ）により制御プログラムを実行し、この制御プログラムが呼び出す各手続きの手続きプログラムを各手続実行側プロセッサにより実行する。各手続きプログラムは、前述のように、頂点が表す文／文の集合を実行する手続きである。手続き呼び出し及び依存関係の登録と手続きの実行とについては、図３に示した仕組みと同様であり、制御プロセッサにおいて手続き呼出しプログラム３が管理する各プロセッサ毎のキューに手続きと依存関係とを登録し、実行可能状態となった手続きを順次実行していく。
【０１５３】
手続きの入力データは、制御プロセッサから実行するプロセッサに転送する。但し、先行する手続きの結果を利用する場合には、手続きを実行したプロセッサから後続の手続きを実行するプロセッサに対して直接データを転送することとする。これは、元の逐次プログラムにおける条件判定に相当する、制御プログラム上の条件判定結果によっては、複数データのうち適切なデータを選択することが必要となる場合がある。このようなデータ選択は、データ転送の依存関係として制御することになる。
【０１５４】
図２８は、手続き制御プログラムの生成方法を示すフローチャートである。ステップＳ１で、制御プログラムの変数と初期値代入文を生成する。ここで変数としては、データの受け渡しを行うための変数を生成する。また、遠隔手続き呼び出しおよびデータ転送の識別する変数、および、データ転送制御の変数を生成する。分散メモリ環境を想定しているため、手続きを実行するプロセッサ上のメモリ領域上の外部変数の宣言を生成することとなる。データ転送制御の変数は、各遠隔手続き呼び出しの入力変数、および、プリディケート頂点の入力変数について、それぞれ作成する。
【０１５５】
次にステップＳ２で、求めた実行順序順に制御依存部分グラフを探索し、制御プログラムを生成する。プリディケート頂点については、その頂点が表す制御構造を生成する。そして、制御構造の本文として、当該頂点の下位の部分木の制御プログラムを生成する。基本ブロックについては依存関係に基づく非同期遠隔手続きおよびデータ転送を行う文を生成する。これについては以下に詳細に説明する。
【０１５６】
更にステップＳ３で、終了値のデータ転送指示を生成する。最後にステップＳ４で、手続きの実行結果の待ち合わせを行う文を生成する。
【０１５７】
図２９は、制御プログラムを生成する処理のフローチャートを示す図である。図２９に示す処理は、図２８のステップＳ２の処理に相当する。図２９の処理の入力は、実行順序関係が決定された縮退したプログラム依存グラフ及び基本ブロックの集合Ｂである。
【０１５８】
ステップＳ１において、各初期定義頂点について以降の処理を繰り返すループを開始する。ここで初期定義頂点とは、変数の初期値が定まっている頂点のことをいう。
【０１５９】
ステップＳ２で、初期定義頂点からプログラム・ブロック頂点へのフロー依存辺について、データ転送の予約を行なう。具体的には、アドレスを登録する処理と状態を変更する処理とを実行する。即ち、図８に示した関数def_data()によりデータ転送の予約をする。ただし、先行手続き呼び出しが存在しないため、転送元遠隔手続き呼び出し識別子fはφとする。
【０１６０】
各初期定義頂点について以上の処理が繰り返し実行されると、その後、制御プログラム本体を生成する。
【０１６１】
ステップＳ３で、プログラムの先頭を表すエントリ頂点ｖEntryの直下の子頂点ｖを要素とする基本ブロックの集合をＢ’とする。ステップＳ４において、Ｂ’の各要素Ｂｉについて、ｉの昇順に以降の処理を繰り返すループを開始する。ステップＳ５で、Ｂｉについての手続き制御プログラムを生成する。
【０１６２】
図３０は、基本ブロックの集合Ｂ’の要素Ｂｉ以下の手続き制御プログラムを生成する処理を示すフローチャートである。図３０の処理は、図２９のステップＳ５に相当する。図３０に示す処理の入力は縮退したプログラム依存グラフＰＤＧ及び基本ブロック要素Ｂｉである。
【０１６３】
図３０のステップＳ１で、基本ブロックＢｉの要素（頂点）の種類を判定する。基本ブロックＢｉの要素である頂点の種類を判定することによって、基本ブロックＢｉがプログラム・ブロックの集合であるか、プレディケート頂点であるかが分かる。
【０１６４】
ステップＳ１の判定の結果、基本ブロックＢｉがプログラム・ブロックの集合の場合は、ステップＳ２でプログラム・ブロックの制御プログラムを生成することとなる。ステップＳ１の判定の結果、基本ブロックＢｉがプレディケート頂点の場合は、ステップＳ３でプレディケートの制御プログラムを生成することとなる。
【０１６５】
図３１は、プログラム・ブロックの制御プログラムを生成する処理のフローチャートを示す図である。図３１の処理は、図３０のステップＳ２に相当する。
【０１６６】
ステップＳ１で、Biの各頂点vを求めた実行順序順に探索する。ステップＳ２で、頂点vの基本ブロックを越える入力フロー依存辺（ブロック外からブロック内へのフロー依存辺）と、ループを繰り越すフロー依存辺について、データ転送指示と待合せを生成する。即ち、wait_for_def_and_move を用いて、データが未転送の場合に、データ転送の指示を行なう。また、「データ転送予約」とすることで、データが上書きされるまでは、データ再送は行なわない。
【０１６７】
ステップＳ３で、頂点vの基本ブロックを越える出力フロー依存辺について、データ転送待合せを生成する。即ち、頂点vの遠隔手続き呼び出しにおいて、上書きするデータについて、後続の手続きへのデータ転送が完了しているかの待ち合わせを行なう。具体的には、wait_for_useを用いて、データを要求している手続きに対して、データ転送を待ち合わせる。
【０１６８】
ステップＳ４で、頂点vの手続き呼び出しを生成する。ステップＳ５で、ステップＳ２のデータ転送と頂点vの依存関係を登録する。即ち、入力データ転送の後に頂点vの遠隔手続き呼び出しを実行すべく、入力データ転送とvの遠隔手続き呼び出しの依存関係を登録する。即ち、ブロックの境界を越えるデータ転送についてはregist_dependenceを用いて依存関係を登録する。ステップＳ５−１で、基本ブロックを越えないループを繰り越す出力フロー依存辺について、上書きするデータについてデータ転送行なってから手続きを実行するように、出力先変数へのデータ転送と頂点vの手続き呼び出しの間の依存関係を登録する。またステップＳ６で、Biに属する頂点からの頂点v へのループを繰り越さない各データ転送から手続きへの依存関係を登録する文を生成する。即ち、基本ブロック内であってループを繰り越さないものについては直接依存関係を登録する。
【０１６９】
ステップＳ７で、頂点v からBiに属する頂点へのデータ転送に対してデータ転送指示と手続きからデータ転送指示への依存関係を登録する文を生成する。即ち、頂点vからブロック内の後続頂点へのループを繰り越さないフロー依存辺について、データ転送の指示を生成し、また頂点vの遠隔手続き実行後に実行すべく依存関係を登録する。
【０１７０】
ステップＳ８で、頂点vの基本ブロックを越える出力フロー依存関係について、出力データ転送情報を登録する文を生成する。即ち、頂点vの基本ブロックを越える或いはループを繰り越すフロー依存辺に関して、出力データ転送情報の登録文def_data()を生成する。これにより転送元アドレスを設定し、転送状況を未転送とする。
【０１７１】
ステップＳ９で、実行開始を指示する文を生成する。
【０１７２】
図３２は、プレディケートの制御プログラムを生成する処理のフローチャートを示す図である。図３２の処理は、図３０のステップＳ３に相当する。
【０１７３】
ステップＳ１で、頂点vの入力フロー依存関係（自ループの繰越を除く）についてデータ転送指示（wait_for_def_and_move）と待合せ（wait）を生成する。即ち、条件式で参照するデータの転送を行なうために、自ループを繰り越すフロー依存辺以外の入力フロー依存辺について、wait_for_def_and_moveを用いて、データが未転送の場合に、データ転送の指示とその待ち合わせを行なう。
【０１７４】
次にステップＳ２で、頂点ｖのプレディケートの種類を判定する。プレディケートがループである場合には、ステップＳ３に進む。プレディケートがｉｆ文である場合には、ステップＳ８に進む。
【０１７５】
ステップＳ２の判定結果がループを示す場合には、ステップＳ３において、入力逐次プログラムにおいて相当するｆｏｒ文或いはｗｈｉｌｅ文を生成する。次にステップＳ４において、頂点ｖへのL=Tの制御依存関係がある頂点ｕを要素とする基本ブロックの集合をＢ’とする。ステップＳ５において、Ｂ’の各要素Ｂｉについて、ｉの昇順に以降の処理を繰り返すループを開始する。ステップＳ６で、Ｂｉについての手続き制御プログラムを生成する。このステップＳ６は入れ子構造となっており、ＢｉについてステップＳ６を実行することは、このＢｉについて図３０全体のフローチャートを実行することに相当する。
【０１７６】
ループの終了後、ステップＳ７で、頂点ｖへのループを繰り越す先行手続きの終了待ち合わせを生成する。これは、ループを繰り越して条件を判定するので、本文の末尾に、条件式への入力データ待ち合わせ（自ループを繰り越す入力フロー依存辺）を行なう文として、wait_for_def_and_moveと待ち合わせ(wait)を追加するものである。
【０１７７】
ステップＳ２の判定結果がｉｆ文を示す場合には、ステップＳ８において、ｉｆ文を生成する。次にステップＳ９で、ｔｈｅｎ節を生成する。ステップＳ１０で、頂点ｖへのL=Tの制御依存関係がある頂点ｕを要素とする基本ブロックの集合をＢ’とする。ステップＳ１１において、Ｂ’の各要素Ｂｉについて、ｉの昇順に以降の処理を繰り返すループを開始する。ステップＳ１２で、Ｂｉについての手続き制御プログラムを生成する。このステップＳ１２は入れ子構造となっており、ＢｉについてステップＳ１２を実行することは、このＢｉについて図３０全体のフローチャートを実行することに相当する。なおステップＳ１１及びＳ１２で生成された文が、ｔｈｅｎ節の本文を構成することになる。
【０１７８】
次にステップＳ１３で、頂点ｖへのL=Fの制御依存関係がある頂点ｕを要素とする基本ブロックの集合をＢ’とする。ステップＳ１４で、基本ブロックの集合Ｂ’が空集合であるか否かを判定し、空集合の場合には処理を終了する。基本ブロックの集合Ｂ’が空集合でない場合、ステップＳ１５で、ｅｌｓｅ節を生成する。ステップＳ１６で、Ｂ’の各要素Ｂｉについて、ｉの昇順に以降の処理を繰り返すループを開始する。ステップＳ１７で、Ｂｉについての手続き制御プログラムを生成する。このステップＳ１７は入れ子構造となっており、ＢｉについてステップＳ１７を実行することは、このＢｉについて図３０全体のフローチャートを実行することに相当する。なおステップＳ１６及びＳ１７で生成された文が、ｅｌｓｅ節の本文を構成することになる。
【０１７９】
以上の処理を実行することで、基本ブロックＢｉ以下の手続き制御プログラムが生成される。
【０１８０】
以下に、本発明の並列化プログラム生成方法により生成された手続きプログラム及び手続き制御プログラムについて、その構成及び動作を具体的な例を用いて説明する。
【０１８１】
図３３は、（ａ）入力逐次プログラムの部分、（ｂ）対応する縮退プログラム依存グラフ、（ｃ）生成された手続制御プログラムの部分を示す図である。（ａ）に示す入力逐次プログラムからプログラム依存グラフを生成し、頂点を結合して縮退することにより、（ｂ）に示す縮退プログラム依存グラフが生成される。生成された手続き制御プログラムの一部分が（ｃ）に示されており、制御変数ｐのｗｈｉｌｅ文の内部において、まずwait_for_def_and_move()により、手続きｆの参照データｘを待ち合わせ、ｘのデータ転送を指示する。次にwait_for_use（）により、前回の手続ｆの結果を必要としている手続きｇへのデータ転送を待ち合わせる。更にregist_dependence()により、ｘのデータ転送に依存して手続きｆを実行することを登録する。また更に、def_data()により、手続きｇの参照データについて転送元アドレス等を登録する。ディスパッチ命令dispatchにより、実行可能手続きである手続きを実行する。
【０１８２】
制御変数ｐのｗｈｉｌｅ文の終了後に、wait_for_def_and_move()により、手続きｇの参照データｙを待ち合わせ、ｙのデータ転送を指示する。更にregist_dependence()により、ｙのデータ転送に依存して手続きｇを実行することを登録する。
【０１８３】
図３４は、以上の手続き制御プログラムの動作を手続きプログラムの実行とともに示す模式図である。図３４では、プロセッサＰＥ０と、データ転送ユニットＤＴＵと、プロセッサＰＥ１と、プロセッサＰＥ２とが用いられる。プロセッサＰＥ０により手続き制御プログラムを実行する。
【０１８４】
プロセッサＰＥ０により１回目のｗｈｉｌｅのループについて手続き制御５１が実行される。これにより変数ｘがプロセッサＰＥ１に転送される。プロセッサＰＥ１は手続き「ｙ＝ｆ（ｘ）」を実行するが、この結果である変数ｙの値はこの時点では転送されない。
【０１８５】
次にプロセッサＰＥ０により２回目のｗｈｉｌｅのループについて手続き制御５２が実行される。このとき変数ｘは既に１回目のループで転送されており、その後変更されていないので、変数ｘの転送が実行されることはない。プロセッサＰＥ１は手続き「ｙ＝ｆ（ｘ）」を実行するが、この結果である変数ｙの値はこの時点では転送されない。
【０１８６】
次にプロセッサＰＥ０によりｗｈｉｌｅループ後の手続き制御５３が実行される。これにより、手続きｇの入力ｙ（＝ｆ（ｘ））の待ち合わせが指定され、ｙのデータ転送を指示する。最後にプロセッサＰＥ０により手続き制御５４が実行される。これにより手続きｇの依存関係が登録され更に手続きの実行が指示される。手続きｇの実行時に、初めて変数ｙがＰＥ１からＤＴＵを介してＰＥ２に転送される。
【０１８７】
図３５は、図３４での変数ｘの参照について更に詳しく説明する図である。プロセッサＰＥ０による手続き制御５１においてdef_data()を実行することにより、ｘの転送状況は「未転送」に設定される。またこの際、転送元遠隔手続き呼び出し識別子はφ（空集合）と指定される。その後手続き制御５１においてwait_for_def_and_move()を実行すると、ｘの転送状況が「未転送」なので、手続きを待ち合わせてｘのアドレス（＆ｘ）のデータを転送する。但しこの例では、手続きがφ（空集合）なので、手続き待ち合わせは行なわない。ｘの転送状況は「転送予約」に設定される。
【０１８８】
その後、プロセッサＰＥ０により手続き制御５２が実行される。この手続き制御５２においてwait_for_def_and_move()を実行すると、ｘの転送状況は「未転送」ではないので、転送処理は実行されない。
【０１８９】
図３６は、図３４での変数ｙの参照について更に詳しく説明する図である。プロセッサＰＥ０による手続き制御５１においてｗｈｉｌｅループ内でdef_data()を実行することにより、ｙの転送状況は「未転送」に設定され、転送元遠隔手続き呼び出し識別子は手続きｆを示す値に設定され、転送元アドレスは手続きｆの変数ｙのアドレスに設定される。
【０１９０】
その後、プロセッサＰＥ０により手続き制御５２が実行される。この手続き制御５２においてdef_data()を実行することにより、ｙの転送状況は「未転送」に設定され、転送元遠隔手続き呼び出し識別子は手続きｆを示す値に設定され、転送元アドレスは手続きｆの変数ｙのアドレスに設定される。
【０１９１】
その後、プロセッサＰＥ０により手続き制御５３が実行される。この手続き制御５３においてwait_for_def_and_move()を実行すると、ｙの転送状況（dtc_g_y->転送状況）は「未転送」であるので、手続きｆを待ち合わせてからｙの転送処理が指示される。
【０１９２】
図３７は、whileループqを繰り越すときの変数ｙのデータ転送待ち合わせを説明するための図である。まずプロセッサＰＥ０により１回目のｗｈｉｌｅqのループについて手続き制御６１が実行される。これにより変数ｘがプロセッサＰＥ１に転送される。プロセッサＰＥ１は手続き「ｙ＝ｆ（ｘ）」を実行する。またdef_data()を実行することにより、ｙの転送状況は「未転送」に設定され、転送元遠隔手続き呼び出し識別子は手続きｆを示す値に設定され、転送元アドレスは手続きｆの変数ｙのアドレスに設定される。
【０１９３】
次に、プロセッサＰＥ０により手続き制御６２が実行される。この手続き制御６２においてwait_for_def_and_move()を実行すると、ｙの転送状況（dtc_g_y->転送状況）は「未転送」であるので、手続きｆを待ち合わせてからｙの転送処理が指示される。ｙの転送状況は「転送予約」に設定され、データ転送識別子は、手続きｆの変数ｙから手続きｇの変数ｙへのデータ転送の識別子の値に設定される。
【０１９４】
次に、プロセッサＰＥ０により手続き制御６３が実行される。この手続き制御６３においてregist_dependence()とdispatchを実行することにより、変数ｙのデータ転送してからの手続きｇの実行が命令される。
【０１９５】
変数ｙのデータ転送が実行中に、プロセッサＰＥ０により手続き制御６４が実行され、制御変数qのｗｈｉｌｅの次回のループが実行される。即ち、例えば図４に示すようなプログラムの場合である。ｗｈｉｌｅの次回のループにおいてwait_for_use（）により、前回の手続ｆの結果を必要としている手続きｇへのデータ転送を待ち合わせる。即ちｙの転送状況が「転送予約」を示し且つ転送元手続き呼び出し識別子が手続きｆを示すので、手続きｆの変数ｙから手続きｇの変数ｙへのデータ転送が終了するのを待つ。データ転送が終了すると、転送状況は「転送済」に設定される。その後、プロセッサＰＥ０により手続き制御６５が実行され、手続きｆが実行される。
【０１９６】
このようにして、ループを繰り越すときの変数ｙのデータ転送待ち合わせを実現することができる。
【０１９７】
図３８は、本発明による並列化プログラム生成方法を実行する装置の構成を示す図である。
【０１９８】
図３８に示されるように、本発明による並列化プログラム生成方法を実行する装置は、例えばパーソナルコンピュータやエンジニアリングワークステーション等のコンピュータにより実現される。図３８の装置は、コンピュータ５１０と、コンピュータ５１０に接続されるディスプレイ装置５２０、通信装置５２３、及び入力装置よりなる。入力装置は、例えばキーボード５２１及びマウス５２２を含む。コンピュータ５１０は、ＣＰＵ５１１、ＲＡＭ５１２、ＲＯＭ５１３、ハードディスク等の二次記憶装置５１４、可換媒体記憶装置５１５、及びインターフェース５１６を含む。
【０１９９】
キーボード５２１及びマウス５２２は、ユーザとのインターフェースを提供するものであり、コンピュータ５１０を操作するための各種コマンドや要求されたデータに対するユーザ応答等が入力される。ディスプレイ装置５２０は、コンピュータ５１０で処理された結果等を表示すると共に、コンピュータ５１０を操作する際にユーザとの対話を可能にするために様々なデータ表示を行う。通信装置５２３は、遠隔地との通信を行なうためのものであり、例えばモデムやネットワークインターフェース等よりなる。
【０２００】
本発明による並列化プログラム生成方法は、コンピュータ５１０が実行可能なコンピュータプログラムとして提供される。このコンピュータプログラムは、可換媒体記憶装置５１５に装着可能な記憶媒体Ｍに記憶されており、記憶媒体Ｍから可換媒体記憶装置５１５を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。或いは、このコンピュータプログラムは、遠隔地にある記憶媒体（図示せず）に記憶されており、この記憶媒体から通信装置５２３及びインターフェース５１６を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。
【０２０１】
キーボード５２１及び／又はマウス５２２を介してユーザからプログラム実行指示があると、ＣＰＵ５１１は、記憶媒体Ｍ、遠隔地記憶媒体、或いは二次記憶装置５１４からプログラムをＲＡＭ５１２にロードする。ＣＰＵ５１１は、ＲＡＭ５１２の空き記憶空間をワークエリアとして使用して、ＲＡＭ５１２にロードされたプログラムを実行し、適宜ユーザと対話しながら処理を進める。なおＲＯＭ５１３は、コンピュータ５１０の基本動作を制御するための制御プログラムが格納されている。
【０２０２】
上記コンピュータプログラム（並列化プログラム生成プログラム即ち並列化プログラム生成コンパイラ）を実行することにより、コンピュータ５１０が、上記各実施例で説明されたように並列化プログラム生成方法を実行する。
【０２０３】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【図面の簡単な説明】
【０２０４】
【図１】本発明による並列化プログラム生成方法の概略を示す図である。
【図２】無駄な待ち時間の発生について説明するための図である。
【図３】依存関係待ち合わせ付き非同期遠隔手続呼び出し方式による手続実行の制御について説明するための図である。
【図４】並列化対象のプログラムの一例を示す図である。
【図５】データ上書き抑制のための待ち合わせ制御を行なう関数の内容を示す図である。
【図６】参照データ取得のための待ち合わせ制御関数の内容を示す図である。
【図７】データ転送が行なわれる場合にデータ転送から手続への依存関係を登録する関数の内容を示す図である。
【図８】手続きで参照するデータについて値の代入に関する情報を登録する関数の内容を示す図である。
【図９】変数生成方法の第１の実施例である手続き毎に変数を生成する処理のフローチャートを示す図である。
【図１０】頂点間の実行順序関係を決定する方法を示すフローチャートである。
【図１１】頂点ｖ以下の制御の流れを再構成する処理を示すフローチャートである。
【図１２】Regionの実行順序関係を計算する処理を示すフローチャートである。
【図１３】逆依存及び出力依存を求める処理を示すフローチャートである。
【図１４】着目領域を越える変数参照を抽出する処理を示すフローチャートである。
【図１５】着目領域を越える変数代入を抽出する処理を示すフローチャートである。
【図１６】逆依存の追加処理を示すフローチャートである。
【図１７】出力依存の追加処理を示すフローチャートである。
【図１８】逆依存及び出力依存を求める処理を示すフローチャートである。
【図１９】全域木を説明するための図である。
【図２０】全域木を模式的に示す図である。
【図２１】全域木間の順序関係を計算する処理を示すフローチャートである。
【図２２】図２１の処理による逆依存辺の追加について説明する図である。
【図２３】基本ブロックを抽出する処理のフローチャートを示す図である。
【図２４】変数生成方法の第２の実施例である必要に応じてプロセッサ毎又は手続き毎に変数を生成する処理のフローチャートを示す図である。
【図２５】手続き制御プログラムの構造を示す図である。
【図２６】手続きプログラム生成方法の概要を示す図である。
【図２７】図２６の手続きプログラム生成方法により生成される手続きプログラムを示す図である。
【図２８】手続き制御プログラムの生成方法を示すフローチャートである。
【図２９】制御プログラムを生成する処理のフローチャートを示す図である。
【図３０】基本ブロックの集合Ｂ’の要素Ｂｉ以下の手続き制御プログラムを生成する処理を示すフローチャートである。
【図３１】プログラム・ブロックの制御プログラムを生成する処理のフローチャートを示す図である。
【図３２】プレディケートの制御プログラムを生成する処理のフローチャートを示す図である。
【図３３】（ａ）は入力逐次プログラムの部分、（ｂ）は対応する縮退プログラム依存グラフ、（ｃ）は生成された手続制御プログラムの部分を示す図である。
【図３４】手続き制御プログラムの動作を手続きプログラムの実行とともに示す模式図である。
【図３５】図３４での変数ｘの参照について更に詳しく説明する図である。
【図３６】図３４での変数ｙの参照について更に詳しく説明する図である。
【図３７】ループを繰り越すときの変数ｙのデータ転送待ち合わせを説明するための図である。
【図３８】本発明による並列化プログラム生成方法を実行する装置の構成を示す図である。
【符号の説明】
【０２０５】
１０  入力変数の引数受信部分
１１  変数宣言部分
１２  プログラム本体部分
１３  出力変数の送信部分
２１，２２  全域木
３１  出力依存辺
３２，３３  逆依存辺
１００  並列実行ライブラリ
１０１  データ転送制御ライブラリ
５１０  コンピュータ
５１１  ＣＰＵ
５１２  ＲＡＭ
５１３  ＲＯＭ
５１４  二次記憶装置
５１５  可換媒体記憶装置
５１６  インターフェース
５２０  ディスプレイ装置
５２１  キーボード
５２２  マウス
５２３  通信装置
【図１】
0005315703.tif 000002
【図２】
0005315703.tif 000003
【図３】
0005315703.tif 000004
【図４】
0005315703.tif 000005
【図５】
0005315703.tif 000006
【図６】
0005315703.tif 000007
【図７】
0005315703.tif 000008
【図８】
0005315703.tif 000009
【図９】
0005315703.tif 000010
【図１０】
0005315703.tif 000011
【図１１】
0005315703.tif 000012
【図１２】
0005315703.tif 000013
【図１３】
0005315703.tif 000014
【図１４】
0005315703.tif 000015
【図１５】
0005315703.tif 000016
【図１６】
0005315703.tif 000017
【図１７】
0005315703.tif 000018
【図１８】
0005315703.tif 000019
【図１９】
0005315703.tif 000020
【図２０】
0005315703.tif 000021
【図２１】
0005315703.tif 000022
【図２２】
0005315703.tif 000023
【図２３】
0005315703.tif 000024
【図２４】
0005315703.tif 000025
【図２５】
0005315703.tif 000026
【図２６】
0005315703.tif 000027
【図２７】
0005315703.tif 000028
【図２８】
0005315703.tif 000029
【図２９】
0005315703.tif 000030
【図３０】
0005315703.tif 000031
【図３１】
0005315703.tif 000032
【図３２】
0005315703.tif 000033
【図３３】
0005315703.tif 000034
【図３４】
0005315703.tif 000035
【図３５】
0005315703.tif 000036
【図３６】
0005315703.tif 000037
【図３７】
0005315703.tif 000038
【図３８】
0005315703.tif 000039