(57)【要約】【課題】入力データ数に制限のある実行基盤において、入力データ数を制限数以下にするためのデータ統合処理を実行することなく、分散並列処理を実行可能にする。【解決手段】逐次処理用に記述された第１プログラムに基づいて、並列処理が可能で、且つ、並列処理実行時の各並列処理の入力データ数に制限数がある計算機システム上で動作する第２プログラムを生成する計算機であって、第１プログラムから、並列処理が可能な第１並列処理及び第２並列処理を抽出し、抽出された第２並列処理の入力データ数が制限数よりも大きい、且つ、抽出された第１並列処理の入力データと出力データとが、第２並列処理の入力データを含む場合に、第１並列処理の入力データ及び出力データを統合した統合データを、第１並列処理の出力データ及び第２並列処理の入力データとする手順を組み込んだ第２プログラムを生成する。【選択図】図４
2012221166.tif 000002
【特許請求の範囲】
【請求項１】
逐次処理用に記述された第１プログラムに基づいて、並列処理が可能で、且つ、並列処理実行時の各並列処理の入力データ数に制限数がある計算機システム上で動作する第２プログラムを生成する計算機であって、
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備え、
前記プロセッサは、
前記第１プログラムから、並列処理が可能な第１並列処理及び第２並列処理を抽出し、
抽出された前記第２並列処理の入力データ数が前記制限数よりも大きい、且つ、抽出された前記第１並列処理の入力データと出力データとが、前記第２並列処理の入力データを含む場合に、前記第１並列処理の入力データ及び出力データを統合した統合データを、前記第１並列処理の出力データ及び前記第２並列処理の入力データとする手順を組み込んだ第２プログラムを生成することを特徴とする計算機。
【請求項２】
前記プロセッサは、前記第１プログラムから、所定の処理が繰り返し実行される第１ループ処理及び第２ループ処理を、それぞれ前記第１並列処理及び第２並列処理として抽出することを特徴とする請求項１に記載の計算機。
【請求項３】
前記プロセッサは、前記統合データが前記第２並列処理の入力データ以外のデータを含む場合に、前記統合データから、前記第２並列処理の入力データを抽出する手順を、前記第２並列処理に組み込んだ第２プログラムを生成することを特徴とする請求項１に記載の計算機。
【請求項４】
前記プロセッサは、前記第１並列処理の入力データと出力データとの組み合わせが前記第２並列処理の入力データ以外のデータを含む場合に、前記第１並列処理の入力データ及び出力データから抽出される前記第２並列処理の入力データを、前記統合データとする手順を、前記第１並列処理に組み込んだ第２プログラムを生成することを特徴とする請求項１に記載の計算機。
【請求項５】
逐次処理用に記述された第１プログラムに基づいて、並列処理が可能で、且つ、並列処理実行時の各並列処理の入力データ数に制限数がある計算機システム上で動作する第２プログラムを生成する計算機における並列処理プログラム生成方法であって、
前記計算機は、
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備え、
前記方法は、
前記プロセッサが、
前記第１プログラムから、並列処理が可能な第１並列処理及び第２並列処理を抽出する手順と、
抽出された前記第２並列処理の入力データ数が前記制限数よりも大きい、且つ、抽出された前記第１並列処理の入力データと出力データとが、前記第２並列処理の入力データを含む場合に、前記第１並列処理の入力データ及び出力データを統合した統合データを、前記第１並列処理の出力データ及び前記第２並列処理の入力データとする手順を組み込んだ第２プログラムを生成する手順と、
を含むことを特徴とする並列処理プログラム生成方法。
【請求項６】
逐次処理用に記述された第１プログラムに基づいて、並列処理が可能で、且つ、並列処理実行時の各並列処理の入力データ数に制限数がある計算機システム上で動作する第２プログラムを生成するプログラムであって、
前記第１プログラムから、並列処理が可能な第１並列処理及び第２並列処理を抽出する手順と、
前記第２並列処理の入力データ数が前記制限数よりも大きい、且つ、前記第１並列処理の入力データと出力データとが、前記第２並列処理の入力データを含む場合に、前記第１並列処理の入力データ及び出力データを統合した統合データを、前記第１並列処理の出力データ及び前記第２並列処理の入力データとする手順を組み込んだ第２プログラムを生成する手順と、
をコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散並列処理プログラムを生成する技術に関し、特に、既存のプログラムから、分散並列処理に適したプログラムを生成する技術に関する。
【背景技術】
【０００２】
近年、大規模データ処理の要求が高まり、新しい分散並列処理プログラミングモデルとしてＭａｐＲｅｄｕｃｅが注目されている（非特許文献１参照）。ＭａｐＲｅｄｕｃｅとは、Ｇｏｏｇｌｅ（登録商標、以下同様）社によって提唱され、Ｍａｐ処理とＲｅｄｕｃｅ処理との２フェーズから構成されるプログラミングモデルである。
【０００３】
Ｍａｐ処理とは、入力データに基づいて、（Key，Value）形式の中間データを生成する処理である。一方、Ｒｅｄｕｃｅ処理とは、ＭａｐＲｅｄｕｃｅ実行基盤によってＫｅｙ毎に中間データを集約して（Key，Valueのリスト）を生成し、Ｋｅｙ毎にＶａｌｕｅのリストを計算する処理である。
【０００４】
ＭａｐＲｅｄｕｃｅの代表的な実行基盤としては、オープンソフトウェアのＨａｄｏｏｐが挙げられる（非特許文献２参照）。Ｈａｄｏｏｐでは、複数のコンピュータを連携させて、ＭａｐＲｅｄｕｃｅモデルのプログラムを実行するため、大容量のデータを取り扱うことができる。また、Ｈａｄｏｏｐでは、様々な言語で書かれたＭａｐＲｅｄｕｃｅモデルのプログラムを実行することができる。
【０００５】
Ｈａｄｏｏｐでは、ＨＤＦＳ（Hadoop Distributed FileSystem）と呼ばれる分散ファイルシステムがある。このＨＤＦＳでは、大容量のデータをある一定の容量毎に区切り、区切られた各データは、複数のコンピュータに分散して格納される。また、各データは、他のコンピュータに複製（コピー）して格納される。そのため、特定のコンピュータが故障した場合でも、複製されたデータを格納している他のコンピュータから参照することが可能である。
【０００６】
Ｈａｄｏｏｐ上でＭａｐＲｅｄｕｃｅモデルのプログラムが動作する場合、まずユーザにより指定された入力データに対し、Ｍａｐ処理が実行される。入力データがＨＤＦＳ上に格納される場合、入力データは一定の容量毎に区切られて複数のコンピュータに分散して格納される。そのため、ある区切られた入力データが格納されているコンピュータ上では、当該区切られた入力データのみに対するＭａｐ処理が実行される。
【０００７】
このように実行されるＭａｐ処理では、異なるコンピュータに格納されたデータの転送及び参照等による余計な負荷が発生しない。そのため、コンピュータの台数を増やした場合に、増加されたコンピュータの台数に応じて、処理性能を向上させることができる。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】J.Dean and S.Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, In Proceedings of Operating Systems Design and Implementation 2004, pp137-150, 2004.
【非特許文献２】Tom White, Hadoop: The Definitive Guide, O'Reilly, 2009.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ところで、上記のように、ある区切られた入力データが格納されたコンピュータ上では、当該区切られた入力データのみに対するＭａｐ処理が実行される。すなわち、Ｍａｐ処理の処理対象は、１つの区切られた入力データのみである。
【００１０】
そのため、複数の区切られた入力データに対してＭａｐ処理（ＭａｐＲｅｄｕｃｅモデルのプログラム）を実行したい場合は、複数の入力データを予め統合（結合）する等により、１つの区切られた入力データを生成する必要があった。
【００１１】
また、予め用意されたデータと、あるＭａｐＲｅｄｕｃｅモデルの第１プログラムの処理結果のデータとが、後続のＭａｐＲｅｄｕｃｅモデルの第２プログラムによって使用される場合は、ＭａｐＲｅｄｕｃｅモデルの第２プログラムの実行前に、両データを統合する等により１つのデータを生成する必要があった。
【００１２】
すなわち、ユーザによって定義された分散並列処理（ＭａｐＲｅｄｕｃｅモデルのプログラム）を実行する実行基盤には、入力データ数が制限される実行基盤がある（上記の例では入力データ数の制限数は１）。このような実行基盤では、所定の分散並列処理が複数のデータを処理対象にする場合、予めこれら複数のデータを統合することによって、データ数を入力データ数の制限数以下にする必要があった。しかしながら、データを統合するための分散処理が別途必要になり、余計な時間がかかっていた。
【００１３】
なお、非特許文献２のｐｐ．２５３−２５８には、ＭａｐＲｅｄｕｃｅモデルのプログラムの実行中に、複数のデータを統合して１つのデータを生成する方法の一例が記載されている。この方法によれば、複数のデータを１つのデータに統合することができる。しかしながら、データを統合するためのＭａｐＲｅｄｕｃｅ処理が別途必要になり、余計な時間がかかっていた。
【００１４】
本発明は、上述した問題を考慮したものであって、入力データ数に制限のある実行基盤において、入力データ数を制限数以下にするためのデータ統合処理を実行することなく、分散並列処理を実行可能な計算機、分散並列処理プログラム生成方法、及び、プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、逐次処理用に記述された第１プログラムに基づいて、並列処理が可能で、且つ、並列処理実行時の各並列処理の入力データ数に制限数がある計算機システム上で動作する第２プログラムを生成する計算機であって、プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備え、前記プロセッサは、前記第１プログラムから、並列処理が可能な第１並列処理及び第２並列処理を抽出し、抽出された前記第２並列処理の入力データ数が前記制限数よりも大きい、且つ、抽出された前記第１並列処理の入力データと出力データとが、前記第２並列処理の入力データを含む場合に、前記第１並列処理の入力データ及び出力データを統合した統合データを、前記第１並列処理の出力データ及び前記第２並列処理の入力データとする手順を組み込んだ第２プログラムを生成することを特徴とする。
【発明の効果】
【００１６】
本発明によれば、入力データ数に制限のある実行基盤において、入力データ数を制限数以下にするためのデータ統合処理を実行することなく、分散並列処理を実行可能である。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施の形態のコンパイラが稼働する計算機システムの構成例を示す図である。
【図２】本発明の実施の形態のコンパイラの処理手順を示すフローチャートである。
【図３】本発明の実施の形態のＭａｐＲｅｄｕｃｅ解析の処理手順を示すフローチャートである。
【図４】本発明の実施の形態の統合データ解析の処理手順を示すフローチャートである。
【図５】本発明の実施の形態のコード生成及び統合データコード生成の処理手順を示すフローチャートである。
【図６】本発明の実施の形態の具体例で用いられるデータとプログラムの処理手順とを示す図である。
【図７】本発明の実施の形態の具体例に係るプログラムの一例を示す図である。
【図８】本発明の実施の形態の具体例に係るループ表の一例を示す図である。
【図９Ａ】本発明の実施の形態の具体例に係るＭａｐＲｅｄｕｃｅ情報の第一の例を示す図である。
【図９Ｂ】本発明の実施の形態の具体例に係るＭａｐＲｅｄｕｃｅ情報の第二の例を示す図である。
【図１０】本発明の実施の形態の具体例においてコード生成によって生成されるプログラムを示す図である。
【図１１】本発明の実施の形態の具体例において統合データコード生成によって生成される第一のプログラムを示す図である。
【図１２】本発明の実施の形態の具体例において統合データコード生成によって生成される第二のプログラムを示す図である。
【図１３】本発明の実施の形態の具体例において統合データコード生成によって生成される第三のプログラムを示す図である。
【発明を実施するための形態】
【００１８】
以下、図面を用いて本発明の実施の形態について説明する。なお、本発明の実施の形態では、分散並列処理のプログラミングモデルとして、Ｇｏｏｇｌｅ社によって提唱されているＭａｐＲｅｄｕｃｅを用いて説明する。また、分散並列処理プログラミングモデルの実行基盤として、オープンソースソフトウェアのＨａｄｏｏｐを用いて説明する。但し、本発明は、これらプログラミングモデル及び実行基盤に限定されるものではない。
【００１９】
図１は、本発明の実施の形態のコンパイラ１０６が稼働する計算機システム１の構成例を示す図である。コンパイラ１０６は、コンパイル対象の逐次実行用のソースプログラム１１０を、コンピュータが実行可能なオブジェクトプログラム１１１（機械語のプログラム等）に変換するソフトウェアである。
【００２０】
計算機システム１は、ＣＰＵ（Central Processing Unit）１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４、外部記憶装置１０５を備える。
【００２１】
ＣＰＵ１０１は、主記憶装置１０４に格納されたプログラム（コンパイラ１０６を含む）を実行する演算処理装置である。
【００２２】
ディスプレイ装置１０２は、コンパイラ１０６によるコンパイル処理が終了した旨を示すメッセージや、エラーを示すエラーメッセージ等の各種情報を出力するための出力装置である。
【００２３】
キーボード１０３は、ユーザが情報を入力するための入力装置である。マウス等であってもよい。ユーザは、キーボード１０３を介して、コンパイラ１０６の起動命令を入力する。
【００２４】
主記憶装置１０４は、コンパイラ１０６等のプログラムを記憶するＲＡＭ（Random Access Memory）等の記憶装置である。この主記憶装置１０４は、プログラムの実行に必要なファイル、データ（中間コード１０７、ループ表１０８、ＭａｐＲｅｄｕｃｅ情報１０９を含む）も記憶する。中間コード１０７、ループ表１０８、ＭａｐＲｅｄｕｃｅ情報１０９は、コンパイラ１０６によるコンパイル過程で生成される各種データである。
【００２５】
外部記憶装置１０５は、プログラムやファイル、データ等を記憶するＨＤＤ（Hard Disk Drive）等の記憶装置である。この外部記憶装置１０５には、ソースプログラム１１０、オブジェクトプログラム１１１が記憶される。
【００２６】
図２は、本発明の実施の形態のコンパイラ１０６の処理手順を示すフローチャートである。図２に示す各処理手順は、計算機システム１のＣＰＵ１０１によって実行される。
【００２７】
コンパイラ１０６は、外部記憶装置１０５に記憶されたソースプログラム１１０を入力し、入力されたソースプログラム１１０に対し、構文解析２０１、ＭａｐＲｅｄｕｃｅ解析２０２、統合データ解析２０３、コード生成２０４の順で処理を実行することにより、オブジェクトプログラム１１１を生成し、出力する。
【００２８】
構文解析２０１では、入力されたソースプログラム１１０の構文を解析する構文解析処理、構文の解析結果に基づいて抽出される処理間の依存関係（制御フロー）を解析する制御フロー解析処理、及び、構文の解析結果に基づいて抽出されるループ処理を解析するループ解析処理を実行する。これにより、中間コード１０７と、ループ表１０８とを生成し、出力する。中間コード１０７は、ソースプログラム１１０内のループ処理の実行順序を特定するための制御フロー情報等を含む。ループ表１０８は、抽出されたループ処理に基づいて生成される。このループ表１０８については、図８を用いて後述する。
【００２９】
なお、構文解析２０１における構文解析処理、制御フロー解析処理、ループ解析処理については、例えば「エイホ、セシィ、ウルマン著：コンパイラ（サイエンス社、１９９０年）」に記載されているように既知の技術であるため、ここでは詳細な説明を省略する。
【００３０】
ＭａｐＲｅｄｕｃｅ解析２０２では、構文解析２０１で生成された中間コード１０７と、ループ表１０８とに基づいて、分散並列化が可能なループ処理（ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理）に関する情報（ＭａｐＲｅｄｕｃｅ情報）を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する。ＭａｐＲｅｄｕｃｅ情報は、ループ処理の入出力データの情報を含む。
【００３１】
具体的には、まずループ表１０８に登録された各ループ処理について、分散並列化が可能か否かを確認する。その後、分散並列化が可能であると判定されたループ処理に関する情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する。本発明の実施の形態では、各イタレーション間でデータ依存がないループ処理、又は、各イタレーション間に足し込み型のデータ依存があるループ処理は、分散並列化が可能であると判定される。ＭａｐＲｅｄｕｃｅ情報１０９については、図９Ａ、図９Ｂを用いて後述する。
【００３２】
統合データ解析２０３では、ＭａｐＲｅｄｕｃｅ解析２０２で生成されたＭａｐＲｅｄｕｃｅ情報１０９と、構文解析２０１で生成された中間コード１０７とに基づいて、ＭａｐＲｅｄｕｃｅ情報１０９に登録された各ＭａｐＲｅｄｕｃｅ処理の入出力データのうち、統合すべきデータを解析する。
【００３３】
具体的には、ＭａｐＲｅｄｕｃｅ情報１０９に登録されている所定のループ処理が、複数の入力データを入力している場合に、これら複数の入力データの全てを入出力データとしている他のループ処理（先行ループ処理）を探索する。その後、探索された先行ループ処理の入出力データを統合可能か否か判定する。統合可能な場合には、当該先行ループ処理の入出力データの該当箇所を、統合データに置き換える。同様に、所定のループ処理の入力データを、統合データに置き換える。
【００３４】
コード生成２０４では、構文解析２０１によって生成された中間コード１０７を、オブジェクトプログラム１１１のコードに変換し出力する。統合データコード生成２０５は、統合データ解析２０３によって統合可能と判定された入力データと出力データとの組み合わせを、統合データとして入出力するためのコードを生成する。すなわち、コード生成２０４によって生成されたオブジェクトプログラム１１１のコードを、統合データ向けのコードに変更する。この統合データコード生成２０５は、コード生成２０４内で実行される。
【００３５】
図３は、本発明の実施の形態のＭａｐＲｅｄｕｃｅ解析２０２の処理手順を示すフローチャートである。ここでは、図２のＭａｐＲｅｄｕｃｅ解析２０２の処理の詳細を説明する。
【００３６】
まず、ステップ３０１において、ＣＰＵ１０１は、ループ表１０８に登録されている各ループ処理のうち、ステップ３０２、３０３の処理を未処理のループ処理があるか否かを判定する（３０１）。未処理のループ処理がない場合は（３０１でＮＯ）、処理を終了する。
【００３７】
一方、未処理のループ処理がある場合は（３０１でＹＥＳ）、ＣＰＵ１０１は、当該未処理のループ処理が、ＭａｐＲｅｄｕｃｅ処理に変換可能か否か（分散並列化が可能か否か）を判定する（３０２）。ＭａｐＲｅｄｕｃｅ処理に変換可能でない場合は（３０２でＮＯ）、ステップ３０１に戻って、次の未処理のループ処理について処理を繰り返す。
【００３８】
一方、ＭａｐＲｅｄｕｃｅ処理に変換可能である場合は（３０２でＹＥＳ）、ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅ処理に変換可能であると判定されたループ処理の情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する（３０３）。その後、ステップ３０１に戻って、次の未処理のループ処理について処理を繰り返す。
【００３９】
以上に示す処理により、ＭａｐＲｅｄｕｃｅ解析２０２では、構文解析２０１で生成された中間コード１０７と、ループ表１０８とに基づいて、分散並列化が可能なループ処理に関する情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する。
【００４０】
図４は、本発明の実施の形態の統合データ解析２０３の処理手順を示すフローチャートである。ここでは、図２の統合データ解析２０３の処理の詳細を説明する。
【００４１】
まずステップ４０１において、ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅ情報１０９に登録されているループ処理（ＭａｐＲｅｄｕｃｅ処理、並列分散処理）のうち、複数の入力データを有するループ処理で、且つ、以降のステップ４０２〜４０５の処理を未処理のループ処理があるか否かを判定する（４０１）。該当するループ処理がない場合は（４０１でＮＯ）、処理を終了する。
【００４２】
一方、該当するループ処理がある場合は（４０１でＹＥＳ）、ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅ情報１０９を参照し、該当するループ処理が有する複数の入力データの全てを、入出力データとして含む他のループ処理が有るか否かを判定する（４０２）。
【００４３】
具体的には、まずＣＰＵ１０１は、複数の入力データを有するループ処理（以下、「対象ループ処理」という。）の前に実行される可能性のあるループ処理（以下、「先行ループ処理」という。）を、ＭａｐＲｅｄｕｃｅ情報１０９と中間コード１０７から取得する。その後、先行ループ処理の入力データと出力データとの組み合わせが、対象ループ処理の複数の入力データの全てを含むか否か判定する。
【００４４】
先行ループ処理の入力データと出力データとの組み合わせが、対象ループ処理の複数の入力データの全てを含まない場合は（４０２でＮＯ）、ステップ４０１に戻り、次のループ処理をチェックする。
【００４５】
一方、先行ループ処理の入力データと出力データとの組み合わせが、対象ループ処理の複数の入力データの全てを含む場合は（４０２でＹＥＳ）、ステップ４０３に進む。
【００４６】
なお、ステップ４０３に進むということは、先行ループ処理の出力データを、対象ループ処理の複数の入力データの全てを含むように変更することによって、対象ループ処理の複数の入力データを統合するためのＭａｐＲｅｄｕｃｅ処理が不要になることを示す。
【００４７】
また、先行ループ処理の入力データと出力データとの組み合わせが、対象ループ処理の複数の入力データの全てを含む場合とは、先行ループ処理の入力データのみ（又は出力データのみ）が、対象ループ処理の複数の入力データの全てを含む場合も含むものとする。
【００４８】
ステップ４０３において、ＣＰＵ１０１は、対象ループ処理の複数の入力データを、１つの統合データに置き換える（４０３）。統合データとは、複数の入力データを、１つのデータに統合したものである。
【００４９】
次に、ステップ４０４において、ＣＰＵ１０１は、先行ループ処理の出力データを、ステップ４０３で置き換えたものと同じ１つの統合データに置き換える（４０４）。以上のステップ４０３、４０４の処理により、異なるループ処理（先行ループ処理と対象ループ処理）間で、同一の統合データのやりとりが可能になる。
【００５０】
なお、このステップ４０４では、先行ループ処理の入力データと出力データとの組み合わせが、対象ループ処理の入力データ以外のデータを含む場合には、先行ループ処理の入力データ及び出力データから、対象ループ処理に必要な入力データのみを抽出することによって得られる統合データに、先行ループ処理の出力データを置き換えてもよい。
【００５１】
その後、ステップ４０５において、ＣＰＵ１０１は、元の出力データ（統合前の先行ループ処理の出力データ）を参照している箇所を、ステップ４０４で置き換えたものと同じ１つの統合データに置き換える（４０５）。これにより、元の出力データを入力データとしていたループ処理において、受け取る入力データがなくなってしまうという問題を回避することができる。その後、ステップ４０１に戻り、次のループ処理をチェックする。
【００５２】
以上に示す処理により、ＭａｐＲｅｄｕｃｅ解析２０２で生成されたＭａｐＲｅｄｕｃｅ情報１０９と、構文解析２０１で生成された中間コード１０７とに基づいて、統合すべきデータを解析する。
【００５３】
図５は、本発明の実施の形態のコード生成２０４及び統合データコード生成２０５の処理手順を示すフローチャートである。ここでは、図２のコード生成２０４及び統合データコード生成２０５の処理の詳細を説明する。なお、ステップ５０１は、コード生成２０４の処理を示す。一方、ステップ５０２〜５０８は、統合データコード生成２０５の処理を示す。
【００５４】
まずステップ５０１において、ＣＰＵ１０１は、中間コード１０７、ループ表１０８、及びＭａｐＲｅｄｕｃｅ情報１０９に基づいて、ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理を実行するためのＭａｐＲｅｄｕｃｅコードや、ＭａｐＲｅｄｕｃｅコードを呼び出すための呼出しコードを含むオブジェクトプログラム１１１のコードを生成する（５０１）。ステップ５０１で生成されるオブジェクトプログラム１１１のコードの具体例については、図１０を用いて後述する。
【００５５】
ステップ５０２において、ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅ情報１０９に登録されたＭａｐＲｅｄｕｃｅ情報のうち、未処理のＭａｐＲｅｄｕｃｅ情報があるか否かを判定する（５０２）。未処理のＭａｐＲｅｄｕｃｅ情報がない場合は（５０２でＮＯ）、処理を終了する。
【００５６】
一方、未処理のＭａｐＲｅｄｕｃｅ情報がある場合は（５０２でＹＥＳ）、ＣＰＵ１０１は、該当するＭａｐＲｅｄｕｃｅ情報の入力データが、統合されたデータであるか否かを判定する（５０３）。統合されたデータでない場合は（５０３でＮＯ）、ステップ５０６に進む。
【００５７】
一方、統合されたデータである場合は（５０３でＹＥＳ）、ＣＰＵ１０１は、ステップ５０１で生成されたコードを修正すべく、統合された入力データから統合前の各データを分割して取り出すためのコードを、入力データ参照コードの直後に挿入する（５０４）。挿入されるコードの具体例については、図１１を用いて後述する。
【００５８】
なお、このステップ５０４により、統合されたデータが対象ループ処理の入力データ以外のデータを含む場合に、対象ループ処理において、統合されたデータから、統合前の各データ（対象ループ処理の入力データを含む）を抽出するためのコードを組み込んでいる。
【００５９】
次に、ステップ５０５において、ＣＰＵ１０１は、入力データが統合データに変更されているため、入力ファイル名を変更する（５０５）。ここでは、統合データの種類に応じた入力ファイル名に変更する。具体的には、入力ファイル名を、統合されている複数の入力データの配列名を先頭から結合し、最後にファイル識別子として「．ｄａｔ」を付加したものにしてもよい。
【００６０】
次に、ステップ５０６において、ＣＰＵ１０１は、該当するＭａｐＲｅｄｕｃｅ情報の出力データが、統合されたデータであるか否かを判定する（５０６）。統合されたデータでない場合は（５０６でＮＯ）、ステップ５０２に戻って処理を繰り返す。
【００６１】
一方、統合されたデータである場合は（５０６でＹＥＳ）、ＣＰＵ１０１は、ステップ５０１で生成されたコードを修正すべく、個別の出力データを統合された出力データに変更するためのコードを、データ出力コードの直前に挿入する（５０７）。挿入されるコードの具体例については、図１２を用いて後述する。
【００６２】
次に、ステップ５０８において、ＣＰＵ１０１は、出力データが統合データに変更されているため、出力ファイル名を変更する（５０８）。ここでは、結合データの種類に応じた出力ファイル名に変更する。具体的には、出力ファイル名を、統合されている複数のデータの配列名を先頭から結合し、最後にファイル識別子として「．ｄａｔ」を付加したものにしてもよい。また、同じ統合データを入力データとするＭａｐＲｅｄｕｃｅ情報がある場合、当該ＭａｐＲｅｄｕｃｅ情報の入力ファイル名と同じにしてもよい。
【００６３】
以上に示す処理により、コード生成２０４では、構文解析２０１によって生成された中間コード１０７を、オブジェクトプログラム１１１のコードに変換し出力する（図１０参照）。統合データコード生成２０５は、統合データ解析２０３によって統合可能と判定された入出力データを、統合データとして入出力するためのコードを生成する。すなわち、コード生成２０４によって生成されたオブジェクトプログラム１１１のコードを、統合データ向けのコードに変更する（図１１〜図１３参照）。
【００６４】
（具体例）
以下、本発明の実施の形態の分散並列処理プログラムの生成方法の具体例について説明する。
【００６５】
図６は、本発明の実施の形態の具体例で用いられるデータとプログラムの処理手順とを示す図である。
【００６６】
図６において、座標データ６０１は、２次元座標上に点在する複数の座標データの集合である。所属クラスタデータ６０２は、座標データ６０１中の各座標データが所属するクラスタ（部分集合）を示すデータである。これら座標データ６０１、６０２は、外部記憶装置１０５に記憶される。
【００６７】
図６のステップ６０３〜６０６では、Ｋ−ｍｅａｎｓ法と呼ばれるプログラムの処理手順（フローチャート）を示している。これらステップ６０３〜６０６で実現されるプログラムは、コンパイラ１０６によるコンパイル対象のソースプログラム１１０に対応する。
【００６８】
Ｋ−ｍｅａｎｓ法とは、あるデータの集合を、Ｋ個のクラスタ（部分集合）に分類する手法である。本発明の実施の形態の具体例では、座標データ６０１に含まれる複数の座標データを、Ｋ個のクラスタに分類する。図６中の実線は処理の流れを示し、点線はデータの流れを示す。
【００６９】
ステップ６０３において、ＣＰＵ１０１は、座標データ６０１を入力し、座標データ６０１中の各座標データが所属する初期クラスタを決定し、所属クラスタデータ６０２を出力する（６０３）。ステップ６０３では、各座標データが所属する初期クラスタはランダムに決定される。
【００７０】
次に、ステップ６０４において、ＣＰＵ１０１は、座標データ６０１と所属クラスタデータ６０２の２つのデータを入力し、クラスタ毎の重心データを計算する（６０４）。具体的には、各クラスタについて、クラスタに所属する各座標データのＸ軸成分の総和とＹ軸成分の総和の各々を、クラスタに所属する座標データの個数で除算することにより、各クラスタの重心データを求める。
【００７１】
なお、図６に重心データを図示してないのは、クラスタ個数をＫ個（Ｋは座標データ数に比べて非常に小さい値とする）とする場合、重心データのデータ数は高々Ｋ個であり、座標データ６０１や所属クラスタデータ６０２に比べ非常にデータ量が小さく、データの受け渡しは主記憶装置１０４内でのコピー等で実現可能であるためである。
【００７２】
次に、ステップ６０５において、ＣＰＵ１０１は、座標データ６０１とステップ６０４で求められた重心データを入力し、各座標データが所属するクラスタを再計算し、所属クラスタデータ６０２を出力する（６０５）。このステップ６０５によって、各座標データは、最も近い重心データを有するクラスタに割り当てられるものとする。
【００７３】
次に、ステップ６０６において、ＣＰＵ１０１は、予め設定された所定の回数を繰り返したか否かを判定する（６０６）。所定の回数を繰り返した場合は（６０６でＹＥＳ）、処理を終了する。所定の回数を繰り返してない場合は（６０６でＮＯ）、ステップ６０４に戻って、クラスタの重心データの計算（６０４）、所属クラスタの再計算（６０５）を繰り返す。
【００７４】
以上の処理により、本発明の実施の形態の具体例では、複数の座標データ６０１を、Ｋ個のクラスタに分類することができる。なお、特にステップ６０４は、複数のデータ（座標データ６０１と所属クラスタデータ６０２）を処理対象にするプログラム文である。
【００７５】
図７は、本発明の実施の形態の具体例に係るプログラム７０の一例を示す図である。図７に示すプログラム７０は、図６のステップ６０３〜６０５を実行するプログラムを示している。
【００７６】
なお、プログラム７０では、図６の座標データ６０１を格納する配列をＰｏｓ、所属クラスタデータ６０２を格納する配列をＣｌｕｓｔｅｒ、重心データを格納する配列をＣｅｎｔｒｏｉｄとしている。
【００７７】
座標データ（Ｐｏｓ）と重心データ（Ｃｅｎｔｒｏｉｄ）はＸ軸成分とＹ軸成分の値とを有する。そのため、座標データのＸ軸成分のデータを「Ｐｏｓ．Ｘ」、Ｙ軸成分のデータを「Ｐｏｓ．Ｙ」で表す。同様に、重心データのＸ軸成分のデータを「Ｃｅｎｔｒｏｉｄ．Ｘ」、Ｙ軸成分のデータを「Ｃｅｎｔｒｏｉｄ．Ｙ」で表す。また、重心データで示される重心を有するクラスタに所属する座標データの数を「Ｃｅｎｔｒｏｉｄ．Ｃ」で表す。
【００７８】
以下、プログラム７０１〜７０４について説明する。
【００７９】
プログラム７０１は、図６のステップ６０３に対応し、座標データ６０１中の各座標データが所属するクラスタを初期化する処理である。関数ｆｕｎｃ１は、座標データを入力し、入力された座標データが所属する初期クラスタ番号を返却する関数である。返却されたクラスタ番号は、配列Ｃｌｕｓｔｅｒに代入される。初期クラスタ番号は、ランダムに決めてもよい。
【００８０】
プログラム７０２と７０３は、図６のステップ６０４に対応し、座標データ６０１と所属クラスタデータ６０２とに基づいて、各クラスタの重心データを求める処理である。具体的には、各クラスタについて、当該クラスタに所属する各座標データのＸ軸成分の総和と、Ｙ軸成分の総和とを求め、それぞれの総和を当該クラスタに所属する座標データの個数で除算することにより求める。
【００８１】
プログラム７０２では、クラスタの番号をＣｌｕｓｔｅｒ［Ｊ２］によって取り出し、取り出されたクラスタの重心データに、当該クラスタに所属する各座標データの情報を繰り返し加算する。その結果、クラスタに所属する各座標データのＸ軸成分の総和を、Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｘに代入する。同様に、クラスタに所属する各座標データのＹ軸成分の総和を、Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｙに代入する。また、当該クラスタに所属する座標データの個数を、Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｃに代入する。
【００８２】
プログラム７０３では、クラスタに所属する各座標データのＸ軸成分の総和（Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｘ）と、Ｙ軸成分の総和（Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｙ）との各々を、クラスタに属する座標データの個数（Ｃｅｎｔｒｏｉｄ［ｃｎｕｍ］．Ｃ）で除算することにより、クラスタの重心データを計算する。
【００８３】
プログラム７０４は、図６のステップ６０５に対応し、座標データ６０１とステップ６０４で求められた重心データとに基づいて、座標データ６０１中の各座標データが所属するクラスタを再計算する処理である。関数ｆｕｎｃ２は、座標データ６０１とステップ６０４で計算された重心データを入力し、入力された座標データが所属すべきクラスタ番号を返却する関数である。返却されたクラスタ番号は、配列Ｃｌｕｓｔｅｒに代入される。所属すべきクラスタとは、全クラスタのうちの、入力された座標データからクラスタの重心データまでの距離が一番近いクラスタであるものとする。
【００８４】
図８は、本発明の実施の形態の具体例に係るループ表１０８の一例を示す図である。図８に示すループ表１０８は、構文解析２０１（図２参照）によって、図７のプログラム７０１〜７０４で示される各ループ処理に基づいて生成されたものである。
【００８５】
このループ表１０８は、ループ識別番号８０１、参照データ８０２の欄を有する。このループ表１０８は、各ループ処理の参照データ（入力データ及び出力データ）８０２を格納する。
【００８６】
ループ識別番号８０１は、構文解析２０１によって、ソースプログラム１１０（ここではプログラム７０１〜７０４）から抽出されたループ処理を登録する毎に、昇順に割り当てられる番号である。このループ識別番号８０１によって、中間コード１０７中の各ループ処理の情報の格納箇所を特定することができる。参照データ８０２の欄には、ループ処理内で定義・使用されるデータ（配列名の情報）が登録される。
【００８７】
まず、プログラム７０１に示すループ処理では、配列Ｐｏｓが使用され、配列Ｃｌｕｓｔｅｒが定義されている。そのため、ループ表１０８の参照データ８０２には、Ｐｏｓ、Ｃｌｕｓｔｅｒが登録される。ループ識別番号８０１には、最初の登録なので１が登録される。
【００８８】
次に、プログラム７０２に示すループ処理では、配列Ｃｌｕｓｔｅｒと配列Ｐｏｓとが使用され、配列Ｃｅｎｔｒｏｉｄが使用・定義されている。そのため、ループ表１０８の参照データ８０２には、Ｃｌｕｓｔｅｒ、Ｐｏｓ、Ｃｅｎｔｒｏｉｄが登録される。ループ識別番号８０１には、２番目の登録なので２が登録される。
【００８９】
次に、プログラム７０３に示すループ処理では、配列Ｃｅｎｔｒｏｉｄが使用・定義されている。そのため、ループ表１０８の参照データ８０２には、Ｃｅｎｔｒｏｉｄが登録される。ループ識別番号８０１には、３番目の登録なので３が登録される。
【００９０】
最後に、プログラム７０４に示すループ処理では、配列Ｐｏｓと配列Ｃｅｎｔｒｏｉｄとが使用され、配列Ｃｌｕｓｔｅｒが定義されている。そのため、ループ表１０８の参照データ８０２には、Ｐｏｓ、Ｃｅｎｔｒｏｉｄ、Ｃｌｕｓｔｅｒが登録される。ループ識別番号８０１には、４番目の登録なので４が登録される。
【００９１】
以上に示すように、ループ表１０８には、各ループ処理の参照データ（入力データ及び出力データ）が、各ループ処理に対応付けて格納される。
【００９２】
図９Ａは、本発明の実施の形態の具体例に係るＭａｐＲｅｄｕｃｅ情報１０９の第一の例を示す図である。図９Ａに示すＭａｐＲｅｄｕｃｅ情報１０９は、ＭａｐＲｅｄｕｃｅ解析２０２（図２参照）によって、図８のループ表１０８に基づいて生成されたものである。
【００９３】
このＭａｐＲｅｄｕｃｅ情報（テーブル）１０９は、ループ識別番号９０１、入力データ９０２、入力変更９０３、出力データ９０４、出力変更９０５の欄を有する。このＭａｐＲｅｄｕｃｅ情報１０９は、各ＭａｐＲｅｄｕｃｅ処理（分散並列化が可能なループ処理）の参照データ（入力データ９０２及び出力データ９０４）、及び、参照データが変更されたか否かを示す情報（入力変更９０３及び出力変更９０５）を格納する。
【００９４】
ループ識別番号９０１は、ＭａｐＲｅｄｕｃｅ情報１０９に登録される各ＭａｐＲｅｄｕｃｅ処理（分散並列処理）を識別するための番号である。このループ識別番号９０１には、各ループ処理が図８のループ表１０８に登録される際に、各ループ処理に付与されたループ識別番号８０１が登録される。
【００９５】
入力データ９０２には、図８のループ表１０８の参照データ８０２のうち、ＭａｐＲｅｄｕｃｅ処理（分散並列処理）で使用される分散データのみが登録される。
【００９６】
なお、本発明の実施の形態では、分散ファイルシステムＨＤＦＳ上に格納され、大きいデータ量で、且つ、ＭａｐＲｅｄｕｃｅ処理で定義または使用されるデータを、分散処理を実行するための「分散データ」と呼ぶ。一方、分散データに比して非常に少ないデータ量のデータは「分散データ」とは呼ばないものとする。
【００９７】
入力変更９０３は、入力データ９０２が変更されたか否かを示すフラグである。この入力変更９０３には、「なし」が初期値として登録される。なお、入力データ９０２が複数のデータに基づいて生成される１つの統合データに変更された場合に、この入力変更９０３には、「あり」がセットされる。
【００９８】
出力データ９０４は、図８のループ表１０８の参照データ８０２のうち、ＭａｐＲｅｄｕｃｅ処理で定義される分散データのみが登録される。
【００９９】
出力変更９０５は、出力データ９０４が変更されたか否かを示すフラグである。この出力変更９０５には、「なし」が初期値として登録される。なお、出力データ９０４が複数のデータに基づいて生成される１つの統合データに変更された場合に、この出力変更９０５には、「あり」がセットされる。
【０１００】
以下、図９Ａに示すＭａｐＲｅｄｕｃｅ情報１０９が生成される具体的手順を、図３、図７及び図８を参照しながら説明する。
【０１０１】
まず、ステップ３０１において、ＣＰＵ１０１は、ループ表１０８に登録されている各ループ処理のうち、ループ識別番号８０１が１のループ処理（以下、単に「第１のループ処理」という。）を抽出する（３０１でＹＥＳ）。次に、ステップ３０２において、ＣＰＵ１０１は、第１のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理か否かを判定する（３０２）。第１のループ処理は、図７のプログラム７０１であって、各イタレーション間に足し込み型のデータ依存はないが、あるイタレーションで定義された値が異なるイタレーションで使用されることがなく、各イタレーション間で依存がないループ処理である。そのため、ＭａｐＲｅｄｕｃｅ処理に変換可能であると判定される（３０２でＹＥＳ）。次に、ステップ３０３において、ＣＰＵ１０１は、第１のループ処理の情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する（３０３）。具体的には、ループ識別番号９０１の欄に、ループ識別番号８０１と同じ番号である１を登録する。入力データ９０２の欄に、対象のＭａｐＲｅｄｕｃｅ処理（ここでは第１のループ処理）内で定義される前に使用されている分散データ、すなわちＰｏｓを登録する。出力データ９０４の欄に、第１のループ処理内で定義されている分散データ、すなわちＣｌｕｓｔｅｒを登録する。なお、入力変更９０３、出力変更９０５の欄には、初期値として「なし」を登録する。
【０１０２】
次に、ステップ３０１に戻って、ＣＰＵ１０１は、ループ表１０８に登録されている各ループ処理のうち、ループ識別番号８０１が２のループ処理（以下、単に「第２のループ処理」という。）を抽出する（３０１でＹＥＳ）。次に、ステップ３０２において、ＣＰＵ１０１は、第２のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理か否かを判定する（３０２）。第２のループ処理は、図７のプログラム７０２であって、配列Ｃｅｎｔｒｏｉｄに配列Ｐｏｓの値を足し込んでいる足し込み型のデータ依存がある。そのため、ＭａｐＲｅｄｕｃｅの処理に変換可能であると判定される（３０２でＹＥＳ）。次に、ステップ３０３において、ＣＰＵ１０１は、第２のループ処理の情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する（３０３）。具体的には、ループ識別番号９０１の欄に、ループ識別番号８０１と同じ番号である２を登録する。入力データ９０２の欄に、第２のループ処理内で定義される前に使用されている分散データ、すなわちＰｏｓ、Ｃｌｕｓｔｅｒを登録する。出力データ９０４の欄に、第２のループ処理内で定義されている分散データはないので、登録対象がない旨を示す情報（ここでは「−」）を登録する。なお、入力変更９０３、出力変更９０５の欄には、初期値として「なし」を登録する。
【０１０３】
次に、ステップ３０１に戻って、ＣＰＵ１０１は、ループ表１０８に登録されている各ループ処理のうち、ループ識別番号８０１が３のループ処理（以下、単に「第３のループ処理」という。）を抽出する（３０１でＹＥＳ）。次に、ステップ３０２において、ＣＰＵ１０１は、第３のループ処理がＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理か否かを判定する（３０２）。第３のループ処理は、図７のプログラム７０３であって、分散データを用いた処理プログラムではないので、ＭａｐＲｅｄｕｃｅ処理に変換可能でないと判定される（３０２でＮＯ）。そのため、ＣＰＵ１０１は、第３のループ処理の情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録しない。
【０１０４】
次に、ステップ３０１に戻って、ＣＰＵ１０１は、ループ表１０８に登録されている各ループ処理のうち、ループ識別番号８０１が４のループ処理（以下、単に「第４のループ処理」という。）を抽出する（３０１でＹＥＳ）。次に、ステップ３０２において、ＣＰＵ１０１は、第４のループ処理が、ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理か否かを判定する（３０２）。第４のループ処理は、図７のプログラム７０４であって、プログラム７０１と同様に、各イタレーション間でデータ依存がないループ処理である。そのため、ＭａｐＲｅｄｕｃｅの処理に変換可能であると判定される（３０２でＹＥＳ）。次に、ステップ３０３において、ＣＰＵ１０１は、第４のループ処理の情報を、ＭａｐＲｅｄｕｃｅ情報１０９に登録する（３０３）。具体的には、ループ識別番号９０１の欄に、ループ識別番号８０１と同じ番号である４を登録する。入力データ９０２の欄に、第４のループ処理内で定義される前に使用されている分散データ、すなわちＰｏｓを登録する。出力データ９０４の欄に、第４のループ処理内で定義されている分散データ、すなわちＣｌｕｓｔｅｒを登録する。なお、入力変更９０３、出力変更９０５の欄には、初期値として「なし」を登録する。
【０１０５】
以上に示す処理により、図９Ａに示すＭａｐＲｅｄｕｃｅ情報１０９は生成される。なお、ＭａｐＲｅｄｕｃｅ処理の処理対象データは、分散データを格納している配列データのみである。そのため、高々クラスタ数の要素（クラスタ数をＫ個とする場合、高々Ｋ個の要素）しか有さない配列Ｃｅｎｔｒｏｉｄは、ＭａｐＲｅｄｕｃｅ処理の処理対象データにはならないものとしている。そのため、ＭａｐＲｅｄｕｃｅ情報１０９の入力データ９０２、出力データ９０４の欄には、Ｃｅｎｔｒｏｉｄは登録されない。
【０１０６】
図９Ｂは、本発明の実施の形態の具体例に係るＭａｐＲｅｄｕｃｅ情報１０９の第二の例を示す図である。図９Ｂに示すＭａｐＲｅｄｕｃｅ情報１０９は、統合データ解析２０３（図２参照）によって、図９ＡのＭａｐＲｅｄｕｃｅ情報１０９に基づいて生成されたものである。
【０１０７】
このＭａｐＲｅｄｕｃｅ情報（テーブル）１０９の各欄は、図９Ａに示すＭａｐＲｅｄｕｃｅ情報１０９と同様であるため、ここでは説明を省略する。
【０１０８】
以下、図９Ｂに示すＭａｐＲｅｄｕｃｅ情報１０９が生成される具体的手順を、図４、図９Ａを参照しながら説明する。
【０１０９】
まずステップ４０１において、ＣＰＵ１０１は、図９ＡのＭａｐＲｅｄｕｃｅ情報１０９の入力データ９０２の欄を参照し、複数の入力データが登録されている第２のループ処理を抽出する（４０１でＹＥＳ）。第２のループ処理の入力データ９０２の欄には、ＰｏｓとＣｌｕｓｔｅｒの２つの入力データが登録されている。以下の説明において、この第２のループ処理を、対象ループ処理という。
【０１１０】
次にステップ４０２において、ＣＰＵ１０１は、ＭａｐＲｅｄｕｃｅ情報１０９を参照し、ＰｏｓとＣｌｕｓｔｅｒの２つの入力データの全てを、入出力データとして含む他のループ処理が有るか否かを判定する（４０２）。
【０１１１】
ステップ４０２において、具体的には、まずＣＰＵ１０１は、対象ループ処理の前に実行される可能性のある先行ループ処理として、第１のループ処理と、第４のループ処理とを抽出する。第１のループ処理と第４のループ処理とは、双方とも、ＰｏｓとＣｌｕｓｔｅｒの２つの入力データの全てを含む（４０２でＹＥＳ）。そのため、このステップ４０２では、配列Ｐｏｓと配列Ｃｌｕｓｔｅｒの組が、統合すべきデータとして判定される。
【０１１２】
次にステップ４０３において、ＣＰＵ１０１は、対象ループ処理の入力データ９０２の欄に登録された複数の入力データ（Ｐｏｓ、Ｃｌｕｓｔｅｒ）を、１つの統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）に置き換える（４０３）。ここでは、置き換え後の統合データを、新たな入力データとして登録する。また、入力データが統合データに置き換えられたので、入力変更９０３に、変更があったことを示す「あり」を登録する。
【０１１３】
なお、統合データは、複数のデータを１つのデータのように扱うものであり、本発明の実施の形態の具体例に係るＭａｐＲｅｄｕｃｅ情報１０９内では、'｛'と'｝'で囲んで表記している。また、統合データとして扱うデータ順は、'｛'と'｝'で囲まれた中に記載してあるデータ順と同じとする。例えば、第２のループ処理の入力データ９０２の欄には｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝として登録されるので、統合データの先頭にＰｏｓのデータが、その後方にＣｌｕｓｔｅｒのデータが配置される。
【０１１４】
次に、ステップ４０４において、ＣＰＵ１０１は、先行ループ処理（第１のループ処理と第４のループ処理）の出力データ９０４の欄に登録された出力データを、ステップ４０３で置き換えたものと同じ１つの統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）に置き換える（４０４）。ここでは、置き換え後の統合データを、新たな出力データとして登録する。また、出力データが統合データに置き換えられたので、出力変更９０５に、変更があったことを示す「あり」を登録する。
【０１１５】
その後、ステップ４０５において、ＣＰＵ１０１は、元の出力データ（統合前の先行ループ処理の出力データ）を参照している箇所を、ステップ４０４で置き換えたものと同じ１つの統合データに置き換える（４０５）。本発明の実施の形態の具体例では、第２のループ処理以外に、先行ループ処理（第１のループ処理と第４のループ処理）の出力データを参照するループ処理が存在しないので、このステップ４０５の処理を実行しない。
【０１１６】
以上に示す処理により、図９Ｂに示すＭａｐＲｅｄｕｃｅ情報１０９は生成される。図９Ｂに示すように、第２のループ処理の入力データ９０２の欄、及び、第１のループ処理と第４のループ処理の出力データ９０４の欄には、同じ統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）が登録されている。
【０１１７】
次に、図１０〜図１３を用いて、本発明の実施の形態の具体例において、コード生成２０４及び統合データコード生成２０５（図２参照）によって生成されるプログラムについて説明する。
【０１１８】
図１０は、本発明の実施の形態の具体例においてコード生成２０４によって生成されるプログラム１０を示す図である。図１０に示すプログラム１０は、図５のステップ５０１において、コード生成２０４によって生成される。
【０１１９】
図１０に示すプログラム１０は、ＭａｐＲｅｄｕｃｅコード１００１と、ＭａｐＲｅｄｕｃｅコード１００１を呼出すための呼出しコード１００２とを含む。なお、ＭａｐＲｅｄｕｃｅ処理に変換可能なループ処理が複数ある場合には、各ループ処理について、ＭａｐＲｅｄｕｃｅコード１００１、呼出しコード１００２が生成される。
【０１２０】
ＭａｐＲｅｄｕｃｅコード１００１は、ループ処理の処理内容に応じて、Ｍａｐ処理とＲｅｄｕｃｅ処理、又は、Ｍａｐ処理のみで構成される。一般に、総和を求める処理、最大値、最小値を求める処理のように、処理結果のデータ数が元のデータ数よりも小さい処理は、Ｍａｐ処理とＲｅｄｕｃｅ処理で構成される。それ以外の処理は、Ｍａｐ処理のみで構成される。
【０１２１】
呼出しコード１００２は、ＭａｐＲｅｄｕｃｅコード１００１を呼出すためのコード（JobClient.runJob（））と、ＭａｐＲｅｄｕｃｅコード１００１のクラス名を設定するためのコード（setMapperClass/setReducerClass）と、入出力ファイル名を設定するためのコード（FileInputFormat.setInputPaths/FileOutputFormat.setOutPath）とを含む。
【０１２２】
図１１は、本発明の実施の形態の具体例において統合データコード生成２０５によって生成される第一のプログラム１１を示す図である。プログラム１１中のプログラムコード１１０１は、図５のステップ５０４において、統合データコード生成２０５によって生成され、プログラム１１に挿入される。
【０１２３】
プログラムコード１１０１は、統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）から、統合前の各入力データ（Ｐｏｓ，Ｃｌｕｓｔｅｒ）を分割して取り出すためのデータ分割コードを示している。具体的には、統合データから統合前の各入力データを抽出し、抽出された各入力データを、それぞれの配列（Ｐｏｓ．Ｘ、Ｐｏｓ．Ｙ、Ｃｌｕｓｔｅｒ）に個別に代入して入力するコードである。
【０１２４】
後述のように、統合データを出力する場合、統合される各データの間にはスペースが埋め込まれている。そのため、ｓｔ．ｎｅｘｔＴｏｋｅｎを用いて各データを取り出すことができる。また、ｓｔ．ｎｅｘｔＴｏｋｅｎを用いて取り出されたＳｔｒｉｎｇ型の各データに、各データの型に応じた型変換を実行することによって、各データの型にあったデータを取り出すことができる。このプログラムコード１１０１は、入力データ参照コードの直後に挿入される。
【０１２５】
なお、プログラムコード１１０１は、図９Ｂの第２のループ処理の入力データ９０２の欄に登録された統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）から、統合前の各入力データ（Ｐｏｓ、Ｃｌｕｓｔｅｒ）を分割して取り出すためのデータ分割コードである。
【０１２６】
図１２は、本発明の実施の形態の具体例において統合データコード生成２０５によって生成される第二のプログラム１２を示す図である。プログラム１２中のプログラムコード１２０１は、図５のステップ５０７において、統合データコード生成２０５によって生成され、プログラム１２に挿入される。
【０１２７】
プログラムコード１２０１は、個別のデータ（Ｐｏｓ、Ｃｌｕｓｔｅｒ）を、統合された出力データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）に変更するためのデータ統合コードを示している。具体的には、各データを、１つのＴｅｘｔ型データとして出力するコードである。
【０１２８】
各データをＳｔｒｉｎｇ型データに型変換した後、統合される各データの間にスペースを埋め込んだ文字列を生成する。その後、データを出力するためのｏｕｔｐｕｔ．ｃｏｌｌｅｃｔを用いて、Ｓｔｒｉｎｇ型データをＴｅｘｔ型に変換して出力する。このプログラムコード１２０１は、データ出力コードの直前に挿入される。
【０１２９】
なお、プログラムコード１２０１は、図９Ｂの第１のループ処理及び第４のループ処理の出力データ９０４の欄に登録された統合データ（｛Ｐｏｓ、Ｃｌｕｓｔｅｒ｝）を生成するためのデータ統合コードである。
【０１３０】
図１３は、本発明の実施の形態の具体例において統合データコード生成２０５によって生成される第三のプログラム１３を示す図である。図１３に示すプログラム１３は、図１０に示すプログラム１０に基づいて、図５のステップ５０２〜５０８の処理によって生成される。
【０１３１】
図１３に示すプログラム１３では、ＭａｐＲｅｄｕｃｅ処理の対象となる第１、第２、及び第４のループ処理が、それぞれＭａｐｐｅｒ１（図１２参照）、Ｍａｐｐｅｒ２（図１１参照）、Ｒｅｄｕｃｅｒ２及びＭａｐｐｅｒ４のクラスコードで示される。
【０１３２】
ｒｕｎ（）には、ＭａｐＲｅｄｕｃｅコードを呼び出すためのコードであって、入力データや出力データのファイル名等を設定するためのコードが生成される。
【０１３３】
コード１３０１は、Ｍａｐｐｅｒ１（第１のループ処理に対応）の出力ファイル名を設定するためのコードである。図９Ｂに示すように、第１のループ処理の出力変更９０５の欄には「あり」が登録されている。そのため、出力ファイル名は変更される（図５のステップ５０８参照）。具体的には、出力ファイル名は、統合されている複数のデータの配列名（Ｐｏｓ、Ｃｌｕｓｔｅｒ）を先頭から結合し、最後にファイル識別子として「．ｄａｔ」を付加したファイル名「ＰｏｓＣｌｕｓｔｅｒ．ｄａｔ」に変更される。
【０１３４】
コード１３０２は、Ｍａｐｐｅｒ２（第２のループ処理に対応）の入力ファイル名を設定するためのコードである。図９Ｂに示すように、第２のループ処理の入力変更９０３の欄には「あり」が登録されている。そのため、入力ファイル名は変更される（図５のステップ５０５参照）。具体的には、コード１３０１と同様であるため、ここでは説明を省略する。
【０１３５】
コード１３０３は、Ｍａｐｐｅｒ４（第４のループ処理に対応）の出力ファイル名を設定するためのコードである。図９Ｂに示すように、第４のループ処理の出力変更９０５の欄には「あり」が登録されている。そのため、出力ファイル名は変更される（図５のステップ５０８参照）。具体的には、コード１３０１と同様であるため、ここでは説明を省略する。
【０１３６】
以上説明してきた図１１〜図１３のプログラムを含むオブジェクトプログラム１１１が、本発明の実施の形態のコンパイラ１０６によって生成される。これにより、入力データ数に制限のある分散処理基盤において、分散処理内で制限数を超えた入力データを参照する場合に、先行する分散処理で統合データを出力することによって、入力データ数を制限数以下にするためのデータ統合用の処理を新たに設けることなく、入力データを参照して分散並列処理を実行することができるようになる。
【０１３７】
以上、本発明の実施の形態について説明したが、上記実施の形態は本発明の適用例の一つを示したものであり、本発明の技術的範囲を上記実施の形態の具体的構成に限定する趣旨ではない。
【符号の説明】
【０１３８】
１     計算機システム（分散並列処理プログラム生成装置）
１０１  ＣＰＵ（プロセッサ）
１０２  ディスプレイ装置
１０３  キーボード
１０４  主記憶装置（記憶部）
１０５  外部記憶装置（記憶部）
１０６  コンパイラ（分散並列処理プログラム生成プログラム）
１０７  中間コード
１０８  ループ表
１０９  ＭａｐＲｅｄｕｃｅ情報
１１０  ソースプログラム
１１１  オブジェクトプログラム
２０１  構文解析
２０２  ＭａｐＲｅｄｕｃｅ解析
２０３  統合データ解析
２０４  コード生成
２０５  統合データコード生成
【図１】
2012221166.tif 000003
【図２】
2012221166.tif 000004
【図３】
2012221166.tif 000005
【図４】
2012221166.tif 000006
【図５】
2012221166.tif 000007
【図６】
2012221166.tif 000008
【図７】
2012221166.tif 000009
【図８】
2012221166.tif 000010
【図９Ａ】
2012221166.tif 000011
【図９Ｂ】
2012221166.tif 000012
【図１０】
2012221166.tif 000013
【図１１】
2012221166.tif 000014
【図１２】
2012221166.tif 000015
【図１３】
2012221166.tif 000016