(57)【要約】  並列化プログラム生成プログラムは、逐次プログラムを入力として、逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を頂点間の辺として有するプログラム依存グラフを生成し、プログラム依存グラフの頂点同士を融合することにより頂点の数を減少させた縮退プログラム依存グラフを生成し、縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成する各段階を計算機に実行させるコードを含むことを特徴とする。
2007105309.tif 000002
【特許請求の範囲】
【請求項１】
逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、
該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、
該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、
該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成する
各段階を計算機に実行させるコードを含むことを特徴とする並列化プログラム生成プログラム。
【請求項２】
スレッド制御プログラムを生成する段階は、
該縮退プログラム依存グラフの頂点間の実行順序関係を計算し、
該計算された実行順序関係順に該縮退プログラム依存グラフの該頂点を探索しながら該縮退プログラム依存グラフの各頂点の種類に応じて該スレッド制御プログラムを生成する
各段階を含むことを特徴とする請求項１記載の並列化プログラム生成プログラム。
【請求項３】
該実行順序関係を計算する段階は、該縮退プログラム依存グラフを静的単一代入形式に変換する段階を含むことを特徴とする請求項２記載の並列化プログラム生成プログラム。
【請求項４】
該縮退プログラム依存グラフの各頂点が表す文又は文の集合を実行する手続として該スレッド・プログラムを生成し、該手続を非同期の遠隔呼び出しとして呼び出すとともに先行頂点の手続を待ち合わせてから後続頂点の手続を呼び出すように制御するスレッド制御プログラムを生成することを特徴とする請求項１記載の並列化プログラム生成プログラム。
【請求項５】
該縮退プログラム依存グラフの各頂点が表す文又は文の集合を実行する手続として該スレッド・プログラムを生成し、該手続に実行開始するメッセージを送信するとともに先行頂点の手続を待ち合わせてから後続頂点の手続に実行指示するように制御するスレッド制御プログラムを生成することを特徴とする請求項１記載の並列化プログラム生成プログラム。
【請求項６】
該縮退プログラム依存グラフの各頂点が表す文又は文の集合を実行するスレッドとして該スレッド・プログラムを生成し、共有メモリを介して入出力変数を受け渡し該スレッドを生成するとともに先行頂点のスレッドを待ち合わせてから後続頂点のスレッドを生成するように制御するスレッド制御プログラムを生成することを特徴とする請求項１記載の並列化プログラム生成プログラム。
【請求項７】
逐次プログラムと並列化プログラム生成プログラムとを格納するメモリと、
該メモリに格納された該並列化プログラム生成プログラムを実行することで該メモリに格納された該逐次プログラムから並列化プログラムを生成する演算処理ユニットを含み、該演算処理ユニットは、該並列化プログラム生成プログラムを実行することにより、該逐次プログラムを構成する各文を頂点として有するとともに文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成することを特徴とする並列化プログラム生成装置。
【請求項８】
該演算処理ユニットは該スレッド制御プログラムを生成する際に、該縮退プログラム依存グラフの頂点間の実行順序関係を計算し、該計算された実行順序関係順に該縮退プログラム依存グラフの該頂点を探索しながら該縮退プログラム依存グラフの各頂点の種類に応じて該スレッド制御プログラムを生成することを特徴とする請求項７記載の並列化プログラム生成装置。
【請求項９】
該演算処理ユニットは該実行順序関係を計算する際に、該縮退プログラム依存グラフを静的単一代入形式に変換することを特徴とする請求項８記載の並列化プログラム生成装置。
【請求項１０】
逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、
該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、
該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、
該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成する
各段階を含むことを特徴とする並列化プログラム生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にプログラム生成方法、装置、及びプログラムに関し、詳しくは並列化プログラム生成方法、装置、及びプログラムに関する。
【背景技術】
【０００２】
近年、シングル・プロセッサでのプログラム性能には限界があることが知られてきた。従来、性能を上げるためには、プロセッサの動作周波数を高くすることで単位時間あたりの処理量を増やす方法と、命令を並列に実行することで同時に実行できる処理を増やす方法とがとられてきた。【０００３】
しかし動作周波数を高くすると消費電力が大きくなるという問題があるとともに、動作周波数の向上には物理的な限界があるという問題がある。また、命令レベルの並列性は高々２〜４程度であり（非特許文献１）、投機的な実行などを導入することにより多少並列性を上げることはできるが、それにも限界があることが知られている。【０００４】
そこで、命令レベルよりも大きな粒度でプログラムを並列化し、複数のプロセッサにて実行することにより、処理性能を向上させる方法が注目されている。しかしながら、制御による分岐が多い逐次プログラムを効果的な並列プログラムへ変換する画一的な方法は、これまでのところ知られていない。【０００５】
逐次プログラムを分割して複数のプロセッサ上で並列に実行するプログラムを生成する手法として、ループに着目したデータ・レベル並列化という方法と、制御に着目した投機的なスレッド実行という方法が知られている。【０００６】
特許文献１では、ループの中におけるデータの依存関係を解析し、配列を分割して、ループの処理を複数のプロセッサで実行させる。この手法は、数値計算等の規則的なループの処理が多い場合に有効である。【０００７】
また特許文献２は、逐次プログラムにおける分岐に着目して、投機的なスレッド実行に置換する手法を示す。この手法では、制御の流れに基づいてプログラムを並列化するので、プログラムの潜在的な並列性を充分に抽出できているとはいえない。また、投機的スレッド実行機構を持たないマルチプロセッサにおいては予測失敗時のロールバックのコストが大きいので、分岐予測ヒット率が低いアプリケーションにはこの手法は適さない。
【特許文献１】特許第３０２８８２１号公報
【特許文献２】特許第３６４１９９７号公報
【非特許文献１】S. Horwitz, J. Prins, and T. Reps, "Integrating non-interfering versions 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 Program Dependence Graph and Its Use in Optimizatio," ACM Transactions on Programming Languages and Systems, pp. 319-419, vol. 9 no. 3, July 1987.
【非特許文献３】Susan Horwitz, Jan Prins, Thomas Reps, "On the adequacy of program dependence graphs for representing programs," Proceedings of the 15th Annual ACM Symposium on the Principles of Programming Languages, pp. 146-157, Jan., 1988.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
以上を鑑みて、本発明は、大規模なソフトウェアを対象として、逐次プログラムを並列化することにより、マルチプロセッサ上で効果的に動作する非投機的なマルチ・スレッド・プログラムを生成する方法、装置、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
並列化プログラム生成プログラムは、逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成する各段階を計算機に実行させるコードを含むことを特徴とする。【００１０】
並列化プログラム生成装置は、逐次プログラムと並列化プログラム生成プログラムとを格納するメモリと、該メモリに格納された該並列化プログラム生成プログラムを実行することで該メモリに格納された該逐次プログラムから並列化プログラムを生成する演算処理ユニットを含み、該演算処理ユニットは、該並列化プログラム生成プログラムを実行することにより、該逐次プログラムを構成する各文を頂点として有するとともに文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成することを特徴とする。【００１１】
並列化プログラム生成方法は、逐次プログラムを入力として、該逐次プログラムを構成する各文を頂点として有するとともに、文と文の間の関係を該頂点間の辺として有するプログラム依存グラフを生成し、該プログラム依存グラフの該頂点同士を融合することにより該頂点の数を減少させた縮退プログラム依存グラフを生成し、該縮退プログラム依存グラフの頂点の各々に相当するスレッド・プログラムを生成し、該スレッド・プログラムの起動及び同期を制御するスレッド制御プログラムを生成する各段階を含むことを特徴とする。
【発明の効果】
【００１２】
本発明の少なくとも１つの実施例によれば、制御の流れグラフではなく、制御の依存関係を示すグラフであるプログラム依存グラフに基づいて並列化プログラムを生成するので、制御の流れ（分岐）を超えたプログラムの並列性を抽出することができる。また、プログラム依存グラフを縮退してグラフの規模を削減することで、その後の並列化プログラム生成処理の効率化及び最適化が可能になるとともに、大きな粒度での並列化を実現することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明による並列化プログラム生成方法の概略を示す図である。
【図２】スレッド・プログラム生成方法の概要を示す図である。
【図３】図２のスレッド・プログラム生成方法により生成されるスレッド・プログラムを示す図である。
【図４】スレッド制御プログラムの生成方法を示すフローチャートである。
【図５】頂点間の実行順序関係を決定する方法を示すフローチャートである。
【図６】頂点ｖ以下の制御の流れを再構成する処理（図５のステップＳ２）を示すフローチャートである。
【図７】Regionの実行順序関係を計算する処理を示すフローチャートである。
【図８】逆依存及び出力依存を求める処理（図７のステップＳ４）を示すフローチャートである。
【図９】着目領域を越える変数参照を抽出する処理を示すフローチャートである。
【図１０】着目領域を越える変数代入を抽出する処理を示すフローチャートである。
【図１１】逆依存の追加処理を示すフローチャートである。
【図１２】出力依存の追加処理を示すフローチャートである。
【図１３】逆依存及び出力依存を求める処理（図７のステップＳ５）を示すフローチャートである。
【図１４】全域木を説明するための図である。
【図１５】全域木を模式的に示す図である。
【図１６】全域木間の順序関係を計算する処理を示すフローチャートである。
【図１７】図１６の処理による逆依存辺の追加について説明する図である。
【図１８】頂点間の実行順序関係を決定する方法の変形例を示すフローチャートである。
【図１９】頂点ｖｐ以下のスレッド制御プログラムを生成する処理を示すフローチャートである。
【図２０】（ａ）は入力逐次プログラムの部分を示す図、（ｂ）は対応する縮退プログラム依存グラフを示す図である。
【図２１】図２０の縮退プログラム依存グラフから第１の実施例に従い生成されるスレッド制御プログラムを示す図である。
【図２２】以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。
【図２３】図２０の縮退プログラム依存グラフから第２の実施例に従い生成されるスレッド制御プログラムを示す図である。
【図２４】以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。
【図２５】図２０の縮退プログラム依存グラフから第３の実施例に従い生成されるスレッド制御プログラムを示す図である。
【図２６】以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。
【図２７】本発明による並列化プログラム生成方法を実行する装置の構成を示す図である。
【符号の説明】
【００１４】
１０  入力変数の受信部分
１１  変数宣言部分
１２  プログラム本体部分
１３  出力変数の送信部分
２１，２２  全域木
３１  出力依存辺
３２，３３  逆依存辺
５１０  コンピュータ
５１１  ＣＰＵ
５１２  ＲＡＭ
５１３  ＲＯＭ
５１４  二次記憶装置
５１５  可換媒体記憶装置
５１６  インターフェース
５２０  ディスプレイ装置
５２１  キーボード
５２２  マウス
５２３  通信装置
【発明を実施するための最良の形態】
【００１５】
以下に、本発明の並列化プログラム生成方法の概略及び実施例を添付の図面を用いて詳細に説明する。【００１６】
図１は、本発明による並列化プログラム生成方法の概略を示す図である。【００１７】
ステップＳ１で逐次プログラムからプログラム依存グラフ（ＰＤＧ：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の順に実行される可能性がある場合に、その実行順序を表すものである。【００２９】
以下において、縮退プログラム依存グラフを作成する処理（図１のステップＳ２）について説明する。【００３０】
上記のような一般的なプログラム依存グラフでは、文または代入式を頂点としたグラフとなっている。文または代入式を頂点とした場合、大規模なソフトウェアではグラフの頂点数が数千〜数万となってしまう。一般的に、コンパイラのグラフを用いた最適化の問題の計算量は、グラフの規模に対して指数関数的に増大することが知られている。したがって、例えば数個の手続きなどを対象とした頂点数が数十程度のグラフの場合には、解析が可能であるが、現実的な規模のソフトウェア全体に対する最適化は困難といえる。【００３１】
そこで、プログラム依存グラフの頂点数及び辺数を低減すべく、プログラム依存グラフの依存関係を縮退して頂点を融合し、粗粒度のプログラム依存グラフを作成する。依存関係を縮退することによりグラフの規模を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の順に実行される可能性がある場合に、その実行順序を表すものである。【００４８】
以下において、スレッド制御プログラムを生成する処理（図１のステップＳ３）及びスレッド・プログラムを生成する処理（図１のステップＳ４）について説明する。【００４９】
まずスレッド・プログラムの生成について説明する。上記のようにして生成された縮退プログラム依存グラフの頂点は、入力逐次プログラムの文の部分集合であって、文の間の制御の流れの情報を有している。従って、着目する１つの頂点へのデータフロー入力辺が表す変数を入力とし、データフロー出力辺が表す変数を出力として、１つのスレッド・プログラムを１つの頂点に対して生成する。また、制御の流れよりスレッド・プログラムの本文を、また、本文の実行に必要な局所変数をそれぞれ生成する。【００５０】
図２は、スレッド・プログラム生成方法の概要を示す図である。図３は、図２のスレッド・プログラム生成方法により生成されるスレッド・プログラムを示す図である。【００５１】
図２のステップＳ１において、着目頂点についてデータフロー入力辺が表す変数を入力として、入力変数の受信のためのプログラム部分を生成する。これにより、図３に示す入力変数の受信部分１０が生成される。ステップＳ２において必要な変数を探索する。更にステップＳ３において、探索により見つかった変数について変数宣言を生成する。これにより、図３に示す変数宣言部分１１が生成される。【００５２】
ステップＳ４において、着目頂点の文の間の制御の流れの情報に基づいて、プログラムの本文を生成する。これにより、図３に示すプログラム本体部分１２が生成される。ステップＳ５において、着目頂点のデータフロー出力辺が表す変数を出力として、出力変数の送信のためのプログラム部分を生成する。これにより、図３に示す出力変数の送信部分１３が生成される。【００５３】
次にスレッド制御プログラムの生成について説明する。非特許文献１に記載される技術に基づいて、縮退したプログラム依存グラフから制御の流れを安全に再構成することができる。具体的には、縮退したプログラム依存グラフの制御依存部分木について、各中間節点に対して、子頂点の実行順序を求める（スケジューリング）。その結果より、各中間節点が表示する制御構造と子頂点が表すスレッド・プログラムの呼出を行なうプログラムを生成する。スレッド・プログラムを呼び出す際に、入力データ及び出力データの送受信と待ち合わせを行なうコードも生成する。このようなスレッド制御プログラムの生成については、以下の実施例において詳細に説明する。【００５４】
以下に、本発明の実施例について詳細に説明する。第１の実施例は、非同期遠隔手続き呼び出しによる並列化プログラムの実現に関する。【００５５】
スレッド・プログラムとしては、頂点が表す文/文の集合を実行する手続きとする。従って、入力変数を手続きの引数とし、出力変数を復帰値あるいは、出力変数を格納するアドレスを引数として受け取るような手続きを作成する。【００５６】
次に、頂点の部分プログラムが使用、定義する変数で、入力の変数以外を求め、変数の宣言を生成する。部分プログラムを出力し、最後に、復帰値として出力の変数の値を返すreturn文、あるいは、引数として受け取ったアドレスに対して、出力する変数の値を代入する文を生成する。【００５７】
スレッド制御プログラムとしては、頂点の手続きを非同期の遠隔呼び出しとして呼び出すものとする。また、後続頂点の表す手続きを呼び出すときには、先行する手続き呼び出しを待ち合わせるものとする。最後に、プログラムの実行結果(最終使用の変数の値)を保証するために、最終使用の変数を出力する手続き待ち合わせる。【００５８】
なお、手続きの終了待ち合わせを制御するために、手続き呼び出しの状態を表す識別子を用いることとする。手続き呼び出しの状態として、"未実行"、"呼び出し中"、"待ち合わせ済"の３つの状態を考えるものとする。【００５９】
図４は、スレッド制御プログラムの生成方法を示すフローチャートである。まずステップＳ１で、頂点間の実行順序関係の計算を行う。一般的に、プログラム依存グラフは、頂点間の依存関係のみを表現したグラフであり、頂点間の実行順序は明示されない。しかし、プログラムとして表現するためには、依存関係(制御依存、データ依存)を満足する実行順序を求めてやる必要がある。ここでは、依存関係の満足するために必要な、逆依存関係、出力依存関係を求め、実行順番を決定する。【００６０】
次にステップＳ２で、変数と初期値代入文を生成する。ここで変数としては、次の２種類の変数を生成する。１つは、プログラムの計算に必要な変数であり、初期定義頂点及び最終使用頂点が表現する変数を生成するとともに、プログラム依存グラフのデータ依存辺が表現する変数を生成する。もう１つは、プログラムの制御に必要な変数であり、各文/文の集合からなる頂点の遠隔手続き呼び出しを識別する変数を生成する。その初期値は「未実行」とする。【００６１】
次にステップＳ３で、頂点vp以下のスレッド制御プログラムを生成する。これについては以下に詳細に説明する。更にステップＳ４で、終了値の待ち合わせを生成する。【００６２】
図５は、頂点間の実行順序関係を決定する方法を示すフローチャートである。図５の処理は、図４のステップＳ１に相当する。図５に示す処理の入力は縮退したプログラム依存グラフＰＤＧであり、出力は縮退したプログラム依存グラフＰＤＧ及びその制御の流れである。【００６３】
ステップＳ１で、縮退したプログラム依存グラフＰＤＧのエントリ頂点（プログラムの開始ポイント）をｖとする。ステップＳ２で、頂点ｖ以下の制御の流れを再構成する。以上で処理を終了する。【００６４】
図６は、頂点ｖ以下の制御の流れを再構成する処理（図５のステップＳ２）を示すフローチャートである。図６の処理の入力は、縮退したプログラム依存グラフＰＤＧ及び頂点ｖである。【００６５】
ステップＳ１で、Region(v, T) = {u | u ∈ V, v→cTu ∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップＳ２に進む。ここでRegion(v, T)とは、頂点uの集合であって、頂点vから頂点uへのTrueの制御依存関係が存在するものである。ここでＶは頂点集合、Ｅは辺集合、v→cTuはTrueの制御依存辺を示すものである。【００６６】
ステップＳ２で、Region(v, T)の実行順序関係を計算する。ステップＳ３で、Region(v, F) = {u | u ∈ V, v→cFu ∈ E}が空集合であるか否かを判断する。空集合であれば処理を終了し、空集合でなければステップＳ４に進む。ここでRegion(v, F)とは、頂点uの集合であって、頂点vから頂点uへのFalseの制御依存関係が存在するものである。以上で処理を終了する。【００６７】
図７は、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)）のヘッドｖｂ（変数を定義している頂点ｗ）への逆依存辺３２、３３を追加する。【０１０１】
図１８は、頂点間の実行順序関係を決定する方法の変形例を示すフローチャートである。図１８のフローチャートに示す処理を、図５のフローチャートに示す処理の代わりに用いてもよい。即ち、頂点間の実行順序関係を決定する処理において、前段階のステップＳ０として、ＳＳＡ（静的単一代入形式）を適用する処理を実行してもよい。即ち、縮退プログラム依存グラフを静的単一代入形式に変換してもよい。この場合、図７に示すステップＳ７の処理（逆依存、出力依存を求め着目領域内の実行順序を決定する処理：図１３のフローチャート）を省略することができる。【０１０２】
図１９は、頂点ｖｐ以下のスレッド制御プログラムを生成する処理を示すフローチャートである。図１９の処理は、図４のステップＳ３に相当する。図１９に示す処理の入力は縮退したプログラム依存グラフＰＤＧ及び頂点ｖｐである。【０１０３】
ここで頂点ｖｐとは着目頂点である。また以下の説明において、頂点ｖｐ以下の頂点（子頂点）とは、縮退プログラム依存グラフの制御依存辺に着目したときの、部分グラフ（木構造になる）における頂点ｖｐ以下の頂点を指すものとする。言い換えれば、頂点ｖｐから頂点ｕへの制御依存辺によるパス（道）が存在するような、頂点ｕの集合を指す。【０１０４】
ステップＳ１で、vpのデータ依存関係（vpの子頂点以下からの自ループへのループ繰り越しフロー依存関係を除く）に関する先行頂点の実行終了待ち合わせを生成する。本実施例では非同期の手続き呼び出しを利用するため、手続きの実行結果を利用する場合は、先行する手続き呼び出しの終了を待ち合わせる必要がある。先行頂点の手続き呼び出しを表す識別子を用いて、先行頂点の状態が「呼び出し中」の場合は終了を待ち合わせるというコードを生成する。待ち合わせ後は、状態を「待ち合わせ済」とするコードを生成する。【０１０５】
ステップＳ２でｖｐの種類を判定する。頂点ｖｐの種類によって以下のようなコードを生成する。【０１０６】
ステップＳ２の判定の結果、ｖｐが文（又は文の集合）頂点の場合は、ステップＳ３で、頂点ｖｐの処理を呼び出すコードを生成する。即ち、非同期で頂点に相当する遠隔手続き呼び出しを行なうコードを生成する。また当該手続き呼び出しを表す識別子に対して、その状態を「呼び出し中」とするコードを生成する。【０１０７】
ステップＳ２の判定の結果、ｖｐがループのプリディケート頂点の場合は、ステップＳ４で、ｆｏｒプリディケートであるかｗｈｉｌｅプリディケートであるかに応じて、ｆｏｒ文或いはｗｈｉｌｅ文を生成する。ステップＳ５で、ｖｐの子頂点以下の実行終了待ち合わせを生成する。即ち、ループの最初において、前に実行したループ本文の処理が実行中であれば、終了待ち合わせを行なうコードを生成する。【０１０８】
ステップＳ６で、ｖｐのＬ＝Ｔ（条件判定結果が真）の場合の制御依存子頂点ｖｃを、求めた実行順序順に探索して、ステップＳ７の処理を繰り返すループを開始する。ステップＳ７で、ｖｃ以下のスレッド制御プログラムを生成する。即ち、子頂点ｖｃが表すプログラムを上記生成したｆｏｒ／ｗｈｉｌｅ文ループの本文として生成する。このステップＳ６の処理は、図１９のフローチャートの処理に対応し、処理が入れ子構造となっている。【０１０９】
ステップＳ８で、ｖｐのループ繰越フロー依存入力辺に関して自ループ内の先行頂点の実行終了待ち合わせを生成する。即ち、次のループへ向けて、頂点ｖｐ実行に必要なデータを待ち合わせるため、ｖｐの先行頂点の実行終了を待ち合わせるコードを生成する。
ステップＳ２の判定の結果、ｖｐがｉｆ文のプリディケート頂点の場合は、ステップＳ９でｉｆ文を生成する。次にステップＳ１０で、ｔｈｅｎ節を生成する。【０１１０】
次にステップＳ１１で、ｖｐのＬ＝Ｔ（条件判定結果が真）の場合の制御依存子頂点ｖｃを、求めた実行順序順に探索して、ステップＳ１２の処理を繰り返すループを開始する。ステップＳ１２で、ｖｃ以下のスレッド制御プログラムを生成する。即ち、子頂点ｖｃが表すプログラムを上記生成したｔｈｅｎ節の本文として生成する。このステップＳ１２の処理は、図１９のフローチャートの処理に対応し、処理が入れ子構造となっている。【０１１１】
ステップＳ１３で、Ｌ＝Ｆ（条件判定結果が偽）の制御依存出力辺が存在するか否かを判定する。存在しない場合には処理を終了し、存在する場合にはステップＳ１４に進む。【０１１２】
ステップＳ１４で、ｅｌｓｅ節を生成する。ステップＳ１５で、ｖｐのＬ＝Ｆ（条件判定結果が偽）の場合の制御依存子頂点ｖｃを、求めた実行順序順に探索して、ステップＳ１６の処理を繰り返すループを開始する。ステップＳ１６で、ｖｃ以下のスレッド制御プログラムを生成する。即ち、子頂点ｖｃが表すプログラムを上記生成したｅｌｓｅ節の本文として生成する。このステップＳ１６の処理は、図１９のフローチャートの処理に対応し、処理が入れ子構造となっている。【０１１３】
以上の処理を実行することで、頂点ｖｐ以下のスレッド制御プログラムが生成される。以下に、第１の実施例により生成されたスレッド・プログラム及びスレッド制御プログラムについて、その構成及び動作を具体的な例を用いて説明する。【０１１４】
図２０は、（ａ）入力逐次プログラムの部分及び（ｂ）対応する縮退プログラム依存グラフを示す図である。図２０（ａ）に示す入力逐次プログラムからプログラム依存グラフを生成し、頂点を結合して縮退することにより、（ｂ）に示す縮退プログラム依存グラフが生成される。頂点ｖ０からｖ５が存在し、頂点ｖ１は縮退により文の集合となっている。【０１１５】
図２１は、図２０の縮退プログラム依存グラフから第１の実施例に従い生成されるスレッド制御プログラムである。最初に変数の宣言があり、使用する変数ｘ，ｙ，ａ，ｂ，ｐを宣言するとともに、手続を表す変数ｖ１，ｖ３，ｖ４，ｖ５を"未実行"に設定する（変数宣言&設定４１）。【０１１６】
図２０（ａ）に示す逐次プログラムのｉｆ文の中は、（ｂ）に示す縮退プログラム依存グラフの頂点ｖ１に対応する。図２１において、この頂点ｖ１に対応する手続ｖ１が手続呼び出し文４２で呼び出される。続いて、代入文４３において、対応する手続識別変数ｖ１が"呼び出し中"に設定される。【０１１７】
図２０（ａ）に示す逐次プログラムのｗｈｉｌｅ文の中では、変数ａ，ｂ，ｘ，ｙが使用されるので、これらの変数を待ち合わせる必要がある。図２１の終了待ち合わせ文４４において、手続ｖ１の終了を待ち合わせ、変数ｘ，ｙの値が手続の返し値として返される。続いて、代入文４５において、対応する手続識別変数ｖ１が"待ち合わせ済み"に設定される。また手続ｖ４が呼び出し中である場合には、終了待ち合わせ文４６において、手続ｖ４の終了を待ち合わせ、変数ｂの値が手続の返し値として返される。【０１１８】
その後、手続呼び出し文４７で手続ｖ３を呼び出し、手続呼び出し文４８で手続ｖ４を呼び出す。これらの手続は、図２０（ｂ）に示される頂点ｖ３及び頂点ｖ４に対応する。【０１１９】
更に、終了待ち合わせ文４９で手続ｖ３を待ち合わせて変数ａの値を獲得し、ｗｈｉｌｅ文の先頭に戻る。獲得したaの値を用いて条件判定を行ない、結果が偽であれば、ループを抜ける。その後、終了待ち合わせ文５０で手続ｖ４を待ち合わせて変数ｂの値を獲得する。最後に、変数ａ，ｂを用いて手続呼び出し文５１で手続ｖ５を呼び出して、終了待ち合わせ文５２で変数ｘの値を獲得する。【０１２０】
図２２は、以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。図２２では、プロセッサ０乃至プロセッサ３の４つのプロセッサが用いられる。プロセッサ０でスレッド制御プログラムを実行する。ｗｈｉｌｅ文の条件が成立すると、手続ｖ１は実行されなかったので、ただちに、手続ｖ３が最初に呼び出されスレッド・プログラム６１がプロセッサ１により実行される。またそれに続いて手続ｖ４が呼び出されスレッド・プログラム６２がプロセッサ２により実行される。これらは図２１の手続呼び出し文４７での手続ｖ３呼び出し、手続呼び出し文４８での手続ｖ４呼び出しに対応する。ｗｈｉｌｅループの末尾にて、条件判定に用いる変数aの値を待ち合わせるべく、手続ｖ３が待ち合わされる。これは図２１の手続き待ち合わせ文４９に対応する。【０１２１】
また再度ｗｈｉｌｅ文の条件が成立すると、ｗｈｉｌｅ文の２度目のループにおいて、先のループで呼び出しを行なった手続ｖ４の待ち合わせが行なわれる。これは、図２１の手続き待ち合わせ文４６に対応する。手続ｖ３が呼び出されスレッド・プログラム６３（プログラムコードは６１と同一）がプロセッサ１により実行される。またそれに続いて手続ｖ４が呼び出されスレッド・プログラム６４（プログラムコードは６２と同一）がプロセッサ２により実行される。また、再度、手続ｖ３の待ち合わせが行なわれる。【０１２２】
ｗｈｉｌｅ文終了後に、手続ｖ４を待ち合わせて、手続ｖ５が呼び出されスレッド・プログラム６５がプロセッサ３により実行される。これは、それぞれ、図２１の終了待ち合わせ文５０での待ち合わせと、手続呼び出し文５１での手続ｖ５呼び出しに対応する。最後に、手続ｖ５の終了を待ち合わせ、その返り値を取得して、プログラムを終了する。【０１２３】
以下に、本発明の第２の実施例として、メッセージ通信による並列化プログラムの実現について説明する。基本的に、スレッド・プログラムとスレッド制御プログラムの生成の仕方は第１の実施例と同様であり、如何にスレッド間のやりとりを実現するかが、手続呼び出しとメッセージ通信とで異なるだけである。【０１２４】
スレッド・プログラムは、注目する頂点へのフロー依存辺が表す入力変数を受信するコードと、実行の開始を指示するメッセージを受信するコードと、頂点が表す文/文の集合と、当該頂点からのフロー依存辺が表す出力変数を送信するコード、実行の完了を表すメッセージを送信するコードから構成される。スレッド制御プログラムは、プリディケート頂点で表現される分岐及びループの制御を行なうコードと、文/文の集合を表す頂点に対して、入力変数と手続きの実行開始を指示するメッセージを送信し、出力変数と終了を通知するメッセージを受信するコードから構成される。出力変数及び終了通知の受信は、後続の頂点で必要となった時点で行なうものとする。最後に、プログラムの実行結果（最終使用の変数の値）を保証するために、変数及び実行完了のメッセージを受信する。終了通知の待ち合わせを制御するために、頂点の状態を表す識別子を用い、"未実行"、"実行中"、"待ち合わせ済"の３つのいずれかの状態を持つものとする。【０１２５】
図２３は、図２０の縮退プログラム依存グラフから第２の実施例に従い生成されるスレッド制御プログラムである。最初に変数の宣言があり、使用する変数ｘ，ｙ，ａ，ｂ，ｐを宣言するとともに、手続を表す変数ｖ１，ｖ３，ｖ４，ｖ５を"未実行"に設定する（変数宣言&設定７１）。【０１２６】
図２０（ａ）に示す逐次プログラムのｉｆ文の中は、（ｂ）に示す縮退プログラム依存グラフの頂点ｖ１に対応する。図２３において、この頂点ｖ１に対応する手続ｖ１にメッセージ送信文７２で実行の開始を指示する。続いて、代入文７３において、対応する手続識別変数ｖ１が"実行中"に設定される。【０１２７】
図２０（ａ）に示す逐次プログラムのｗｈｉｌｅ文の中では、変数ａ，ｂ，ｘ，ｙが使用されるので、これらの変数を待ち合わせる必要がある。図２３の終了通知メッセージ受信文７４において、手続ｖ１からの終了通知メッセージを待ち合わせ、変数ｘの値が通知される。続いて、代入文７５において、対応する手続識別変数ｖ１が"待ち合わせ済み"に設定される。また手続ｖ４が実行中である場合には、終了通知メッセージ受信文７６において、手続ｖ４からの終了通知メッセージを待ち合わせ、変数ｂの値が通知される。【０１２８】
その後、メッセージ送信文７７で手続ｖ３に実行開始を指示し、メッセージ送信文７８で手続ｖ４に実行開始を指示する。これらの手続は、図２０（ｂ）に示される頂点ｖ３及び頂点ｖ４に対応する。更に、終了通知メッセージ受信文７９で手続ｖ３からの終了通知メッセージを待ち合わせ、ｗｈｉｌｅ文の先頭に戻る。受信した変数aの値を用いて条件判定を行ない、結果が偽であれば、ループを抜ける。その後、終了通知メッセージ受信文８０で手続ｖ４からの終了通知メッセージを待ち合わせる。最後に、変数ａ，ｂを用いてメッセージ送信文８１で手続ｖ５に実行開始を指示して、終了通知メッセージ受信文８２で変数ｘの値を獲得する。【０１２９】
図２４は、以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。図２４では、プロセッサ０乃至プロセッサ３の４つのプロセッサが用いられる。プロセッサ０でスレッド制御プログラムを実行する。ｗｈｉｌｅ文の条件が成立すると、if文が成立しなかったため、ただちに、実行開始メッセージが必要な変数ｘ，ａとともに手続ｖ３に送信され、スレッド・プログラム９１がプロセッサ１により実行される。またそれに続いて実行開始メッセージが必要な変数ｙ，ｂとともに手続ｖ４に送信され、スレッド・プログラム９２がプロセッサ２により実行される。これらは図２３におけるメッセージ送信文７７での手続ｖ３への通信、メッセージ送信文７８での手続ｖ４への通信に対応する。ｗｈｉｌｅループの末尾にて、条件判定に用いる変数aが受信される。これは図２３の手続き待ち合わせ文７９に対応する。【０１３０】
また再度ｗｈｉｌｅ文の条件が成立すると、ｗｈｉｌｅ文の２度目のループにおいて、手続ｖ４の変数が受信される。これは図２３のメッセージ受信文７６に対応する。実行開始メッセージが手続ｖ３に送信され、スレッド・プログラム９３（プログラムコードは９１と同一）がプロセッサ１により実行される。またそれに続いて実行開始メッセージが手続ｖ４に送信され、スレッド・プログラム９４（プログラムコードは９２と同一）がプロセッサ２により実行される。また、再度、手続ｖ３の待ち合わせが行なわれる。【０１３１】
ｗｈｉｌｅ文終了後に、手続ｖ４の変数bが受信され、実行開始メッセージが必要な変数ａ，ｂとともに手続ｖ５に送信され、スレッド・プログラム９５がプロセッサ３により実行される。これは、それぞれ、図２３のメッセージ受信文７０での待ち合わせと、メッセージ送信文８１での手続ｖ５への通信に対応する。最後に、手続ｖ５の変数xを受信して、プログラムを終了する。【０１３２】
以下に、本発明の第３の実施例として、マルチ・スレッド・ライブラリによる並列化プログラムの実現について説明する。基本的に、スレッド・プログラムとスレッド制御プログラムの生成の仕方は第１の実施例と同様であり、如何にスレッド間のやりとりを実現するかが、手続呼び出しとマルチ・スレッド・ライブラリとで異なるだけである。【０１３３】
スレッド・プログラムは、スレッドとして実行され、共有メモリを利用して入出力変数の受け渡しを行なう。そのため、入出力となる共有変数をロックすることとなる。頂点の部分プログラムを実行し、最後に、共有変数のロックを解除し、スレッドを終了する。【０１３４】
具体的には、スレッドの手続きを生成する。入出力変数の受け渡し方法に、共有メモリを利用するため、入出力変数をロックするコードを生成する。次に、頂点の部分プログラムが使用、定義する変数で、入力の変数以外を求め、変数の宣言を生成する。部分プログラムを出力し、最後に、共有変数のロックを解除するコードと、スレッドを終了するコードを生成する。【０１３５】
スレッド制御プログラムは、頂点の手続きをスレッドとして呼び出すものとする。また、後続頂点の実行を呼び出すときには、先行するスレッドを待ち合わせるものとする。最後に、プログラムの実行結果（最終使用の変数の値）を保証するために、その値を出力するスレッドを待ち合わせる。待ち合わせを制御するために、スレッドの実行状態を表す識別子を用い、"未実行"、"実行中"、"待ち合わせ済"の３つのいずれかの状態を持つものとする。【０１３６】
図２５は、図２０の縮退プログラム依存グラフから第３の実施例に従い生成されるスレッド制御プログラムである。最初に変数の宣言があり、使用する変数ｘ，ｙ，ａ，ｂ，ｐを宣言するとともに、スレッドを表す変数ｖ１，ｖ３，ｖ４，ｖ５を"未実行"に設定する（変数宣言&設定１０１）。【０１３７】
図２０（ａ）に示す逐次プログラムのｉｆ文の中は、（ｂ）に示す縮退プログラム依存グラフの頂点ｖ１に対応する。図２５において、この頂点ｖ１に対応するスレッドｖ１がスレッド生成文１０２で生成される。続いて、代入文１０３において、対応するスレッド識別変数ｖ１が"実行中"に設定される。【０１３８】
図２０（ａ）に示す逐次プログラムのｗｈｉｌｅ文の中では、変数ａ，ｂ，ｘ，ｙが使用されるので、これらの変数を待ち合わせる必要がある。図２５の終了待ち合わせ文１０４において、スレッドｖ１の終了を待ち合わせ、変数ｘ，ｙの値が共有メモリを利用して受け渡される。続いて、代入文１０５において、対応するスレッド識別変数ｖ１が"待ち合わせ済み"に設定される。またスレッドｖ４が実行中である場合には、終了待ち合わせ文１０６において、スレッドｖ４の終了を待ち合わせ、変数ｂの値が共有メモリを利用して受け渡される。【０１３９】
その後、スレッド生成文１０７でスレッドｖ３を生成し、スレッド生成文１０８でスレッドｖ４を生成する。これらのスレッドは、図２０（ｂ）に示される頂点ｖ３及び頂点ｖ４に対応する。【０１４０】
更に、終了待ち合わせ文１０９でスレッドｖ３を待ち合わせて変数ａの値を獲得し、ｗｈｉｌｅ文の先頭に戻る。獲得したaの値を用いて条件判定を行ない、結果が偽であれば、ループを抜ける。その後、終了待ち合わせ文５０でスレッドｖ４を待ち合わせて変数ｂの値を獲得する。最後に、変数ａ，ｂを用いてスレッド生成文５１でスレッドｖ５を生成し、終了待ち合わせ文５２で変数ｘの値を獲得する。【０１４１】
図２６は、以上のスレッド制御プログラムの動作をスレッド・プログラムの実行とともに示す模式図である。図２６では、１つのプロセッサ０が用いられる。プロセッサ０でスレッド制御プログラムを実行するとともに、各スレッド・プログラムを実行する。ｗｈｉｌｅ文の条件が成立すると、手続ｖ１は実行されなかったので、ただちに、スレッドｖ３が最初に生成されスレッド・プログラム１２１が実行される。またそれに続いてスレッドｖ４が生成されスレッド・プログラム１２２が実行される。これらは図２５のスレッド生成文１０７でのスレッドｖ３生成及びスレッド生成文１０８でのスレッドｖ４生成に対応する。ｗｈｉｌｅループの末尾にて、条件判定に用いる変数aの値を獲得すべく、スレッドｖ３の終了が待ち合わされる。これは図２５の待ち合わせ文１０９に対応する。【０１４２】
また再度ｗｈｉｌｅ文の条件が成立すると、ｗｈｉｌｅ文の２度目のループにおいて、先のループで生成したスレッドｖ４の待ち合わせが行なわれる。これは、図２５の待ち合わせ文１０６に対応する。スレッドｖ３が生成されスレッド・プログラム１２３（プログラムコードは１２１と同一）が実行される。またそれに続いてスレッドｖ４が生成されスレッド・プログラム１２４（プログラムコードは１２２と同一）が実行される。再度、スレッドｖ３の待ち合わせが行なわれる。【０１４３】
ｗｈｉｌｅ文終了後に、スレッドｖ４を待ち合わせて、スレッドｖ５が生成されスレッド・プログラム１２５が実行される。これは、それぞれ、図２５の待ち合わせ文１１０での待ち合わせと、スレッド生成文１１１でのスレッドｖ５生成に対応する。最後に、スレッドｖ５を待ち合わせ、その結果を取得して、プログラムを終了する。【０１４４】
なお、スレッドの生成及び合流の代わりに、セマフォなどを用いたスレッド間同期機構を用いて、同等の制御を行なうことも考えられる。【０１４５】
図２７は、本発明による並列化プログラム生成方法を実行する装置の構成を示す図である。【０１４６】
図２７に示されるように、本発明による並列化プログラム生成方法を実行する装置は、例えばパーソナルコンピュータやエンジニアリングワークステーション等のコンピュータにより実現される。図２７の装置は、コンピュータ５１０と、コンピュータ５１０に接続されるディスプレイ装置５２０、通信装置５２３、及び入力装置よりなる。入力装置は、例えばキーボード５２１及びマウス５２２を含む。コンピュータ５１０は、ＣＰＵ５１１、ＲＡＭ５１２、ＲＯＭ５１３、ハードディスク等の二次記憶装置５１４、可換媒体記憶装置５１５、及びインターフェース５１６を含む。【０１４７】
キーボード５２１及びマウス５２２は、ユーザとのインターフェースを提供するものであり、コンピュータ５１０を操作するための各種コマンドや要求されたデータに対するユーザ応答等が入力される。ディスプレイ装置５２０は、コンピュータ５１０で処理された結果等を表示すると共に、コンピュータ５１０を操作する際にユーザとの対話を可能にするために様々なデータ表示を行う。通信装置５２３は、遠隔地との通信を行なうためのものであり、例えばモデムやネットワークインターフェース等よりなる。【０１４８】
本発明による並列化プログラム生成方法は、コンピュータ５１０が実行可能なコンピュータプログラムとして提供される。このコンピュータプログラムは、可換媒体記憶装置５１５に装着可能な記憶媒体Ｍに記憶されており、記憶媒体Ｍから可換媒体記憶装置５１５を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。或いは、このコンピュータプログラムは、遠隔地にある記憶媒体（図示せず）に記憶されており、この記憶媒体から通信装置５２３及びインターフェース５１６を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。【０１４９】
キーボード５２１及び／又はマウス５２２を介してユーザからプログラム実行指示があると、ＣＰＵ５１１は、記憶媒体Ｍ、遠隔地記憶媒体、或いは二次記憶装置５１４からプログラムをＲＡＭ５１２にロードする。ＣＰＵ５１１は、ＲＡＭ５１２の空き記憶空間をワークエリアとして使用して、ＲＡＭ５１２にロードされたプログラムを実行し、適宜ユーザと対話しながら処理を進める。なおＲＯＭ５１３は、コンピュータ５１０の基本動作を制御するための制御プログラムが格納されている。【０１５０】
上記コンピュータプログラム（並列化プログラム生成プログラム即ち並列化プログラム生成コンパイラ）を実行することにより、コンピュータ５１０が、上記各実施例で説明されたように並列化プログラム生成方法を実行する。【０１５１】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【図１】
2007105309.tif 000003
【図２】
2007105309.tif 000004
【図３】
2007105309.tif 000005
【図４】
2007105309.tif 000006
【図５】
2007105309.tif 000007
【図６】
2007105309.tif 000008
【図７】
2007105309.tif 000009
【図８】
2007105309.tif 000010
【図９】
2007105309.tif 000011
【図１０】
2007105309.tif 000012
【図１１】
2007105309.tif 000013
【図１２】
2007105309.tif 000014
【図１３】
2007105309.tif 000015
【図１４】
2007105309.tif 000016
【図１５】
2007105309.tif 000017
【図１６】
2007105309.tif 000018
【図１７】
2007105309.tif 000019
【図１８】
2007105309.tif 000020
【図１９】
2007105309.tif 000021
【図２０】
2007105309.tif 000022
【図２１】
2007105309.tif 000023
【図２２】
2007105309.tif 000024
【図２３】
2007105309.tif 000025
【図２４】
2007105309.tif 000026
【図２５】
2007105309.tif 000027
【図２６】
2007105309.tif 000028
【図２７】
2007105309.tif 000029
【国際調査報告】
2007105309.tif 000030
2007105309.tif 000031
2007105309.tif 000032
2007105309.tif 000033