JP3675623B2 - プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 - Google Patents
プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 Download PDFInfo
- Publication number
- JP3675623B2 JP3675623B2 JP29988697A JP29988697A JP3675623B2 JP 3675623 B2 JP3675623 B2 JP 3675623B2 JP 29988697 A JP29988697 A JP 29988697A JP 29988697 A JP29988697 A JP 29988697A JP 3675623 B2 JP3675623 B2 JP 3675623B2
- Authority
- JP
- Japan
- Prior art keywords
- scenario
- program
- parallel
- development support
- unit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Multi Processors (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Description
【発明の属する技術分野】
本発明は、並行プログラムを開発する技術の改良に関し、より具体的には、複雑な並行プログラムについても優れた信頼性と効率で作成できるようにしたものである。
【0002】
【従来の技術】
並行プログラムは、複数のプロセスが同時並行的に動作するプログラムであり、別々に動くプロセス間の相互関係によって全体の動作が決まるという複雑さがある。そのため、並行プログラムの作成は、プロセスが単一の流れに従って順次動作をする逐次プログラムに比べて困難である。特に、並行プログラムの挙動は、どのプロセスのどの部分がどのようなタイミングで実行されるかに応じて、実行ごとに非決定的に異なる。この結果、並行プログラムのバグには再現性が乏しく、また、テストするテストケースも極めて多数となるため、テストとデバッグが非常に困難である。
【0003】
このような並行プログラムの作成を支援し、並行プログラムの信頼性を高める技術として、超逐次プログラミングが知られている(特開平8−16429)。この技術では、並行プログラムを一旦逐次化して超逐次プログラムを作成する。超逐次プログラムとは、もとの並行プログラムをその並行構造に関する情報を保ちながら逐次化したプログラムである。そして、このような超逐次プログラムに対してプログラミング、テスト、デバッグを行い、その結果に基づいて超逐次プログラムを再び並行化することによって信頼性の高い並行プログラムを作成することができる。
【0004】
例えば、並行プログラムにテストケースを与えるなどしてテストし、このテストの際の実行ログのうち、バグがないと判定された正しい実行ログを、もとの並行プログラムを一旦逐次化した超逐次プログラムの一種とみなす。そして、このような正しい実行ログを複数マージすることによって、超逐次プログラムの正しい振る舞いを表すシナリオグラフを作る。このシナリオグラフを、部分間の実行順序を指定する同期命令と共に、複数のプロセスに部分ごとに割り当てることによって再び並行化し、並行プログラムを作成する。
【0005】
また、本出願人が出願した他の技術では、並行プログラムを、実行制御の単位となるセクションに分け、セクション間の正しい実行順序をシナリオグラフの経路で表す。この経路に含まれる個々の動作を、動作間の実行順序を指定する同期命令と共に各プロセスに割り当てることによって、正しい振る舞いを示す並行プログラムを作成する。なお、並行プログラムには違った実行順序を表すいくつかの経路が含まれることがあるが、経路ごとの実行結果が同じになる場合のようにシナリオグラフと等価な経路を自動的に復元することによって、生成される並行プログラムの振る舞いに柔軟性が増え、実行効率が向上する。
【0006】
【発明が解決しようとする課題】
しかしながら、これらの従来技術では、プログラムの正しい振る舞いをシナリオグラフで表す際に、単一の階層のみを持つ平面的な構造のシナリオグラフを用いる。すなわち、このシナリオグラフは、プログラムの各部分をアークで表し、各状態を表すノードの間をアークで接続することによって、プログラムの部分間の実行順序を、平面的な構造の状態遷移グラフで表したものである。そして、ループや階層構造のような複雑な構造を平面的な構造のシナリオグラフで表そうとすると、構造の複雑さに応じてシナリオグラフが複雑で大規模なものとなるので、処理のアルゴリズムが複雑化したり処理効率が悪化するだけでなく、シナリオグラフ自体も理解しづらいものとなる。このため、上記のような従来技術は複雑な並行プログラムに適用することが困難という問題点があった。
【0007】
本発明は、上記のような従来技術の問題点を解決するために提案されたもので、その目的は、複雑な並行プログラムについても優れた信頼性と効率で作成できる技術を提供することである。
【0008】
上記の目的を達成するため、本発明は、入力装置及び記憶装置を有するコンピュータに、編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段を構成することによって実現され、前記入力装置が入力した情報に基づいて、前記編集手段が第1の並行プログラムを作成し、前記第1の並行プログラムを前記記憶装置が記憶し、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段が第2の並行プログラムを生成し、前記第2の並行プログラムを前記記憶装置が記憶するプログラム開発支援装置において、前記第1の並行プログラムから実行のシナリオを作成する前記作成手段と、前記第1の並行プログラムを解析することによって、前記第1の並行プログラムの部分間に存在する依存関係を抽出する前記解析手段と、前記シナリオを、ループを含まないブロックに階層的に分解する前記分解手段と、前記依存関係に基づいて、前記分解されたシナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化する前記並行化手段と、各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化する前記統合化手段と、統合化されたプロセスごとのシナリオから第2の並行プログラムを生成する前記生成手段と、を有することを特徴とする。また、本発明は、入力装置及び記憶装置を有するコンピュータに構成された編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段によって実現され、前記入力装置が入力した情報に基づいて、前記編集手段が第1の並行プログラムを作成し、前記第1の並行プログラムを前記記憶装置が記憶し、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段が第2の並行プログラムを生成し、前記第2の並行プログラムを前記記憶装置が記憶するプログラム開発支援方法において、前記作成手段が、前記第1の並行プログラムから実行のシナリオを作成するステップと、前記解析手段が、前記第1の並行プログラムを解析することによって、第1の並行プログラムの部分間に存在する依存関係を抽出するステップと、前記分解手段が、前記シナリオを、ループを含まないブロックに階層的に分解するステップと、前記並行化手段が、前記依存関係に基づいて、分解された前記シナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化するステップと、前記統合化手段が、各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化するステップと、前記生成手段が、統合化されたプロセスごとのシナリオから第2の並行プログラムを生成するステップと、を含むことを特徴とする。また、本発明は、入力装置及び記憶装置を有するコンピュータに、編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段を実現させるソフトウェアであって、前記入力装置から入力された情報に基づいて、前記編集手段に第1の並行プログラムを作成させ、前記第1の並行プログラムを前記記憶装置に記憶させ、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段に第2の並行プログラムを生成させ、前記第2の並行プログラムを前記記憶装置に記憶させるプログラム開発支援用ソフトウェアを記録した記録媒体において、前記プログラム開発支援用ソフトウェアは、前記作成手段に、前記第1の並行プログラムから実行のシナリオを作成させ、前記解析手段に、前記第1の並行プログラムを解析させることによって、前記第1の並行プログラムの部分間に存在する依存関係を抽出させ、前記分解手段に、前記シナリオを、ループを含まないブロックに階層的に分解させ、前記並行化手段に、前記依存関係に基づいて、分解された前記シナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化させ、前記統合化手段に、各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化させ、前記生成手段に、統合化されたプロセスごとのシナリオから第2の並行プログラムを生成させることを特徴とする。
以上の発明では、正しいことが確認されたシナリオという形で、並行プログラムを一旦逐次化し、このシナリオに基づいて並行プログラムを再び生成することによって並行プログラムの信頼性を向上させる。その際、シナリオを一旦、ループを含まないブロックに階層的に分解する。そして、分解されたブロック若しくは前記ブロックに属する命令を各プロセスに割り当てて並行化し、プロセスごとに再び統合化して並行プログラムを生成する。分解された個々のブロックはループや階層構造を含まないので、効率的に並行化処理でき、並行プログラム全体として効率的に開発を行うことができる。
【0009】
本発明のプログラム開発支援装置は、前記分解手段は、前記作成手段から与えられたシナリオを正規化する手段を有することを特徴とする。
以上の発明では、シナリオを正規化することによって正規表現に変換されたシナリオとし、正規表現に変換されたシナリオは階層的に分解することが容易である。このため、並行プログラムの分解が効率化される。
【0010】
本発明のプログラム開発支援装置は、前記並行化手段は、シナリオをプロセスに割り当てる際、前記依存関係に対応する同期命令をシナリオに埋め込むように構成されたことを特徴とする。
以上の発明では、同期命令を埋め込みながらシナリオをプロセスに割り当てるので、プロセス間において各部分の実行タイミングが、依存関係に基づく先行制約に合致するように制御され、最終的に得られる並行プログラムの信頼性が確保される。
【0011】
本発明のプログラム開発支援装置は、前記並行化手段は、シナリオに埋め込んだ前記同期命令のうち、冗長な同期命令を除去するように構成されたことを特徴とする。また、本発明のプログラム開発支援方法は、前記並行化手段が並行化するステップは、シナリオをプロセスに割り当てる際、前記依存関係に対応する同期命令をシナリオに埋め込むサブステップと、シナリオに埋め込んだ前記同期命令のうち、冗長な同期命令を除去するサブステップと、を含むことを特徴とする。
以上の発明では、冗長な同期命令を除去することによって、各プロセスが互いにどのようなタイミングで動作するかの自由度が拡張される。これは、無害な非決定性を与えることによって並行プログラムを最適化することを意味し、シナリオという形で一旦逐次化された並行プログラムにおいて、並行性を可能な限り復元することができる。
【0012】
本発明のプログラム開発支援装置は、前記並行化手段は、前記冗長な同期命令を除去する際、シナリオに埋め込んだ任意の同期命令の作用を抑制し、前記抑制の前と後の各シナリオの間で、前記依存関係を持つ動作が示し得る実行順序が同じかどうかを判断し、前記実行順序が同じである場合は、作用を抑制した前記同期命令を除去するように構成されたことを特徴とする。また、本発明のプログラム開発支援方法は、前記並行化手段が、冗長な同期命令を除去するサブステップは、シナリオに埋め込んだ任意の同期命令の作用を抑制し、前記抑制の前と後の各シナリオの間で、前記依存関係を持つ動作が示し得る実行順序が同じかどうかを判断し、前記実行順序が同じである場合は、作用を抑制した前記同期命令を除去することを特徴とする。
以上の発明では、依存関係を持つ動作の実行順序に影響しない同期命令が除去されるので、並行プログラムの動作の自由度を拡張しながら、依存関係を持つ動作の実行順序は正しく維持される。
【0013】
本発明のプログラム開発支援装置は、前記並行化手段は、前記冗長な同期命令を除去する際、シナリオに埋め込んだ任意の同期命令の作用を抑制し、前記抑制の前と後の各シナリオの間で、シナリオが等価かどうかを判定する判定手段を含み、前記判定手段は、相互に依存関係を有する部分を含む2つのシナリオそれぞれについて、前記依存関係を有する部分がいつ実行されたかを表すカウンティングトレースの集合を計算する手段と、計算された前記2つの集合を比較し、2つの集合が等しい場合に2つのシナリオが等価であると判断する手段から構成され、シナリオが等価であると判断された場合は、作用を抑制した前記同期命令を除去するように構成されたことを特徴とする。
並行プログラムの開発において、シナリオが等価かどうかの判定は、シナリオの正規化や冗長な同期命令の除去などで用いることができる。本発明では、この等価性の判定を、依存関係を有する部分がいつ実行されたかを表すカウンティングトレースに基づいて行う。ここで、並行プログラムにおいて、依存関係を有する部分同士は実行順序が変わるとバグの原因になり得るが、それ以外の部分は実行順序を自由にしてもバグの原因とはならず、逆に並行プログラムの柔軟性を高める効果がある。本発明では、等価性の判定において依存関係を有する部分だけを問題とすることによって、バグの発生を防止する一方、バグを生じない部分については実行順序の自由度を増やして並行プログラムの柔軟性を高めることができる。
【0014】
【発明の実施の形態】
次に、本発明の実施の形態であるプログラム開発支援装置(以下「本装置」という)について、図面を参照して説明する。
【0015】
〔1.構成〕
〔1−1.本装置を実現するためのコンピュータシステムの構成〕
まず、本装置を実現するためのコンピュータシステムの構成例を図1に示す。このコンピュータシステムは、並行プログラムを構成する各プロセスを同時並行的に実行するためのN台のプロセッサ211,212,…,21Nを有し、これら各プロセッサ211,212,…,21Nには、I/Oインターフェース22を介して、共有メモリ23及び周辺装置が接続されている。周辺装置としては、入力装置24、出力装置25及び外部記憶装置26を用いる。
【0016】
上記の周辺装置のうち、入力装置4は、各種コマンドやデータの入力をする装置で、キーボードとマウスなどのポインティングデバイスを有する。また、出力装置5は、CRTディスプレイなどの表示画面に、ソースプログラムやデバッグ状況に関する情報等をテキスト又はグラフィック表示することにより、ユーザに提示する装置である。なお、出力装置としては、他にプリンタなどを適宜用いることができる。ユーザは、これら入力装置4及び出力装置5を用いて、対話的にコンピュータを操作することができる。また、外部記憶装置6は、磁気ディスクや光磁気ディスクなどの記録媒体を用いて、ソースプログラムやデバッグ状況に関する情報などを書き込み及び読み出す装置である。
【0017】
本装置は、上記のようなコンピュータシステムの各種ハードウェア資源をソフトウェアで制御することによって実現されるが、コンピュータシステムや前記ソフトウェアの具体的な構成は種々考えられるので、以下、本装置の各機能を実現する仮想的回路ブロックを用いて本実施形態を説明する。
【0018】
〔1−2.機能ブロック図に基づく構成〕
すなわち、図2は本装置の構成を示す機能ブロック図である。この図に示すように、本装置は、編集手段1と、作成手段3と、分解手段5と、を有する。このうち編集手段1は、第1の並行プログラム2を作成及び修正するための手段1である。また、作成手段3は、第1の並行プログラム2に基づいて実行のシナリオを作成し、シナリオを表すシナリオ情報4を提供する手段である。また、分解手段5は、正しいと判定されるシナリオを、ループを含まないブロックに階層的に分解することによって、ブロックに分解されたシナリオをブロック間の構造と共に表す構造的シナリオ情報6を提供する手段である。
【0019】
また、本装置は、解析手段12と、並行化手段7と、統合化手段8と、生成手段10と、を有する。このうち解析手段12は、第1の並行プログラム2を解析することによって第1の並行プログラム2の各部分間に存在する依存関係を抽出し、この依存関係を表す解析情報13を提供する手段である。また、並行化手段7は、分解されたシナリオを、抽出された依存関係に対応する部分間の実行順序を維持しながら、ブロックを単位として複数のプロセスに割り当てることによって並行化する手段である。また、統合化手段8は、解析情報13を参照しながら、各プロセスに割り当てられたシナリオをプロセスごとに統合することによって、統合されたプロセスごとのシナリオを表すローカルシナリオ情報9を提供する手段である。また、生成手段10は、ローカルシナリオ情報9に基づいて第2の並行プログラム11を生成する手段である。
【0020】
〔2.全体的な処理手順〕
上記のような構成を有する本装置における全体的な処理手順を図3のフローチャートに示す。
〔2−1.第1の並行プログラムの作成〕
まず、ユーザは、編集手段1を用いて、第1の並行プログラム2を作成する(ステップ1)。ここで、並行プログラムを作成するプログラミング言語は自由に選択することができ、例えば、Javaなどの並行プログラミング言語で記述してもよいし、あるいはC言語などの逐次プログラミング言語と、μ−ITRONのようなオペレーティングシステムのシステムコールとを組み合わせることによって記述してもよい。
【0021】
〔2−2.シナリオの作成〕
次に、作成手段3によって、第1の並行プログラム2を実行した場合のシナリオを作成する(ステップ2)。ここで、シナリオとは、プログラムの挙動を、実行されるプログラム中の命令からなる逐次的な列として表現したものである。
【0022】
このようなシナリオを作成するには、例えば、テストケースを与えて第1の並行プログラム2を仮想的に実行し、その実行履歴をシナリオとしたり、第1の並行プログラム2が示し得る各部分間の実行順序を、枝別れするグラフの各経路として表し、許容できない実行順序に対応する経路をグラフから削除し、その結果として得られたグラフをシナリオ情報とするなどが考えられる。ここで、グラフに含まれる各経路が個々のシナリオに対応する。
【0023】
また、このようなシナリオを表現する具体的な形式としては、例えば、状態遷移図形式のシナリオグラフが考えられる。シナリオグラフは、並行プログラムによって実現されるシステムの全体的な状態、すなわちグローバル状態をノードとし、プログラムの各動作はノードを接続するアークで表した有向グラフである。ここで、複数のプロセスから構成された並行プログラムにおいて、グローバル状態とは、個々のプロセスがどの位置を実行しているかの状態及び各プロセスのメモリの状態を組み合わせたものである。
以上のように作成されたシナリオは、シナリオの内容を表すシナリオ情報4として、後のステップに提供される。すなわち、本出願において、「シナリオ」というときは、プログラムが示し得るある1つの命令の列であり、「シナリオグラフ」というときは1又は2以上のシナリオの集合を一体に表したものである。この場合、シナリオグラフ中の1つの経路(パス)が1つのシナリオを表す。また、「シナリオ情報」は、上記のように1又は2以上のシナリオの集合をシナリオグラフなどの形式で表した情報である。
【0024】
〔2−3.シナリオの挙動の確認〕
このように作成されたシナリオに対して、ユーザが、シナリオで表された並行プログラム2の挙動が仕様通りであって正しいことを確認する(ステップ3)。この確認は、従来から知られたプログラムのテスト方法を用いればよい。正しくないシナリオがある場合は(ステップ4)、シナリオの元となった第1の並行プログラム2にバグがあるので、編集手段1を用いて第1の並行プログラム2を修正したうえ(ステップ1)、再度シナリオを作成して(ステップ2)、正しいことを確認する。シナリオが正しいことが確認された場合(ステップ4)、さらにシナリオを作成するときはシナリオの作成(ステップ2)に戻り、シナリオの作成を終了するときは次のステップ6に進む。
【0025】
このようにして、複数のシナリオを順次作成する場合、既に作成したシナリオと新たに作成したシナリオで相違している経路を、既に作成したシナリオに付加することによって、複数のシナリオを一体化して単一のシナリオ情報とすることができる。例えば、シナリオグラフでは、2つのシナリオの後半でプログラムの部分間の実行順序が異なっている場合、シナリオグラフを途中から2つに枝別れさせ、異なっているそれぞれの順序に対応した経路を枝別れの先に続けることによって、前記2つのシナリオを単一のシナリオ情報で表すことができる。また、複数のシナリオを作成する場合は、1つのシナリオを作成するごとにその正しさを確認してもよいが、連続して複数作成した後で、正しさの確認を一括して行ってもよい。
【0026】
〔2−4.依存関係の抽出〕
上記のようにシナリオ情報で表される各シナリオの正しさが確認され、第1の並行プログラム2にバグがないと考えられる場合は、ステップ6において、解析手段12が、第1の並行プログラム2を解析することによって、第1の並行プログラム2を構成する各命令間の依存関係を抽出する。
【0027】
ここで、依存関係とは、プログラムの異なった部分同士が相手を前提とする関係であり、データ依存と制御依存とがある。また、依存関係は、プログラムの部分間に相互に存在する、すなわち対称性を持つ関係である。このような依存関係がある2つの命令については、その実行順序によって計算結果が異なる可能性があるため、一方が他方よりも先行して実行されなければならないという制約が存在する。このような制約を先行制約と呼ぶ。このような依存関係および先行制約を抽出するためのアルゴリズムは既に公知であり、具体的には文献「本多弘樹:自動並列化コンパイラ、情報処理Vol.34.No.9,1993」などに紹介されている。
【0028】
すなわち、まず、どのプロセスが実行されるかが、プロセス間の条件分岐で決定されず、全てのプロセスが実行される場合、依存関係はプロセス間のデータ依存を求めることによって検出できる。データ依存とは、一方の命令が、他方の命令によって提供されるデータに依存する関係である。例えば、図4(a)に示すように、共有変数MにXの値を書き込む命令write(M,X)と、同じ共有変数Mからデ−タを読み出す命令Y=read(M) の間には、直接的なデータ依存が存在する。
【0029】
また、図4(b)に示すように、上記の共有変数Mに書き込まれた値が一旦別の変数M2にコピーされ、読み出す命令はこの変数M2からデータを読み出す場合、書き込む命令と読み出す命令の間には、間接的なデータ依存が存在する。このような直接的なデータ依存や間接的なデータ依存は、各命令がどの変数についてどのような処理を行っているかを辿ることによって抽出することができる。
【0030】
また、どのプロセスが実行されるかが、プロセス間の条件分岐で決定される場合は、前記のデータ依存に加えて、制御依存も求める必要がある。制御依存とは、一方のプロセスでの条件の評価が真になるまで、他方のプロセスの実行を開始できないという依存関係である。このような制御依存は、各プロセスに含まれる条件分岐命令と各プロセスとの関係を調べることによって検出する。
【0031】
前記のような、並行プログラムCの命令間の依存関係の集合をD(C)と表す。すなわち、(ti,tj)∈D(C)ということは、命令tiとtjの間に依存関係が存在することを意味する。また、与えられた並行プログラムCが示す動作列θにおいて、動作間の先行制約は次のように定義される。すなわち、先行制約を記号”<<”で表し、シナリオθのi番目の動作をc(θ,i)のように表す場合、
c(θ,i) << c( θ,j)iff (θ[i],θ[j])∈D(C)and i<j
である。これは、シナリオθのi番目とj番目の動作が依存関係を持ち、かつ、iがjより大きければ(先行するなら)i番目の動作はj番目の動作に対して先行しなければならないという先行制約が存在することを意味する。なお、本発明で「動作」とは、具体的にはプログラムの命令を意味し、例えば、「a=b−1」のような演算と代入の命令や「a==b」のような評価などが命令の単位となる。
以上のように抽出された依存関係は、依存関係を表す解析情報13として、後のステップに提供される。
【0032】
〔2−5.シナリオの分解〕
正しいことが確認されたシナリオ情報は、分解手段5によって、ループを含まないブロックに階層的に分解される(ステップ7)。ここで、一般に、並行プログラムは永続的に動き続ける場合が多く、並行プログラムに基づくシナリオはループを持つ場合が多い。このため、シナリオの分解では、ループを含まない部分をブロックとし、ループは、このようなブロックの末尾と先頭をつなぐ経路として、ブロック自体とは区別する。また、ループは多重になっている場合があるので、分解は階層的に行われる。
【0033】
このように分解されるもとのシナリオが、有向グラフであるシナリオグラフとして表現されている場合、分解でできる個々のブロック内は、下位のブロックをノードとするアサイクリックなグラフとして表現できる。このアサイクリックなグラフとは、ループを含まないグラフである。例えば、図5(a)に示すシナリオグラフは、図5(b)に示すように、ループを含まないブロックB1とそれ以外の部分に分解され、このブロックB1がさらに、ループを含まないブロックB2とそれ以外の部分に分解される。このようにループを含まないブロックを、以下、アサイクリックブロックと呼ぶ。
【0034】
また、分解されたシナリオは、図5(b)のようなグラフで表現する以外に、このグラフと等価な下記のような正規表現で表すことも可能である。
t14 + (t1(t2 t3 t4 +
t7 t8(t12 t13 t14)* t9 t10 t11)t5 t6)*
ここで、t1+t2は「t1又はt2」を表し、t1*はt1の0回以上の繰り返しを表す。なお、シナリオを分解する詳細な手順及び正規表現については後述する。
【0035】
以上のようにシナリオを分解した結果としては、各ブロックの内容を表す情報と、ブロック以外の例えばループやブロック間の上位下位の関係を表す情報が得られ、これらの情報を構造的シナリオ情報と呼ぶ。すなわち、分解手段5からは構造的シナリオ情報6が、後のステップに提供される。
【0036】
〔2−6.シナリオの並行化〕
続いて、上記のように分解されたシナリオを各ブロックごとに、複数のプロセスに割り当てる処理、すなわち並行化を行なう(ステップ8)。ここでは、プロセスの構造、例えば用いるプロセスの数などは第一の並行プログラム2と同じだと仮定するが、もちろん、プロセスの構造は任意に設定することもできる。
【0037】
この並行化の際は、プログラム解析情報13によって表される命令間の依存関係を用いる。すなわち、並行化とは、シナリオのなかで依存関係のない部分同士を相互に並行に動かせるようにすることを意味する。例えば、あるシナリオでは直列関係(ab)にあるプロセスP1の命令aとプロセスP2の命令bにおいて、aとbの間に依存関係がなければ、aとbを異なるプロセスに割り当てることによって並行関係(a‖b)にすることができる。一方、依存関係を持つ命令同士については、依存関係から導出される先行制約を満足するために、並行化の際、各命令の前後に同期命令を挿入する。
【0038】
また、並行化手段7は、このように並行化されたシナリオから冗長な同期命令を除去する。ここで、同期命令が冗長か否かの基準は、シナリオからその同期命令を除去しても、除去されたシナリオを並行プログラムとみなして生成されるシナリオの集合が、除去前のシナリオを並行プログラムとみなして生成されるシナリオの集合と等価であるか否かであり、除去しても等価な同期命令は冗長と判断する。このように等価の概念を用いて冗長な同期命令を除去する詳細な手順は後述する。
【0039】
〔2−7.シナリオの統合化〕
上記のような並行化の結果、各プロセスには、それぞれ異なったブロックから由来するシナリオの部分が、相互に別個独立のまま割り当てられている状態となる。そこで、統合化手段8が、各ブロックを単位として割り当てられているシナリオを、プロセスごとに統合化する(ステップ9)。この統合化の詳細な手順は後述する。また、統合化の結果としては、統合化されたプロセスごとのシナリオを表すローカルシナリオ情報(9)が、後のステップに提供される。
【0040】
〔2−8.第2の並行プログラムの生成〕
最後に、上記のように統合化されたプロセスごとのローカルシナリオ情報9から、生成手段10が、第二の並行プログラム11を生成する(ステップ10)。ここで生成される第二の並行プログラム11は、元となったシナリオ情報4で表されるシナリオおよびそのシナリオと等価な挙動のみを再現するものであるから、ステップ2で与えられたシナリオが正しければ(ステップ4)、この第二の並行プログラムも正しいことが保証される。
【0041】
〔3.詳細な手順〕
次に、シナリオが有向グラフで与えられた場合を例にとり、上記に説明したステップ1〜10の手順のうち、シナリオの分解(ステップ7)について詳細な手順を説明し、続いて、シナリオの並行化(ステップ8)及びシナリオの統合(ステップ9)についても詳細な手順を説明する。
【0042】
ここでは、与えられたシナリオは図5(a)に示したようなシナリオグラフであり、このシナリオグラフのノ−ドは第1のプログラム2のグロ−バルな実行状態を表し、ノード間のア−クが第1の並行プログラム2内のt1やt14などの命令を表す。また、複数のシナリオが1つのシナリオグラフによって表されていて、1つのシナリオはシナリオグラフ上の1つの経路に対応するものとする。
【0043】
〔3−1.シナリオの分解の詳細な手順〕
〔3−1−1.シナリオグラフの正規化〕
シナリオグラフを分解するには、まず、ユーザの作成したシナリオグラフSGから正規表現(regular expression)に変換されたシナリオグラフSGr を作成する。ここで、正規表現とは、例えば、ループ部分が0回以上の繰り返しをするというデータの構造であり、正規表現でないシナリオグラフSGから正規表現に変換されたシナリオグラフSGr を作成することをシナリオグラフの正規化と呼ぶ。このとき、SGとSGr は意味的に等価であることが保証できるようにSGr を生成する。このように正規化されたシナリオグラフSGr はもとのSGと等価であるが、階層的な構造を抽出することによって分解することが容易な構造を有する。
【0044】
ここで、2つのシナリオが意味的に等価であることをシナリオ等価と呼び、また、2つのシナリオが等価である特徴を等価性と呼び、等価性を記号「===」で表す。この場合、等価性は次のように定義できる。すなわち、2つのシナリオθ1とθ2がシナリオ等価である(θ1===θ2)とは下記の条件が成り立つことである。
(1)任意のiに対して、あるjが存在して、
c(θ1,i) = c( θ2,j)であり、かつ
任意のjに対して、あるiが存在して、
c(θ2,j) = c( θ1,i)である。
(2)任意のi1,i2に対して、あるj1,j2が存在して、
c(θ1,i1) = c(θ2,j1) かつ
c(θ1,i2) = c(θ2,j2) かつ
c(θ1,i1) << c( θ1,i2) → c( θ2,j1) << c( θ2,j2))である。
(3)任意のj1,j2に対して、あるi1,i2が存在して、
c(θ1,i1) = c(θ2,j1) かつ
c(θ1,i2) = c(θ2,j2) かつ
c(θ2,j1) << c( θ2,j2) → c( θ1,i1) << c( θ1,i2))である。
【0045】
このようなシナリオ等価を前提として、シナリオをグラフで表したシナリオグラフが等価であることをシナリオグラフ等価と呼ぶ。そして、2つのシナリオグラフSG1=(S1,T1,δ1,s01)とSG2=(S2,T2,δ2,s02)に対して、SG1とSG2がシナリオグラフ等価である(SG1===SG2) とは下記の条件が成り立つことである。
すなわち、任意のSG1のシナリオθ1に対して、あるSG2のシナリオθ2が存在して、θ1===θ2であり、かつ任意のSG2のシナリオθ2に対して、あるSG1のシナリオθ1が存在して、θ1 ===θ2である。
【0046】
次に、与えられたシナリオグラフを、上記のような等価性を維持しながら正規化する手順の一例を示す。まず、与えられたシナリオグラフから、全く実行されない場合があるループを、分岐構造などに基づいて検出する。次に、そのループの中で、そのループが実行されない場合も実行されるパスと共有しているアークを検出する。検出されたアークと同じアークを、当該ループに専属のものと持たせることによって、ループを他の部分から独立させる。
【0047】
より具体的には、シナリオグラフは有限オ−トマトンであり、シナリオグラフの正規化に関しては、有限オ−トマトンから等価な正規表現を生成する公知のアルゴリズムを用いる(参考文献:福村、稲垣/オ−トマトン・形式言語理論と計算論、岩波書店、1982)。なお、このような等価な正規表現に変換されたシナリオグラフは、ループとそれ以外の部分が明確に区分されているので、階層的な構造の抽出が容易である。
【0048】
〔3−1−2.ブロックへの階層的分解〕
上記のような正規化に続いて、正規なシナリオグラフSGr を図5(b)に示すように、ループを含まないブロックに階層的に分解する。このような分解で得られる階層構造に含まれる各階層では、シナリオは下位のブロックをノ−ドとし、ル−プを含まないサブグラフとして表現できる。
【0049】
すなわち、上記のように正規化されたシナリオを分解するには、シナリオから最も大きなループを探し出し、そのループを、ループを含まないブロックと、そのブロックの末尾と先頭をつなぐ経路とに分ける。そして、このように作られたブロックから次に大きなループを探し出し、このような手続きを、ループが見つからなくなるまで階層的に繰り返せばよい。例えば、図5(a)のシナリオが与えられた場合、最大のループとしてt1−t2−t3−t4−t5−t6を含むループ構造が取り出され、図5(b)に示すように、この部分がブロックB1となる。さらに、ブロックB1の中からループt12−t13−t14が取り出され、この部分がブロックB2となる。
【0050】
〔3−2.シナリオの並行化の詳細な手順〕
シナリオの並行化(ステップ8)では、上記のような分解で得られた各階層のアサイクリックブロックごとに、下記の手順で並行化を行なう。これは、ル−プを含む場合とそうでない場合を統一的な手順で並行化することは困難だからである。なお、従来の、ス−パ−コンピュ−タのコンパイラにおける逐次プログラム並列化においても同様のアプロ−チが採用されている(参考文献:M. Girkar and C.D. Polychronopoulos, Automatic Extraction of Functional Parallelism from Ordinary Programs, IEEE Trans. on Parallel and Distributed Systems, Vol.3, No.2, 1992)。
【0051】
〔3−2−1.同期動作の挿入〕
例えば、アサイクリックブロックを構成するプロセスP1の命令t11とプロセスP2の命令t21の間に依存関係がなければ、これら2つの命令t11とt21は、それぞれプロセスに割り当てることによって並行関係(t11‖t21)にすることができる。依存関係のない2つのブロックについても同様である。なお、各命令は、第1の並行プログラム2においてどのプロセスに所属するかが決まっているので、シナリオの並行化では、各命令をそれぞれ所属するプロセスに射影することになる。依存関係のある直列関係の命令やブロックを並行化したり、分岐を含むブロックを並行化する場合は、次のように同期命令を用いる。
【0052】
まず、依存関係のある直列関係の命令やブロックの間に同期命令si を挿入する。例えば、相互に依存関係を持つ動作t11とt21が、シナリオのあるブロックで直列しているものとする(図6(a))。そして、動作t11とt21の間の依存関係に基づいて、動作t11が動作t21に先行しなければならないという先行制約が存在するものとする。この場合、直列している動作t11とt12の間に同期命令s1を挿入することによって
t11 t21 → t11 s1 t21
とする(図6(b))。また、例えば、ブロックB1とB2の間に同様の先行制約がある場合も、同期命令s1を挿入して
B1 B2 → B1 s1 B2
とする。
【0053】
また、各分岐にも同期命令を挿入する。例えば、図7(a)の例では、分岐命令による動作t11の内容に応じて、動作t12−t13を含む左側の経路と、動作t21−t22を含む右側の経路とに、動作列が分岐する。この場合、図7(b)に示すように、それぞれの経路へ分岐する部分に同期命令s1及びs2を挿入し、
t11 (t12 t13 + t21 t22) →
t11 (s1 t12 t13 + s2 t21 t22)
とする。また、例えば、ブロックB1における分岐の動作に基づいてブロックB2とB3とに分岐するような場合も、それぞれの経路へ分岐する部分に、同様に同期命令s1及びs2を挿入し、
B1 (B2 + B3) → B1 (s1 B2 + s2 B3)
とする。
【0054】
〔3−2−2.プロセスへの射影〕
次に、上記のように同期命令を挿入したシナリオを各プロセスに射影する。ここで、射影(projection)とは、各プロセスにシナリオの一部を割り当てることである。ここで、B|PはブロックBのプロセスPへの射影を意味する。
【0055】
例えば、図6(b)では、同期命令s1を挿入したシナリオに動作t11とt21が含まれているが、このうち動作t11をあるプロセスP1に割り当て、動作t21を別のプロセスP2に割り当てる場合、図6(c)に示すように、プロセスP1では動作t11に続けて同期命令s1を割り当て、プロセスP2では動作t21の前に同期命令s1を割り当て、
t11 s1 t21 → t11 s1 ‖s1 t21
とする。この場合、プロセスP2の同期命令s1は、プロセスP1で同期命令s1が実行されるまで待ち状態となるので、プロセスP2の動作t21は必ずプロセスP1の動作t11の実行終了を待って実行が開始される。このため、動作t11とt21の実行順序は先行制約に合致するように維持される。
【0056】
また、ブロックB1とB2の間に先行制約がある場合も同様に、挿入されている同期命令s1を各ブロックB1,B2と共に各プロセスに割り当てることによって、
B1 s1 B2 → (B1|P1)s1(B2|P1) ‖(B1 |P2)s1(B2|P2)
とする。
【0057】
また、図7(b)では、同期命令s1及びs2を挿入したシナリオに、動作t12−t13を含む左側の経路と、動作t21−t22を含む右側の経路が含まれているが、この2つの経路をそれぞれ別々のプロセスP1とP2に割り当てるものとする。この場合、図7(c)に示すように、プロセスP1では、動作t11による分岐のうち、プロセスP1で実行する左側の経路に同期命令s1を挿入し、右側の経路は同期命令s2を最後に終了するように構成する。プロセスP2では、これと反対に、同期命令s1の経路は終了するように構成し、同期命令s2に続けて動作t21以降の右側の経路を構成することによって、
t11(s1 t12 t13 + s2 t21 t22) →
t11(s1 t12 t13 + s2)‖(s1 + s2 t21 t22)
とする。この場合、プロセスP1で同期命令s1に続いて動作t12以下が実行される場合は、プロセスP2は同期命令s1で終了し、また、プロセスP2で同期命令s2に続いて動作t21以下が実行される場合は、プロセスP1は同期命令s2で終了する。このため、プロセスP1とP2を併せて観察しても、図7(b)で示した右側と左側の双方の経路が同時に実行されることはなく、もとのシナリオに含まれていた分岐の構造が保存されている。
【0058】
また、ブロックB1における分岐の動作に基づいてブロックB2とB3とに分岐するような場合も同様に、挿入されている同期命令s1及びs2をブロックと共にそれぞれのプロセスへ割り当て、
B1 (s1 B2 + s2 B3) →
(B1 |P1)(s1(B2 |P1) + s2(B3 |P1))‖
(B1 |P2)(s1(B2 |P2) + s2(B3 |P2))
とする。この場合は、同期命令s1に続いてブロックB2が実行される場合、ブロックB2の各部分のうちプロセスP1ではプロセスP1に射影された部分が実行され、プロセスP2ではプロセスP2に射影された部分が実行される。また、同期命令s2に続いてブロックB3が実行される場合、ブロックB3の各部分のうちプロセスP1ではプロセスP1に射影された部分が実行され、プロセスP2ではプロセスP2に射影された部分が実行される。
【0059】
上記のような射影を行った時点では、各プロセスには、第1の並行プログラム2において当該プロセスに対応する命令が割り当てられているほか、ブロックに挿入された全ての同期命令が、全てのプロセスに割り当てられている。
【0060】
〔3−2−3.冗長な同期命令の除去〕
続いて、割り当てられた全ての同期命令の中から、各アサイクリックブロックごとに冗長な同期命令を抽出しそれを除去する。たとえば、図8(a)のシナリオをプロセスP1,P2へ射影し、
(s1 a s2 + s3 s4 a) ‖(s1 s2 b + s3 b s4)
とした結果を図8(b)に示す。この例では、命令aとbに依存関係があることから同期命令s1,s2,s3,s4が用いられているが、実際には図8(a)のシナリオではa→bという順序も、逆のb→aという順序も双方許容されているので、同期命令s1,s2,s3,s4は冗長である。このため、これら同期命令を除去することによって図8(c)の状態とすることができる。
【0061】
〔3−2−3−1.原始的な手順〕
このような冗長な同期命令をシナリオグラフSGから除去する手順は、原始的には次のように表現することができる。すなわち、任意の同期命令sを選択し、それを除去する前のグラフSGと除去した後のグラフSG’を比較し、両者がシナリオグラフ等価(SG===SG’)であれば同期命令sを削除する、という処理を繰り返し、全ての同期命令についてこの処理を繰り返しても同期命令が1つの除去できなくなった時点で処理を終了する。
【0062】
〔3−2−3−2.シナリオグラフ等価を判定する手順〕
上記の手順では、選択した同期命令を除去する前後のシナリオグラフが等価かどうかを判定する必要があり、本実施形態では、シナリオグラフの等価性の判定に次のようなカウンティングトレ−スを用いる。カウンティングトレースとは、シナリオにおいてどの動作が何度行われ、依存関係を持つ動作がいつ行われたかを示す情報である。ここで、与えられたシナリオθのカウンティングトレ−スct(θ)は以下のように定義される。
ct( θ) = (<動作の生起カウンタの組>,< 先行制約条件の集合>)
この定義において、動作の生起カウンタは、そのシナリオ中で当該動作が何回生起したかを表す項目であり、例えば、(a,k)のような表現は、シナリオθにおいて動作aがk回生起したことを意味する。また、先行制約条件は、依存関係を持つ動作がいつ生起したかを表す。例えば、並行プログラムCが動作a→b→c→b→aの順に実行され、この実行順序を表すシナリオθ=abcbaに対して、依存関係の集合D(C)が依存関係(a,c)を含む場合、θのカウンティングトレ−スは、
となる。この例において、動作の生起カウンタの組{(a,2),(b,2),(c,1)}は、シナリオθ=abcbaにおいて、動作aが2回、動作bが2回、動作cが1回生起したことを意味し、1つ目の先行制約条件c(θ,1)<<c(θ,3)は、シナリオθにおいて、依存関係を持つ2つの動作a,cがそれぞれ1番目と3番目の動作として生起したことを意味し、また、2つ目の先行制約条件c(θ,3)<<c(θ,5)は、動作c,aがそれぞれ3番目と5番目の動作として生起したことを意味している。
【0063】
このようなカウンティングトレースの集合をカウンティングトレ−ス集合と呼び、アサイクリックなシナリオグラフSGにおいて、カウンティングトレ−ス集合ctset(SG)は以下のように定義される。
ctset(SG) = {ct(θ) |θはSGのシナリオ}
この定義は、シナリオグラフSGに基づくカウンティングトレース集合ctset(SG)が、シナリオグラフSGの全てのシナリオθのカウンティングトレースct(θ)からなることを意味している。そして、アサイクリックなシナリオグラフSGにおいて、任意のシナリオは有限なので、このシナリオグラフSGを並行プログラムCとみなし、ctset(C)を計算することが可能である。ここで、アサイクリックなシナリオグラフSG1とSG2に対して、シナリオグラフ等価とカウンティングトレース集合との間には、下記の性質が成り立つ。
SG1 === SG2 iff ctset(C1)=ctset(C2)
これは、2つのシナリオグラフSG1とSG2の間でそれぞれに基づくカウンティングトレース集合ctset(C1)とctset(C2)が同じであれば、2つのシナリオグラフSG1とSG2は等価であることを意味する。
【0064】
〔3−2−4.冗長な同期命令の除去を効率的に行う手順〕
シナリオグラフ等価を判定する上記のような手法を応用して、冗長な同期命令の除去を効率的に行う手順を次に示す。なお、ここでは、依存関係を有する動作t1とt2の間に同期命令sync(s1)の挿入されたアサイクリックブロックSGn (図9(a))から冗長な同期命令を除去するものとする。まず、SGn をプロセスP1とP2に射影する。なお、射影されたプロセスは、並行プログラムCn とみなすことができる。まず、冗長な同期命令の除去を効率的に行う手順を図10に示す。
〔3−2−4−1.ダミー動作の挿入〕
図10に示す手順では、まず、各プロセスPiに挿入してある各同期命令sync(ID)に1対1に対応させて、ダミー動作nsync(Pi,ID)を挿入する(ステップ101)。ダミー動作とは、同期する命令である同期命令に対して、同期しない命令であり、言い換えれば、同期命令による同期を解除する動作である。このようなダミー動作は、例えば、同期命令の直前に、当該同期命令の直後へ選択的にジャンプする命令を挿入することによって実現する。例えば、図9(a)に示したシナリオグラフについては、各プロセスP1及びP2に割り当てて並行化する際、同期命令sync(s1)の直前に、当該同期命令sync(s1)をスキップしてその直後にジャンプするダミー動作nsync(P1,s1)及びnsync(P2,s1)を各プロセスに挿入する(図9(b))。このようなダミー動作を挿入したシナリオグラフをSGe とする。また、このように挿入した全てのダミー動作は、記録用の集合ANSに記録しておく(ステップ102)。
【0065】
〔3−2−4−2.状態空間の生成〕
次に、上記のようにダミー動作を挿入したシナリオグラフSGe を、並行プログラムCe とみなし、並行プログラムCe が示し得る動作列の集合を表す状態空間SS(Ce)を生成する(ステップ103/図9(c))。ここで、並行プログラムCについて、状態空間SS(C)とは、下記に定義する状態遷移グラフSS(C)=(S,T,δ,m0)である。
SはCのグローバル状態の集合
TはCの命令の集合
δは状態遷移関係。すなわち、この状態遷移関係δの要素(m,t,m’)は、グローバル状態mで命令tが実行されるとグローバル状態m’になることを意味する。
m0はCの初期グローバル状態
なお、シナリオグラフSG=(S,A,δ’,s0)は並行プログラムCの状態空間SS(C)=(S,A,δ,s0)のサブグラフである。すなわち、δ’がδの部分集合である。
【0066】
〔3−2−4−3.違反パスの検出〕
続いて、生成された状態空間SS(Ce)から、カウンティングトレース集合ctset(Cn)に含まれないカウンティングトレースct(θ)を生じる違反パスθ、すなわち先行制約に反するまたはデッドロックする違反パスθを検出する(ステップ104)。図9(c)では、違反パスθを太線及び×印で示す。なお、ctset(Cn)はダミー動作挿入前のシナリオグラフに対応するカウンティングトレース集合であり、違反パスθを検出する際に作成するか、それ以前に作成して保存しておく。
【0067】
違反パスθが検出された場合(ステップ105)、この違反パスθをルート側に向かって遡り、遡る経路の最後に登場するダミー動作nsync(Pi,ID)を検出する(ステップ106/図9(c))。すなわち、違反パスθはダミー動作nsync(Pi,ID)の挿入が原因で発生したと考えられることから、同期命令sync(ID)は不可欠であり、冗長でないことが判断できる。図9(c)の例では、動作ns21が、正しい動作からの逸脱(deviation) を生じさせたダミー動作として検出されている。
【0068】
このように検出されたダミー動作は、記録用の集合DNSに追加する(ステップ107)。また、そのダミー動作をシナリオグラフSGe から除去(ステップ108)したうえで状態空間SS(Ce )を再度生成するか、状態空間のうちそのダミー動作から始まる部分を枝刈りする。そのうえで再び違反パスθの検出からの手順を繰り返し、違反パスθが検出されなくなった時点で(ステップ105)以下の手順へ進む。
【0069】
〔3−2−4−4.冗長性の判断〕
違反パスθが検出されなくなった時点では、それまでに検出された全てのダミー動作が集合DNSに含まれている。その結果、挿入した全てのダミー動作の集合ANSから、検出されたダミー動作の集合DNSを除いたANS−DNSは、挿入したが違反パスを発生させなかったダミー動作の集合となる。そのようなダミー動作に対応する同期命令は、実際に削除してもシナリオグラフのカウンティングトレース集合には影響を与えない。
【0070】
したがって、ダミー動作nsync(Pi,ID)がANS−DNSに含まれるならば、そのプロセスPiに挿入されている同期命令sync(ID)は冗長であるからシナリオグラフから除去する(ステップ109)。このように冗長な同期命令をすべて並行プログラムCnから除去することによって、並行プログラムCoが最終的に得られたとする。このとき、挿入した全ての同期命令を持ったままの並行プログラムCnと、冗長な同期命令を除去した並行プログラムCoはカウンティングトレース集合が共通することからシナリオグラフ等価であり、SS(Co)===SS(Cn)が満たされる。
【0071】
〔3−3.統合化の詳細な手順〕
続いて、分解された各階層のブロックごとに並行化されたシナリオを、各プロセスごとに1つのシナリオに統合する。
【0072】
〔3−3−1.ブロックの埋め込み〕
統合の際は、まず、下位の階層のブロックの詳細を上位の階層に埋め込む。例えば、
B1 = a1 (B2 |P1) a2‖b1 (B2|P2) b2
B2 = a3 ‖b3
のとき、下位階層のブロックに関する
B2|P1 = a3 、B2|P2 = b3
を代入すると、全体として
B1 = a1 a3 a2 ‖b1 b3 b2
になる。
【0073】
〔3−3−2.ループの展開〕
続いて、ブロックに対するループを、そのブロックの内側の各プロセスのループとする。例えば、
(a‖b)* → a*‖b*
とする。
【0074】
〔4.具体例〕
以下に、本実施形態を並行プログラムを適用する場合の具体例を、図3に示すフローチャートの各ステップにしたがって説明する。ここで対象とするのは共有変数型の並行プログラムCであり、この並行プログラムCは少なくとも、2つのプロセスP1,P2から構成され、共有メモリを用いる2つの共有変数m1,m2を読み書きするものとする。
【0075】
〔4−1.並行プログラムの作成〕
この具体例では、並行プログラムC=P1‖P2を作成したとする(ステップ1)。このプログラムの命令間の依存関係の集合D(C)には、変数m1を介したデータ依存に基づく依存関係(a2,b2)と、変数m2を介したデータ依存に基づく依存関係(a3,b3)が含まれる。
【0076】
m1 = 0 ; m2 = 0 ;
P1:
while(true){
a1: v11 = 1 ;
a2: write(m1,v11) ;
a3: v12 = read(m2) ;
}
P2:
while(true){
b1: v21 = 2 ;
b2: v22 = read(m1) ;
b3: write(m2,v21) ;
}
〔4−2.シナリオの作成〕
上記のような並行プログラムCから、作成手段3を用いてシナリオを作成する(ステップ2)。ここでは、複数のシナリオをまとめたシナリオグラフ(図11(a))が作成されたものとする。
【0077】
〔4−3.シナリオの挙動の確認〕
ユーザは、このシナリオグラフ上の各シナリオは正しいことを確認し(ステップ3)、バグがあればステップ1に戻る(ステップ4)。ここでは、シナリオにはバグは発見されず、依存関係の抽出(ステップ6)に続いてシナリオの分解(ステップ7)が行われるものとする。
【0078】
〔4−4.シナリオの分解〕
シナリオの分解(ステップ6)では、シナリオグラフの正規化と階層構造の抽出が行われる。すなわち、まず、シナリオグラフ(図11(a))を正規化することによって正規表現に変換された次のシナリオを得る。ここで、a*は「aの0回以上の繰り返し」、a+bは「aまたはbを実行する」を意味する。
SGr=(b1(a1 a2 a3)* a1(a2 b2 + b2 a2)b3 a3)*
この正規表現に変換されたシナリオを等価なグラフで表したシナリオグラフを図11(b)に示す。正規表現に変換されたシナリオ
(b1(a1 a2 a3)* a1(a2 b2 + b2 a2)b3 a3)*
は以下のような階層的な構造を有する各ブロックに分解することができる。ここで、B1*およびB2*を1つの要素とみなせば、各階層の個々のブロックはル−プ構造を含まない。
SGr = B1*
B1 = b1 B2* a1(a2 b2 + b2 a2)b3 a3
B2 = a1 a2 a3
〔4−5.シナリオの並行化〕
続いて、このように分解されたブロックを単位として、並行化を行なう(ステップ8)。この例では、ブロックB2は、
B2 = a1 a2 a3 ‖ε( εは空列の意味)
であり、プロセスP1の動作しか含まないので並行化の必要はない。一方、ブロックB1は次のように並行化される。まず、ブロックB1には同期命令s1,s2,s3,s4,s5,s6を導入する。
B1 = b1 B2* s1 a1(s2 a2 s3 b2 + s4 b2 s5 a2)b3 s6 a3
続いて、このように同期命令s1〜s6を挿入したブロックB1をプロセスP1,P2に射影する。
さらに、冗長な同期命令を除去する。ここで、(s2 a2 s3 b2 + s4 b2 s5 a2) に関しては、
(s2 a2 s3 + s4 s5 a2) ‖(s2 s3 b2 + s4 b2 s5) → a2 ‖b2
と簡約化できる。すなわち、同期命令s2,s3,s4,s5は冗長であるため除去される。この結果、ブロックB1の最終的な正規表現は下記のようになる。
B1 =(B2 |P1)* s1 a1 a2 s6 a3 ‖b1(B2 |P2)* s1 b2 b3 s6
〔4−6.シナリオの統合〕
次に、各ブロックごとに各プロセスに割り当てられているシナリオを統合化する。この統合化では、下位のブロックB2の内容を、上位の階層のブロックB1に埋め込むことによって、
SGr = ((a1 a2 a3)* s1 a1 a2 s6 a3 ‖b1 s1 b2 b3 s6)*
となる。また、ル−プの展開を行なうことによって、
SGr =
((a1 a2 a3)* s1 a1 a2 s6 a3)* ‖(b1 s1 b2 b3 s6)*
となる。このような統合化によって最終的に生成されたシナリオをシナリオグラフで表すと図11(c)のようになる。ここで、正規表現をそのままグラフで表したものは多少冗長性があるので、一部最適化されている。
【0079】
〔4−7.第2の並行プログラムの生成〕
最後に、図11(c)に示したシナリオグラフから、下記の並行プログラムC=P1‖P2を生成する。
【0080】
〔5.効果〕
以上説明したように、本実施形態では、正しいことが確認されたシナリオという形で、並行プログラムを一旦逐次化し、このシナリオに基づいて並行プログラムを再び生成することによって並行プログラムの信頼性の向上させる。その際、シナリオを一旦、ループを含まないブロックに階層的に分解する。そして、分解されたブロックごとに各プロセスに割り当てて並行化し、プロセスごとに再び統合化して並行プログラムを生成する。このため、構造が複雑な並行プログラムについても、ブロックに分解して処理することによって逐次プログラミングと同程度の容易さで開発することが可能となる。また、分解された個々のブロックはループや階層構造を含まないので、効率的に処理でき、並行プログラム全体として効率的に開発を行うことができる。
【0081】
特に、本実施形態では、シナリオを正規化することによって正規表現に変換されたシナリオとし、正規表現に変換されたシナリオは階層的に分解することが容易である。このため、並行プログラムの分解が効率化される。
【0082】
また、本実施形態では、同期命令を埋め込みながらシナリオをプロセスに割り当てるので、プロセス間において各部分の実行タイミングが、依存関係に基づく先行制約に合致するように制御され、最終的に得られる並行プログラムの信頼性が確保される。
【0083】
また、本実施形態では、冗長な同期命令を除去することによって、各プロセスが互いにどのようなタイミングで動作するかの自由度が拡張される。これは、無害な非決定性を与えることによって並行プログラムを最適化することを意味し、シナリオという形で一旦逐次化された並行プログラムにおいて、並行性を可能な限り復元することができる。
【0084】
また、本実施形態では、依存関係を持つ動作の実行順序に影響しない同期命令が除去されるので、並行プログラムの動作の自由度を拡張しながら、依存関係を持つ動作の実行順序は正しく維持される。
【0085】
〔6.他の実施の形態〕
なお、本発明は上記実施の形態に限定されるものではなく、次に例示するような他の実施形態も含むものである。例えば、上記実施形態を実現するために用いるコンピュータの構成について、図1に示した構成例はマルチCPUであるが、本発明は他の構成のコンピュータシステム上に実現してもよく、例えば、共有メモリを有する並列計算機、共有メモリを有しない並列計算機、分散ネットワーク計算機システム、単一CPU計算機をマルチタスクシステムとしたもの、などが考えられる。
【0086】
また、上記実施形態では、依存関係の抽出は、シナリオを分解する前に行ったが、依存関係の抽出はシナリオを分解した後に行ってもよい。また、上記実施形態では、シナリオの形式としてシナリオグラフを用いたが、シナリオの形式は自由であり、テキストやフローチャート形式など所望の形式のシナリオを用いることができる。また、上記実施形態で示した並行プログラムやシナリオは例示に過ぎず、用いる言語、表現形式、複雑さなどは自由に選択することができる。
【0087】
また、本発明は、本発明の作用を実現するためのソフトウェアによって実現することが一般的と考えられるが、そのようなソフトウェアを記録した記録媒体も本発明の一態様である。
【0088】
【発明の効果】
以上説明したように、複雑な構造の並行プログラムについても、優れた信頼性と効率で開発を行うことができるので、プログラミングの生産性と精度が大幅に向上する。
【図面の簡単な説明】
【図1】本発明の実施の形態の実現に用いるコンピュータシステムのハードウェア構成を示す図
【図2】本発明の実施の形態の構成を示す機能ブロック図
【図3】本発明の実施の形態における処理手順を示すフローチャート
【図4】本発明の実施の形態において、データ依存の例を示す図
【図5】本発明の実施の形態におけるシナリオの分解を例示する図
【図6】本発明の実施の形態において、シナリオに同期命令を挿入し、各プロセスに割り当てる例を示す図
【図7】本発明の実施の形態において、シナリオに同期命令を挿入し、各プロセスに割り当てる他の例を示す図
【図8】本発明の実施の形態において、シナリオに挿入した同期命令が冗長なものとして除去される状態を示す図
【図9】本発明の実施の形態において、シナリオグラフにダミー動作を挿入し、違反パスが発生する状態を示す図
【図10】本発明の実施の形態において、冗長な同期命令を効率的に除去する手順を示すフローチャート
【図11】本発明の実施の形態における具体例を示す図
【符号の説明】
1:編集手段
2:第1の並行プログラム
3:作成手段
4:シナリオ情報
5:分解手段
6:構造的シナリオ情報
7:並行化手段
8:統合化手段
9:ローカルシナリオ情報
10:生成手段
11:第二の並行プログラム
12:解析手段
13:解析情報
21:プロセッサ
22:I/Oインタフェイス
23:共有メモリ
24:入力装置
25:出力装置
26:外部記憶装置
Claims (10)
- 入力装置及び記憶装置を有するコンピュータに、編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段を構成することによって実現され、前記入力装置が入力した情報に基づいて、前記編集手段が第1の並行プログラムを作成し、前記第1の並行プログラムを前記記憶装置が記憶し、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段が第2の並行プログラムを生成し、前記第2の並行プログラムを前記記憶装置が記憶するプログラム開発支援装置において、
前記第1の並行プログラムから実行のシナリオを作成する前記作成手段と、
前記第1の並行プログラムを解析することによって、前記第1の並行プログラムの部分間に存在する依存関係を抽出する前記解析手段と、
前記シナリオを、ループを含まないブロックに階層的に分解する前記分解手段と、
前記依存関係に基づいて、前記分解されたシナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化する前記並行化手段と、
各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化する前記統合化手段と、
統合化されたプロセスごとのシナリオから第2の並行プログラムを生成する前記生成手段と、
を有することを特徴とするプログラム開発支援装置。 - 前記分解手段は、前記作成手段から与えられたシナリオを正規化する手段を有することを特徴とする請求項1記載のプログラム開発支援装置。
- 前記並行化手段は、シナリオをプロセスに割り当てる際、前記依存関係に対応する同期命令をシナリオに埋め込むように構成されたことを特徴とする請求項1又は2記載のプログラム開発支援装置。
- 前記並行化手段は、シナリオに埋め込んだ前記同期命令のうち、冗長な同期命令を除去するように構成されたことを特徴とする請求項3記載のプログラム開発支援装置。
- 前記並行化手段は、前記冗長な同期命令を除去する際、
シナリオに埋め込んだ任意の同期命令の作用を抑制し、
前記抑制の前と後の各シナリオの間で、前記依存関係を持つ動作が示し得る実行順序が同じかどうかを判断し、
前記実行順序が同じである場合は、作用を抑制した前記同期命令を除去するように構成されたことを特徴とする請求項4記載のプログラム開発支援装置。 - 前記並行化手段は、前記冗長な同期命令を除去する際、
シナリオに埋め込んだ任意の同期命令の作用を抑制し、
前記抑制の前と後の各シナリオの間で、シナリオが等価かどうかを判定する判定手段を含み、
前記判定手段は、相互に依存関係を有する部分を含む2つのシナリオそれぞれについて、前記依存関係を有する部分がいつ実行されたかを表すカウンティングトレースの集合を計算する手段と、
計算された前記2つの集合を比較し、2つの集合が等しい場合に2つのシナリオが等価であると判断する手段から構成され、
シナリオが等価であると判断された場合は、作用を抑制した前記同期命令を除去するように構成されたことを特徴とする請求項4記載のプログラム開発支援装置。 - 入力装置及び記憶装置を有するコンピュータに構成された編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段によって実現され、前記入力装置が入力した情報に基づいて、前記編集手段が第1の並行プログラムを作成し、前記第1の並行プログラムを前記記憶装置が記憶し、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段が第2の並行プログラムを生成し、前記第2の並行プログラムを前記記憶装置が記憶するプログラム開発支援方法において、
前記作成手段が、前記第1の並行プログラムから実行のシナリオを作成するステップと、
前記解析手段が、前記第1の並行プログラムを解析することによって、第1の並行プログラムの部分間に存在する依存関係を抽出するステップと、
前記分解手段が、前記シナリオを、ループを含まないブロックに階層的に分解するステップと、
前記並行化手段が、前記依存関係に基づいて、分解された前記シナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化するステップと、
前記統合化手段が、各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化するステップと、
前記生成手段が、統合化されたプロセスごとのシナリオから第2の並行プログラムを生成するステップと、
を含むことを特徴とするプログラム開発支援方法。 - 前記並行化手段が並行化するステップは、
シナリオをプロセスに割り当てる際、前記依存関係に対応する同期命令をシナリオに埋め込むサブステップと、
シナリオに埋め込んだ前記同期命令のうち、冗長な同期命令を除去するサブステップと、
を含むことを特徴とする請求項7記載のプログラム開発支援方法。 - 前記並行化手段が、冗長な同期命令を除去するサブステップは、
シナリオに埋め込んだ任意の同期命令の作用を抑制し、
前記抑制の前と後の各シナリオの間で、前記依存関係を持つ動作が示し得る実行順序が同じかどうかを判断し、
前記実行順序が同じである場合は、作用を抑制した前記同期命令を除去することを特徴とする請求項8記載のプログラム開発支援方法。 - 入力装置及び記憶装置を有するコンピュータに、編集手段、作成手段、解析手段、分解手段、並行化手段、統合化手段、生成手段を実現させるソフトウェアであって、前記入力装置から入力された情報に基づいて、前記編集手段に第1の並行プログラムを作成させ、前記第1の並行プログラムを前記記憶装置に記憶させ、前記第1の並行プログラムに基づいて、前記作成手段、前記解析手段、前記分解手段、前記並行化手段、前記統合化手段及び前記生成手段に第2の並行プログラムを生成させ、前記第2の並行プログラムを前記記憶装置に記憶させるプログラム開発支援用ソフトウェアを記録した記録媒体において、
前記プログラム開発支援用ソフトウェアは、
前記作成手段に、前記第1の並行プログラムから実行のシナリオを作成させ、
前記解析手段に、前記第1の並行プログラムを解析させることによって、前記第1の並行プログラムの部分間に存在する依存関係を抽出させ、
前記分解手段に、前記シナリオを、ループを含まないブロックに階層的に分解させ、
前記並行化手段に、前記依存関係に基づいて、分解された前記シナリオを前記ブロック若しくは前記ブロックに属する命令を単位として複数のプロセスに割り当てることによって並行化させ、
前記統合化手段に、各プロセスに割り当てられたシナリオを前記プロセスごとのシナリオとして統合化させ、
前記生成手段に、統合化されたプロセスごとのシナリオから第2の並行プログラムを生成させることを特徴とするプログラム開発支援用ソフトウェアを記録した記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29988697A JP3675623B2 (ja) | 1997-10-31 | 1997-10-31 | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29988697A JP3675623B2 (ja) | 1997-10-31 | 1997-10-31 | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH11134307A JPH11134307A (ja) | 1999-05-21 |
JP3675623B2 true JP3675623B2 (ja) | 2005-07-27 |
Family
ID=17878140
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP29988697A Expired - Fee Related JP3675623B2 (ja) | 1997-10-31 | 1997-10-31 | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3675623B2 (ja) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4923288B2 (ja) * | 2000-03-13 | 2012-04-25 | 陽子 友保 | 非同期共有オブジェクトシステムの耐故障合意手法およびその実現機構 |
US9043194B2 (en) | 2002-09-17 | 2015-05-26 | International Business Machines Corporation | Method and system for efficient emulation of multiprocessor memory consistency |
US8108843B2 (en) | 2002-09-17 | 2012-01-31 | International Business Machines Corporation | Hybrid mechanism for more efficient emulation and method therefor |
US7496494B2 (en) | 2002-09-17 | 2009-02-24 | International Business Machines Corporation | Method and system for multiprocessor emulation on a multiprocessor host system |
JP4754010B2 (ja) * | 2008-09-29 | 2011-08-24 | 富士通株式会社 | メッセージ紐付け処理プログラム、方法及び装置 |
US8539035B2 (en) * | 2008-09-29 | 2013-09-17 | Fujitsu Limited | Message tying processing method and apparatus |
JP5017396B2 (ja) * | 2010-03-01 | 2012-09-05 | 株式会社東芝 | 情報処理装置およびプログラムの検証方法 |
CN111857970A (zh) * | 2020-07-29 | 2020-10-30 | 北京思特奇信息技术股份有限公司 | 一种基于多依赖进程的调度方法和系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3039953B2 (ja) * | 1989-04-28 | 2000-05-08 | 株式会社日立製作所 | 並列化装置 |
JPH0689188A (ja) * | 1992-09-08 | 1994-03-29 | Nec Software Ltd | 自動並列化処理方式 |
JPH06250988A (ja) * | 1993-02-26 | 1994-09-09 | Nec Software Ltd | 自動並列化処理方法 |
JP3641090B2 (ja) * | 1995-12-26 | 2005-04-20 | 株式会社東芝 | プログラミング支援装置とその方法 |
-
1997
- 1997-10-31 JP JP29988697A patent/JP3675623B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH11134307A (ja) | 1999-05-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4629768B2 (ja) | 並列化処理方法、システム、及びプログラム | |
US8276124B2 (en) | Constructing petri nets from traces for diagnostics | |
US6275980B1 (en) | Programming method for concurrent programs and program supporting apparatus thereof | |
JP4042604B2 (ja) | プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム | |
JP2980178B2 (ja) | 並列プロセッサで処理する並列な命令ストリームを同期させる方法 | |
US9152389B2 (en) | Trace generating unit, system, and program of the same | |
US10943041B2 (en) | Electronic system level parallel simulation method with detection of conflicts of access to a shared memory | |
US8201142B2 (en) | Description language for structured graphs | |
US6067415A (en) | System for assisting a programmer find errors in concurrent programs | |
JP4050339B2 (ja) | 並行プログラム作成支援装置及び並行プログラム作成方法並びに並行プログラム実行装置 | |
JP3675623B2 (ja) | プログラム開発支援装置及び方法並びにプログラム開発支援用ソフトウェアを記録した記録媒体 | |
JP4414373B2 (ja) | プログラムの検証プログラム、プログラムの検証装置、プログラムの検証方法 | |
JP2012146137A (ja) | 情報処理装置およびプログラム | |
Hierons et al. | Parallel algorithms for generating harmonised state identifiers and characterising sets | |
CN111158890A (zh) | 控制任务集中的任务并行的系统及其方法 | |
Darabi et al. | A verification technique for deterministic parallel programs | |
JP3641090B2 (ja) | プログラミング支援装置とその方法 | |
JP3930255B2 (ja) | システム仕様情報処理装置、システム仕様情報処理方法及びプログラム | |
JP2016146148A (ja) | 設計支援装置、および設計支援方法 | |
Didier et al. | Sheep in wolf's clothing: Implementation models for dataflow multi-threaded software | |
CN115033479B (zh) | 一种基于精化约束重用的并行程序增量式回归验证方法 | |
JP6600888B2 (ja) | 並列化コンパイラ、並列化コンパイル装置、及び並列プログラムの生成方法 | |
Reichel | Metamorphic testing of version control systems | |
Ganai et al. | Reduction of verification conditions for concurrent system using mutually atomic transactions | |
Hwang et al. | A model‐free and state‐cover testing scheme for semaphore‐based and shared‐memory concurrent programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20041214 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050214 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20050412 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050426 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090513 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090513 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100513 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |