(57)【特許請求の範囲】
【請求項１】
複数のタスクのタスク境界を示す情報と、１のデータに対するデータアクセスに対応するＮ個（Ｎは１以上の整数）のノードと該ノード間のデータアクセスの順序制約を表現する第１の依存関係を示すエッジとを含み、該ノードのうち少なくとも１のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第１依存関係情報とを入力する入力部と、
前記第１依存関係情報に基づき、前記タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、該タスク境界エッジに接続される少なくとも１の該不確実アクセスノードを示す提示情報を生成する生成部と、
前記１のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、前記不確実アクセスノードに対して、該依存有無情報に従い、該不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力する指示部と、
前記変換情報に従い、前記第１依存関係情報を、前記１のデータに対するデータアクセスに対応するＭ（０≦Ｍ≦Ｎ）個のノードと、該ノード間の第２の依存関係を示すエッジとを含む第２依存関係情報に変換する変換部と
を備える
ことを特徴とする情報処理装置。
【請求項２】
前記生成部は、
少なくとも１のノードをさらに特定し、特定した該ノードが、前記第１依存関係情報に含まれる各ノードから前記タスク境界エッジへの少なくとも１の経路上に存在するか否かに応じて、該各ノードの前記提示情報を生成する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記生成部は、
前記タスク境界エッジに隣接するタスクの方向に対して、タスク境界までの距離が最小となり、且つ、確実を示すアクセス確実性フラグを持つ書き込みノードを特定する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記生成部は、さらに、前記変換情報を前記提示情報に反映させ、
前記指示部は、入力された前記依存有無情報に応じて前記変換情報を更新する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項５】
プログラムコードと前記タスク境界情報とを入力する入力部と、
前記プログラムコードを解析して前記第１依存関係情報を出力する解析部と、
前記プログラムコードから並列プログラムを生成する並列化部と
をさらに備え、
前記解析部は、
前記プログラムコードに記述される、前記１のデータにアクセスする可能性があると判定された前記データアクセスに対応するノードが入力され得る少なくとも１の外部入力値が該１のデータにアクセスすると見做せる場合に、前記アクセス確実性フラグを前記確実に設定し、該外部入力値が該１のデータにアクセスすると見做せない場合に、前記アクセス確実性フラグを前記不確実に設定して前記第１依存関係情報を出力し、
前記並列化部は、
前記タスク境界に従い前記プログラムコードの処理を並列実行単位に分割し、前記第２依存関係情報に含まれるエッジのうち前記タスク境界エッジを用いて該並列実行単位に対して同期を挿入して前記並列プログラムを生成する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項６】
プログラムコードと前記タスク境界情報とを入力する入力部と、
前記プログラムコードを解析して前記第１依存関係情報を出力する解析部と、
前記提示情報と、前記プログラムコードと等価なデータアクセスを行う等価アクセスプログラムコードとを解析して関係情報を生成する関係情報生成部と、
前記関係情報を入力し、前記依存有無情報を出力する監視部と
をさらに備え、
前記解析部は、
前記プログラムコードに記述される、前記１のデータにアクセスする可能性があると判定された前記データアクセスに対応するノードが入力され得る少なくとも１の外部入力値が該１のデータにアクセスすると見做せる場合に、前記アクセス確実性フラグを前記確実に設定し、該外部入力値が該１のデータにアクセスすると見做せない場合に、前記アクセス確実性フラグを前記不確実に設定して前記第１依存関係情報を出力し、
前記関係情報生成部は、
前記提示情報に含まれる不確実アクセスノードと、該不確実アクセスノードのアクセスの有無を決定する前記等価アクセスプログラムコード中のデータアクセスとの、アクセスの有無に関する対応関係を示す前記関係情報を生成し、
前記監視部は、
前記等価アクセスプログラムコード実行中に、前記関係情報に基づいて、不確実アクセスノードのアクセスの有無を決定するデータアクセスを監視し、該データアクセスの監視結果に基づき前記依存有無情報を生成する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項７】
前記タスク境界情報は、
前記第１依存関係情報が示す前記第１の依存関係をタスクに分割したときに、接続しているノードが異なるタスクに属するエッジであるタスク境界エッジを特定するタスク境界を示す情報を含む
ことを特徴とする請求項１に記載の情報処理装置。
【請求項８】
複数のタスクのタスク境界を示す情報と、１のデータに対するデータアクセスに対応するＮ個（Ｎは１以上の整数）のノードと該ノード間のデータアクセスの順序制約を表現する第１の依存関係を示すエッジとを含み、該ノードのうち少なくとも１のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第１依存関係情報とを入力する入力ステップと、
前記第１依存関係情報に基づき、前記タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、該タスク境界エッジに接続される少なくとも１の該不確実アクセスノードを示す提示情報を生成する生成ステップと、
前記１のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、前記不確実アクセスノードに対して、該依存有無情報に従い、該不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力する指示ステップと、
前記変換情報に従い、前記第１依存関係情報を、前記１のデータに対するデータアクセスに対応するＭ（０≦Ｍ≦Ｎ）個のノードと、該ノード間の第２の依存関係を示すエッジとを含む第２依存関係情報に変換する変換ステップと
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施の形態は、情報処理装置およびプログラムに関する。
【背景技術】
【０００２】
逐次計算機用のプログラムを、複数のコアまたプロセッサにより並列的に処理が可能なように並列化する技術が知られている。このプログラムの並列化を行う場合、プログラムの中で計算時間の多くを占めているループを並列化することが一般的に行われる。ループを含むプログラムの並列化を行う際に、ループのイタレーション間に依存があるか否かが不明な場合、開発者がループのイタレーション間に依存が無いと判断した場合に、並列化を行う技術が既に知られている。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】Georgios  Tournavitis,  Zheng  Wang,  Bjorn  Franke,  and  Michael  F.P.  O’Boyle.  Towards  a  Holistic  Approach  to  Auto-Parallelization:  Integrating  Profile-Driven  Parallelism  Detection  and  Machine-Learning  Based  Mapping.  In  Proc.  of  the  2009  ACM  SIGPLAN  Conference  on  Programming  Language  Design  and  Implementation,  pp.  177-187,  2009.
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来の技術においては、ループのイタレーション間にデータの依存がある場合のプログラムの並列化が困難であった。一方、イタレーション間の依存を無視して並列化を実行することも可能である。ところが、この場合、全てのデータの依存関係を考慮して開発者が手作業で同期を挿入することになり、開発者の負荷が大きくなる。また、並列化するか否かという判断を開発者が行う方法では、開発者に指示を仰ぐ並列化の単位をループなどに限定しなければ現実的ではない。このように、従来、高性能な並列プログラムを低コストで生成する方法や装置が求められていた。
【課題を解決するための手段】
【０００５】
実施の形態の情報処理装置は、入力部が、複数のタスクのタスク境界を示す情報と、１のデータに対するデータアクセスに対応するＮ個（Ｎは１以上の整数）のノードと該ノード間のデータアクセスの順序制約を表現する第１の依存関係を示すエッジとを含み、該ノードのうち少なくとも１のノードは対応するデータアクセスが確実か不確実かを示すアクセス確実性フラグを持つ第１依存関係情報とを入力し、生成部が、第１依存関係情報に基づき、タスク境界を跨ぐエッジのうち、データアクセスが不確実なノードである不確実アクセスノードを少なくとも一方に接続しているタスク境界エッジを特定し、タスク境界エッジに接続される少なくとも１の不確実アクセスノードを示す提示情報を生成する。指示部が、１のデータに対応するデータアクセスの依存関係の有無を示す依存有無情報を入力して、不確実アクセスノードに対して、依存有無情報に従い、不確実アクセスノードへのデータアクセスが無いことを示す情報を含む変換情報を出力し、変換部が、変換情報に従い、第１依存関係情報を、１のデータに対するデータアクセスに対応するＭ（０≦Ｍ≦Ｎ）個のノードと、ノード間の第２の依存関係を示すエッジとを含む第２依存関係情報に変換する。
【図面の簡単な説明】
【０００６】
【図１】第１の実施形態に係る並列化装置の機能ブロック図。
【図２】第１の実施形態によるプログラム並列化処理のフローチャート。
【図３】第１の実施形態の説明に用いるプログラムコードを示す図。
【図４】第１の実施形態のタスク境界情報を示す図。
【図５】第１の実施形態のタスク分割結果の例を示す図。
【図６】第１の実施形態によりプログラムコードを解析した依存関係情報を示す図。
【図７】第１の実施形態の第１依存関係情報を示す図。
【図８】第１の実施形態の第１依存関係情報を示す図。
【図９】第１の実施形態の第１依存関係情報を示す図。
【図１０】第１の実施形態のタスク境界ノードの情報を示す提示情報を示す図。
【図１１】第１の実施形態の依存有無情報を示す図。
【図１２】第１の実施形態の依存有無情報から生成した変換情報を示す図。
【図１３】第１の実施形態の変換情報を反映させて更新した提示情報を示す図。
【図１４】第１の実施形態の依存有無情報を示す図。
【図１５】第１の実施形態の依存有無情報から生成した変換情報を示す図。
【図１６】第１の実施形態により全てのデータについて生成した変換情報を示す図。
【図１７】第１の実施形態の第２依存関係情報に基づく依存グラフを示す図。
【図１８】第１の実施形態の第２依存関係情報に基づく依存グラフを示す図。
【図１９】第１の実施形態の第２依存関係情報に基づく依存グラフを示す図。
【図２０】第１の実施形態のタスク境界エッジをプログラムコードに対応付けた図。
【図２１】第１の実施形態の必要最小限のタスク間の実行順序制約を示す図。
【図２２】第１の実施形態による並列プログラムを示す図。
【図２３】第１の実施形態を適用しない場合の並列プログラムを示す図。
【図２４】第１の実施形態の連続しない複数の処理が含まれるタスクを示す図。
【図２５】第１の実施形態を説明するためのプログラムを示す図。
【図２６】第１の実施形態の第１依存関係情報に基づく依存グラフを示す図。
【図２７】第１の実施形態の第１依存関係情報の他の例を示す図。
【図２８】第１の実施形態のタスク毎に分割された依存グラフを示す図。
【図２９】第１の実施形態のプログラムコードを含めた提示情報を示す図。
【図３０】第２の実施形態による同期最適化装置の一例の構成を示す図。
【図３１】第２の実施形態による同期最適化処理を示すフローチャート。
【図３２】第２の実施形態を説明するためのプログラムコードを示す図。
【図３３】第２の実施形態による同期情報の対応関係の解析結果を示す図。
【図３４】第２の実施形態により解析された実行順序制約を示す図。
【図３５】第２の実施形態の実行順序制約から解析した第１依存関係情報を示す図。
【図３６】第２の実施形態により同期が最適化された並列プログラムを示す図。
【図３７】第３の実施形態による並列化システムの機能ブロック図。
【図３８】第３の実施形態によるインターフェイス挿入部の一例の構成を示す図。
【図３９】第３の実施形態を説明するためのプログラムコードを示す図。
【図４０】第３の実施形態のタスク境界情報の例を示す図。
【図４１】第３の実施形態の変数毎のデータアクセス依存関係を示す図。
【図４２】第３の実施形態のタスク境界情報によるタスク分割を示す図。
【図４３】第３の実施形態のプログラムコードの第１依存関係情報を示す図。
【図４４】第３の実施形態による並列プログラムを示す図。
【図４５】第３の実施形態の各依存グラフおよびノードに識別子を対応付けた図。
【図４６】第３の実施形態による関係情報の例を示す図。
【図４７】第３の実施形態のプログラムコードの実行イメージを示す図。
【図４８】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図４９】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５０】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５１】第３の実施形態のプログラムコードの実行イメージを示す図。
【図５２】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５３】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５４】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５５】第３の実施形態の変更を加えた第２依存関係情報を示す図。
【図５６】第４の実施形態による解析システムの機能ブロック図。
【図５７】第４の実施形態による関係情報の例を示す図。
【図５８】第４の実施形態によるプロファイルプログラムの例を示す図。
【図５９】第４の実施形態による第２依存関係情報の例を示す図。
【図６０】各実施形態に共通して適用可能なハードウェア構成を示す図。
【発明を実施するための形態】
【０００７】
（第１の実施形態）
図１は、第１の実施形態に係る情報処理装置としての並列化装置１０の機能を説明するための一例の機能ブロック図を示す。並列化装置１０は、入力されたプログラムコードの並列化を行い、並列プログラムを生成し、出力する。並列化装置１０は、入力部１０１、解析部１０２、生成部１０３、指示部１０４、変換部１０５および並列化部１０６を備える。
【０００８】
図２は、第１の実施形態によるプログラム並列化処理の例を概略的に示すフローチャートである。ステップＳ１０１で、入力部１０１に対して並列化対象のプログラムコード１１１と、当該プログラムコード１１１によるプログラムに対するタスク境界を示すタスク境界情報１１０とが入力される。次のステップＳ１０２で、解析部１０２は、入力されたプログラムコード１１１を解析してデータアクセスに関する依存関係情報を得る。解析部１０２により出力された依存関係情報を、以下、第１依存関係情報１１２と呼ぶ。
【０００９】
次のステップＳ１０３で、生成部１０３は、タスク境界情報１１０と、解析部１０２が解析した第１依存関係情報１１２とに基づき、提示を行うための提示情報１１４を生成する。次のステップＳ１０４で、指示部１０４は、依存有無情報１１５の入力があったか否かを判定し、入力があったと判定した場合、処理をステップＳ１０５に移行させる。ステップＳ１０５で、指示部１０４は、入力された依存有無情報１１５に従い変換情報１０７を生成または更新し、処理をステップＳ１０３に戻す。生成部１０３は、依存有無情報１１５の入力に伴い更新された変更情報１０７を提示情報１１４に反映させる。
【００１０】
一方、依存有無情報１１５の入力が終了し、ステップＳ１０４で依存有無情報１１５の入力が無いと判定されたら、処理がステップＳ１０６に移行される。ステップＳ１０６で、変換部１０５は、指示部１０４により生成または更新された変換情報１０７を用いて、解析部１０２が解析した第１依存関係情報１１２を第２依存関係情報１１３に変換する。次のステップＳ１０７で、並列化部１０６は、変換部１０５が変換した第２依存関係情報１１３を用いて、同期を挿入した並列プログラム１１６を生成する。
【００１１】
以下の説明では、並列化装置１０の各機能ブロックを図１の順番で直列に接続した最も基本的な形態での各機能ブロックの説明を行う。本第１の実施形態は、この例に限定されない。例えば、複数の機能ブロックが協調しながら動作を行う構成、一部の機能ブロックの順番を入れ替える構成、ある機能ブロックを複数の機能ブロックに分割する構成、これら３つの形態を組み合わせる構成などで本第１の実施形態を実施することもできる。また、機能ブロックを複数のモジュールに分割して実施することもできる。
【００１２】
並列化装置１０の各部の処理について、より詳細に説明する。入力部１０１は、プログラムコード１１１とタスク境界情報１１０とを並列化装置１０に対して入力する。図３は、プログラムコード１１１の例を、図４は、タスク境界情報１１０の例をそれぞれ示す。
【００１３】
図３に例示されるプログラムコード１１１は、プログラミング言語として一般的に用いられるＣ言語を模した疑似言語で記述されており、各行の先頭の数字およびコロン「：」は、説明のため各行を特定するために付した行番号である。また、図３の例では、プログラムコード１１１は、データアクセス表現“ａ”、“ｂ”、“ｃ”、“ｓ”、“ｔ”、“ｕ”、“ｖ”、“ｐ”、“ｑ”、“＊ｐ”および“＊ｑ”と、代入演算子“＝”と、加算演算子“＋”とを含んでいる。データアクセス表現は、直接アクセス表現と間接アクセス表現とに大別される。以下の例では、間接アクセス表現に対してアスタリスク“＊”を付して、直接アクセス表現と区別する。
【００１４】
直接アクセス表現とは、動的なデータを利用せずにアクセスするデータの位置を決定するデータアクセス表現である。例えば、直接アクセス表現“ａ”は、動的なデータを利用せずにデータａにアクセスする。一方、間接アクセス表現とは、動的なデータを利用して、アクセスするデータの位置を決定するデータアクセス表現である。例えば、第５行目に記述される間接アクセス表現“＊ｐ”は、動的なデータｐを利用して、動的なデータｐが指し示す位置にあるデータにアクセスする。データｐが指し示す位置にあるデータとは、例えば、そのデータのメモリアドレスをデータｐが保持しているということである。
【００１５】
直接アクセス表現では、アクセスするデータを必ず特定可能であるのに対して、間接アクセス表現では、アクセスするデータを特定できない場合がある。そのため、間接アクセス表現“＊ｐ”がアクセスするデータを、抽象的にデータ＊ｐと表現することがある。
【００１６】
図４に例示されるタスク境界情報１１０は、図３に示したプログラムコード１１１中の第６行目および第１０行目に記述されるラベル“ｌａｂｅｌ＿２”および“ｌａｂｅｌ＿３”がタスク境界であることを示している。図５は、図４のタスク境界情報１１０を利用して図３のプログラムコード１１１をタスクに分割した場合の例を概念的に示す。この例では、タスク境界情報１１０により、プログラムコード１１１による処理が、タスク２１１とタスク２１２とタスク２１３とに分割されている。なお、タスクは、コンピュータ（ＣＰＵ：Central  Processing  Unit）が処理を実行する単位であり、１以上の処理を含む。タスク境界とは、プログラムコードが表現するデータアクセスなどの処理をタスクに分割する境界を示す情報である。
【００１７】
図３のプログラムコード１１１では、タスク２１１、タスク２１２、タスク２１３の順序で処理が行われる。図示とその説明の都合上、任意の異なる２つのタスクの境界にはタスク境界が存在するとして以下の説明を行う。図５の例では、タスク２１１とタスク２１２の境界であるタスク境界２０１と、タスク２１２とタスク２１３の境界であるタスク境界２０２と、タスク２１１とタスク２１３の境界であるタスク境界２０３とが存在している。図４においてタスク境界２０３に対応する情報が含まれていないように、タスク境界情報に全てのタスク境界の情報を含める必要はなく、暗黙的なタスク境界が存在してもよい。
【００１８】
なお、タスク境界情報１１０は、例えば所定のＵＩ(User  Interface)からユーザ（開発者）により入力される。これに限らず、プログラムコード１１１を解析し、解析結果に基づきタスク境界情報１１０を自動的に発生させ入力するようにしてもよい。
【００１９】
解析部１０２は、プログラムコード１１１を解析して依存関係情報を出力する。図６は、図３のプログラムコード１１１を解析した依存関係情報の例を示す。なお、上述したように、解析部１０２から出力される依存関係情報を、第１依存関係情報１１２と呼ぶ。
【００２０】
解析部１０２は、プログラムコード１１１に記述される各データに対して、そのデータにアクセスする可能性があるデータアクセス表現をノードとし、正しい実行結果を得るために守らなければならないデータアクセスの順序を、ノード間のエッジで表現する依存グラフを生成する。ここで、あるデータにアクセスしないとは解析されていない場合に、そのデータにアクセスする可能性があると解析される。
【００２１】
ノードとは、１のデータに対するデータアクセスに対応し、当該データアクセスが確実であるか不確実であるかを示すアクセス確実性フラグを持つ情報であり、１のデータに対してＮ個（Ｎは１以上の整数）が存在する。エッジとは、正しい実行結果を得るために守らなければならないデータアクセスの順序制約を表現する情報である。
【００２２】
図６において、プログラムコード１１１におけるデータａ、データｂおよびデータｃの依存グラフは、それぞれ依存グラフ３０１ａ、依存グラフ３０２ｂおよび依存グラフ３０３ｃとして示される。説明を簡略化するため、その他のデータの依存関係は、タスク間の依存関係とならないと仮定する。図６および以下の同様の図において、各ノード内の文字は、「Ｗ」であれば書き込みアクセス、「Ｒ」であれば読み込みアクセスを示す。
【００２３】
図において、書き込みの後の読み込みである真依存、読み込みの後の書き込みである逆依存、書き込みの後の書き込みである出力依存をエッジとして示している。例えば、第１行目の“ａ＝０”と第４行目の“ａ＝２”は、データａにそれぞれ値「０」と値「２」を代入するという意味であり、依存グラフ３０１ａにおいて、書き込み後の書き込みである出力依存が、“ａ＝０”に対応するノードと、“ａ＝２”に対応するノードとを接続するエッジとして表されている。
【００２４】
解析部１０２は、依存グラフの各ノードがアクセスするデータを解析して、各ノードにアクセス確実性フラグを設定する。アクセス確実性フラグは、値が「確実」を示す値および「不確実」を示す値の何れか一方に設定される。アクセス確実性フラグに「確実」を示す値が設定されたノードを確実アクセスノード、アクセス確実性フラグに「不確実」を示す値が設定されたノードを不確実アクセスノードと呼ぶ。図６および以下の同様の図において、確実アクセスノードを「●（黒丸）」で示し、不確実アクセスノードを「○（白丸）」で示している。また、以下では、アクセス確実性フラグに「確実」または「不確実」を示す値を設定することを、「アクセス確実性フラグの値を「確実」（または「不確実」）に設定する」と記述する。
【００２５】
解析部１０２は、解析しているプログラムコード１１１への少なくとも１つの外部入力値において、ノードが対応するデータにアクセスすると見做せる場合には、当該ノードのアクセス確実性フラグの値を「確実」に設定し、見做せない場合には、当該ノードのアクセス確実性フラグの値を「不確実」に設定する。なお、外部入力とは、プログラムコード１１１の外部から値を入力するデータであり、外部入力値とは、外部入力で入力されるデータの値である。図３のプログラムコード１１１の例では、外部入力は、第５行目および第８行目にそれぞれ記述されるデータｐおよびデータｑである。
【００２６】
直接アクセス表現は、外部入力値に関わらずアクセスするデータを特定可能であるため、アクセス確実性フラグの値を「確実」に設定する。間接アクセス表現は、アクセス先の決定に利用する動的なデータの解析結果に応じて、アクセス確実性フラグを設定する。図６の例では、間接アクセス表現に対応するノードのアクセス確実性フラグは、アクセス先の決定に利用する動的なデータｐおよびデータｑが任意の値を取るのか、限られた値を取るのかを判断できない。そのため、データａ、データｂおよびデータｃそれぞれにおいて、データアクセス表現“＊ｐ”に対応するノードと、データアクセス表現“＊ｑ”に対応するノードは、各々不確実アクセスノードとして生成されている。
【００２７】
一方、間接アクセス表現のアクセス先の決定に利用する動的なデータを解析できた場合には、当該間接アクセス表現に対応するノードを確実アクセスノードとしたり、当該ノードを生成しないことが可能となる。データ毎に依存グラフを構築するため、１つの間接アクセス表現に対して、データ毎にノードの種類や有無が異なる可能性がある。
【００２８】
並列化装置１０は、ユーザが生成部１０３と指示部１０４とを利用してインタラクティブに出す指示に応じて、変換部１０５が利用する変換情報１０７を生成する。ここで、ユーザとは、並列化装置１０を利用する人または他の装置である。例えば、ユーザは、並列プログラムを開発する開発者や、データのデータアクセスにおける依存の有無を自動的に決定する依存有無決定装置である。
【００２９】
生成部１０３は、解析部１０２が生成した第１依存関係情報１１２と入力部１０１から入力したタスク境界情報１１０とから、提示情報１１４を生成する。図７、図８および図９は、それぞれデータａ、データｂおよびデータｃについて、第１依存関係情報１１２とタスク境界情報１１０とを組み合わせて示した例である。すなわち、図７〜図９は、それぞれ図６で示したデータａ、データｂおよびデータｃの依存グラフ３０１ａ、３０２ｂおよび３０３ｃに対してタスク境界情報１１０を加味して表現したものである。
【００３０】
図７の例では、データａに関する依存グラフ３０１ａにおいて、プログラムコード１１１における第１行目の“ａ＝０”のデータアクセス表現“ａ”、第４行目の“ａ＝２”のデータアクセス表現“ａ”、第５行目の“ｓ＝＊ｐ”のデータアクセス表現“＊ｐ”、第８行目の“＊ｑ＝４”のデータアクセス表現“＊ｑ”、第１１行目の“ｔ＝ａ”のデータアクセス表現“ａ”、ならびに、第１３行目の“ｖ＝ａ＋ｃ”のデータアクセス表現“ａ”が、それぞれノード４０１ａ、４０２ａ、４０３ａ、４０４ａ、４０５ａおよび４０６ａとして示されている。
【００３１】
同様に、図８の例では、データｂに関する依存グラフ３０２ｂにおいて、プログラムコード１１１における第２行目の“ｂ＝１”のデータアクセス表現“ｂ”、第５行目の“ｓ＝＊ｐ”のデータアクセス表現“＊ｐ”、第８行目の“＊ｑ＝４”のデータアクセス表現“＊ｐ”、ならびに、第１２行目の“ｕ＝ｂ”のデータアクセス表現“ｂ”が、それぞれノード４１１ｂ、４１２ｂ、４１３ｂおよび４１４ｂとして示されている。
【００３２】
さらに、図９の例では、データｃに関する依存グラフ３０３ｃにおいて、プログラムコード１１１における第５行目の“ｓ＝＊ｐ”のデータアクセス表現“＊ｐ”、第７行目の“ｃ＝３”のデータアクセス表現“ｃ”、第８行目の“＊ｑ＝４”データアクセス表現“＊ｑ”、第９行目の“ｃ＝５”のデータアクセス表現ｃ、ならびに、第１３行目の“ｖ＝ａ＋ｃ”のデータアクセス表現“ｃ”が、それぞれノード４２１ｃ、４２２ｃ、４２３ｃ、４２４ｃおよび４２５ｃとして示されている。
【００３３】
生成部１０３は、全ての第１依存関係情報１１２を提示情報１１４に変換するのではなく、提示情報１１４に変換する第１依存関係情報１１２を限定する。これにより、ユーザは、容易若しくは高速に変換情報１０７を生成する指示を終えられるようにできる。
【００３４】
次に、提示情報１１４に変換する第１依存関係情報１１２を限定する方法について説明する。以下、タスク境界に跨るエッジをタスク境界エッジ、タスク境界エッジに接続されているノードをタスク境界ノードという。少なくとも１つの不確実アクセスノードが接続されているエッジを不確実エッジという。タスク境界エッジ且つ不確実エッジであるエッジを不確実タスク境界エッジという。
【００３５】
生成部１０３は、ユーザが簡単もしくは高速に指示を終えられるようにするため、少なくとも１つの不確実タスク境界エッジに接続されている少なくとも１つの不確実アクセスノードに関する提示情報１１４を生成する。少なくとも１つの不確実タスク境界エッジに接続されている少なくとも１つの不確実アクセスノードに対してユーザが順次指示を与えていけば、最小のユーザ指示で不確実タスク境界エッジを無くすことができる。
【００３６】
一方、不確実タスク境界エッジに接続されていない不確実アクセスノードへの指示は、当該不確実アクセスノードよりタスク境界に近いノードへの指示結果によっては無駄となる可能性がある。
【００３７】
生成部１０３が依存グラフ３０１ａに関する提示情報を生成する例について説明する。図７に示される依存グラフ３０１ａには、それぞれ不確実アクセスノードであるノード４０３ａおよび４０４ａが含まれており、タスク境界を跨ぎ、且つこれらノード４０３ａおよび４０４ａのうち少なくとも一方に接続されるタスク境界エッジとして、タスク境界２０１と交わる１つの不確実タスク境界エッジと、タスク境界２０２と交わる２つの不確実タスク境界エッジの、合計で３つの不確実タスク境界エッジが存在する。
【００３８】
図１０は、タスク境界２０１に跨る不確実タスク境界エッジのタスク境界ノードに関する情報を示す提示情報１１４の例を示す。図１０の例では、提示情報１１４により、不確実アクセスノードであるノード４０３ａおよび４０４ａと、これらノード４０３ａおよび４０４ａに接続される不確実タスク境界エッジ４５０とが提示されている。
【００３９】
なお、提示情報１１４は、例えば、並列化装置１０がプログラムとして動作する際のＯＳの描画ＡＰＩ(Application  Programming  Interface)から生成された表示情報である。例えば、提示情報１１４は、ディスプレイに表示される画像情報としてユーザに対して伝達される。提示情報１１４は、ファイルやメモリ上のデータとして伝達させることもできる。
【００４０】
上述したように、不確実タスク境界エッジに接続されている少なくとも１つの不確実アクセスノードに関する提示情報１１４を生成すればよい。そのため、図１０の例のように不確実タスク境界エッジ４５０の両側のノード４０３ａおよび４０４ａを提示せずに、例えば、ノード４０４ａを除外してノード４０３ａのみに関する提示情報１１４を生成してもよい。
【００４１】
生成部１０３は、不確実タスク境界エッジに対して直接的に接続されていないノードに関しても、タスク境界エッジに関与する可能性があるノードと確実に関与しないノードとを認識して、それぞれに異なる提示情報の生成方法を与えてもよい。
【００４２】
例えば、図７に示されるノード４０１ａや、図９に示されるノード４２３ｃは、タスク境界エッジに接続されることが無く、タスク境界エッジに関与しない。そのため、ノード４０１ａやノード４２３ｃを提示情報１１４に含めないようにしたり、ノード４０１ａやノード４２３ｃの表示色を他のノードの表示色とは異なる色にするなど、提示方法を変更するようにしてもよい。このように、タスク境界エッジに関与しないノードの提示方法を、タスク境界エッジに関与する可能性のあるノード提示方法と異ならせることで、ユーザが指示を与える上で有益な提示情報１１４を生成できる。
【００４３】
タスク境界エッジに接続されることが無いノードを生成部１０３が検出する一例の方法について説明する。生成部１０３は、全ての確実書き込みノードを特定する。確実書き込みノードとは、書き込みを行う確実アクセスノードである。図７の例では、ノード４０１ａおよびノード４０２ａが確実書き込みノードである。
【００４４】
生成部１０３は、タスクＴ1に含まれるあるノードＮから他のタスクＴ2に侵入する少なくとも１つの経路に、少なくとも１つの特定した確実書き込みノードが存在する場合に、ノードＮがタスクＴ1およびタスクＴ2のタスク境界エッジには接続されることはないと判定する。
【００４５】
例えば、図７の例では、ノード４０１ａからノード４０２ａとノード４０３ａとを経由してタスク２１２へ到達する経路には、特定した確実書き込みノード４０２ａが存在する。そのため、ノード４０１ａは、タスク境界２０１のタスク境界エッジに接続されない。同様にして、ノード４０１ａは、図７の依存グラフ３０１ａに含まれる全てのタスク境界に接続されないと判定できる。また、図９に例示されるノード４２３ｃについても、依存グラフ３０３ｃに含まれる全てのタスク境界に接続されないと判定できる。
【００４６】
ここで、経路とは、同じ方向を向いたエッジのみを経由しながら到達可能な経路をいう。例えば、図９の例では、ノード４２５ｃからノード４２４ｃ、ノード４２３ｃおよびノード４２２ｃを経由してノード４２１ｃに向かうには、同じ方向を向いたエッジのみを経由して到達可能であるため、ここでの経路に該当する。一方、図７に例示されるノード４０３ａからノード４０２ａを経由してノード４０４ａに向かうには、ノード４０３ａからノード４０２ａに向かい、その後、ノード４０２ａからノード４０３ａを介してノード４０４ａに向かうことになる。この場合、ノード４０３ａからノード４０２ａに向かうエッジと、ノード４０２ａからノード４０３ａを経由してノード４０４ａに向かうエッジとが異なる方向を向いているため、ここでの経路には含めない。
【００４７】
上述した、生成部１０３がタスク境界エッジに接続されることが無いノードを検出する方法は、２つのスレッドとその間のタスク境界に注目した場合、次のように考えることができる。すなわち、この方法は、先ず、タスク境界エッジに隣接する一方のタスク方向に対して、タスク境界距離が最小となる確実書き込みノードを特定する。そして、第１依存関係情報１１２（依存グラフ）に含まれる各ノードからタスク境界エッジへの少なくとも１つの経路上に少なくとも１つの特定した確実書き込みノードが存在するか否かを判定する。若し、存在しないと判定したら、特定されたノードがタスク境界エッジに接続される可能性があると判定する。一方、存在すると判定したら、当該ノードがタスク境界エッジに接続されないと判定する。
【００４８】
ここで、１つのノード若しくはエッジと、１つのタスク境界との間の距離であるタスク境界距離を、当該１つのノード若しくはエッジから当該１つのタスク境界に到達するまでに経由する最小のノード数と定義する。１つのノードに対して、タスク境界距離は、タスク境界の数だけ定義される。例えば、図９の例では、ノード４２２ｃからタスク境界２０１までのタスク境界距離は「０」であり、ノード４２２ｃからタスク境界２０２までのタスク境界距離は「２」である。
【００４９】
指示部１０４は、依存有無情報１１５を入力して変換情報１０７を生成する。依存有無情報１１５とは、依存グラフの要素であるノード若しくはエッジの有無を示す情報である。変換情報１０７とは、変換部１０５が第１依存関係情報１１２を第２依存関係情報１１３に変換する方法を示した情報である。
【００５０】
図１１は、依存有無情報の例を示す。依存有無情報１１５は、あるデータに関する依存グラフにおいて、不確実アクセスノード（ノードＡとする）から当該データに対するアクセスの有無を示す情報である。より具体的には、図１１に例示される依存有無情報１１５の「ａｃｃｅｓｓ  ノードＡ」は、図１０を参照し、依存グラフ３０１ａの要素であるノードＡすなわちノード４０３ａによる、当該依存グラフ３０１ａの対象データであるデータａへのアクセスがあることを示している。
【００５１】
指示部１０４は、依存有無情報１１５から、依存有無情報１１５に含まれるノードのアクセス確実性フラグの値を反転させるための変換情報１０７を生成する。図１２は、図１１に例示した依存有無情報１１５から生成した変換情報１０７の例を示す。図１２の例では、図１１に例示する依存有無情報１１５からノードＡ（ノード４０３ａ）のアクセス確実性フラグの値を反転させる変換情報１０７の「ｃｈａｎｇｅ  ｆｌａｇ  ノードＡ」を生成する。例えば、ユーザは、指示部１０４が有するＵＩを操作して、提示情報１１４により提示された、タスク境界２０１に跨る不確実タスク境界エッジのタスク境界ノードに関する情報に応じて、アクセス確実性フラグの値を反転させるノードを選択する。
【００５２】
なお、図１１および図１２の例では、依存有無情報１１５と変換情報１０７とが異なる形式の情報となっているが、これはこの例に限定されず、依存有無情報１１５と変換情報１０７とが同一の形式の情報であってもよい。
【００５３】
ユーザは、生成部１０３と指示部１０４とにより、指示部１０４への依存有無情報１１５の入力が終了するまで、並列化装置１０とのやり取りを行う。すなわち、指示部１０４により生成された変換情報１０７は、生成部１０３に入力される。生成部１０３は、入力された変換情報１０７を提示情報１１４に反映させ、提示情報１１４を更新する。図１３は、図１０に例示した提示情報１１４に対して図１２に例示した変換情報１０７を反映させて更新した、新たな提示情報１１４の例を示す。この例では、図１２に例示した変換情報１０７がノードＡ（ノード４０３ａ）のアクセス確実性フラグの値を反転させることを示しているため、図１３に例示される新たな提示情報１１４におけるノードＡ（ノード４０３ａ）が、不確実アクセスノードから確実アクセスノードに更新されている。
【００５４】
さらに、図１４に例示されるように、指示部１０４に対して、ノードＢ（ノード４０４ａ）がデータａにアクセスしないことを示す依存有無情報１１５の「ｎｏ  ａｃｃｅｓｓ  ノードＢ」を入力したとする。指示部１０４は、入力された依存有無情報１１５に従い、図１５に例示されるように、図１２に例示した変換情報１０７に対してノードＢ（ノード４０４ａ）を削除するコマンドを追加して、変換情報１０７を更新する。更新された変換情報１０７は、生成部１０３に入力される。生成部１０３は、入力された変換情報１０７を提示情報１１４に反映させ、提示情報１１４を更新する。
【００５５】
この図１５に例示する提示情報１１４の更新により、データａに関する不確実タスク境界ノードが無くなる。そのため、他のデータ（例えばデータｂ）に関する変換情報１０７および提示情報１１４の生成を行う。ユーザは、提示情報１１４に応じて順次依存有無情報１１５を入力していく。全てのデータ（図１６の例では、データａ、データｂおよびデータｃ）の依存グラフについて依存有無情報１１５が入力され変換情報１０７の更新が完了すると、依存有無情報１１５の入力が終了したと判定され、ユーザとのやりとりが終了される。
【００５６】
図１６は、データａ、データｂおよびデータｃに対して依存有無情報１１５が入力され、更新が完了された変換情報１０７の例を示す。
【００５７】
変換部１０５は、指示部１０４が生成した変換情報１０７を利用して、第１依存関係情報１１２を第２依存関係情報１１３に変換する。すなわち、変換情報１０７に従い、第１依存関係情報１１２を、１のデータに対するデータアクセスに対応するＭ（０≦Ｍ≦Ｎ）個のノードと、当該ノード間の第２の依存関係を示すエッジとを含む第２依存関係情報１１３に変換する。
【００５８】
変換情報１０７において、「ｃｈａｎｇｅ  ｆｌａｇ」に示されるノードは、アクセス確実性フラグの値が反転される。例えば、アクセス確実性フラグの値が「不確実」を示している場合は、「ｃｈａｎｇｅ  ｆｌａｇ」により当該値が「確実」に変更される。また、「ｄｅｌｅｔｅ」に示されるノードは、削除される。図１６の例では、変換情報１０７において、データａに関し、ノードＡ（ノード４０３ａ）のアクセス確実性フラグの値の反転と、ノードＢ（ノード４０４ａ）の削除とが示される。データｂに関し、ノードＣ（ノード４１２ｂ）のアクセス確実性フラグの値の反転と、ノードＤ（ノード４１３ｂ）の削除とが示される。また、データｃに関し、ノードＥ（ノード４２１ｃ）の削除が示される。
【００５９】
図１７、図１８および図１９は、図７、図８および図９で示した第１依存関係情報１１２に基づく依存グラフ３０１ａ、３０２ｂおよび３０３ｃを、図１６に示した変換情報１０７を用いてそれぞれ第２依存関係情報１１３に基づく依存グラフ３１１ａ、３１２ｂおよび３１３ｃに変換した例を示す。変換部１０５による変換処理によって、図１６の変換情報１０７において「ｃｈａｎｇｅ  ｆｌａｇ」と指示された不確実アクセスノードが確実アクセスノードに変換され、「ｄｅｌｅｔｅ」と指示されたノードが削除される。削除されたノードの前後の依存関係は、削除されずに残ったノードで正しく依存関係が再構築されるように変換される。
【００６０】
図１７を参照し、データａに関し、図１６の変換情報１０７における「ｃｈａｎｇｅ  ｆｌａｇ  ノードＡ」の記述に従い、図７のノード４０３ａのアクセス確実性フラグの値が反転されて、「確実」を示す値とされる（ノード５０３ａ）。また、「ｄｅｌｅｔｅ  ノードＢ」の記述に従い、図７のノード４０４ａが削除される（図１７のタスク２１２参照）。ノード４０３ａのアクセス確実性フラグの値の反転と、ノード４０４ａの削除とに伴い、ノード４０３ａおよびノード４０４ａに係るエッジ情報も変更される。
【００６１】
図１８を参照し、データｂに関し、図１６の変換情報１０７における「ｃｈａｎｇｅ  ｆｌａｇ  ノードＣ」の記述に従い、図８のノード４１２ｂのアクセス確実性フラグの値が反転されて、「確実」を示す値とされる（ノード５１２ｂ）。また、「ｄｅｌｅｔｅ  ノードＤ」の記述に従い、図８のノード４１３ｂが削除される（図１８のタスク２１２参照）。ノード４１２ｂのアクセス確実性フラグの値の反転と、ノード４１３ｂの削除とに伴い、ノード４１２ｂおよびノード４１３ｂに係るエッジ情報も変更される。
【００６２】
図１９を参照し、データｃに関し、図１６の変換情報１０７における「ｄｅｌｅｔｅ  ノードＥ」の記述に従い、図９のノード４２１ｃが削除される（図１９のタスク２１１参照）と共に、ノード４２１ｃに係るエッジ情報も変更される。
【００６３】
並列化部１０６は、上述のようにして変換情報１０７に基づき変換部１０５が変換した後の第２依存関係情報１１３を利用して同期の位置を決定し、同期を挿入した並列プログラム１１６を生成する。
【００６４】
並列化部１０６は、第２依存関係情報１１３に含まれるタスク境界エッジを抽出し、実行時に守らなければならない実行順序制約を解析する。図２０は、上述した図１７、図１８および図１９に示されるタスク境界エッジを図３のプログラムコード１１１に対応付けた例を示す。
【００６５】
タスク境界エッジ６０１ａ、６０２ａおよび６０３ｂは、タスク２１１とタスク２１３との間のエッジである。タスク境界エッジ６０１ａは、ノード５０２ａとノード５０５ａとをノード５０２ａからノード５０５ａに向けて接続し、タスク境界エッジ６０２ａは、ノード５０２ａとノード５０６ａとをノード５０２ａからノード５０６ａに向けて接続する。タスク境界エッジ６０３ｂは、ノード５１１ｂとノード５１４ｂとをノード５１１ｂからノード５１４ｂに向けて接続する。また、タスク境界エッジ６０４ｃは、タスク２１２とタスク２１３との間のエッジである。タスク境界エッジ６０４ｃは、ノード５２４ｃとノード５２５ｃとをノード５２４ｃからノード５２５ｃに向けて接続する。
【００６６】
実行順序制約は、タスク境界エッジの方向に従う。タスク２１１とタスク２１２との間にはタスク境界エッジが存在しないため、実行順序制約がない。タスク２１１とタスク２１３との間には、タスク境界エッジ６０１ａ、６０２ａおよび６０３ｂの順序制約がある。タスク２１２とタスク２１３の間には、タスク境界エッジ６０４ｃの順序制約がある。正しい計算結果を得るためには、これらの順序制約を守る必要がある。
【００６７】
並列化部１０６は、出力される同期の最適化を行ってもよい。例えば、必要最小限の同期を挿入する方法が知られている。実行順序制約には包含関係があり、ある実行順序制約を満たせば他の実行順序制約も満たされる場合がある。図２０の例では、タスク境界エッジ６０１ａが表す実行順序制約を守れば、タスク境界エッジ６０２ａとタスク境界エッジ６０３ｂが表す実行順序制約も守られる。そのため、図２１に例示するように、必要最小限のタスク間の実行順序制約は、タスク境界エッジ６０１ａおよび６０４ｃのみとなる。
【００６８】
このような実行順序制約の包含関係を検出する包含関係検出アルゴリズムの例について説明する。タスクＡおよびタスクＢ、ならびに、タスクＡからタスクＢに向かう２つの依存関係Ｄ1、Ｄ2を考える。ここで、２つの依存関係Ｄ1およびＤ2の始点と終点を比較したとき、依存関係Ｄ1の始点の実行順序が依存関係Ｄ2の始点の実行順序と同じか若しくは遅く、依存関係Ｄ1の終点の実行順序が依存関係Ｄ2の終点の実行順序と同じか若しくは早い場合、依存関係Ｄ1は依存関係Ｄ2を包含する。そのため、依存関係Ｄ1の依存関係が示す実行順序制約を満たせば、依存関係Ｄ2の依存関係が示す実行順序制約も満たされる。
【００６９】
これは、図２０で示したような簡単な例の場合の包含関係検出アルゴリズムであり、タスクが後述する図２４のように複数個所に分かれている場合や、Ｃ言語のローカル変数を考慮する場合など、並列化装置がサポートする入出力情報に応じた包含関係検出アルゴリズムが必要となる。
【００７０】
並列化部１０６は、タスク境界エッジが示す実行順序制約を満たす同期を挿入した並列プログラム１１６を出力する。図２２は、図２１に示した各タスク境界エッジから必要最小限のタスク境界エッジを抽出して生成した並列プログラム１１６の例を示す。実行順序制約をトークン(TOKID＿x：但しID＿xは識別子)の受け渡しで表現しており、タスク境界エッジ６０１ａとトークン７０１とが対応し、タスク境界エッジ６０４ｃとトークン７０２とが対応している。トークンが同じ識別子を持つコマンドput＿tokenとコマンドget＿tokenが対応しており、対応したコマンドput＿tokenが実行された後にコマンドget＿tokenの実行を抜けることが保証される。
【００７１】
本第１の実施形態によれば、生成部１０３と指示部１０４とにおいて、ユーザが全ての情報を見て必要な同期の位置を判断するのではなく、ユーザが個々の情報を見て判断可能な依存関係情報を与えることにより、質の良い同期を容易に挿入可能となる。
【００７２】
図２３は、本第１の実施形態による並列化装置１０を利用しない場合の並列プログラムの例を示す。例えば、並列化装置１０における生成部１０３、指示部１０４および変換部１０５を用いずに、解析部１０２による解析結果（第１依存関係情報１１２）を直接的に並列化部１０６が利用した場合について考える。この場合、図７〜図９に示した全てのタスク境界エッジの実行順序関係を満たす必要がある。そのため、図５に示したプログラムコードから、図２３に示される、トークン７１０、７１１および７１２を用いた並列プログラムが生成される。
【００７３】
この並列プログラムは、図２２に示した本第１の実施形態による並列プログラム１１６に比べ、並列実行可能な区間が少ない。すなわち、図２２の並列プログラム１１６は、図中に示されるパートＲおよびパートＳ、パートＴおよびパートＵ、パートＴおよびパートＳ、ならびに、パートＳおよびパートＵがそれぞれ並列実行可能である。さらに、パートＴと、タスク２１３内の「ｖ＝ａ＋ｃ」とが並列実行可能である。これに対して、図２３の、本第１の実施形態によらない並列プログラムは、図中に示されるパートＶおよびパートＷのみが並列実行可能となる。したがって、図２２の本第１の実施形態による並列プログラム１１６の方が、本第１の実施形態によらない並列プログラムよりも、並列化の点で高性能であるといえる。
【００７４】
本第１の実施形態は、上述した例に限定されない。プログラムコード１１１は、例えば、Ｃ言語やＪａｖａ（登録商標）のようなプログラミング言語で書かれたテキストデータが格納されたテキストファイルとして提供される。並列化装置１０に独自のプログラミング言語で書かれたテキストデータによるファイルとして提供されてもよい。また、プログラムコード１１１は、人が見て構造を容易に理解できるテキストデータである必要はなく、バイナリデータが格納されたバイナリファイルとして提供することもできる。
【００７５】
また、プログラムコード１１１は、１つのファイルに全ての情報が入っている必要はなく、分割されて複数のファイルに格納してあってもよい。また、プログラムコード１１１は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、Ｃ言語の構文解析装置が生成したメモリ上のデータである構文木をプログラムコード１１１として入力してもよい。プログラムコード１１１は、必要な処理を全て記述してある必要はなく、大きなプログラムコードの一部分であってもよい。
【００７６】
タスク境界情報１１０は、例えば、プログラムコード１１１上のタスク境界位置を示したテキストデータが格納されたテキストファイルとして提供される。また、タスク境界情報１１０は、人が見て構造を容易に理解できるテキストデータによるファイルである必要はなく、バイナリデータが格納されたバイナリファイルであってもよい。
【００７７】
また、タスク境界情報１１０は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、ＧＵＩ(Graphical  User  Interface)を利用したタスク境界位置指定装置を用意し、このタスク境界位置指定装置を用いてタスク境界情報１１０を作成することが考えられる。この場合、例えばタスク境界位置指定装置によりプログラムコード１１１を画面に表示させ、この表示に従いマウスなどのポインティングデバイスでタスク境界に指定したい位置を指定すると、指定した位置をタスク境界としてメモリ上に出力するようにできる。また、タスク境界情報１１０は、人が指定する必要はなく、別の装置がプログラムコード１１１を解析して出力したものでもよい。例えば、タスク境界情報生成装置を利用して、図３にあるようなラベルｌａｂｅｌ＿１、ｌａｂｅｌ＿２、ｌａｂｅｌ＿３をタスク境界と認識して、その位置をメモリ上に出力したものでもよい。例えば、Ｃ言語で書かれたプログラムコード１１１を解析してループの位置を探索し、ループ回転数の半分の位置にタスク境界があると認識して、メモリ上に出力したものでもよい。
【００７８】
プログラムコード１１１およびタスク境界情報１１０は、１つのデータとして纏められていてもよい。例えば、プログラムコード１１１の一部分をラベル付き中括弧｛｝で括っており、その中括弧によりタスクを分割している例では、プログラムコード１１１とタスク境界情報１１０とが纏められていることになる。
【００７９】
タスクは、プログラムコード１１１が表現する処理の一部分である。１つのタスクに、連続しない複数の処理が含まれていてもよい。例えば、図５の例では、タスク２１１とタスク２１３とが異なるタスクとされているが、これに限らず、図２４に例示されるように、タスク２１１とタスク２１３とを１つのタスク２１４としてもよい。タスク２１１とタスク２１３とが１つのタスク２１４とされている場合、タスク２１１とタスク２１３とを並列実行することができない。この場合、タスク２１１とタスク２１３との間の依存を考慮する必要がないため、タスク２１４の前半部分とタスク２１２との境界であるタスク境界２０１、ならびに、タスク２１２とタスク２１４の後半部分との境界であるタスク境界２０２がそれぞれプログラムコード１１１のタスク境界となる。
【００８０】
プログラムコード１１１もしくはタスク境界情報１１０は、タスクの親子関係情報を含んでいてもよい。例えば、前処理とループと後処理とを含むプログラムコード１１１のループ部分のみを並列化する場合、前処理と後処理とを含む親タスクからループを並列実行する子タスクを起動することになる。並列化部１０６は、並列化を行う子タスク間の依存関係のみを考慮して、親タスクと子タスクとの間の依存関係を最適化しなくてもよいし、親タスクと子タスクとの間の依存関係を考慮して最適化してもよい。親タスクと子タスクとの二階層ではなく、さらに子タスクから孫タスクを起動するなど、親子関係は任意の階層数で構成することができる。
【００８１】
タスク境界は、プログラムコード１１１を分割するのではなく、プログラムコード１１１が表現する処理を分割する。図５の例のように、プログラムコード１１１の分割とプログラムコード１１１が表現する処理の分割とが等価になる例もある一方で、これらが等価にはならない場合も存在する。例えば、プログラムコード１１１に対してＣ言語のループが含まれると、プログラムコード１１１の分割とプログラムコード１１１が表現する処理の分割とが等価ではなくなる。Ｃ言語で書かれたループの内部は、プログラムコード１１１上では１回転分の処理しか示していないが、実際は、複数回転分の処理になる可能性がある。そのため、ループの回転途中をタスク境界と指定するようにしてもよい。例えば、ループが１００回転であるならば５０回転目の終了時をタスク境界とすることが考えられる。このような指定を行うことによって、配列を利用したデータ分割並列化を実現できる。
【００８２】
タスク境界は、各データアクセスが所属しているタスクを特定できる情報であれば、形式は問わない。例えば、各データアクセスが所属するタスクの情報を保持しておくことにより、所属しているタスクが切り替わる部分をタスク境界エッジと見做すことができる。
【００８３】
データアクセス表現には、様々な種類が存在する。図３の例で利用したデータアクセス表現以外にも、例えば、Ｃ言語の関数コールもデータアクセス表現の一種になり得る。関数ｆ()の内部でデータａとデータｂとにアクセスしている場合、関数コールｆ()をデータａとデータｂとのデータアクセス表現と見做してもよいし、関数コールｆ()をデータアクセス表現と見做さずに、関数中のデータアクセス表現を直接利用してもよい。関数コールｆ()をデータａとデータｂとのデータアクセス表現と見做すように、１つのデータアクセス表現が複数のデータにアクセスすることがあってもよい。
【００８４】
直接アクセス表現と間接アクセス表現との違いは、プログラムコード１１１の種類によって異なる。図３の例では、データアクセス表現“ａ”を直接アクセス表現に分類したが、これはこの例に限らず、例えばＣ++言語では、変数ａの型定義によっては、図３におけるデータアクセス表現“ａ”が間接アクセス表現である可能性もある。
【００８５】
データアクセス表現を構成する識別子とアクセスするデータとは、必ずしも１対１の対応関係になっている必要はない。図３の例では、データアクセス表現“ａ”がデータａにアクセスするとしたが、例えば、Ｃ言語ではこのような対応関係にならない。Ｃ言語では、データアクセス表現“ａ”がローカル変数ａにアクセスするのかグローバル変数ａにアクセスするのか、識別子“ａ”だけでは判定できない。そのため、プログラムコード１１１にある変数宣言も解析する必要がある。解析部１０２でＣ言語を解析可能としておけば、データアクセス表現“ａ”がローカル変数ａおよびグローバル変数ａの何れにアクセスするのか、動的なデータを利用せずに判別できるため、データアクセス表現とデータとを結びつけられる。
【００８６】
依存グラフは、上述では、図６に示したように、真依存、逆依存および出力依存をエッジとして表した構造で表現したが、これはこの例に限定されない。すなわち、依存グラフすなわち第１依存関係情報１１２は、その構造と等価な表現がされていればよく、さらにより厳しい依存を表現していてもよい。例えば、データの定義および利用の関係と、定義同士の順序関係とを表現する定義利用ツリーでは、逆依存を明示的にエッジとして示していないが、定義同士の順序関係から逆依存を導くことが可能である。例えば、プログラムコード１１１上におけるデータアクセスの順序関係を示した順序列では、読み込み同士の順序関係も表現されるが、順序関係から依存関係を導いて同期を挿入することもできるし、順序関係のみを利用して同期を挿入することもできる。
【００８７】
上述では、図６に示したように、直接アクセス表現がアクセスするデータのみについて依存グラフを構築したが、これはこの例に限定されない。すなわち、間接アクセス表現がアクセスするデータについての依存グラフを構築してもよい。例えば、図６では、第５行目のデータアクセス表現“＊ｐ”と第８行目データアクセス表現“＊ｑ”とが共に、プログラムコード上では表現されていないデータｚを読み書きする可能性がある。そのため、データ＊ｐやデータ＊ｑに関する依存グラフを構築することにより、データ＊ｐとデータ＊ｑがデータｚにアクセスしても、正しい並列プログラムを生成可能となる。
【００８８】
依存グラフのノードは、書き込みアクセスか読み込みアクセスかを示す情報を保持していなくてもよい。読み書きの情報が無い場合であっても、情報の提示方法や並列化の方法によって読み書きの情報を生成部１０３や並列化部１０６が利用できる場合がある。例えば、順序関係を依存関係情報として利用した場合がこれに該当する。
【００８９】
依存グラフのエッジは、ループ依存や制御依存を表現していてもよい。並列化部１０６は、ループ依存や制御依存を表現しているエッジを認識し、適切に同期を挿入するようにできる。
【００９０】
依存グラフは、少なくとも１のノードがアクセス確実性フラグを有していればよい。あるノードがアクセス確実性フラグを有していない場合、当該ノードを「確実」を示すアクセス確実性フラグを持つノードと同様に扱ったり、他の情報からアクセス確実性フラグの情報を補完することができる。例えば、アクセス確実性フラグを有していない読み込みアクセスのノードに関し、間接アクセス表現の依存グラフの読み込みアクセスのノードを、「不確実」を示すアクセス確実性フラグを持つノードであると見做して扱うことができる。この例では、依存有無情報として、間接アクセス表現の依存グラフの各読み込みアクセスのノードが対応するデータを入力することもできる。
【００９１】
解析部１０２は、解析できていない外部入力値に依存するアクセス確実性フラグを「確実」と設定してもよい。例えば、図２５に例示されるプログラムコード２００２は、図３に示したプログラムコード１１１に対して、第１行目の「データｚの値が「０」であるならば、データｐはデータａを指し示す」ｉｆ文を追加したものである。この図２５のプログラムコード２００２によれば、データｚの値が「０」の場合にデータアクセス表現“＊ｐ”がデータａにアクセスする。この場合、厳密には外部入力ｚの値が「０」を取り得ない可能性があるため、データａの依存関係情報においてデータアクセス表現“＊ｐ”に対応するノードのアクセス確実性フラグは「不確実」となる。しかしながら、図２５のプログラムコード２００２におけるｉｆ文は、データｚの値が「０」という条件が成立することがあるという前提で書かれたものと解釈してもよいため、データａのデータアクセス表現“＊ｐ”に対応するノードを確実アクセスノードとしてもよい。
【００９２】
図２６は、図２５のプログラムコード２００２に基づく第１依存関係情報１１２の例を示す。図２６の例では、図３のプログラムコード１１１に基づき図６に示した第１依存関係情報１１２におけるデータａの依存グラフ３０１ａに対し、依存グラフ３０１ａ’において、「ｓ＝＊ｐ」に対応するノードのアクセス確実性フラグが「確実」とされ、当該ノードが確実アクセスノードとされている。データｂおよびデータｃにそれぞれ対応する依存グラフ３０２ｂおよび３０３ｃについては、図６と同一である。
【００９３】
上述では、提示情報１１４と第１依存関係情報１１２とが同様の構造を表現するように説明したが、これはこの例に限定されず、これらが異なる構造を表現していてもよい。例えば、データａに関する第１依存関係情報１１２を、図２７に依存グラフ９０１ａとして例示されるように、データアクセスの順序列として保持しておき、提示情報１１４では、図２８に例示されるように、タスク毎に分割された依存グラフ３０００に変換してもよい。このように、提示情報１１４と第１依存関係情報１１２とで異なる構造を用いて表現したとき、指示部１０４は、提示情報１１４に対する依存有無情報１１５を受け取ってもよく、適切に依存有無情報１１５を変換情報１０７に変換する必要がある。
【００９４】
生成部１０３は、提示情報１１４に対し、第１依存関係情報１１２が保持する一部の情報を含めなくてもよい。例えば、第１依存関係情報１１２がノードの読み書き情報を保持していても、生成部１０３は、この読み書き情報を提示情報１１４に含めないことができる。例えば、依存有無情報１１５を与えることが可能な依存グラフの要素を限定することにより、アクセス確実性フラグを提示情報１１４に含めずに並列化装置１０として機能させることが可能である。より具体的には、提示情報１１４にノードの情報を直接的に含めなくても、図２９に例示されるように、プログラムコード３００１を提示情報１１４に含めて、プログラムコード３００１上のデータアクセス表現を結ぶエッジを提示情報１１４に含めることが考えられる。他の例として、提示情報１１４にエッジの情報を含めずに、ノードの情報だけを含めてもよい。
【００９５】
入力部１０１から提示情報１１４の補助情報を入力するようにし、生成部１０３は、この補助情報を提示情報１１４に含めてもよい。提示情報１１４に対する補助情報の例としては、クリティカルパス情報や実行パス情報が考えられる。
【００９６】
生成部１０３は、少なくとも１つのノードを特定し、第１依存関係情報１１２に含まれる各ノードからタスク境界エッジへの少なくとも１つの経路上に少なくとも１つの特定したノードが存在するか否かに応じて各ノードの提示情報１１４を生成する際に、特定するノードを、確実書き込みノードとは異なるノードとしてもよい。どのようなノードを特定するかに関わらず、特定したノードを境目として、提示情報１１４の生成方法を変更することができる。例えば、特定したノードからタスク境界側のノードのみを提示情報１１４に含めることができる。ノードを特定する代わりにエッジを特定しても、同様である。
【００９７】
生成部１０３が利用する、少なくとも１つのノードを特定して、第１依存関係情報１１２に含まれる各ノードからタスク境界までの少なくとも１つの経路上に特定したノードが存在するかに応じて提示情報１１４を生成する方法は、第１依存関係情報１１２を保持する際にどのようなデータ構造を用いるかによって、表現方法が異なり実質的に同じ処理を行う複数の方法が存在する。
【００９８】
例えば、第１依存関係情報１１２として順序関係を利用した場合、特定したノードと、各ノードおよびタスク境界の順序関係とに応じて提示情報１１４を生成する方法は、少なくとも１つの経路上に特定したノードが存在するか否かに応じて提示情報１１４を生成する方法と同じである。すなわち、あるノード、少なくとも１つの特定したノード、タスク境界、の順になっているならば、あるノードからタスク境界までの少なくとも１つの経路上に特定したノードが存在することになる。逆に、全ての特定したノード、あるノード、タスク境界、の順になっているならば、あるノードからタスク境界までの全ての経路上に特定したノードが存在しないことになる。
【００９９】
生成部１０３は、提示ポリシを利用して提示する情報と方法の選択を行い、提示情報１１４を生成してもよい。第１の例として、選択した１つの不確実タスク境界エッジに関する情報のみを提示するという提示ポリシが考えられる。第２の例として、データａに関する全ての依存関係情報のみ提示しないという提示ポリシが考えられる。第３の例として、タスク境界エッジを赤など強調色とし、その他のエッジを黒など非強調色とする提示ポリシが考えられる。第４の例として、指示部１０４から依存有無情報１１５を入力する必要があるノードもしくはエッジのみを提示するという提示ポリシが考えられる。第５の例として、タスク境界からの距離に応じてノードの大きさを変更するという提示ポリシが考えられる。これら第１〜第５の提示ポリシは、例であって、さらに他の提示ポリシを適用することもできるし、複数の提示ポリシを組み合わせてもよい。また、提示ポリシは、生成部１０３に組み込まれていてもよいし、外部から提示ポリシを入力できてもよい。
【０１００】
生成部１０３は、少なくとも１つのノードを特定し、第１依存関係情報１１２に含まれる各ノードからタスク境界エッジへの少なくとも１つの経路上に少なくとも１つの特定したノードが存在するか否かに応じて各ノードの提示情報１１４を生成する方法と、提示ポリシに応じて各ノードの提示情報を生成する方法とを組み合わせてもよい。例えば、特定したタスクよりも内側の不確実アクセスノードのみ提示情報１１４に含めるという方法が考えられる。
【０１０１】
上述の、特定したノードが存在するか否かは、ノードに対する処理を、人による判断が必要な部分と不必要な部分とを区別することに対応する。また、提示ポリシによって、人による判断が必要な部分と不必要な部分とを区別することで、より容易または高速な処理が可能となる。
【０１０２】
指示部１０４は、依存有無情報１１５として、ノードの依存有無情報ではなくエッジの依存有無情報を受け取ってもよい。例えば、図７の依存グラフ３０１ａにおいて、タスク境界２０２を跨る２本のエッジは存在しないという指示を与えることにより、ノード４０４ａによるデータａへのアクセスも存在しないということが解析できる。
【０１０３】
指示部１０４は、依存有無情報１１５として、複数のノードやエッジの依存有無情報を受け取ってもよい。例えば、指示部１０４は、図７の依存グラフ３０１ａにある全ての不確実アクセスノードは依存に関与しないという依存有無情報を受け取ることが可能である。この場合、依存グラフ３０１ａからノード４０３ａとノード４０４ａとを削除することができる。
【０１０４】
指示部１０４は、データとデータの対応情報を依存有無情報１１５として入力してもよい。例えば、「データ＊ｐとデータａは対応関係にない」という依存有無情報１１５を入力したとき、変換部１０５は、データａの依存グラフからデータアクセス表現“＊ｐ”のノードを取り除き、データ＊ｐの依存グラフからデータアクセス表現“ａ”のノードを取り除くことが可能である。
【０１０５】
指示部１０４では、全ての不確実タスク境界エッジに関する指示を受け取らない状態で依存有無情報１１５の入力を終了して、図２のステップＳ１０５に示される依存関係情報の変換処理に進むことができる。この場合、タスク境界エッジに不確実アクセスノードが接続される可能性がある。このような不確実アクセスノードをどのように扱うかは、装置全体の実装方針に依存する。例えば、不確実アクセスノードからデータのアクセスがあると見做すのであれば、不確実アクセスノードを確実アクセスノードに変換する。また例えば、不確実アクセスノードからデータのアクセスが無いと見做すのであれば、不確実アクセスノードを削除して依存関係情報を再構築する。但しこの場合には、正しく動作しない可能性があるため、警告を行うということもできる。
【０１０６】
並列プログラム１１６は、例えば実行可能ファイルである。これに限らず、並列プログラム１１６は、Ｃ言語やＪａｖａ（登録商標）のようなプログラミング言語で書かれたテキストデータが格納されたテキストファイルでもよいし、並列化装置１０独自のプログラミング言語で書かれたテキストデータが格納されたテキストファイルであってもよい。また、並列プログラム１１６は、１つのファイルに全ての情報が入っている必要はなく、分割されて複数のファイルに格納されていてもよい。さらに、並列プログラム１１６は、ファイルという形式である必要はなく、メモリ上のデータであってもよい。例えば、並列プログラム１１６は、実行時コンパイラが出力した、メモリ上の実行可能なデータでもよい。さらにまた、並列プログラム１１６は、必要な処理を全て記述してある必要はなく、他のオブジェクトファイルと組み合わせて用いられるオブジェクトファイルであってもよい。
【０１０７】
上述したように、本第１の実施形態によれば、プログラムコード１１１に含まれるデータアクセスに関する莫大な情報の中から、必要最小限の情報を選択して提示するようにしている。そのため、タスク間におけるデータアクセスの依存関係の変更指示を、ユーザが容易または高速に与えることができるようになり、低コストで高性能な並列プログラムを生成することが可能となる。
【０１０８】
また、本第１の実施形態によれば、必要最小限のノードを提示すると共に、当該ノードに対する周辺のノードの情報をさらに提示することにより、ユーザは、当該周辺のノードに関する情報も認識できるようになる。
【０１０９】
（第２の実施形態）
図３０は、本第２の実施形態による情報処理装置としての同期最適化装置２０の一例の構成を示す。なお、図３０において、上述の図１と共通する部分には同一の符号を付し、詳細な説明を省略する。同期最適化装置２０は、入力された並列プログラムに対して同期最適化処理を行い、同期が最適化された並列化プログラム１１６’を生成、出力する。同期最適化装置２０は、入力部５００１、解析部５００２、生成部５００３、指示部５００４、変換部５００５および再配置部５００６を備える。
【０１１０】
図３１は、第２の実施形態による同期最適化処理の例を概略的に示すフローチャートである。ステップＳ２０１で、入力部５００１に対して同期最適化対象のプログラムコード１１１’と、当該プログラムコード１１１’によるプログラムに対するタスク境界を示すタスク境界情報１１０’とが入力される。次のステップＳ２０２で、解析部５００２は、入力されたプログラムコード１１１’を解析してデータアクセスに関する依存関係情報（第１依存関係情報１１２）を得る。
【０１１１】
次のステップＳ２０３で、生成部５００３は、タスク境界情報１１０’と、解析部５００２が解析した第１依存関係情報１１２とに基づき、提示を行うための提示情報１１４を生成する。次のステップＳ２０４で、指示部５００４は、依存有無情報１１５の入力があったか否かを判定し、入力があったと判定した場合、処理をステップＳ２０５に移行させる。ステップＳ２０５で、指示部５００４は、入力された依存有無情報１１５に従い変換情報１０７を生成または更新し、処理をステップＳ２０３に戻す。生成部５００３は、依存有無情報１１５の入力に伴い更新された変更情報１０７を提示情報１１４に反映させる。
【０１１２】
一方、依存有無情報１１５の入力が終了し、ステップＳ２０４で依存有無情報１１５の入力が無いと判定されたら、処理がステップＳ２０６に移行される。ステップＳ２０６で、変換部５００５は、指示部５００４により生成または更新された変換情報１０７を用いて、解析部１０２が解析した第１依存関係情報１１２を第２依存関係情報１１３に変換する。次のステップＳ２０７で、再配置部５００６は、変換部５００５が変換した第２依存関係情報１１３を用いて、同期を再配置した並列プログラム１１６’を生成、出力する。
【０１１３】
以下の説明では、同期最適化装置２０の各機能ブロックを図３０に示した順番で直列に接続した最も基本的な形態での各機能ブロックの説明を行う。本第２の実施形態は、この例に限定されない。例えば、複数の機能ブロックが協調しながら動作を行う構成、一部の機能ブロックの順番を入れ替える構成、ある機能ブロックを複数の機能ブロックに分割する構成、これら３つの形態を組み合わせる構成などで本第２の実施形態を実施することもできる。また、機能ブロックを複数のモジュールに分割して実施することもできる。
【０１１４】
入力部５００１は、プログラムコード１１１’とタスク境界情報１１０’とを同期最適化装置２０に入力する。ここで、プログラムコード１１１’は、既に何らかの方法でタスク毎に分割され、各タスクより並列化されている並列プログラムである。したがって、プログラムコード１１１’は、タスク境界情報１１０’を含んでいる。
【０１１５】
図３２は、タスク境界情報１１０’を含むプログラムコード１１１’の例を示す。図３２に例示されるプログラムコード１１１’は、３つのタスクから構成される並列プログラムコードである。プログラムコード１１１’中のコード“task1”、コード“task2”およびコード“task3”と、これらのコードに付随する括弧“｛  …  ｝”がタスク境界情報１１０’を示しており、括弧内“｛  …  ｝”のコードが同じタスクに所属している。それぞれのタスクは、コマンドput＿tokenおよびコマンドget＿tokenを利用して同期を行いながら並列実行される。
【０１１６】
解析部５００２は、プログラムコード１１１’とタスク境界情報１１０’とを解析して第１依存関係情報１１２を出力する。
【０１１７】
解析部５００２は、プログラムコード１１１’中の同期情報を利用して、プログラムコード１１１’によるプログラムの実行順序制約を解析する。図３２の例では、同期情報は、コマンドput＿tokenおよびコマンドget＿tokenと、これらコマンドによって受け渡されるトークンを識別する識別子とを含む。コマンドput＿tokenは、トークンを渡すコマンドであり、コマンドget＿tokenは、コマンドを受け取るコマンドである。解析部５００２は、同じ識別子を持つコマンドput＿tokenとコマンドget＿tokenとが対応関係にあると解析する。
【０１１８】
図３３は、図３２のプログラムコード１１１’における同期情報の対応関係を解析した結果を模式的に示す。なお、図３３において、行番号は、元のプログラムコード１１１’における行番号を示している。プログラムコード１１１’は、コード“task1”で定義されるタスク９１２と、コード“task2”で定義されるタスク９１３と、コード“task3”で定義されるタスク９１１とに分割され、タスク９１１とタスク９１２との境界がタスク境界９０１、タスク９１２とタスク９１３との境界がタスク境界９０２、タスク９１１とタスク９１３との境界がタスク境界９０３とされている。
【０１１９】
ここで、同期コードを含まない連続した処理をブロックと呼ぶ。解析部５００２は、プログラムコード１１１’の各タスクから、ブロックを抽出する。図３３の例では、タスク９１１における第１７行〜第２０行が１つのブロック９２１とされる。タスク９１２における第３行目および第４行目、ならびに、第６行目が、それぞれ１つのブロック９２２および９２３とされる。また、タスク９１３における第１１行目および第１２行目、ならびに、第１４行目が、それぞれ１つのブロック９２４および９２５とされる。
【０１２０】
図３３において、対応関係にあるコマンドput＿tokenおよびコマンドget＿tokenが矢印で接続され、同期位置が示される。解析部５００２は、図３３の同期情報の対応関係から、図３２のプログラムコード１１１’における実行順序制約を解析する。
【０１２１】
図３４は、プログラムコード１１１’から解析された実行順序制約の例を示す。解析部５００２は、下記のルールに従って実行順序制約の解析を行う。
（１）同じタスクに含まれるブロックは、上から下（行番号が小さいブロックから、行番号が大きいブロック）の順に実行されるという実行順序制約がある。
（２）異なるタスクに含まれるブロックは、対応するコマンドput＿tokenの前の処理の次にコマンドget＿tokenの後の処理が実行されるという実行順序制約がある。
【０１２２】
例えば、タスク９１１に含まれるブロック９２１と、タスク９１２に含まれるブロック９２２とでは、ブロック９２１とブロック９２２とが異なるタスクに含まれている。そのため、ブロック９２１とブロック９２２との間には、上述した（２）の、識別子TOKID＿1を持つコマンドput＿tokenおよびコマンドget＿tokenによる実行順序制約が存在する。一方、それぞれタスク９１２に含まれるブロック９２２とブロック９２３とでは、ブロック９２２およびブロック９２３が同じタスクに含まれているため、上述した（１）の、タスク９１２の上から下の順による実行順序制約が存在する。
【０１２３】
このように、プログラムコード１１１’における実行順序制約の解析を行った結果、図３４に例示されるようなブロック間の実行順序制約が得られる。すなわち、ブロック９２１、ブロック９２２の順に実行され、ブロック９２２の実行後、ブロック９２３およびブロック９２４がそれぞれ実行される。ブロック９２３およびブロック９２４の実行後、ブロック９２５が実行される。
【０１２４】
解析部５００２は、解析した実行順序制約を利用して、さらに第１依存関係情報１１２を解析する。図３５は、図３４に示した実行順序制約から解析した第１依存関係情報１１２の例を示す。なお、図３５において、左側に示したプログラムコードは、単に各ノードとの対応関係を分かりやすくするために併記したものであり、実際には、第１依存関係情報１１２は、このプログラムコードの情報を保持していない。
【０１２５】
解析部５００２は、実行順序制約の順にデータアクセス表現が実行された際に、データアクセス表現の実行順序を利用して依存グラフを生成する。例えば、データａは、ブロック９２１で“ａ＝０”、“ａ＝２”、“ｓ＝＊ｐ”の順にアクセスされ、次にブロック９２２で“＊ｑ＝４”がアクセスされ、次にブロック９２４で“ｔ＝ａ”がアクセスされ、次にブロック９２５で“ｖ＝ａ＋ｃ”がアクセスされる。このアクセス順序から、図３５の依存グラフ９５１ａが生成される。データｂに関する依存グラフ９５２ｂ、データｃに関する依存グラフ９５３ｃも同様である。
【０１２６】
解析部５００２は、第１依存関係情報１１２のエッジに接続されるノードが異なるタスクに所属するとき、当該エッジにタスク境界が存在すると解析する。図３３の例では、上述したように、タスク９１１とタスク９１２との間のタスク境界をタスク境界９０１、タスク９１２とタスク９１３との間のタスク境界９０２、タスク９１１とタスク９１３との間のタスク境界をタスク境界９０３としてそれぞれ示した。
【０１２７】
生成部５００３、指示部５００４および変換部５００５は、図１に示した第１の実施形態における生成部１０３、指示部１０４および変換部１０５と同一の機能を持つ。処理内容も、第１の実施形態における並列化装置１０と同様であるため、ここでの説明を省略する。
【０１２８】
再配置部５００６は、変換部５００５が変換した後の第２依存関係情報１１３を利用して同期の位置を再決定し、再決定された同期を挿入した並列プログラム１１６’を生成する。再配置部５００６における処理は、並列化装置１０の並列化部１０６における処理に対して、下記の点が相違する。
（１）不要な最適化前の同期を削除する。
（２）並列化処理は不要である。
【０１２９】
例えばタスク境界情報１１０’を含むプログラムコード１１１’に対し、第１の実施形態で説明したのと同様の依存有無情報１１５が与えられ、この依存有無情報１１５に基づき図１６に示した変換情報１０７が生成される。再配置部５００６は、この変換情報１０７に基づき変換部５００５で第１依存関係情報１１２を変換した第２依存関係情報１１３に対し、第１の実施形態で説明したのと同様にして必要な同期を解析して、図３６に例示される、同期が最適化された並列プログラム１１６’を出力する。
【０１３０】
このように、本第２の実施形態によれば、逐次プログラムではなく、並列化が既に行われた並列プログラムを入力した場合であっても、意味のある処理を行うことができる。すなわち、入力された並列プログラムに対し、同期を最適化することにより、当該並列プログラムの性能を向上させることができる。
【０１３１】
（第３の実施形態）
本第３の実施形態では、並列プログラムにおけるデータアクセスの依存関係を示す依存関係情報を、当該並列プログラムの動作中にランタイムライブラリが変更できるようにした。
【０１３２】
図３７は、本第３の実施形態による情報処理装置としての並列化システム１２３０の機能を示す一例の機能ブロック図である。並列化システム１２３０は、コード変換部１２２０およびランタイムライブラリ部１２２１と、並列プログラム１１６”内のインターフェイス（Ｉ／Ｆ）部１２１０とを含む。なお、図３７において、上述の図１と共通する部分には同一の符号を付し、詳細な説明を省略する。
【０１３３】
図３７の並列化システム１２３０を図１に示した第１の実施形態における並列化装置１０と比較すると、並列化装置１０の一部がコード変換部１２２０に含まれ、他の部分がランタイムライブラリ部１２２１に含まれている。並列プログラム１１６”内に設けられるインターフェイス部１２１０は、例えばランタイムライブラリ部１２２１のＡＰＩ(Application  Programming  Interface)であって、並列プログラム１１６”は、このインターフェイス部１２１０を介してランタイムライブラリ部１２２１と通信を行うことができる。
【０１３４】
また、図３７の並列化システム１２３０は、図１の並列化装置１０に対して、インターフェイス（Ｉ／Ｆ）挿入部１５００および情報生成部１５０１が追加されている。
【０１３５】
本第３の実施形態では、コード変換部１２２０において、並列化部１０６’がタスク境界情報１１０”を利用してプログラムコード１１１”を並列化した並列プログラム１１６Ａを生成する。インターフェイス挿入部１５００は、解析部１０２がプログラムコード１１１”およびタスク境界情報１１０”に基づき解析した第１依存関係情報１１２と、第１依存関係情報１１２を生成部１０３が変換した提示情報１１４とを用いて、並列化部１０６’が生成した並列プログラム１１６Ａに対してインターフェイス部１２１０を挿入した並列プログラム１１６”を生成する。
【０１３６】
なお、逐次プログラムとして入力されるプログラムコード１１１”と、当該プログラムコード１１１”を変換した並列プログラム１１６Ａとでは、互いに機能的に等価であるメモリアクセスを行う。例えば、プログラムコード１１１”に間接アクセス表現“＊ｐ”にデータａのアクセスがあった場合、当該プログラムコード１１１”を並列化した並列プログラム１１６Ａにおいても、間接アクセス表現“＊ｐ”は、同じデータａを参照する。
【０１３７】
図３８は、インターフェイス挿入部１５００の一例の構成をより詳細に示す。インターフェイス挿入部１５００は、同期インターフェイス（Ｉ／Ｆ）挿入部１６００と、依存有無情報更新インターフェイス挿入部１６０１と、関係情報生成部１６０３とを含む。
【０１３８】
同期インターフェイス挿入部１６００は、第１依存関係情報１１２を利用して、並列プログラム１１６Ａに対して同期インターフェイス部１６１０を挿入する。関係情報生成部１６０３は、提示情報１１４を入力し、間接アクセス表現のアクセス先を決定する動的なデータへの書き込みアクセスと、この書き込みアクセスによってアクセスの有無が決定する間接アクセス表現によるノードとの対応関係を表現する関係情報１６０２を生成する。依存有無情報更新インターフェイス挿入部１６０１は、関係情報１６０２に基づき並列プログラム１１６Ａに対して依存有無情報更新インターフェイス部１６１１を挿入する。
【０１３９】
インターフェイス部１２１０は、インターフェイス挿入部１５００により並列プログラム１１６Ａに挿入された、同期インターフェイス部１６１０および依存有無情報更新インターフェイス部１６１１を含む。
【０１４０】
コード変換部１２２０で生成された第１依存関係情報１１２は、ＸＭＬ(Extensible  Markup  Language)などのフォーマットを用いてデータアクセス間の依存関係を表現した第１依存関係情報ファイル１２０２を介して、ランタイムライブラリ部１２２１に渡される。解析部１０２で生成された第１依存関係情報１１２は、依存情報出力部１２００により第１依存関係情報ファイル１２０２に格納されて、ランタイムライブラリ部１２２１に渡され、変換部１２０３に入力される。
【０１４１】
依存有無情報１１５は、第１の実施形態では、ユーザが作成し指示部１０４から入力していた。これに対して、本第３の実施形態では、依存有無情報１１５は、並列プログラム１１６”が依存有無情報更新インターフェイス部１６１１を介して情報生成部１５０１が生成し、指示部１２０２に入力される。
【０１４２】
ランタイムライブラリ部１２２１と並列プログラム１１６”は、コンパイルされて実行可能状態となり、これをプロセッサなどのプログラム実行環境で実行する。並列プログラム１１６”は、例えばランタイムライブラリ部１２２１と一部または全部が共通の実行環境において、ランタイムライブラリ部１２２１と共に実行される。実行が開始されると、ランタイムライブラリ部１２２１において、第１依存関係情報ファイル１２０２に記録されている第１依存関係情報１１２を、変換部１２０３が読み込む。
【０１４３】
一方、並列プログラム１１６”の実行に伴い、挿入されている依存有無情報更新インターフェイス部１６１１の実行結果がランタイムライブラリ部１２２１内の情報生成部１５０１に渡される。依存有無情報更新インターフェイス部１６１１の実行結果は、例えば当該インターフェイス部１２１０が実行されたか否かを示す情報を含む。情報生成部１５０１は、このインターフェイス部１２１０の実行結果に応じて依存有無情報１１５を生成する。生成された依存有無情報１１５は、指示部１２０４に入力される。
【０１４４】
指示部１２０４は、入力された依存有無情報１１５から変換情報１０７を生成する。変換部１２０３は、この変換情報１０７に基づき、第１依存関係情報ファイル１２０２から読み込んだ第１依存関係情報１１２を第２依存関係情報１１３に変換する。第２依存関係情報１１３は、並列プログラム１１６”の同期インターフェイス部１６１０に入力される。同期インターフェイス部１６１０は、入力された第２依存関係情報１１３を並列プログラム１１６”のタスクの同期に反映させる。
【０１４５】
本第３の実施形態による並列化システム１２３０は、様々なバリエーションが考え得る。例えば、並列プログラム１１６”の実行環境にコード変換部１２２０が含まれていてもよいし、コード変換部１２２０と実行環境との間での第１依存関係情報１１２の受け渡し方法としては、第１依存関係情報１１２をファイルに格納して受け渡すに限らず、メモリ上のデータとしてメモリを介して受け渡すなど様々な方法が考えられる。並列プログラム１１６”に対するインターフェイス部１２１０の挿入方法についても、様々な方法が考えられる。例えば、インターフェイス部１２１０を、プログラムコードの１行単位で挿入してもよいし、プログラムコードの複数行からなるブロック単位で挿入してもよい。
【０１４６】
また、インターフェース部１２１０とその機能となるランタイムライブラリ部１２２１の処理も、様々に考えられる。例えば、不確実アクセスノードを削除するインターフェイスと、確実アクセスノードに変更するインターフェイスとに分けてもよいし、これら２の機能を持つ１のインターフェイスとなっていてもよい。
【０１４７】
本第３の実施形態による並列化システム１２３０は、インターフェイス部１２１０を挿入することにより並列プログラム１１６”の実行を監視しているが、これはこの例に限定されず、他の方法により並列プログラム１１６”の実行を監視してもよい。例えば、並列プログラム１１６”には何も挿入しない代わりに、当該並列プログラム１１６”のプログラムコードの実行をＯＳ(Operating  System)が監視しておき、監視しているＣＰＵの命令を実行したときに、同期もしくは依存有無の更新を行う方法がある。ＯＳが実行状況を監視する場合、関係情報１６０２を利用して、ＯＳが監視する命令とこの命令が実行されたときに行う処理をＯＳに設定する。
【０１４８】
さらに、図３７で示した並列化システム１２３０の各機能をそれぞれハードウェアにより実装することもできるし、ＣＰＵで動作されるソフトウェアにより実装してもよい。ハードウェアによる実装とソフトウェアによる実装とのハイブリッドでもよい。さらにまた、プログラムコード１１１”、タスク境界情報１１０”、入力部１０１、解析部１０２および第１依存関係情報１１２と、これらから作成および使用される情報などに関しては、上述の第１の実施形態で説明したような、様々なバリエーションが考えられる。
【０１４９】
また、ランタイムライブラリ部１２２１により変換された第２依存関係情報１１３の利用方法も、上述の例に限定されない。例えば、第２依存関係情報１１３が更新される毎に、更新内容などをトレース情報として記録しておいてもよい。このようなトレース情報は、並列プログラムの作成時などに、動的な情報を反映した依存関係情報として利用可能である。
【０１５０】
次に、サンプルコードを用いて、並列プログラムの形態やランタイムライブラリ部１２２１の動作について説明する。図３９は、コード変換部１２２０に入力されるプログラムコード１１１”の例を示す。プログラムコード１１１”のデータｐは、間接アクセス表現＊ｐのアクセス先を決定する動的なデータであり、間接アクセス表現＊ｐによるデータアクセスは、不確実アクセスノードとなる。このプログラムコード１１１”においては、第２行目〜第６行目のｉｆ文の条件の分岐結果により、データｐがアクセスするデータが決定される。
【０１５１】
すなわち、ｉｆ文の条件が真になったのであればコード“ｐ＝＆ａ”が実行されて、間接アクセス表現＊ｐは、データａにアクセスする。一方、ｉｆ文の条件が偽になったのであればコード“ｐ＝＆ｂ”が実行されて、間接アクセス表現＊ｐは、データｂにアクセスする。したがって、間接アクセス表現＊ｐのノードは、ｉｆ文の条件分岐結果によりアクセスの有無が決定可能である。
【０１５２】
図４０は、プログラムコード１１１”に対するタスク境界情報１１０”の例を示す。この例では、プログラムコード１１１”において、第９行目のコード“label＿2”と、第１３行目のコード“label＿3”とがタスク境界であることが示され、これにより、プログラムコード１１１”が３つのタスクに分割されることが分かる。
【０１５３】
図４１は、解析部１０２がプログラムコード１１１”を解析して、変数毎のデータアクセス依存関係を表現した例を示す。第１依存関係情報１１２において、データａ、データｂおよびデータｃそれぞれについて依存関係が解析され、依存グラフ１３０１ａ、１３０２ｂおよび１３０３ｃが得られている。間接アクセス表現＊ｐは、ｉｆ文中の、ポインタ変数ｐに変数ａまたはｂのアドレスを代入するコード“ｐ＝＆ａ”とコード“ｐ＝＆ｂ”とにより、データａまたはデータｂにしかアクセスしないため、データａおよびデータｂの依存グラフ中にのみ、不確実アクセスノードとして存在する。
【０１５４】
図４２は、図４０のタスク境界情報１１０”を利用して図３９のプログラムコード１１１”をタスクに分割した場合の例を概念的に示す。この例では、タスク境界情報１１０”により、プログラムコード１１１”による処理が、タスク１４００、１４０１および１４０２の３つのタスクに分割される。また、タスク１４００とタスク１４０１との境界がタスク境界１４１０、タスク１４０１とタスク１４０２との境界がタスク境界１４１１、タスク１４００とタスク１４０２との境界がタスク境界１４１２とされる。
【０１５５】
図４３は、解析部１０２が図４０〜図４２を用いて説明した情報に基づき生成した、プログラムコード１１１”の第１依存関係情報１１２の例を概念的に示す。図４３において、タスクTask1がタスク１４００、タスクTask2がタスク１４０１、タスクTask3がタスク１４０２をそれぞれ示し、各タスク１４００〜１４０２の境界が横線でタスク境界１４１０および１４１１として示されている。なお、この例では、タスク境界１４１２は、ノードが存在しないタスクTask2を通過するエッジにより、間接的に表現される。
【０１５６】
また、解析部１０２は、各タスク境界１４１０〜１４１２を跨ぐエッジから、タスク間の依存関係を特定することができる。このとき、タスク内に対象データのノードが存在しない場合は、当該タスクに関するタスク境界にエッジが存在しても、当該タスクは、当該対象データに対する依存関係は存在しない。例えば、図４３の例では、データａに関しては、タスクtask1とタスクtask3との間で不確実タスク境界エッジが存在することが示される。データｃに関しては、タスクTask1とタスクTask2との間に確実タスク境界エッジが存在することが示される。
【０１５７】
並列化部１０６’は、タスク境界情報１１０”に基づきプログラムコード１１１”を並列プログラム１１６Ａに変換する。例えば、並列化部１０６’は、プログラムコード１１１”をタスク毎に分割した状態の並列プログラム１１６Ａに変換する。並列プログラム１１６Ａには、コード“Task1”、コード“Task2”およびコード“Task3”と、中括弧｛  …  ｝によってタスクTask1、タスクTask2およびタスクTask3がそれぞれ定義される。
【０１５８】
インターフェイス挿入部１５００は、並列化部１０６’で作成された並列プログラム１１６Ａに対して、コマンドまたは関数valid＿node()、invalid＿node()、post＿sync()およびwait＿sync()を挿入して、並列プログラム１１６”を生成する。図４４は、図３９に示したプログラムコード１１１”を元に生成した並列プログラム１１６”の例を示す。なお、以下では、便宜上、コマンドまたは関数valid＿node()、invalid＿node()、post＿sync()およびwait＿sync()を、それぞれコマンドとして説明する。
【０１５９】
コマンドvalid＿node()およびコマンドinvalid＿node()が依存有無情報更新インターフェイスである。コマンドpost＿sync()およびコマンドwait＿sync()が同期インターフェイスである。並列プログラム１１６Ａに挿入された依存有無情報更新インターフェイスが、依存有無情報更新インターフェイス部１６１１である。同様に、並列プログラム１１６Ａに挿入された同期インターフェイスが、同期インターフェイス部１６１０である。これらのコマンドは、ランタイムライブラリ部１２２１と通信を行うためのインターフェイス（ＡＰＩ）であって、インターフェイス部１２１０を構成する。
【０１６０】
依存有無情報更新インターフェイス部１６１１は、並列プログラム１１６”に含まれる間接アクセス表現のアクセス先を決定する動的なデータへの書き込みアクセスを監視し、監視結果をランタイムライブラリ部１２２１に渡す。
【０１６１】
依存有無情報更新インターフェイス部１６１１を構成するコマンドvalid＿node()およびinvalid＿node()は、不確実タスク境界ノードに関する依存有無関係情報を更新するためのインターフェイスである。コマンドvalid＿node()およびinvalid＿node()は、不確実ノードの情報を更新し、当該不確実ノードの確実ノードへの変更、または、当該不確実ノードの削除を行う。コマンドvalid＿node()およびinvalid＿node()は、インターフェイス挿入部１５００が不確実タスク境界ノードの原因となっている変数に対するアクセス個所に挿入する。ここで、不確実タスク境界ノードの状態に影響を与える変数は、上述した間接アクセス表現のアクセス先を決定する変数であって、より具体的には、Ｃ言語などのプログラミング言語におけるポインタや配列のインデックスなどである。
【０１６２】
関係情報生成部１６０３は、提示情報１１４に含まれる不確実タスク境界ノードと、この不確実タスク境界ノードのアクセスの有無を決定するデータアクセスとのアクセスの有無に関する関係情報１６０２を生成する。関係情報１６０２は、コマンドvalid＿node()およびinvalid＿node()の挿入を行うための情報である。
【０１６３】
関係情報生成部１６０３に生成された関係情報１６０２は、コマンドvalid＿node()およびinvalid＿node()を並列プログラム１１６Ａに挿入する位置を示す位置情報と、これらのコマンドに与える引数とを含む。引数は、コマンドが対象とするノードを特定するための識別子を含む。ここで、変数アクセスは、例えば、間接アクセス表現であるポインタ変数へのアドレスの代入である。
【０１６４】
図４５は、図４３に示した第１依存関係情報１１２の各依存グラフおよびノードに対して、それぞれ識別子を対応付けた例を示す。図４５において、識別子「VAR＿ID＿x」は、値「ｘ」により各データを識別する。この例では、識別子「VAR＿ID＿1」がデータａ、識別子「VAR＿ID＿2」がデータｂ、識別子「VAR＿ID＿3」がデータｃを表している。また、識別子「NODE＿ID＿x」は、各データの依存グラフのルートから順番に値「ｘ」を割り振り、ノードを識別する。各コマンドvalid＿node()、invalid＿node()、post＿sync()およびwait＿sync()の引数としてこれら識別子「VAR＿ID＿x」および識別子「NODE＿ID＿x」を組み合わせて用いて、依存グラフのノードを特定する。これらの識別子は、コード変換部１２２０の解析部１０２でプログラムコード１１１”から解析されたノード毎に割り振られ、第１依存関係情報１１２に付加されると共に、並列プログラム１１６”へのコマンド挿入時に使用される。以下、適宜、ノードを識別子「VAR＿ID＿x」および識別子「NODE＿ID＿x」を用いて、ノード(VAR＿ID＿x,NODE＿ID＿x)のように記述する。
【０１６５】
図４６は、図４５における関係情報１６０２の例を示す。関係情報１６０２は、コマンドvalid＿node()およびinvalid＿node()を並列プログラム１１６Ａに挿入する位置を示す監視位置情報と、これらのコマンドに与える引数とを含む。図４６に示されるように、関係情報１６０２は、識別子「VAR＿ID＿1,  NODE＿ID＿2」などのコマンドvalid＿node()およびinvalid＿node()に与える引数と、監視位置情報とを関連付ける。コマンドvalid＿node()およびinvalid＿node()に与える引数は、これらのコマンドにより情報を更新する対象である不確実アクセスノードを識別可能な情報となっている。
【０１６６】
依存有無情報更新インターフェイス挿入部１６０１は、プログラムコード中の変数に対するアクセスを解析し、当該変数に対するデータアクセスの有無や、不確実アクセスノードのアクセス確実性フラグの不確実から確実への変更に影響を与えるデータアクセスを抽出する。このとき、依存有無情報更新インターフェイス挿入部１６０１は、直接アクセス表現および間接アクセス表現など、ある変数に関わるアクセス全般について、この解析を行う。
【０１６７】
逐次プログラムである図３９に示したプログラムコード１１１”を例に挙げて説明する。インターフェイス挿入部１５００は、プログラムコード１１１”における第３行目のように、間接アクセス表現“＊ｐ”にデータａをセットするコードがあった場合、図４６に例示される関係情報１６０２を参照する。より具体的には、依存有無情報更新インターフェイス挿入部１６０１は、依存有無情報更新インターフェイスとして挿入すべきコマンドvalid＿node()およびinvalid＿node()の情報を、図４６に例示した関係情報１６０２から得ることができる。依存有無情報更新インターフェイス挿入部１６０１は、関係情報１６０２を利用して、例えばコード“ｐ＝＆ａ”の監視位置情報に対応付けられた、これらの依存有無情報更新インターフェイスを挿入する。
【０１６８】
図４５に示されるように、データａに関しては、識別子「VAR＿ID＿1」および識別子「NODE＿ID＿2」で識別されるノードと、識別子「VAR＿ID＿1」および識別子「NODE＿ID＿3」で識別されるノードの、２つの不確実タスク境界ノードが存在する。そのため、図４４の並列プログラム１１６”における第４行目および第５行目に示されるように、これらのノードを確実アクセスノードへと変更するコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)およびコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿3)を挿入する。また、データｂに関する不確実タスク境界ノードには、識別子「VAR＿ID＿2」および識別子「NODE＿ID＿1」で識別されるノードと、識別子「VAR＿ID＿2」および識別子「NODE＿ID＿3」で識別されるノードとが存在する。これらのノードについては、図４４の第６行目に示されるように、これらのノードを削除するコマンドinvalid＿node(VAR＿ID＿2,NODE＿ID＿1)およびinvalid＿node(VAR＿ID＿2,NODE＿ID＿3)を挿入する。
【０１６９】
なお、本第3の実施形態では、依存有無情報更新インターフェイス部１６１１の挿入により、間接アクセス表現＊ｐに対する代入を監視する例を示したが、これはこの例に限定されず、間接アクセス表現＊ｐに対する参照を監視してもよいし、代入および参照の両方を共に監視してもよい。
【０１７０】
同期インターフェイス部１６１０を構成するコマンドpost＿sync()およびコマンドwait＿sync()は、タスク間の同期を制御する同期インターフェイスである。コマンドpost＿sync()は、あるアクセスノードからのエッジが存在する場合に、そのアクセスを含む文の直後に挿入する。一方、コマンドwait＿sync()は、あるアクセスノードへのエッジが存在する場合に、そのアクセスを含む文の直前に挿入する。
【０１７１】
図４４の並列プログラム１１６”の例では、図４３または図４５に示した第１依存関係情報１１２と比較し、第１５行目の直接アクセス表現によるデータａに対するアクセスの直後に、コマンドpost＿sync(VAR＿ID＿1,NODE＿ID＿1)が挿入される。また、第１７行目のデータｃに対する間接アクセス表現“＊ｐ”によるアクセスの直後に、コマンドpost＿sync(VAR＿ID＿3,NODE＿ID＿1)、post＿sync(VAR＿ID＿1,NODE＿ID＿2)およびpost＿sync(VAR＿ID＿2,NODE＿ID＿1)が挿入される。
【０１７２】
コマンドwait＿sync()については、第２４行目の直接アクセス表現によるデータｃに対するアクセスの直前に、コマンドwait＿sync(VAR＿ID＿3,NODE＿ID＿2)が挿入される。第２６行目の直接アクセス表現によるデータｂに対するアクセスの直前に、コマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿2)が挿入される。また、第３３行目の間接アクセス表現“＊ｐ”に対するデータｔによるアクセスの直前に、コマンドwait＿sync(VAR＿ID＿1,NODE＿ID＿3)と、コマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿3)とが挿入される。
【０１７３】
次に、インターフェイス部１２１０を構成する各コマンドの機能について概略的に説明する。
【０１７４】
（ａ）コマンドvalid＿node()：
引数で指定したノードを確実アクセスノードに変更する変換情報１０７を、ランタイムライブラリ部１２２１の情報生成部１５０１および指示部１２０４を介して変換部１２０３に送る。
【０１７５】
より具体的には、インターフェイス部１２１０において当該コマンドvalid＿node()が実行されると、データおよびを識別する識別子と、ノードを識別する識別子とを含む引数と、引数で指定したノードを確実アクセスノードに変更する指示とが情報生成部１５０１に渡される。情報生成部１５０１は、当該コマンドvalid＿node()から渡された情報を用いて依存有無情報１１５を生成する。指示部１２０４は、この依存有無情報１１５から、引数で指定したノードを確実アクセスノードに変更するための変換情報１０７を作成して変換部１２０３に渡す。なお、後述するコマンドinvalid＿node()、コマンドpost＿sync()およびコマンドwait＿sync()についても、同様に実行結果の変換部１２０３に対する伝達がなされる。
【０１７６】
変換部１２０３は、送られた変換情報１０７を用いて第２依存関係情報１１３の更新を行う。並列プログラム１１６”の最初の実行時など、第２依存関係情報１１３が存在しないような場合には、第１依存関係情報ファイル１２０２から読み込んだ第１依存関係情報１１２に基づき第２依存関係情報１１３を作成することもできる。コマンドvalid＿node()は、ある間接アクセス表現に対するアクセスがある場合に、その間接アクセス表現にセットされるデータに対応する不確実タスク境界ノードの数だけ挿入される。コマンドvalid＿node()は、間接アクセス表現にセットされたデータの不確実タスク境界ノードが引数に指定される。
【０１７７】
（ｂ）コマンドinvalid＿node()：
引数で指定したノードを消去する変換情報１０７を、ランタイムライブラリ部１２２１の情報生成部１５０１および指示部１２０４を介して変換部１２０３に送る。変換部１２０３は、送られた変換情報１０７を用いて第２依存関係情報１１３の不確実アクセスノードを消去する。並列プログラム１１６”の最初の実行時など、第２依存関係情報１１３が存在しないような場合には、第１依存関係情報ファイル１２０２から読み込んだ第１依存関係情報１１２に基づき第２依存関係情報１１３を作成することもできる。コマンドinvalid＿node()は、ある間接アクセス表現に対するアクセスがある場合に、その間接アクセス表現にセットされないデータの不確実タスク境界ノードの数だけ挿入される。コマンドinvalid＿node()は、間接アクセス表現にセットされなかったデータの不確実タスク境界ノードが引数に指定される。
【０１７８】
（ｃ）コマンドpost＿sync()：
第２依存関係情報１１３をチェックし、引数で指定したノードが存在している場合に、そのノードからのエッジを削除するような変換情報１０７を、ランタイムライブラリ部１２２１の情報生成部１５０１および指示部１２０４を介して変換部１２０３に送る。なお、第２依存関係情報１１３は、並列プログラム１１６”の最初の実行時など、第２依存関係情報１１３が存在しないような場合、第１依存関係情報ファイル１２０２から読み込んだ第１依存関係情報１１２に基づき作成することができる。コマンドpost＿sync()は、対象ノードからのエッジが確実タスク境界エッジまたは不確実タスク境界エッジの場合に挿入される。
【０１７９】
（ｄ）コマンドwait＿sync()：
ランタイムライブラリ部１２２１の情報生成部１５０１および指示部１２０４を介して変換部１２０３に対して、第２依存関係情報１１３を参照し、引数で指定したノードが存在している場合にそのノードへのエッジが存在するかをチェックして、実行開始および同期待ちの何れの状態であるか否かを判断するよう、リクエストを送る。変換部１２０３は、このリクエストに応じて、変換情報１０７に基づき第２依存関係情報１１３を参照する。このとき、変換部１２０３は、変換情報１０７を第２依存関係情報１１３を参照するためだけに用い、依存関係情報の変更は行わない。なお、第２依存関係情報１１３は、並列プログラム１１６”の最初の実行時など、第２依存関係情報１１３が存在しないような場合、第１依存関係情報ファイル１２０２から読み込んだ第１依存関係情報１１２に基づき作成することができる。コマンドwait＿sync()は、対象ノードへのエッジが確実タスク境界エッジまたは不確実タスク境界エッジの場合に挿入される。
【０１８０】
依存有無情報更新インターフェイス挿入部１６０１が並列プログラム１１６”に挿入した各コマンドにより、依存有無情報更新インターフェイス部１６１１の実行結果が情報生成部１５０１に渡される。情報生成部１５０１は、この実行結果に基づき依存有無情報１１５を作成する。この依存有無情報１１５により、実行中の並列プログラム１１６”におけるデータアクセスが監視される。換言すれば、依存有無情報更新インターフェイス挿入部１６０１と依存情報有無更新インターフェイス部１６１１と情報生成部１５０１とにより、並列プログラム１１６”におけるデータアクセスを監視する監視部が構成されるといえる。なお、上述のように、ＯＳがデータアクセスを監視する場合、監視部を構成する機能部品は、本第３の実施形態とは異なるものとなる。
【０１８１】
図４７および図５１は、図４４に示した並列プログラム１１６”の実行イメージを示す。図４７は、図４４に示した並列プログラム１１６”における第２行目のｉｆ文の判定結果が真になった場合の実行例を示す。また、図５１は、当該ｉｆ文の判定結果が偽になった場合の実行例を示す。図４７および図５１において、縦軸は時間を示し、図の上から下に向けて時間が進行する。また、実線の矢印がプログラムの実行を表し、点線が同期待ちを表している。また、矢印の左横に記述されるプログラムコードがそれぞれのタスクの処理のイメージを表している。
【０１８２】
先ず、図４７に示される、ｉｆ文の判定結果が真の場合の実行イメージを時系列順に追って説明する。
【０１８３】
（１）タスクTask1、タスクTask2およびタスクTask3がそれぞれ実行を開始する。タスクTask1は、同期待ちは必要なく、処理を開始する。タスクTask2は、コマンドwait＿sync(VAR＿ID＿3,NODE＿ID＿2)を実行する。ここでは、図４５に示したように、引数で指定されたノードが存在しているため、先ず、この引数で指定されたノードへのエッジをチェックする。引数で指定されたノードへのエッジが存在するため、タスクTask2は、同期待ち状態に入る。タスクTask3は、コマンドwait＿sync(VAR＿ID＿1,NODE＿ID＿3)を実行する。この場合は、引数で指定されたノードが存在しているため、このノードへのエッジをチェックする。エッジが存在するため、タスクTask3は、同期待ち状態に入る。なお、同期待ちとなり処理が開始されないタスクTask2およびTask3は、ポーリングを行い、同様の判定を繰り返しているものとする。
【０１８４】
（２）タスクTask1は、プログラムの処理を進めていき、ｉｆ文の処理を終えたものとする。この例では、ｉｆ文による条件判定の結果が真となったものとしている。ここで、第４行目、第５行目のコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)とコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿3)とを実行し、第２依存関係情報１１３の対象ノードを確実アクセスへと更新する。また、第６行目、第７行目のコマンドinvalid＿node(VAR＿ID＿2,NODE＿ID＿1)とコマンドinvalid＿node(VAR＿ID＿2,NODE＿ID＿3)とを実行し、対象ノードを削除すると共に接続されているエッジも削除する。
【０１８５】
すなわち、例えばコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)とコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿3)とが実行されると、引数に従い情報生成部１５０１が依存有無情報１１５を生成する。引数で指定されたノードを確実アクセスノードに変更する変更情報１０７がランタイムライブラリ部１２２１の指示部１２０４を介して変換部１２０３に送られる。
【０１８６】
コマンドinvalid＿node(VAR＿ID＿2,NODE＿ID＿1)とコマンドinvalid＿node(VAR＿ID＿2,NODE＿ID＿3)に関しても同様である。変換部１２０３は、送られた変換情報１０７を用いて第２依存関係情報１１３を更新する。インターフェイス部１２１０は、更新された第２依存関係情報１１３を並列プログラム１１６”の実行に反映させる。
【０１８７】
図４８は、コマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)、valid＿node(VAR＿ID＿1,NODE＿ID＿3)、invalid＿node(VAR＿ID＿2,NODE＿ID＿1)およびinvalid＿node(VAR＿ID＿2,NODE＿ID＿3)の実行により変更が加えられた第２依存関係情報１１３の例を示す。図４５に示した元の依存関係情報、すなわち第１依存関係情報１１２に対して、識別子(VAR＿ID＿1,NODE＿ID＿2)および(VAR＿ID＿1,NODE＿ID＿3)で特定されるノードが確実アクセスノードに変更されている（依存グラフ１３０１ａ−１）。また、識別子(VAR＿ID＿2,NODE＿ID＿1)および(VAR＿ID＿2,NODE＿ID＿3)で特定されるノードが削除され、識別子(VAR＿ID＿2,NODE＿ID＿2)に接続されるエッジが削除されているのが分かる（依存グラフ１３０２ｂ−１）。
【０１８８】
（３）タスクTask1は、さらに実行を継続し、第１５行目で直接アクセス表現“ａ”に値「２」をセットした後、第１６行目のコマンドpost＿sync(VAR＿ID＿1,  NODE＿ID＿1)を実行する。対象のノード(VAR＿ID＿1,  NODE＿ID＿1)は存在するため、そのノード(VAR＿ID＿1,  NODE＿ID＿1)からのエッジを削除する。図４９は、この変更を加えた第２依存関係情報１１３の例を示す。上述の図４８に対し、ノード(VAR＿ID＿1,  NODE＿ID＿1)からノード(VAR＿ID＿1,  NODE＿ID＿2)へのエッジが削除されているのが分かる（依存グラフ１３０１ａ−２）。
【０１８９】
（４）タスクTask1は、さらに実行を継続し、第１７行目で、データｃに対して間接アクセス表現“＊ｐ”の値すなわちデータａの値「２」をセットする。その後、間接アクセス表現“＊ｐ”に係るノードに対して、第１８行目のコマンドpost＿sync(VAR＿ID＿3,NODE＿ID＿1)と第１９行目のコマンドpost＿sync(VAR＿ID＿1,NODE＿ID＿2)を実行する。対象ノード(VAR＿ID＿3,NODE＿ID＿1)および(VAR＿ID＿1,NODE＿ID＿2)は存在するため、これらのノードからのエッジを削除する。図５０は、この変更を加えた第２依存関係情報１１３の例を示す。上述の図４９に対し、ノード(VAR＿ID＿3,NODE＿ID＿1)からノード(VAR＿ID＿3,NODE＿ID＿2)へのエッジと、ノード(VAR＿ID＿1,NODE＿ID＿2)からノード(VAR＿ID＿1,NODE＿ID＿3)へのエッジとが削除されているのが分かる（依存グラフ１３０３ｃ−１、依存グラフ１３０１ａ−３）。
【０１９０】
（５）タスクTask1は、さらに実行を継続し、第２０行目のコマンドpost＿sync(VAR＿ID＿2,NODE＿ID＿1)を実行する。この場合、対象ノード(VAR＿ID＿2,NODE＿ID＿1)は既に削除されて存在しないため、実際には何も行われない。
【０１９１】
（６）上述したコマンドwait＿sync(VAR＿ID＿3,NODE＿ID＿2)に応じてポーリングしているタスクTask2は、図５０に示した第２依存関係情報１１３を参照し、対象ノード(VAR＿ID＿3,NODE＿ID＿2)へのエッジが削除されたことを検知し、実行を開始する。
【０１９２】
（７）同様に、上述したコマンドwait＿sync(VAR＿ID＿1,NODE＿ID＿3)に応じてポーリングしているタスクTask3は、図５０に示した第２依存関係情報１１３を参照し、対象ノード(VAR＿ID＿1,NODE＿ID＿3)へのエッジが削除されたことを検知し、実行を開始する。
【０１９３】
（８）タスクTask3は、第３２行目のコマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿3)を実行するが、対象ノード(VAR＿ID＿2,NODE＿ID＿3)へのエッジが既に削除されているため、何も行わない。その後、第３３行目〜第３５行目のコードに従い、間接アクセス表現“＊ｐ”がアクセスするデータに対してデータｔの値をセットし、直接アクセス表現“ｕ”に対して、直接アクセス表現“ｖ”の値と、値「３」とを加算した値をセットする。さらに、直接アクセス表現“ｖ”の値に直接アクセス表現“ｓ”の値と、値「５」とを加算した値をセットする。
【０１９４】
（９）タスクTask2は、第２４行目で直接アクセス表現“ｃ”に対して値「３」をセットした後、第２５行目のコマンドwait＿sync(VAR＿ID＿2,  NODE＿ID＿2)を実行するが、図５０に示されるように、既に対象ノード(VAR＿ID＿2,  NODE＿ID＿2)へのエッジが存在しないため、実行を継続する。
【０１９５】
（１０）次に、タスクTask2は、第２６行目で直接アクセス表現“ｂ”に対して値「４」をセットした後、第２７行目のコマンドpost＿sync(VAR＿ID＿2,NODE＿ID＿2)を実行するが、図５０に示されるように、既に対象ノード(VAR＿ID＿2,NODE＿ID＿2)へのエッジが存在しないため、実際には何も行わない。そして、第２８行目で、直接アクセス表現“ｃ”に対して値「５」をセットする。
【０１９６】
次に、図５１に示される、ｉｆ文の判定結果が偽の場合の実行イメージを時系列順に追って説明する。
【０１９７】
（１）タスクTask1、タスクTask2およびタスクTask3がそれぞれ実行を開始する。タスクTask1は、処理を開始することができる。タスクTask2は、コマンドwait＿sync(VAR＿ID＿3,NODE＿ID＿2)を実行する。ここでは、図４５に示したように、引数で指定されたノードへのエッジが存在するため、タスクTask2は、同期待ち状態に入る。タスクTask3は、コマンドwait＿sync(VAR＿ID＿1,NODE＿ID＿3)を実行する。この場合も、引数で指定されたノードが存在しているため、このノードへのエッジをチェックする。エッジが存在するため、タスクTask3は、同期待ち状態に入る。なお、同期待ちとなり処理が開始されないタスクTask2およびTask3は、ポーリングを行い、同様の判定を繰り返しているものとする。
【０１９８】
（２）タスクTask1は、プログラムの処理を進めていき、ｉｆ文の処理を終えたものとする。この例では、ｉｆ文による条件判定の結果が偽となったものとしている。ここで、第１０行目、第１１行目のコマンドvalid＿node(VAR＿ID＿2,  NODE＿ID＿1)とコマンドvalid＿node(VAR＿ID＿2,NODE＿ID＿3)とを実行し、第２依存関係情報１１３の対象ノードを確実アクセスへと更新する。また、第１２行目、第１３行目のコマンドinvalid＿node(VAR＿ID＿1,NODE＿ID＿2)とコマンドinvalid＿node(VAR＿ID＿1,NODE＿ID＿3)とを実行し、対象ノードを削除すると共に接続されているエッジも削除する。タスクtask1は、その後も実行を継続する。
【０１９９】
図５２は、コマンドvalid＿node(VAR＿ID＿2,NODE＿ID＿1)、valid＿node(VAR＿ID＿2,NODE＿ID＿3)、invalid＿node(VAR＿ID＿1,NODE＿ID＿2)およびinvalid＿node(VAR＿ID＿1,NODE＿ID＿3)の実行により変更が加えられた第２依存関係情報１１３の例を示す。図４５に示した元の依存関係情報、すなわち第１依存関係情報１１２に対して、識別子(VAR＿ID＿2,NODE＿ID＿1)および(VAR＿ID＿2,NODE＿ID＿3)で特定されるノードが確実アクセスノードに変更されている（依存グラフ１３０２ｂ”）。また、識別子(VAR＿ID＿1,NODE＿ID＿2)および(VAR＿ID＿1,NODE＿ID＿3)で特定されるノードが削除されているのが分かる（依存グラフ１３０２ａ”）。
【０２００】
（３）上述したコマンドドwait＿sync(VAR＿ID＿1,NODE＿ID＿3)に応じてポーリングしているタスクTask3は、図５２に示した第２依存関係情報１１３を参照し、データａの間接アクセス表現“＊ｐ”に関する不確実タスク境界エッジが存在していないことを確認し、ポーリングから抜け処理を開始する。
【０２０１】
（４）タスクTask3は、第３２行目のコマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿3)を実行し、引数で指定されたノード(VAR＿ID＿2,NODE＿ID＿3)が存在しているため、このノード(VAR＿ID＿2,NODE＿ID＿3)へのエッジをチェックする。エッジは存在するため同期待ち状態に入る。
【０２０２】
（５）タスクTask1が、第１５行目で直接アクセス表現“ａ”に値「２」をセットし、次に第１６行目のコマンドpost＿sync(VAR＿ID＿1,NODE＿ID＿1)を実行する。対象ノード(VAR＿ID＿1,NODE＿ID＿1)は既に削除されて存在しないため、何も行わない。
【０２０３】
（６）タスクTask1が、第１７行目で、データｃに対して、間接アクセス表現“＊ｐ”の値すなわちデータｂの値をセットする。次に、第１８行目のコマンドpost＿sync(VAR＿ID＿3,  NODE＿ID＿1)を実行する。対象ノード(VAR＿ID＿3,  NODE＿ID＿1)は存在するため、そのノード(VAR＿ID＿3,  NODE＿ID＿1)からのエッジを削除する。図５３は、この変更を加えた第２依存関係情報１１３の例を示す。上述の図５２に対し、ノード(VAR＿ID＿3,  NODE＿ID＿1)とノード(VAR＿ID＿3,  NODE＿ID＿2)とを接続するエッジが削除されているのが分かる（依存グラフ１３０３ｃ”）。
【０２０４】
（７）上述したコマンドwait＿sync(VAR＿ID＿3,NODE＿ID＿2)に応じてポーリングしているタスクTask2は、図５３に示した第２依存関係情報１１３を参照し、対象ノード(VAR＿ID＿3,NODE＿ID＿2)へのエッジが削除されたことを検知し、実行を開始する。
【０２０５】
（８）タスクTask1が、第１９行目のコマンドpost＿sync(VAR＿ID＿1,NODE＿ID＿2)を実行する。対象ノード(VAR＿ID＿1,NODE＿ID＿2)は既に削除されて存在しないため、何も行わない。
【０２０６】
（９）タスクTask1が、第２０行目のコマンドpost＿sync(VAR＿ID＿2,NODE＿ID＿1)を実行する。対象ノード(VAR＿ID＿2,NODE＿ID＿1)は存在するため、そのノード(VAR＿ID＿2,NODE＿ID＿1)からのエッジを削除する。図５４は、この変更を加えた第２依存関係情報１１３の例を示す。上述の図５３に対し、ノード(VAR＿ID＿2,  NODE＿ID＿1)とノード(VAR＿ID＿2,  NODE＿ID＿2)とを接続するエッジが削除されているのが分かる（依存グラフ１３０２ｂ”−１）。タスクTask1は、実行を終了する。
【０２０７】
（１０）タスクTask2は、第２４行目で直接アクセス表現“ｃ”に対して値「３」をセットし、次に第２５行目のコマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿2)を実行する。対象ノード(VAR＿ID＿2,NODE＿ID＿2)へのエッジは存在しないため、実行を継続する。
【０２０８】
（１１）タスクTask2は、第２６行目で直接アクセス表現“ｂ”に対して値「４」をセットし、次に第２７行目のコマンドpost＿sync(VAR＿ID＿2,NODE＿ID＿2)を実行する。対象ノード(VAR＿ID＿2,NODE＿ID＿2)は存在するため、そのノード(VAR＿ID＿2,NODE＿ID＿2)からのエッジを削除する。図５５は、この変更を加えた第２依存関係情報１１３の例を示す。上述の図５４に対し、ノード(VAR＿ID＿2,  NODE＿ID＿2)とノード(VAR＿ID＿2,  NODE＿ID＿3)とを接続するエッジが削除されているのが分かる（依存グラフ１３０２ｂ”−２）。第２８行目で直接アクセス表現“ｃ”に対して値「５」をセットして、タスクTask2は、実行を終了する。
【０２０９】
（１２）上述したコマンドwait＿sync(VAR＿ID＿2,NODE＿ID＿3)に応じてポーリングしているタスクTask3は、図５５に示した第２依存関係情報１１３を参照し、対象ノード(VAR＿ID＿2,NODE＿ID＿3)へのエッジが削除されたことを検知し、実行を開始する。その後、タスクTask3は、第３３行目〜第３５行目のコードに従い、間接アクセス表現“＊ｐ”がアクセスするデータに対してデータｔの値をセットし、直接アクセス表現“ｕ”に対して、直接アクセス表現“ｖ”の値と、値「３」とを加算した値をセットする。さらに、直接アクセス表現“ｖ”の値に直接アクセス表現“ｓ”の値と、値「５」とを加算した値をセットする。
【０２１０】
このように、本第３の実施形態によれば、ランタイムライブラリ部１２３０は、並列プログラム１１６”の実行結果によってタスクの並列実行状況を変化させる。実行時に不確実アクセスノードの更新を行うことによって、図４７の実行イメージでは、図５１の実行イメージに比較してより多くの並列実行を行うことが可能となっている。なお、この例では示されていないが、並列プログラムによっては、間接アクセス表現のアクセス先を決定する動的なデータのタスク間の依存に対しても、同期を挿入する必要がある。
【０２１１】
第３の実施形態の方法によれば、ランタイムライブラリ部１２２１が並列プログラム１１６”の依存関係情報を参照し、参照結果に応じて並列実行状況を操作することが可能となる。また、データのアクセス単位で依存関係の更新を行うことで、細かい粒度での並列実行管理が可能となる。
【０２１２】
第３の実施形態による並列化システム１２３０の構成は、図３７に示す構成に限定されず、他の様々な形態が考えられる。例えば、コード変換部１２２０の一部または全部がランタイムライブラリ部１２２１に含まれていてもよい。
【０２１３】
また、プログラムコード１１１”、タスク境界情報１１０”、入力部１０１、解析部１０２および第１依存関係情報１１２、ならびに、これら各情報および各部で作成または使用される情報については、第１の実施形態で既に説明したのと同様の、様々なバリエーションが考えられる。
【０２１４】
コード変換部１２２０とランタイムライブラリ部１２２１との間での第１依存関係情報１１２の受け渡し方法も、上述の第１依存関係情報ファイル１２０２を介して当該情報を受け渡す方法に限らず、様々な方法が考えられる。例えば、コード変換部１２２０に並列プログラム１１６”をバイナリコードに変換するバイナリ変換部を付加し、第１依存関係情報１１２を並列プログラム１１６”のバイナリコードに埋め込む方法が考えられる。また、第１依存関係情報１１２をファイルで受け渡す場合にも、通常のテキストファイルを用いたり、バイナリで表現するなど様々な方法が考えられる。
【０２１５】
並列プログラム１１６”に対するインターフェイス部１２１０の挿入方法についても様々に考えられる。また、ランタイムライブラリ部１２２１で用意する機能やインターフェイス（ＡＰＩ）も、様々に考えられる。例えば、本第３の実施形態では、第２依存関係情報１１３の更新や、同期の解消を行う処理は、並列プログラム１１６”にＡＰＩを挿入することで実現したが、同様の処理を実現するプログラムコードを、並列プログラム１１６”に対して直接的に挿入してもよい。また、同期を取るためのＡＰＩの挿入を変数毎に行わず、スレッド間の依存関係を満たせるように最低限挿入するなど、ＡＰＩの挿入方法も様々に考えられる。コマンドvalid＿node()およびコマンドinvalid＿node()の２つのＡＰＩを１つのＡＰＩで実現してもよいし、例えば図４４の第４行目、第５行目のように連続して挿入される同じＡＰＩを、１つのＡＰＩで実現することもできる。
【０２１６】
これらのシステム全体もしくはシステムを構成している個々の機能ブロックをハードウェア実装してもよいし、ソフトウェア実装してもよいし、それらのハイブリッドでもよい。
【０２１７】
上述したように、本第３の実施形態によれば、タスク境界情報を用いずにタスク境界に影響しない不確実アクセスノードも含めた全ての不確実アクセスノードの依存有無情報１１５を更新する場合と比較し、タスク境界エッジに接続される不確実アクセスノードに限定した依存有無情報の更新を行うことによって、ランタイムによる更新オーバヘッドを抑えることが可能となる。これにより、ランタイムオーバヘッドの削減が実現できる。また、実行時の最新情報を用いた依存関係情報の更新を行い、その情報を使用した解析を行うことによって、ある実行時点で最も適切であると判断される並列化を行うことが可能となる。
【０２１８】
（第４の実施形態）
本第４の実施形態では、データアクセスの依存関係を示す依存関係情報を、逐次プログラムの動作中にランタイムライブラリが変更できるようにした。これにより、確実な依存関係を詳細に解析することができる。
【０２１９】
図５６は、本第４の実施形態による情報処理装置としての解析システム１２４０の一例の構成を示す。なお、図５６において、上述した図３７と共通する部分には同一の符号を付し、詳細な説明を省略する。
【０２２０】
本第４の実施形態による解析システム１２４０の、上述した第３の実施形態による並列化システム１２３０に対する差異について、概略的に説明する。上述した第３の実施形態による並列化システム１２３０では、コード変換部１２２０が並列プログラム１１６”を出力するのに対して、本第４の実施形態によるコード変換部１２２０’は、プロファイルプログラム１７００と呼ばれるプログラムコードを出力する。また、上述した第３の実施形態による並列化システム１２３０では、ランタイムライブラリ部１２２１が出力した第２依存関係情報１１３を、並列プログラム１１６”内のインターフェイス部１２１０に入力するのに対して、本第４の実施形態では、ランタイムライブラリ部１２２１’は、第２依存関係情報１１３を外部に出力し、プロファイルプログラム１７００に戻さない。
【０２２１】
より詳細には、本第４の実施形態による解析システム１２４０では、コード変換部１２２０’において、インターフェイス挿入部１５００’は、入力部１０１からプログラムコード１１１Ａを入力する。インターフェイス挿入部１５００’は、このプログラムコード１１１Ａを利用してインターフェイス部１２１０’を生成してプログラムコード１１１Ａに挿入し、プロファイルプログラム１７００を生成する。また、プロファイルプログラム１７００内のインターフェイス部１２１０’は、第２依存関係情報１１３を入力しない。
【０２２２】
ランタイムライブラリ部１２２１’は、第２依存関係情報１１３を外部に出力するための出力部１７０１を有する。出力部１７０１は、変換部１２０３から入力された第２依存関係情報１１３をランタイムライブラリ部１２２１’の外部（解析システム１２４０の外部）に出力する。なお、出力する第２依存関係情報１１３のデータ形式は特に限定されず、テキストデータ形式、バイナリデータ形式、画像データ形式、ＸＭＬ形式など、様々な形態であってよい。
【０２２３】
インターフェイス挿入部１５００’は、上述した第３の実施形態によるインターフェイス挿入部１５００と同様に、提示情報１１４とプログラムコード１１１Ａとを解析し、依存有無情報更新インターフェイスと、当該依存有無情報更新インターフェイスを挿入する位置を示す監視位置情報とを対応付ける関係情報を生成する。
【０２２４】
図５７は、本第４の実施形態によりインターフェイス挿入部１５００で生成される関係情報１６０２’の一例を示す。関係情報１６０２’は、コマンドvalid＿node()をプログラムコード１１１Ａに挿入する位置を示す監視位置情報と、このコマンドに与える引数とを含む。引数は、コマンドが対象とするノードを特定するための識別子を含む。コマンドvalid＿node()は、上述の第３の実施形態と同様に、実行時に引数で指定された不確実アクセスノードを確実アクセスノードに変更する変換情報を生成する。一方、本第４の実施形態では、上述の第３の実施形態と異なり、関係情報１６０２’に、引数で指定したノードを消去する変換情報を生成するコマンドinvalid＿node()が含まれない。すなわち、第４の実施形態では、コマンドinvalid＿node()を実行しない。これは、本第４の実施形態では、確実に発生した依存関係情報を収集することを目的としているためである。
【０２２５】
インターフェイス挿入部１５００’は、関係情報１６０２’を利用して作成したインターフェイス部１２１０’を、逐次プログラムであるプログラムコード１１１Ａに挿入して、プロファイルプログラム１７００を生成する。図５８は、こうして生成されたプロファイルプログラム１７００のプログラムコードの一例を示す。
【０２２６】
なお、図５８に例示するプロファイルプログラム１７００は、上述した図３９に示したプログラムコード１１１”に対して、インターフェイス部１２１０’を挿入した例である。図５８のプロファイルプログラム１７００において、第１１行目および第１２行目の間、ならびに、第１４行目および第１５行目の間にそれぞれタスク境界１８００および１８０１が定義され、第１行目〜第１１行目がタスクTask1、第１２行目〜第１４行目がタスクTask2、第１５行目〜第１７行目がタスクTask3とされている。
【０２２７】
図５８に例示されるように、図５７の関係情報１６０２’に従い、コード“ｐ＝＆ａ”の位置に、インターフェイス部１２１０’としてコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)およびvalid＿node(VAR＿ID＿1,NODE＿ID＿3)が挿入され、コード“ｐ＝＆ｂ”の位置に、インターフェイス部１２１０’としてコマンドvalid＿node(VAR＿ID＿2,NODE＿ID＿1)およびvalid＿node(VAR＿ID＿2,NODE＿ID＿3)が挿入されて、プロファイルプログラム１７００が生成される。
【０２２８】
なお、本第４の実施形態では、ポインタ変数ｐへの代入のみを監視するインターフェイス挿入例について説明したが、これはこの例に限定されず、その他のポインタ変数ｐへのアクセスを監視してもよい。例えば、図５８の第１１行目にコード“ｃ＝＊ｐ”として記述される、ポインタ変数ｐへのアクセスを監視してもよい。
【０２２９】
プロファイルプログラム１７００が図５８に示すプログラムコードを持つ場合、当該プロファイルプログラム１７００の実行によって変更される前の第１依存関係情報１１２は、図４１を用いて説明したものとなる。図５９は、プロファイルプログラム１７００が実行されて出力される第２依存関係情報１１３の例を示す。第１依存関係情報１１２において、データａ、データｂおよびデータｃそれぞれについて依存関係が解析され、依存グラフ１９０１ａ、１９０２ｂおよび１９０３ｃが得られている。なお、図５９は、図５８で示したプロファイルプログラム１７００におけるｉｆ文の判定結果が真になった場合の例を示す。
【０２３０】
図５８に示すプロファイルプログラム１７００において、インターフェイス部１２１０’を構成するコマンドvalid＿node(VAR＿ID＿1,NODE＿ID＿2)とvalid＿node(VAR＿ID＿1,NODE＿ID＿3)とが実行され、識別子(VAR＿ID＿1,NODE＿ID＿2)で識別される不確実アクセスノードと、識別子(VAR＿ID＿1,NODE＿ID＿3)で識別される不確実アクセスノードとが確実アクセスノードに変更される。なお、コマンドvalid＿node()は、引数で指定されているノードが既に確実アクセスノードに変更されている場合は、何も処理を行わない。
【０２３１】
上述した第３の実施形態では、インターフェイス挿入部１５００が並列プログラム１１６Ａを解析して関係情報を生成し挿入するように説明したが、本第４の実施形態のように、逐次プログラムによるプログラムコードに対して解析および関係情報の生成、挿入を行ってもよい。
【０２３２】
上述したように、本第４の実施形態によれば、タスク境界情報を用いずにタスク境界に影響しない不確実アクセスノードも含めた全ての不確実アクセスノードの依存有無情報を更新する場合と比較し、タスク境界エッジに接続される不確実アクセスノードに限定した依存有無情報の更新を行うことによって、ランタイムによる更新オーバヘッドを抑えることが可能となる。これにより、ランタイムオーバヘッドの削減が実現できる。
【０２３３】
また、プログラムの最適化を、実行時の情報を反映させた依存関係情報を用いて行うことによって、より高い性能のプログラムを作成することが可能となる。例えば、第１の実施形態の並列化装置１０の第１依存関係情報１１２として、本第４の実施形態による解析システム１２４０の出力部１７０１が出力する第２依存関係情報１１３を利用することが可能である。これにより、実行時の情報を反映させ不確実アクセスノードを確実アクセスノードにし、提示情報１１４を削減することができ、それに伴い依存有無情報の削減も期待できる。その結果、少ない作業で第１依存関係情報を第２依存関係情報に変換できるようになる。
【０２３４】
次に、上述した第１、第２、第３および第４の実施形態に共通して適用可能な構成について、図６０を用いて説明する。図６０に例示されるように、第１、第２および第３の実施形態による情報処理装置は、例えば一般的なコンピュータにより実現可能である。
【０２３５】
図６０において、バス３０に対してＣＰＵ１８、ＲＡＭ(Random  Access  Memory)１１、ＲＯＭ(Read  Only  Memory)１２、表示制御部１３および通信Ｉ／Ｆ（インターフェイス）１４が接続される。また、バス３０に対して、ハードディスクドライブ（ＨＤＤ）１５、ドライブ装置１６および入力Ｉ／Ｆ１７が接続される。
【０２３６】
ＣＰＵ１８は、ＲＯＭ１２やＨＤＤ１５に記憶されるプログラムに従い、ＲＡＭ１１をワークメモリとして用いて、このコンピュータの全体を制御する。表示制御部１３は、ＣＰＵ１８により生成された表示制御信号を、表示装置２４が表示可能な信号に変換して出力する。
【０２３７】
ＨＤＤ１５は、上述のＣＰＵ１８が実行するためのプログラムや、プログラムによって用いられるデータなどが格納される。ドライブ装置１６は、脱着可能な記録媒体２１が装填可能とされ、当該記録媒体２１に対するデータの読み書きを行うことができる。ドライブ装置１６が対応可能な記録媒体２１としては、ＣＤ(Compact  Disk)、ＤＶＤ(Digital  Versatile  Disk)、フレキシブルディスクといったディスク記録媒体や、読み書き可能で不揮発性の半導体メモリが考えられる。
【０２３８】
入力Ｉ／Ｆ１７は、外部からのデータの入力を行う。例えば、入力Ｉ／Ｆ１７は、ＵＳＢ(Universal  Serial  Bus)やＩＥＥＥ１３９４(Institute  of  Electrical  and  Electronics  Engineers  1394)といった所定のインターフェイスを有し、このインターフェイスにより外部の機器からのデータ入力を行う。また、入力Ｉ／Ｆ１７に対して、キーボード２２やマウス２３といった入力デバイスが接続される。ユーザは、例えば表示装置２４に対する表示に応じてこれら入力デバイスを操作することで、このコンピュータに対して指示を出すことができる。
【０２３９】
通信Ｉ／Ｆ１４は、所定のプロトコルを用いて外部の通信ネットワークと通信を行う。
【０２４０】
第１の実施形態による並列化装置１０を構成する各機能ブロック、第２の実施形態による同期最適化装置２０を構成する各機能ブロック、第３の実施形態における並列化システム１２３０を構成する各機能ブロック、ならびに、第４の実施形態における解析システム１２４０を構成する各機能ブロックは、ＣＰＵ１８上で動作するプログラムによって実現される。これら各実施形態を実行するためのプログラムは、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録して提供される。これに限らず、プログラム並列化システムを実行するためのプログラムを、ＲＯＭ１２に予め記憶させて提供してもよい。
【０２４１】
さらに、各実施形態を実行するためのプログラムを、インターネットなどのネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、本実施形態に係るプログラム並列化システムを実行するためのプログラムを、インターネットなどのネットワーク経由で提供または配布するように構成してもよい。
【０２４２】
各実施形態を実行するためのプログラムは、上述した各部（第１の実施形態の例では、入力部１０１、解析部１０２、生成部１０３、指示部１０４、変換部１０５および並列化部１０６）を含むモジュール構成となっており、実際のハードウェアとしては、ＣＰＵ１８が例えばＨＤＤ１５から当該プログラムを読み出して実行することにより上述の各部がＲＡＭ１１上にロードされ、各部がＲＡＭ１１上に生成されるようになっている。
【０２４３】
なお、上述では、各実施形態において、実施形態による装置またはシステムを構成する各機能ブロックが１つのコンピュータ上で動作するように説明したが、これはこの例に限られない。例えば、各機能ブロックのうち１または複数がそれぞれ異なるコンピュータ上で動作するようにしてもよい。この場合、各機能ブロック間でのデータのやりとりは、記録媒体２１やネットワークを介して行うことができる。
【０２４４】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０２４５】
１０  並列化装置
２０  同期最適化装置
１０１，５００１  入力部
１０２，５００２  解析部
１０３，５００３  生成部
１０４，１２０４，５００４  指示部
１０５，１２０３，５００５  変換部
１０６，１０６’  並列化部
１０７  変換情報
１１０，１１０’，１１０Ａ  タスク境界情報
１１１，１１１’，１１１Ａ  プログラムコード
１１２  第１依存関係情報
１１３  第２依存関係情報
１１４  提示情報
１１５  依存有無情報
１１６，１１６’，１１６”，１１６Ａ  並列プログラム
１２１０，１２１０’  インターフェイス部
１２２０，１２２０’  コード変換部
１２２１，１２２１’  ランタイムライブラリ部
１２３０  並列化システム
１２４０  解析システム
１５００，１５００’  インターフェイス挿入部
１５０１  情報生成部
１６００  同期インターフェイス挿入部
１６０１  依存有無情報更新インターフェイス挿入部
１６０２，１６０２’  関係情報
１６０３  関係情報生成部
１６１０  同期インターフェイス部
１６１１  依存有無情報更新インターフェイス部
１７００  プロファイルプログラム
１７０１  出力部
５００６  再配置部
【図１】
0005178852.tif 000002
【図２】
0005178852.tif 000003
【図３】
0005178852.tif 000004
【図４】
0005178852.tif 000005
【図５】
0005178852.tif 000006
【図６】
0005178852.tif 000007
【図７】
0005178852.tif 000008
【図８】
0005178852.tif 000009
【図９】
0005178852.tif 000010
【図１０】
0005178852.tif 000011
【図１１】
0005178852.tif 000012
【図１２】
0005178852.tif 000013
【図１３】
0005178852.tif 000014
【図１４】
0005178852.tif 000015
【図１５】
0005178852.tif 000016
【図１６】
0005178852.tif 000017
【図１７】
0005178852.tif 000018
【図１８】
0005178852.tif 000019
【図１９】
0005178852.tif 000020
【図２０】
0005178852.tif 000021
【図２１】
0005178852.tif 000022
【図２２】
0005178852.tif 000023
【図２３】
0005178852.tif 000024
【図２４】
0005178852.tif 000025
【図２５】
0005178852.tif 000026
【図２６】
0005178852.tif 000027
【図２７】
0005178852.tif 000028
【図２８】
0005178852.tif 000029
【図２９】
0005178852.tif 000030
【図３０】
0005178852.tif 000031
【図３１】
0005178852.tif 000032
【図３２】
0005178852.tif 000033
【図３３】
0005178852.tif 000034
【図３４】
0005178852.tif 000035
【図３５】
0005178852.tif 000036
【図３６】
0005178852.tif 000037
【図３７】
0005178852.tif 000038
【図３８】
0005178852.tif 000039
【図３９】
0005178852.tif 000040
【図４０】
0005178852.tif 000041
【図４１】
0005178852.tif 000042
【図４２】
0005178852.tif 000043
【図４３】
0005178852.tif 000044
【図４４】
0005178852.tif 000045
【図４５】
0005178852.tif 000046
【図４６】
0005178852.tif 000047
【図４７】
0005178852.tif 000048
【図４８】
0005178852.tif 000049
【図４９】
0005178852.tif 000050
【図５０】
0005178852.tif 000051
【図５１】
0005178852.tif 000052
【図５２】
0005178852.tif 000053
【図５３】
0005178852.tif 000054
【図５４】
0005178852.tif 000055
【図５５】
0005178852.tif 000056
【図５６】
0005178852.tif 000057
【図５７】
0005178852.tif 000058
【図５８】
0005178852.tif 000059
【図５９】
0005178852.tif 000060
【図６０】
0005178852.tif 000061