JPWO2011090032A1 - 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 - Google Patents
並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 Download PDFInfo
- Publication number
- JPWO2011090032A1 JPWO2011090032A1 JP2011550911A JP2011550911A JPWO2011090032A1 JP WO2011090032 A1 JPWO2011090032 A1 JP WO2011090032A1 JP 2011550911 A JP2011550911 A JP 2011550911A JP 2011550911 A JP2011550911 A JP 2011550911A JP WO2011090032 A1 JPWO2011090032 A1 JP WO2011090032A1
- Authority
- JP
- Japan
- Prior art keywords
- variable
- program
- processing
- loop
- result
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/456—Parallelism detection
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
入力データを処理して結果を出力する第1プログラムに基づいて、並列処理が可能な第2プログラムを生成する。所定の処理が繰り返し実行されるループ処理を第1プログラムから抽出し、抽出されたループ処理のループ変数及び所定の処理で使用される処理変数を抽出し、処理変数が配列変数である場合には、ループ変数に対応するキーに基づいて処理変数に代入するデータを収集し、収集されたデータをキーに基づいて集約する処理を含む第4プログラムを生成し、第1プログラムに含まれるループ処理以外の処理と、第4プログラムを実行させるための処理と、を含む第5プログラムを生成し、第4プログラム及び第5プログラムを含むプログラムを、第2プログラムとして出力する。
Description
本発明は、並列処理プログラムの生成方法に関し、特に、既存のプログラムから並列処理に適したプログラムを生成する技術に関する。
近年、大規模なデータ処理の要求が高まり、複数の計算機資源によって分散並列処理を行う技術が提案されている。分散並列処理を実行する場合、例えば、処理対象のデータを分割して各計算機資源に割り当て、各計算機資源が割り当てられたデータを処理する。
また、新しい分散並列処理プログラミングモデルとしてMapReduceが注目されている。MapReduceはGoogle(登録商標)社が提唱したプログラミングモデルであり、Map処理、Reduce処理の2フェーズを含む。
Map処理は、入力データに基づいて(Key,Value)形式の中間データを生成する。その後、MapReduce実行基盤によってKey毎に中間データを集約し、(Key,Valueのリスト)ペアを生成する。Reduce処理では、Key毎にValueのリストを処理し、処理結果を出力する。なお、MapReduceでは、Map処理とReduce処理に対応する処理内容を開発者が記述する必要がある。MapReduceの詳細については、非特許文献1に記載されている。
MapReduceの代表的な実行基盤としてはオープンソースソフトウェアのHadoopが存在する。Hadoopは、Java(登録商標、以下同じ)によって実装されているため、Map処理及びReduce処理もJavaを用いて記述するのが一般的である。この場合、Hadoop用のJavaのインターフェイスを多数利用する必要がある。
また、Java以外の言語を使用する技術としては、標準入出力を介してデータをやり取りするHadoop Streamingと呼ばれる技術が開発されている。Hadoop Streamingでは、Perl、Pythonなど、標準入出力をサポートする任意の言語によってMap処理とReduce処理を記述することが可能となる。Hadoop及びHadoop Streamingの詳細については、非特許文献2の32ページから36ページに記載されている。
さらに、アプリケーションプログラミングと実行モデルのギャップを少なくするため、高位のプログラム記述からMapReduceによる低位の実行モデルに変換する技術が開示されている。例えば、Hadoopに対応する技術として、Pig Latinが提案されている。Pig Latinでは、データ処理プログラムをMapReduceに自動的に変換する。Pigを用いることによってMapReduceを意識せずに並列処理プログラムを開発することが可能となる。Pigの詳細については非特許文献2の301ページから341ページに記載されている。
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, pp32-36, pp301-341, 2009.
前述のように、MapReduceに対応するプログラムを記述するためには、アプリケーションモデルをMapReduceに対応するモデルに変換しなければならず、また、MapReduceに対応したプログラムの記述方法も複雑である。また、非特許文献2に開示されているように、高位のプログラム記述から自動的にMapReduceモデルに対応したプログラムに変換する技術も提案されているが、既存のアプリケーションプログラムを再度専用の言語を使用して記述し直す必要がある。すなわち、既存プログラムに基づいて、自動的又は容易にMapReduceに対応したプログラムを生成することは困難であった。
本発明の目的は、既存言語で記述されたプログラムに含まれる所定形式の処理(例えば、ループ処理)を、分散並列処理を実行可能なプログラム(コード)に変換する技術を提供することにある。
本発明の代表的な一形態では、入力データを処理して結果を出力する第1プログラムに基づいて、並列処理が可能な第2プログラムを生成するプログラム生成装置において、前記第2プログラムを生成する並列処理プログラム生成方法であって、前記プログラム生成装置は、前記並列処理プログラム生成方法を実行するプロセッサ、及び前記並列処理プログラム生成方法を実行するために必要な情報が記憶される記憶部を備え、前記並列処理プログラム生成方法は、前記プロセッサが、前記第1プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、前記プロセッサが、前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記プロセッサが、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、前記プロセッサが、前記収集されたデータを前記キーに基づいて集約する処理を含む第4プログラムを生成し、前記プロセッサが、前記第1プログラムに含まれる前記ループ処理以外の処理と、前記第4プログラムを実行させるための処理と、を含む第5プログラムを生成し、前記プロセッサが、前記第4プログラム及び前記第5プログラムを含むプログラムを、前記第2プログラムとして出力する。
本発明の一形態によれば、既存言語で記述されたプログラムに基づいて分散並列処理を実行可能なプログラムを生成することが可能になるため、システム開発の生産性を向上させることができる。
以下、図面を用いて本発明の実施の形態について説明する。以下に述べる実施の形態は、複数の計算機による分散並列処理に適したプログラムに既存のプログラムを変換するための技術である。
(第1の実施の形態)
本発明の第1の実施の形態及び第2の実施の形態では、並列処理プログラムを生成する具体的な方法として、既存のプログラムからMapReduceモデルを適用したプログラムを生成する実施形態について説明する。
本発明の第1の実施の形態及び第2の実施の形態では、並列処理プログラムを生成する具体的な方法として、既存のプログラムからMapReduceモデルを適用したプログラムを生成する実施形態について説明する。
また、第1の実施の形態及び第2の実施の形態では、MapReduceモデルを適用したプログラムの実行基盤をHadoopとする。Hadoopを実行基盤とすることによって、複数の計算機による分散並列処理を容易に実行することが可能となる。さらに、Hadoopは、分散並列処理を実行する計算機の増減に容易に対応できる。そのため、一部の計算機に障害が発生した場合に、他の計算機に再処理させるなどの障害対応が可能となっている。
本発明の第1の実施の形態の並列処理プログラム生成方法では、変換対象のソースプログラム(第1プログラム)に含まれる並列化可能箇所を抽出し、当該抽出箇所にMapReduceモデルを適用したプログラム(第3プログラム、第4プログラム)を生成する。さらに、生成されたプログラムを呼び出すためのプログラム(第5プログラム)を生成する。以下、本発明の第1の実施の形態における並列処理プログラム生成方法について説明する。
図1は、本発明の第1の実施の形態の並列処理プログラム生成方法が実行される計算機(並列処理プログラム生成装置)100の構成を示すブロック図である。
本発明の第1の実施の形態の計算機100は、CPU(プロセッサ)101、ディスプレイ装置102、キーボード103、主記憶装置104及び外部記憶装置105を備える。CPU101、ディスプレイ装置102、キーボード103、主記憶装置104及び外部記憶装置105は、内部バスを介して相互に接続される。
CPU101は、主記憶装置104に記憶されたプログラムを実行することによって、並列処理プログラムの生成などの各種処理を実行する。
ディスプレイ装置102は、CPU101によって実行された処理の結果、例えば、並列処理プログラム生成方法の実行結果(終了メッセージ、エラーメッセージなど)を表示する出力装置である。
キーボード103は、実行される処理の対象を指定したり、ディスプレイ装置102に表示する内容を選択したりする入力装置である。なお、入力装置として、キーボード103の他にマウスなどを備えるようにしてもよい。
主記憶装置104は、CPU101によって実行されるプログラム及び当該プログラムを実行するために必要なデータを記憶する。主記憶装置104に記憶されるプログラムは外部記憶装置105に格納されたプログラムがロードされたものであってもよい。主記憶装置104に記憶されたプログラム及びデータについては後述する。なお、主記憶装置104は、揮発性の記憶媒体であってもよいし、不揮発性の記憶媒体であってもよい。
外部記憶装置105は、プログラム及びデータを格納する。外部記憶装置105は、不揮発性の記憶媒体によって構成される。外部記憶装置105には、並列処理プログラム生成方法を実行するために主記憶装置104にロードされるプログラムを格納するようにしてもよい。
以上が、本発明の第1の実施の形態の並列処理プログラム生成方法を実行する計算機100のハードウェア構成である。続いて、主記憶装置104に記憶されるプログラム及びデータと、外部記憶装置105に格納されるプログラム及びデータとについて説明する。
主記憶装置104には、コンパイラ108、中間コード109、ループ表110、配列表111、及びMapReduce情報112が記憶される。
コンパイラ108は、既存のプログラム(第1プログラム)の入力を受け付けて、MapReduceモデルに対応したプログラム(第3プログラム、第4プログラム)を含む変換後のプログラム(第2プログラム)を出力する並列処理プログラム生成方法を実現するためのプログラムである。
中間コード109は、コンパイラ108によってソースプログラムを変換する際に一時的に出力されるデータである。CPU101は、中間コード109をさらに処理することによって、最終的な結果(オブジェクトプログラム107)を出力する。
ループ表110、配列表111及びMapReduce情報112は、ソースプログラム106を変換するために利用されるデータであり、中間コード109と同様に、ソースプログラムを変換する際に一時的に生成及び出力される。
ループ表110は、コンパイラ108によってソースプログラム106からループ処理を抽出した結果を格納する。ループ表110の詳細については、図8にて後述する。
配列表111は、抽出されたループ処理で演算される配列変数を抽出した結果を格納する。配列表111の詳細については、図9にて後述する。
MapReduce情報112は、ループ表110及び配列表111に基づいてソースプログラム106を解析した結果を格納する。MapReduce情報112には、さらに、結果変数登録表302、オペランド識別子登録表303及びイタレーション対応表304を含む。MapReduce情報112の詳細については、図3にて後述する。
外部記憶装置105には、並列処理プログラム生成方法を適用するソースプログラム106(第1プログラム)及びソースプログラム106に基づいて生成されたオブジェクトプログラム107(第2プログラム)が格納される。
オブジェクトプログラム107には、MapReduceモデルが適用されたMapReduceプログラム113(第3プログラム、第4プログラム)と、MapReduceプログラム113を呼び出すための処理を含む変換後のソースプログラム114(第5プログラム)とが含まれる。
図2は、本発明の第1の実施の形態のコンパイラ108の構成、及びソースプログラム106からオブジェクトプログラム107を生成する過程の概要を説明する図である。
前述のように、本発明の第1の実施の形態では、CPU101がコンパイラ108を実行することによって、ソースプログラム106に基づいてオブジェクトプログラム107を生成する。図2では、ソースプログラム106に基づいてオブジェクトプログラム107を生成する手順の概要について説明する。
コンパイラ108の構成について説明すると、コンパイラ108は、構文解析部201、MapReduce解析部202及びコード生成部203を含む。前述のように、コンパイラ108はプログラムであり、構文解析部201、MapReduce解析部202及びコード生成部203も同様にプログラムである。以下、処理の主体は本来ならばこれらのプログラムを実行するCPU101であるが、図2の説明では理解しやすくするために各プログラムを主体として各処理を説明する。
まず、構文解析部201は、入力されたソースプログラム106を解析することによって、ループ処理に対応する記述を抽出し、中間コード109、ループ表110及び配列表111を生成する。構文解析部201による処理の詳細については、図4以降の図を参照しながら説明する。
中間コード109は、ループ処理及びループ処理内で実行される処理に対応するコードが抽出されたものである。ループ表110及び配列表111を生成する構文解析部201の処理については、図7に示した中間コード109(ループ処理)を例として、図8及び図9を参照しながら説明する。
続いて、MapReduce解析部202は、構文解析部201によって生成された中間コード109、ループ表110及び配列表111に基づいて、ループ処理をMapReduce処理に変換するために必要な情報を解析し、MapReduce情報112を生成する。MapReduce情報112の構成については、図3にて説明する。なお、MapReduce解析部202による処理の詳細については、図11から図15を参照しながら説明する。
最後に、コード生成部203は、MapReduce解析部202によって生成されたMapReduce情報112に基づいて、オブジェクトプログラム107を生成する。オブジェクトプログラム107には、前述のように、MapReduce処理に変換されたMapReduceプログラム113及びMapReduceプログラム113の呼び出し部を含む変換後のソースプログラム114が含まれる。
なお、図2にて説明した手順については、図4に示したフローチャートを参照しながらさらに詳細を説明する。
図3は、本発明の第1の実施の形態のMapReduce情報112の構成を示す図である。
MapReduce情報112は、結果変数登録表302、オペランド識別子登録表303及びイタレーション対応表304を含む。また、結果変数登録表302、オペランド識別子登録表303及びイタレーション対応表304は、構文解析部201によって抽出されたループ処理ごとに生成される。
結果変数登録表302には、ループにおける演算結果を格納する変数の情報が格納される。結果変数登録表302の詳細については図10にて説明する。また、結果変数登録表302を生成する手順については、図11にて説明する。
オペランド識別子登録表303には、値及び変数を識別するオペランドに関する情報が格納される。例えば、ループ処理内で配列変数が使用されている場合、当該配列変数の添字がオペランドに対応する。複数のループが入れ子になっている場合には、複数の変数の組がオペランドになる。オペランド識別子登録表303の詳細については図12にて説明する。また、オペランド識別子登録表303を生成する手順については、図13にて説明する。
イタレーション対応表304には、ループ処理によって繰り返される1回分の処理(イタレーション)に関する情報が格納される。イタレーション対応表304の詳細については図14にて説明する。また、イタレーション対応表304を生成する手順については、図15にて説明する。
図4は、本発明の第1の実施の形態のソースプログラム106を分散処理に適したオブジェクトプログラム107に変換する分散処理プログラム変換方法の手順を示すフローチャートである。
図4に示すフローチャートは、図2に示した手順に対応し、コンパイラ108に含まれる各構成(構文解析部201、MapReduce解析部202及びコード生成部203)による処理を実行する手順を示している。
CPU101は、コンパイラ108が実行されると、構文解析部201によって構文解析処理を実行する(ステップ401)。構文解析処理では、まず、ソースプログラム106の入力が受け付けられる。
構文解析処理において、CPU101は、さらに、入力されたソースプログラム106を解析し、ループ処理に対応する記述を抽出する。ループ処理を実行する構文としては、例えば、for文(他に、while文など)がある。ソースプログラム106がテキストファイル形式で入力されていれば、検索キーとして"for"を設定して文字検索を実行する。対象外の構文が抽出されてしまう場合には、さらに検索条件を追加して検索結果を絞り込めばよい。
CPU101は、さらに、抽出されたループ処理の構造を解析し(ループ解析)、中間コード109、ループ表110及び配列表111を生成する。中間コード109は、ループ及びループ処理内で実行される処理に対応するコードが抽出されたものである。構文解析処理及びループ解析処理に関しては、従来技術を利用する。ループ表110の一例については図8、配列表111の一例について図9に示す。
CPU101は、構文解析処理の終了後、MapReduce処理に変換可能なループ処理に対し、MapReduce解析処理を実行する(ステップ402〜404)。
CPU101は、まず、MapReduce解析処理が実行されていないループ処理が存在するか否かを判定する(ステップ402)。MapReduce解析処理が実行されていないループ処理が存在する場合には(ステップ402の結果が「Yes」)、処理対象のループ処理がMapReduce処理に変換可能であるか否かを判定する(ステップ403)。
本発明の第1の実施の形態では、密多重ループの最外側ループに該当し、データ依存条件を満たす場合に、当該ループ処理をMapReduce処理に変換可能と判定する。密多重ループとは、すべてのループが直接の入れ子関係となるループであって、外側ループと内側ループとの間に実行文が存在しないループ(若しくはこれと等価な構造を有する多重ループ)である。
また、各イタレーション間のデータ依存がない場合、又はデータ依存が足しこみ型の依存の場合にデータ依存条件を満たすとしている。足しこみ型のデータ依存とは、例えば、i,jをループ制御変数とする二重ループにおいてsum[i]=sum[i]+a[i,j](for i,j sum[i]+=a[i,j]としても同じ)を計算するように、演算結果の次元がループのネスト数よりも小さくなる場合である。なお、足しこみ演算子は加算(「+」)の他に、減算(「−」)、乗算(「*」)などの場合も適用可能であるが、本発明の第1の実施の形態では、加算(「+」)の例について説明する。また、ループ処理で最大値若しくは最小値を取得する場合などについても適用可能である。
また、sum[i]を「足しこみ変数」、代入文の右辺から足しこみ変数を除いたコードを「右辺コード」とする。前述の例では、右辺コードは「a[i,j]」となる。
なお、複数のループ処理が並列して入れ子となっている場合には、並列しているループ処理ごとに密多重ループとなるようにループ処理を分割することによって、MapReduce処理に変換可能な形式に変換してもよい。
CPU101は、処理対象のループ処理がMapReduce処理に変換可能である場合には(ステップ403の結果が「Yes」)、処理対象のループ処理に対し、MapReduce解析処理を実行する(ステップ404)。MapReduce解析処理が実行されると、当該ループ処理に対応するMapReduce情報112が生成される。なお、MapReduce解析処理については概要を図5に示し、さらに詳細については図10から図15を参照しながら説明する。
CPU101は、処理対象のループ処理がMapReduce処理に変換可能でない場合には(ステップ403の結果が「No」)、ステップ402の処理によって未処理のループ処理が残っているか否かを判定する。
CPU101は、すべてのループ処理に対して、ステップ403の処理が実行された場合には(ステップ402の結果が「No」)、MapReduce解析処理が実行されたループ処理に対応するオブジェクトプログラム107を生成する。
CPU101は、コード生成処理が実行されていないMapReduce情報112が存在するか否かを判定する(ステップ405)。すなわち、すべてのMapReduce処理に変換対象のループ処理について、オブジェクトプログラム107が生成されたか否かを判定する。すべてのMapReduce情報112についてコード生成処理が実行された場合には(ステップ405の結果が「No」)、本処理を終了する。
CPU101は、コード生成処理が実行されていないMapReduce情報112が存在する場合には(ステップ405の結果が「Yes」)、未処理のMapReduce情報112に基づいて、コード生成部203によってコード生成処理を実行する(ステップ406)。コード生成処理では、MapReduce情報112に基づいて、オブジェクトプログラム107(MapReduceプログラム113と変換後のソースプログラム114)を生成する。なお、コード生成処理については概要を図6に示し、さらに詳細については図16から図24を参照しながら説明する。
図5は、本発明の第1の実施の形態のMapReduce解析部202によるMapReduce解析処理404の手順を示すフローチャートである。
MapReduce解析処理404は、結果変数登録表生成処理501、オペランド識別子登録表生成処理502及びイタレーション対応表生成処理503を含む。また、結果変数登録表生成処理501、オペランド識別子登録表生成処理502、イタレーション対応表生成処理503の順で実行される。
結果変数登録表生成処理501は、前述のように、結果変数及び結果変数に関する情報を抽出し、図10に示す結果変数登録表302を生成する処理である。結果変数登録表生成処理501の詳細な手順については、図11にて説明する。
オペランド識別子登録表生成処理502は、前述のように、値及び変数を識別するオペランドに関する情報を抽出し、図12に示すオペランド識別子登録表303を生成する処理である。オペランド識別子登録表生成処理502の詳細な手順については、図13にて説明する。
イタレーション対応表生成処理503は、前述のように、ループ処理によって繰り返される1回分の処理に関する情報を抽出し、図14に示すイタレーション対応表304を生成する処理である。イタレーション対応表生成処理503の詳細な手順については、図15にて説明する。
図6は、本発明の第1の実施の形態のコード生成部203によるコード生成処理406の手順を示すフローチャートである。
コード生成処理406は、MapReduceコード生成処理601、及びMapReduce呼び出しコード生成処理602を含む。また、MapReduceコード生成処理601、MapReduce呼び出しコード生成処理602の順で実行される。
MapReduceコード生成処理601は、MapReduce解析処理404によって生成されたMapReduce情報112に基づいて、ループ毎にMapReduceプログラム113を生成する。MapReduceコード生成処理601の詳細については、図16、図18、図20、図23にて説明する。また、生成されたMapReduceプログラム113については、図19、図21、図22、図24にて説明する。
MapReduce呼び出しコード生成処理602は、MapReduceコード生成処理601で生成されたMapReduceプログラム113を呼び出すためのコード(プログラム)を生成する。そして、MapReduce処理に変換する対象以外のソースプログラム106に、MapReduceプログラム113を呼び出すためのコードを挿入し、変換後のソースプログラム114を生成する。
以降、MapReduce処理に変換可能なループ処理の例を図7に示し、図7に示したループ処理をMapReduce処理に変換する過程を説明する。
図7は、本発明の第1の実施の形態のMapReduce処理に変換可能なループ処理700を示す図である。
ループ処理700は、図4に示した構文解析処理401によって、ソースプログラム106から抽出されたものである。
ループ処理700は、最外層から順に制御変数をI1、I2、I3とする三重のループを構成しており、最外層と中層、中層と最内層の間に実行文が存在しない密多重ループとなっている。また、ループ処理の最内層には、足しこみ演算(sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2])が記述されている。なお、ループ処理700の足しこみ演算に含まれる配列の添字は行優先順(最も右側が連続次元)となっている。
以下、ループ処理700に対して構文解析処理401を実行することによって生成されたループ表110を図8に、配列表111を図9に示し、各表について説明する。
図8は、本発明の第1の実施の形態のループ表110の一例を示す図である。
ループ表110は、ループ番号801、制御変数802、制御変数下限値803、制御変数上限値804、制御変数増分値805、及び子ループ806を含む。また、ループ表110は、前述のように、所定の条件を満たしたMapReduce処理に変換可能なループ処理ごとに生成される。また、所定の条件を満たすループ処理が密多重ループである場合には、入れ子となったループごとにエントリーがループ表110に生成される。図7に示したループ処理700は三重ループであるため、ループ表110には、各ループに対応する3つのエントリーが含まれている。
ループ番号801は、ループを識別するための番号である。ループ番号801は、各ループが識別可能であればよい。例えば、ループ表110では、最外層から昇順に番号が割り当てられており、最外層のループ処理にループ番号「1」が設定されている。
制御変数802は、ループ処理におけるカウンタ変数である制御変数(ループ変数)を格納する。ループ番号が「1」の場合には、制御変数「I1」が格納される。
制御変数下限値803は、制御変数802の下限値である。制御変数上限値804は、制御変数802の上限値である。ループ処理700を参照すると、最外層のループ処理は、「for I1=0..99」となっているため、制御変数下限値803には「0」が設定され、制御変数上限値804には「99」が設定される。
制御変数増分値805は、制御変数802を制御変数下限値803から制御変数上限値804まで変化させるための増分値である。制御変数下限値803よりも制御変数上限値804の値の方が小さい場合には、制御変数増分値805に負の値が設定される。なお、制御変数が整数であり、増分値が1の場合には、プログラムの仕様上、増分値の指定を省略することが可能な場合がある。ループ処理700では、増分値の指定が省略されており、制御変数増分値805増分値は1となっている。
子ループ806は、入れ子となっているループ(子ループ)のループ番号である。子ループがさらに多重ループとなっている場合には、子ループのうち、最外層のループ処理のループ番号801が格納される。例えば、ループ処理700のように、三重ループであれば、最外層のループであるループ番号が「1」のループでは、子ループの値に「2」が設定される。
図9は、本発明の第1の実施の形態の配列表111の一例を示す図である。
配列表111は、ループ処理内で演算される数式の右辺コードに含まれる配列変数に関する情報を格納する。配列表111は、前述のように、ループ処理毎に生成される。
配列表111は、配列名901、型902、次元数903、次元904、及びサイズ905を含む。
配列名901は、配列変数の変数名を格納し、例えば、添字部分を除いた変数が格納される。同じ配列変数が複数回使用されている場合であっても1つのエントリーのみが作成される。ループ処理700では、ループ内の数式の右辺コードが「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となっている。したがって、配列変数a[I1,I2,I3]、a[I2,I3,I1]、及びb[I1,I2]が対象となり、配列名901は"a"及び"b"となる。
型902は、配列変数のデータ型が格納される。型902は、ソースプログラム106に定義されている各配列変数の宣言文を抽出すればよい。
次元数903は、配列変数の添字の次元数である。例えば、a[I1,I2,I3]であれば、3となる。
サイズ905は、次元904に対応する制御変数の値の範囲である。対応するループ処理の制御変数下限値803、制御変数上限値804、及び制御変数増分値805に基づいて設定される。なお、複数種類の制御変数が設定される場合には最大範囲が設定される。
以上が構文解析処理401によって生成されるループ表110及び配列表111についての説明である。以下、生成されたループ表110及び配列表111に基づいて実行されるMapReduce解析処理404について説明する。
MapReduce解析処理404では、生成されたループ表110及び配列表111に基づいて、結果変数登録表302、オペランド識別子登録表303及びイタレーション対応表304に必要な情報を登録する。すなわち、MapReduce解析処理404は、図5にて説明したように、結果変数登録表生成処理501、オペランド識別子登録表生成処理502及びイタレーション対応表生成処理503によって構成される。MapReduce解析処理404は、ループ処理をMapReduce処理に変換するために必要な情報を生成するポイントとなる処理である。
本発明の第1の実施の形態では、ループ処理によって繰り返される1回分の処理、すなわち、イタレーションごとにデータを収集して演算する。足しこみ演算を行うループ処理の場合、さらに1イタレーションごとの演算結果を結果変数に足しこむ。なお、本発明の第1の実施の形態の対象となるループ処理では、前述のように、密多重ループである必要があり、対象となる演算は、最内層のループ内で処理される演算処理となる。図7に示したループ処理700では、最内層のループ内で処理される足しこみ演算(sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2])が解析の対象となる。なお、最内層のループ内で処理される演算をループ実行文とする。
以下、MapReduce解析処理404について、図10から図15を参照しながら詳細に説明する。
まず、結果変数登録表302について図10を参照しながら説明し、結果変数登録表302を生成する結果変数登録表生成処理501について図11を参照しながら説明する。
図10は、本発明の第1の実施の形態の結果変数登録表302の一例を示す図である。
結果変数登録表302は、ループ実行文において計算結果を代入している変数(結果変数)と演算の種類などを表す情報を登録する。結果変数登録表302は、変数名1001、添字式1002及び足しこみ1003を含む。
本発明の第1の実施の形態では、ループ実行文において足しこみ演算がなされるか否かに基づいてMapReduce処理を2回実行するか、若しくは1回実行するかを決定する(図16のステップ1601)。また、コード生成処理406において、結果変数登録表302を参照して、利用するMapReduceテンプレートを選択したり、Reduce処理における結果を出力するコードを生成したりする(図20のステップ2006及びステップ2008)。
変数名1001は、ループ実行文において、演算結果を代入する結果変数の変数名である。変数名1001は、Reduce処理を生成する場合に、1イタレーションの結果を代入する変数を設定するためなどに使用される(図20のステップ2001)。
添字式1002は、結果変数を特定する情報が格納される。具体的には、結果変数が配列変数の場合には配列変数の添字が登録される。また、結果変数がスカラーの場合には任意の定数(例えば「1」)を登録する。
足しこみ1003は、ループ実行文が足しこみ型であれば「YES」、足しこみ型でなければ「NO」を登録する。
ループ処理700では、ループ実行文が足しこみ型であるため、足しこみ1003には「YES」が設定される。また、足しこみ結果を代入する変数が「sum[i]」となっているため、「sum」が変数名1001に登録され、「I1」が添字式1002に登録される。
図11は、本発明の第1の実施の形態の結果変数登録表302を生成するための結果変数登録表生成処理501の手順を示すフローチャートである。
CPU101は、結果変数登録表生成処理501を開始すると、まず、未処理のループ実行文が存在するか否かを判定する(ステップ1101)。未処理のループ実行文が存在しない場合、すなわち、すべてのループ実行文について、ステップ1102以降の処理を実行した場合には(ステップ1101の結果が「No」)、結果変数登録表生成処理501を終了する。
CPU101は、未処理のループ実行文が存在する場合には(ステップ1101の結果が「Yes」)、処理対象のループ実行文が代入文であるか否かを判定する(ステップ1102)。処理対象のループ実行文が代入文でない場合には(ステップ1102の結果が「No」)、MapReduce処理に変換できないため、ステップ1101の処理に戻る。
CPU101は、処理対象のループ実行文が代入文である場合には(ステップ1102の結果が「Yes」)、代入文の左辺変数の変数名を結果変数登録表302の変数名1001に登録する(ステップ1103)。
CPU101は、左辺変数がスカラー値であるか否かを判定する(ステップ1104)。左辺変数がスカラー値でない場合、すなわち、左辺変数が配列変数の場合には(ステップ1104の結果が「No」)、結果変数登録表302の添字式1002に配列変数の添字を登録する(ステップ1105)。左辺変数がスカラー値の場合には(ステップ1104の結果が「Yes」)、結果変数登録表302の添字式1002に任意の定数(例えば「1」)を登録する(ステップ1106)。
CPU101は、ループ実行文の代入文が足しこみ型か否かを判定する(ステップ1107)。足しこみ型でない場合には(ステップ1107の結果が「No」)、結果変数登録表302の足しこみ1003に「NO」を設定する(ステップ1108)。一方、足しこみ型の場合には(ステップ1107の結果が「Yes」)、結果変数登録表302の足しこみ1003に「YES」を設定する(ステップ1109)。
以上の処理が終了すると、ステップ1101の処理に戻り、未処理のループ実行文が存在しなくなるまで本処理を実行する。
ここで、図7に示したループ処理700に対し、図11に示した結果変数登録表生成処理501を適用する手順について説明する。
ループ処理700では、前述のように、ループ実行文は「sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となる。
結果変数登録表生成処理501が実行され、最初にステップ1101の処理が実行されると、未処理のループ実行文が存在するため(ステップ1101の結果が「Yes」)、ループ実行文が代入文であるか否かが判定される(ステップ1102)。
ループ実行文は、sum[I1]に、a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]を加算して代入する代入文であるため(ステップ1102の結果が「Yes」)、結果変数登録表302の変数名1001に「sum」を登録する(ステップ1103)。
さらに、CPU101は、結果変数がスカラー値であるか否かを判定する(ステップ1103)。結果変数sum[I1]は、配列変数であり、スカラー値でないため(ステップ1103の結果が「No」)、結果変数登録表302の添字式1002に「[I1]」を登録する(ステップ1105)。
CPU101は、ループ実行文に複合代入演算子「+=」が含まれているため(ステップ1107の結果が「Yes」)、足しこみ型であると判定し、結果変数登録表302の足しこみ1003に「YES」を登録する。そして、ステップ1101の処理に戻るが、ループ実行文が存在しないため(ステップ1102の結果が「No」)、本処理を終了する。
以上のように、結果変数登録表302を参照すると、図7のループ処理を解析した結果、変数名1001の値から変数「sum」に1イタレーションの演算結果を代入することがわかる。さらに、足しこみ1003の値から代入文が足しこみ演算であることがわかり、添字式1002から制御変数「I1」について足しこみ演算を行えばよいことがわかる。
次に、オペランド識別子登録表303について図12を参照しながら説明する。さらに、オペランド識別子登録表303を生成するオペランド識別子登録表生成処理502について図13を参照しながら説明する。
図12は、本発明の第1の実施の形態のオペランド識別子登録表303の一例を示す図である。
本発明の第1の実施の形態では、コード生成処理406において、イタレーションごとにデータを収集して演算するコードが生成される。そのため、各データにループ実行文に含まれる配列変数に対応する識別子(オペランド識別子)を割り当てる必要がある。特に、a[I1,I2,I3]とa[I2,I3,I1]のように同じ配列名で添字の構成が異なる場合には変数毎に識別子を付与しなければ識別することができない。オペランド識別子登録表303には、配列を特定するための情報(配列参照)が格納される。
オペランド識別子登録表303は、配列名1201、配列参照形式1202、及びオペランド識別子1203を含む。オペランド識別子登録表303は、ループ処理ごとに生成される。
配列名1201は、ループ実行文の右辺コードに含まれる配列変数の変数名である。配列参照形式1202は、添字を含む配列変数に対応する。オペランド識別子1203は、配列参照形式1202と対応し、配列参照形式1202を識別する識別子である。
オペランド識別子登録表303は、MapReduce解析処理404に含まれるオペランド識別子登録表生成処理502よって生成され、イタレーション対応表304を生成するイタレーション対応表生成処理503及びコード生成処理406の実行時に参照される。
図13は、本発明の第1の実施の形態のオペランド識別子登録表303を生成するためのオペランド識別子登録表生成処理502の手順を示すフローチャートである。本処理は、結果変数登録表302に登録された結果変数の右辺コードの各項について、オペランド識別子登録表303のエントリーを生成する。
CPU101は、オペランド識別子登録表生成処理502を開始すると、まず、未処理の配列参照が存在するか否かを判定する(ステップ1301)。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には(ステップ1301の結果が「No」)、オペランド識別子登録表生成処理502を終了する。
CPU101は、配列名が結果変数登録表302の変数名1001に登録済であって、かつ、足しこみ1003の値が「YES」であるか否かを判定する(ステップ1302)。配列名が結果変数登録表302の変数名1001に登録済であって、かつ、足しこみ1003の値が「YES」の場合には(ステップ1302の結果が「Yes」)、処理対象の配列変数は結果変数と同一であり、オペランド識別子を割り当てる必要がないため、次の変数について処理を実行するためにステップ1301の処理に戻る。
CPU101は、配列名が結果変数登録表302の変数名1001に登録済でない、又は、足しこみ1003の値が「NO」の場合には(ステップ1302の結果が「No」)、同じ配列参照形式が既に登録済みであるか否かを判定する(ステップ1303)。前述のように、同じ配列名であっても添字式の構成が異なれば値が異なるため、配列名及び添字式が含まれる配列参照形式ごとにオペランド識別子を割り当てる。
CPU101は、同じ配列参照形式が既に登録済みである場合には(ステップ1303の結果が「Yes」)、オペランド識別子を割り当てる必要がないため、次の変数について処理を実行するためにステップ1301の処理に戻る。
一方、CPU101は、同じ配列参照形式が登録済みでない場合には(ステップ1303の結果が「No」)、オペランド識別子登録表303に新しいオペランド識別子を割り当てる(ステップ1304)。新しいオペランド識別子は、登録済みのオペランド識別子と重複しないように生成される。
最後に、CPU101は、オペランド識別子登録表303の配列名1201、配列参照形式1202及びオペランド識別子1203に、配列参照から取得された配列名及び配列参照形式、ステップ1304の処理で割り当てられたオペランド識別子を登録する(ステップ1305)。その後、残りの配列参照を処理するためにステップ1301の処理に戻る。
ここで、図7に示したループ処理700に対し、図13に示したオペランド識別子登録表生成処理502を適用する手順について説明する。
ループ処理700では、前述のように、ループ実行文は「sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となっており、処理対象となる右辺コードは、「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となる。
オペランド識別子登録表生成処理502が実行され、最初にステップ1301の処理が実行されると、未処理の配列参照が存在するため(ステップ1301の結果が「Yes」)、ステップ1302の処理を実行する。
最初に処理対象となる配列参照は「a[I1,I2,I3]」である。配列参照「a[I1,I2,I3]」は、結果変数登録表302に登録されていないため(ステップ1302の結果が「No」)、当該配列参照がオペランド識別子登録表303に登録済みであるか否かを判定する(ステップ1303)。そして、オペランド識別子登録表303にはエントリーが登録されていないため(ステップ1303の結果が「No」)、新しくオペランド識別子を生成する(ステップ1304)。このとき、生成されるオペランド識別子は「ID1」となっているが、前述のように重複しなければ任意である。
さらに、CPU101は、配列名1201として「a」、配列参照形式1202として「a[I1,I2,I3]」、オペランド識別子1203として「ID1」をオペランド識別子登録表303に登録する(ステップ1305)。
配列参照a[I2,I3,I1]、b[I1,I2]についても同様の手順でオペランド識別子「ID2」、「ID3」を割り当て、オペランド識別子登録表303に対応するエントリーを登録する。
オペランド識別子登録表生成処理502の結果、配列参照a[I1,I2,I3]とオペランド識別子ID1、配列参照a[I2,I3,I1]とオペランド識別子ID2、配列参照b[I1,I2]とオペランド識別子ID3を対応させることができる。
続いて、イタレーション対応表304について図14を参照しながら説明する。さらに、イタレーション対応表304を生成するイタレーション対応表生成処理503について図15を参照しながら説明する。
図14は、本発明の第1の実施の形態のイタレーション対応表304の一例を示す図である。
イタレーションとは、ループ処理で繰り返される1回分の処理である。イタレーションは、ループ変数によって特定可能であり、多重ループであれば、複数のループ変数によって特定される。
イタレーション対応表304には、入力データを参照するイタレーションがオペランド識別子ごとに登録される。イタレーション対応表304は、配列名1401、入力データ1402、オペランド識別子1403、及びイタレーション1404を含む。イタレーション対応表304は、オペランド識別子登録表303の各エントリーに基づいて生成される。イタレーション対応表304は、ループ処理毎に生成される。
イタレーション対応表304は、イタレーションごとにデータを収集及び演算するコード(プログラム)を生成する際に参照される。具体的には、後述するMap処理のコード(プログラム)を生成する処理(図18のステップ1806)において、イタレーション対応表304に基づいて、入力データに対してオペランド識別子及びイタレーションを設定するコードが生成される。
配列名1401は、入力データが格納される配列変数の変数名である。入力データ1402は、入力されたデータを示す情報が格納される。配列変数の場合には添字とともに指定される。
オペランド識別子1403は、オペランド識別子登録表303に格納されており、配列名1401に対応するオペランド識別子である。イタレーション1404は、イタレーションを識別する情報である。
例えば、オペランド識別子1403が「ID2」の場合、入力データa[J1,J2,J3]を処理するイタレーション1404は、(J3,J1,J2)となる。オペランド識別子1403が「ID2」の配列参照形式がa[I2,I3,I1]であることからイタレーション1404を特定することができる。イタレーション1404を設定するための処理の詳細については、図15にて後述する。
図15は、本発明の第1の実施の形態のイタレーション対応表304を生成するためのイタレーション対応表生成処理503の手順を示すフローチャートである。本処理は、オペランド識別子登録表303に登録されたオペランド識別子ごとにイタレーション対応表304のエントリーを生成する。
イタレーション対応表生成処理503では、処理対象となるループ処理のループネスト数をmとする。ループネスト数mは、ループ表110に基づいて取得することができる。
CPU101は、イタレーション対応表生成処理503を開始すると、まず、オペランド識別子登録表303に未処理のオペランド識別子が存在するか否かを判定する(ステップ1501)。未処理のオペランド識別子が存在しない場合には(ステップ1501の結果が「No」)、イタレーション対応表生成処理503を終了する。
CPU101は、未処理のオペランド識別子が存在する場合には(ステップ1501の結果が「No」)、未処理のオペランド識別子に対応するエントリーを取得する(ステップ1502)。さらに、取得されたエントリーの配列名1401がイタレーション対応表304に登録済みか否かを判定する(ステップ1503)。配列名が既に登録されている場合には(ステップ1503の結果が「Yes」)、ステップ1506以降の処理を実行する。
CPU101は、未処理のオペランド識別子が存在しない場合には(ステップ1501の結果が「No」)、イタレーション対応表304に新しいエントリーを作成し、オペランド識別子登録表303の配列名1201の値を配列名1401に登録する(ステップ1504)。
さらに、CPU101は、配列の次元数をnとして、イタレーション対応表304の入力データ1402の添字を[J1,J2,…Jn−1,Jn]として登録する(ステップ1505)。なお、配列の次元数は、図9に示した配列表111の次元数903から取得することができる。
以降の処理では、添字が[J1,J2,…Jn−1,Jn]の配列を利用するループ処理のイタレーションを取得する。例えば、データ「a[J1,J2,J3]」をオペランド識別子「ID1」の配列参照形式として使用する場合には、イタレーション「(J1,J2,J3)」が取得される。以下、イタレーションを取得する手順について説明する。
CPU101は、配列参照形式の添字を[σ(I1,I2,…,Im)]とする(ステップ1506)。配列参照形式が「a[I1,I2,I3]」の場合には、[σ(I1,I2,…,Im)]は[I1,I2,I3]となる。また、配列参照形式がb[I1,I2]の場合には、[σ(I1,I2,…,Im)]は[I1,I2]となる。なお、Ikはループの制御変数であり、I1は最外側の制御変数を表す。
さらに、CPU101は、Ik(1<=i<=m)について、[σ(I1,I2,…,Im)]=[J1,J2,…Jn−1,Jn]の解を求める(ステップ1507)。例えば、配列参照形式がa[I2,I3,I1]の場合には、[I2,I3,I1]=[J1,J2,J3]を解くことになる。この場合、「I1=J3,I2=J1,I3=J2」が解となる。同様に、配列参照形式がb[I1,I2]の場合には、[I1,I2]=[J1,J2]を解いて「I1=J1,I2=J2」が解となる。
CPU101は、イタレーション1404のk次元目にステップ1507の処理で求められたIkを設定する(ステップ1508)。
さらに、CPU101は、Ik(1<=k<=m)について、ステップ1508の処理で設定されなかったIkにループ表110に格納された制御変数下限値803と制御変数上限値804に基づいて制御変数の範囲をセットする(ステップ1509)。例えば、配列参照形式がb[I1,I2]の場合には、「I1=J1,I2=J2」については設定されたが、I3については設定されていないため、ループ表110を参照し、「I3」の制御変数の範囲「0:99」をセットする。b[J1,J2]のデータは、ループ処理において、制御変数I1でJ1、I2でJ2、I3では0から99のそれぞれの場合で使用されるためである。ステップ1508及びステップ1509の処理によって、入力データを参照するイタレーションを設定することができる。
最後に、CPU101は、オペランド識別子1403と、ステップ1508及びステップ1509の処理で設定されたイタレーションをイタレーション1404に登録する(ステップ1510)。そして、ステップ1501の処理に戻り、オペランド識別子登録表303に未処理のエントリーが存在しなくなるまで本処理を繰り返す。
ここで、図7に示したループ処理700に対し、図15に示したイタレーション対応表生成処理503を適用する手順について説明する。
まず、対象となるループ処理のループネスト数mは、ループ表110を参照すると、「3」であることがわかる。
イタレーション対応表生成処理503が実行され、最初にステップ1501の処理が実行されると、オペランド識別子登録表303に未処理のエントリーが存在するため(ステップ1501の結果が「Yes」)、オペランド識別子登録表303の未処理のエントリーを取得する(ステップ1502)。また、取得されたエントリーから配列名「a」、配列参照形式「a[I1,I2,I3]」、オペランド識別子「ID1」を取得する。
このとき、イタレーション対応表304に配列名「a」が未登録であるため(ステップ1503の結果が「No」)、CPU101は、イタレーション対応表304に新しいエントリーを作成し、配列名1201に配列名「a」を登録する(ステップ1504)。さらに、配列名「a」の次元数nは、配列表111の次元数903に「3」が設定されているため、「n=3」となる。したがって、入力データ1402の添字を[J1,J2,J3]として登録する(ステップ1505)。
CPU101は、配列参照形式a[I1,I2,I3]の添字を[σ(I1,I2,I3)](つまり、σ(I1,I2,I3)=[I1,I2,I3])とし(ステップ1506)、Ik(1<=k<=3)について、[σ(I1,I2,I3)]=[J1,J2,J3]の解((つまり、[I1,I2,I3]=[J1,J2,J3]の解)を求める(ステップ1507)。この結果、「I1=J1、I2=J2、I3=J3」が解となり、イタレーションとして(J1,J2,J3)をセットする(ステップ1508)。
さらに、配列名「a」の場合には未設定のIk(1<=k<=3)は存在しないため(ステップ1509)、オペランド識別子1403に「ID1」、イタレーション1404に「(J1,J2,J3)」を登録する(ステップ1510)。その後、ステップ1501の処理に戻る。
次のループでは、ステップ1501の処理で、オペランド識別子登録表303に未処理のエントリーが存在すると判定されるため、当該未処理のエントリーが取得される(ステップ1502)。具体的には、配列名「a」、配列参照形式「a[I2,I3,I1]」、オペランド識別子「ID2」が取得される。
このとき、配列「a」はイタレーション対応表304に登録済であるため(ステップ1503の結果が「Yes」)と判定し、参照形式a[I2,I3,I1]の添字を[σ(I1,I2,I3)](つまり、σ(I1,I2,I3)=[I2,I3,I1])とする(ステップ1506)。そして、Ikについて、[σ(I1,I2,I3)]=[J1,J2,J3]の解として(つまり、[I2,I3,I1]=[J1,J2,J3]の解として)「I1=J3、I2=J1、I3=J2」が得られる(ステップ1507)。
CPU101は、ステップ1507の処理の結果に基づいて、(J3,J1,J2)をイタレーションとしてセットする(ステップ1508)。また、未設定のIk(1<=k<=3)は存在しないため(ステップ1509)、オペランド識別子1403に「ID2」、イタレーション1404に(J3,J1,J2)を登録する(ステップ1510)。
次のループでは、ステップ1501の処理で、オペランド識別子登録表303に未処理のエントリーが存在すると判定されるため、当該未処理のエントリーが取得される(ステップ1502)。具体的には、配列名「b」、配列参照形式「b[I1,I2]」、オペランド識別子「ID3」が取得される。
このとき、イタレーション対応表304に配列名「b」が未登録であるため(ステップ1503の結果が「No」)、CPU101は、イタレーション対応表304に新しいエントリーを作成し、配列名1201に配列名「b」を登録する(ステップ1504)。さらに、配列名「b」の次元数nは、配列表111の次元数903に「2」が設定されているため、「n=2」となる。したがって、入力データ1402の添字を[J1,J2]として登録する(ステップ1505)。
CPU101は、配列参照形式b[I1,I2]の添字を[σ(I1,I2,I3)]とし(ステップ1506)、(つまり、σ(I1,I2,I3)=[I1,I2]とし)Ikについて、[σ(I1,I2,I3)]=[J1,J2]の解を求める(ステップ1507)(つまり、[I1,I2]=[J1,J2]の解を求める)。
CPU101は、ステップ1507の処理の結果、「I1=J1、I2=J2、I3=−(該当無し)」が解となり、イタレーションとして(J1,J2,−)をセットする(ステップ1508)。また、k=3の場合にIkが未設定になるため、「I3」には、ループ表110の「I3」の制御変数範囲「0:99」がセットされる(ステップ1509)。最後に、オペランド識別子1403に「ID3」、イタレーション1404に(J1,J2,0:99)を登録する(ステップ1510)。
その後、ステップ1501の処理に戻るが、オペランド識別子登録表303に未処理のエントリーが存在しなくなるため、本処理を終了する。
以上の処理の結果、入力データ1402がa[J1,J2,J3]の場合には、オペランド識別子1403にはID1及びID2が対応する。さらに、各オペランド識別子1403に対応するイタレーション1404について(J1,J2,J3)及び(J3,J1,J2)で、a[J1,J2,J3]が参照されることがわかる。
また、入力データ1402がb[J1,J2]の場合には、オペランド識別子1403にはID3が対応する。さらに、イタレーション1404に格納された(J1,J2,0:99)においてb[J1,J2]が参照される。イタレーション対応表304は、後述するMap処理のコードを生成する際に参照される。
以上がMapReduce解析処理404の説明である。続いて、MapReduce解析処理404によって生成された結果変数登録表302、オペランド識別子登録表303及びイタレーション対応表304に基づいて、ソースプログラム106からオブジェクトプログラム107を生成する手順について説明する。
図16は、本発明の第1の実施の形態のMapReduceコード生成処理601の手順を示すフローチャートである。MapReduceコード生成処理601は、結果変数登録表302のエントリーごとに実行される。
CPU101は、MapReduceコード生成処理601を実行すると、結果変数登録表302から処理対象のエントリーを取得し、足しこみ1003の値が「YES」であるか否かを判定する(ステップ1601)。
CPU101は、処理対象のエントリーの足しこみ1003の値が「YES」の場合には(ステップ1601の結果が「Yes」)、MapReduce処理を2回実行するためのテンプレートを選択する(ステップ1603)。足しこみを行う場合には、1回目のMap処理において1イタレーション分の演算を行い、2回目のMap処理で各イタレーション結果を集計するためである。
そして、CPU101は、1回目のMap処理のコードを生成するMap1コード生成処理を実行する(ステップ1606)。Map1コード生成処理の詳細については、図18にて説明する。また、Map1コード生成処理によって生成されるMap処理1のコードを図19に示す。
続いて、CPU101は、1回目のReduce処理のコードを生成するReduce1コード生成処理を実行する(ステップ1607)。Reduce1コード生成処理の詳細については、図20にて説明する。また、Reduce1コード生成処理によって生成されるReduce処理1のコード(プログラム)を図21に示す。
さらに、CPU101は、2回目のMap処理のコードを生成するMap2コード生成処理を実行する(ステップ1608)。Map2コード生成処理の詳細については、図22にて説明する。また、Map2コード生成処理によって生成されるMap処理2のコード(プログラム)を図23に示す。
続いて、CPU101は、2回目のReduce処理のコードを生成するReduce2コード生成処理を実行する(ステップ1609)。Reduce2コード生成処理の詳細については、図24にて説明する。また、Reduce2コード生成処理によって生成されるReduce処理2のコードを図25に示す。
一方、CPU101は、処理対象のエントリーの足しこみ1003の値が「YES」でない場合には(ステップ1601の結果が「No」)、MapReduce処理を1回実行するためのテンプレートを選択する(ステップ1602)。
CPU101は、Map処理のコードを生成するMap1コード生成処理を実行し(ステップ1604)、さらに、Reduce処理のコードを生成するReduce1コード生成処理を実行する(ステップ1605)。なお、ステップ1604のMap1コード生成処理と、ステップ1606のMap1コード生成処理とは同じ処理でよい。ステップ1605のReduce1コード生成処理も同様にステップ1607のReduce1コード生成処理と同じ処理でよい。
CPU101は、ステップ1605又はステップ1609の処理が終了すると、生成されたMap処理及びReduce処理を実行するための出力コードを生成する(ステップ1610)。具体的には、生成されたMap処理及びReduce処理に依存しない処理が定義されたテンプレートをあらかじめ用意し、用意されたテンプレートに対してMap処理及びReduce処理に依存する処理を追加する。
図17は、本発明の第1の実施の形態のMapReduceプログラムのテンプレートの一例を示す図である。
図17に示したMapReduceプログラムのテンプレートの例では、実行基盤Hadoop上で利用するためにJava言語で記述したプログラムを示しているが、他の開発言語又は実行基盤向けにMapReduceコードを生成する場合であっても同様に適用することができる。
本発明の第1の実施の形態ではJava言語でコード(プログラム)が生成されるため、クラスモジュールを作成するためのテンプレートが定義される。なお、クラス名は、「OutClass」となっている。
MapReduceプログラムのテンプレートには、生成されたMapReduce処理に対応するクラスが定義され、ソースプログラム106に依存するMapReduce処理記述部分1701が含まれる。図17に示すMapReduce処理記述部分1701は、MapReduce処理を2回実行する場合を示しており、MapReduce処理を1回のみ実行する場合(図16のステップ1602)には、Map2クラス及びReduce2クラスの定義は不要である。なお、MapReduce処理記述部分1701に定義されるクラスについては、図18から図24にクラスを定義するコードを生成する手順及び生成されたクラス定義の例を示す。
また、MapReduceプログラムのテンプレートに定義されているOutClassには、runメソッド及びmainメソッドが定義される。runメソッドは、生成元となるソースプログラム106に依存する処理を含む。一方、Mainメソッドは、runメソッドを実行するためのメソッドであり、生成元となるソースプログラム106には依存しない。
図17に示すOutClassのrunメソッドには、1回目のMapReduce処理を実行するブロックと、2回目のMapReduce処理を実行するブロック1702とが含まれている。MapReduce処理を1回だけ実行する場合には2回目のMapReduce処理を実行するブロック1702の記述は不要である。
以下、MapReduceモデルが適用されたコード(クラス定義)を生成する手順について説明する。まず、一般的なMap処理とReduce処理について説明する。
Map処理では、入力されたデータを処理し、キー(Key)及び値(Value)を組として、(Key,Value)形式でデータを出力する。
Reduce処理の前の処理で、Map処理で出力されたValueの値をKeyごとにlist(Value)とし、(Key,list(Value))形式のデータをReduce処理への入力とする。そして、Keyごとにlist(Value)の値を処理し、処理結果を出力する。
本発明の第1の実施の形態では、前述のように、ソースプログラム106に含まれるループ処理に対して、MapReduceモデルに対応したコードを生成する。
ループ実行文において配列変数を結果変数に足しこむ演算を実行する場合について説明すると、1回目のMap処理で、入力データを参照するイタレーションとオペランドの情報(オペランド識別子)を、入力データに付与する。1回目のReduce処理では、イタレーションごとに収集したデータに対し、オペランド識別子に基づいてループ実行文に記述された1回分の演算を行う。
2回目のMap処理では、Reduce処理の結果をそのまま出力するidentity Mapパターンを適用する。そして、2回目のReduce処理ではイタレーションごとの計算結果である1回目のReduce処理の結果のリストを処理し、足しこみ結果を出力する。
ループ実行文が足しこみ型の演算でない場合には、イタレーションごとの演算結果に対してさらに足しこみ演算を行う必要がないため、1回目のMap処理及びReduce処理によって結果を算出することが可能となる。
Map処理及びReduce処理の入出力は、(Key,Value)形式であり、以降、Key及びValueに設定する内容について説明する。
また、本発明の第1の実施の形態において、入力データは「1 1000 改行 2 1500 …」のように、1データが「インデックス(Key) データ」のようにタブ区切りでファイルに登録されている。なお、データの入力は、タブ区切りでデータが登録されているファイルを利用する方法に限定されず、別の形式で登録されたファイルを利用してもよいし、他のシステムから入力されたデータを利用してもよく、その他の方法を利用してもよい。
さらに、結果については、例えば、配列の要素が「sum[1]=100」である場合には、(Key:1,Value:100)のように(Key:配列の添字,Value:配列要素)の形式でファイルに出力する。また、変数がスカラーで、「sum=100」である場合には、(Key:1,Value:100)のように(Key:任意の定数,Value:変数の値)の形式でファイルに出力する。
続いて、Map処理及びReduce処理を記述したコードを生成するための詳細な手順について説明する。
まず、1回目のMap処理(Map1処理)を生成するための手順について説明する。Map1処理では、入力データを参照するイタレーションと対応するオペランドの情報を付与する。具体的に説明すると、Map1処理では(Key:データのインデックス,Value:データ)の形式でデータが入力され、(Key:イタレーション,Value:<オペランド識別子,データ>)の形式で出力するコードを生成する。出力Keyのイタレーション、出力側のValueのオペランド識別子は、イタレーション対応表304に基づいて付与される。
図14に示したイタレーション対応表304では、配列「a」については1のデータに対し、2種類のオペランド識別子「ID1」「ID2」が設定されている。また、配列「b」については1のデータに対して、1種類のオペランド識別子「ID3」が設定されている。
したがって、オペランド識別子「ID1」「ID2」に対応する各ValueにKey「(J1,J2,J3)」「(J3,J1,J2)」を割り当てて出力し、さらに、オペランド識別子「ID3」に対応するValueに100種類のKey「(J1,J2,0:99)」を設定して出力するコードを生成する。
以下、図18にMap処理(Map1処理)を生成する手順を示し、本手順を図7のループ処理700に適用して生成されたプログラムの例を図19に示す。
図18は、本発明の第1の実施の形態のMap1コード生成処理1606の手順を示すフローチャートである。なお、Map1コード生成処理1604も同様である。
CPU101は、まず、イタレーション対応表304に未処理の配列名を含むエントリーが存在するか否かを判定する(ステップ1801)。未処理のエントリーが存在しない場合には(ステップ1801の結果が「No」)、本処理を終了する。
CPU101は、イタレーション対応表304に未処理のエントリーが存在する場合には(ステップ1801の結果が「Yes」)、当該エントリーを取得する(ステップ1802)。
本発明の第1の実施の形態では、前述のように、入力データはファイルに格納されており、ファイルからデータを読み出すことによってデータが入力される。CPU101は、入力データを受け付けるために、mapメソッドの対象となる入力データが格納されたファイル名がイタレーション対応表304の「配列名」に対応するファイル名か否かを判定する条件ブロックを含むコードを生成する(ステップ1803)。
具体的には、mapメソッド対象ファイル名が変数「filename」に格納され、配列名「a」のデータがファイル「Adata」に格納されている場合、入力されたファイルが「Adata」であるか否かを判定するブロック「if(filename.equals("Adata")){ }」を生成する(図19の条件ブロック1901)。そして、Adataを参照するイタレーションとオペランドの情報を付与するために必要な処理を、生成されたブロックの内部に生成する。
CPU101は、mapメソッドのKeyの引数(データのインデックス)をイタレーション対応表304の入力データの添字式に変換するコードを生成する(ステップ1804)。すなわち、mapメソッドの入力データが格納される配列変数の各添字を算出するコードを生成する。
CPU101は、ステップ1802の処理で取得されたエントリーのイタレーション1404を参照し、未処理のイタレーションが残っているか否かを判定する(ステップ1805)。未処理のイタレーションが残っていない場合には(ステップ1805の結果が「No」)、ステップ1801の処理に戻り、次のエントリーに対して処理を実行する。
CPU101は、未処理のイタレーションが残っている場合には(ステップ1805の結果が「Yes」)、処理対象のイタレーションに対し、Keyに「イタレーション」、Valueに「オペランド識別子とデータ」を設定するコードを生成する(ステップ1806)。すなわち、データに対し、Keyにイタレーションの情報、Valueにオペランドの情報を付与している。
その後、CPU101は、ステップ1805の処理に戻り、未処理のイタレーションが存在しなくなるまで、ステップ1806の処理を実行する。そして、未処理のイタレーションが存在しなくなった場合には、ステップ1801の処理に戻り、未処理のエントリーが存在しなくなるまで次のエントリーを処理する。
図19は、本発明の第1の実施の形態のMap1コード生成処理1606によって生成されたMap1コードの一例を示す図である。
ここでは、図7のループ処理700に対し、図18のフローチャートに示した手順を適用して、Map1コードを生成する過程を説明する。
Map1コードには、configureメソッドと、mapメソッドが含まれる。configureメソッドは、入力データが格納されたファイル名などを設定するメソッドであり、所定の内容が記述される。したがって、ここではmapメソッドを生成する過程について説明する。
まず、mapメソッドの引数について説明すると、mapメソッドの第一引数は入力側のKey「index」、第二引数は入力値「data」、第三引数は出力データ「output」である。出力データ「output」は、OutputCollector型であり、第一引数はKey、第二引数はValueとなっている。
Map1コード生成処理1606が開始され、最初にステップ1801の処理が実行されると、イタレーション対応表304には未処理の配列名1401を含むエントリーが存在する(ステップ1801の結果が「Yes」)。そこで、CPU101は、まず、「配列名」が「a」のエントリーを取得する(ステップ1802)。
続いて、CPU101は、mapメソッド対象ファイル名が格納された変数「filename」が配列名「a」に対応するファイル名「Adata」であるか否かを判定する条件ブロック1901を生成する(ステップ1803)。なお、ステップ1803の処理では、条件ブロック1901の内部で実行される処理については生成しない。
次に、CPU101は、mapメソッドのKeyの引数(データのインデックス)を配列の添字式に変換するコードを生成する(ステップ1804)。図9の配列表111を参照すると、配列「a」は「3次元」であり、各次元のサイズは「100」であることから、Keyの引数の1002の位を1次元目(J1)、100の位を2次元目(J2)、1の位を3次元目(J3)に設定するコード1902を生成する。
さらに、CPU101は、イタレーション対応表304の配列名「a」のエントリーについて、イタレーション1404を参照する。そして、イタレーション「(J1,J2,J3)」が未処理であるため(ステップ1805の結果が「Yes」)、Keyを「(J1,J2,J3)」に、Valueを「<ID1,data>」に設定して出力するコード1903を生成する(ステップ1806)。コード1903におけるcollectメソッドは、第一引数をKey、第二引数をValueとしてMap処理後の結果を収集する。Valueには、配列名1401が「a」、かつ、イタレーション1404が「(J1,J2,J3)」に対応するオペランド識別子1403(「ID1」)と、入力されたデータ「data」とが設定される。
さらに、イタレーション対応表304の配列名が「a」のイタレーション1404には、未処理のイタレーション「(J3,J1,J2)」が存在するため(ステップ1805の結果が「Yes」)、出力データを生成するコードを生成する(ステップ1806)。具体的には、Keyを「(J3,J1,J2)」に、Valueを「<ID2,data>」に設定して出力するコード1904を生成する。Valueには、配列名1401が「a」、かつ、イタレーション1404が「(J3,J1,J2)」に対応するオペランド識別子1403(「ID2」)と、入力されたデータ「data」とが設定される。
その後、イタレーション対応表304の配列名「a」について、未処理のエントリーは存在しないため、ステップ1801の処理に戻る。
さらに、イタレーション対応表304を参照すると、「配列名」が「b」のエントリーが未処理であるため(ステップ1801の結果が「Yes」)、当該エントリーを取得し(ステップ1802)、対応するコードを生成する。
CPU101は、mapメソッド対象ファイル名が格納された変数「filename」が配列名「b」に対応するファイル名「Bdata」であるかを判定する条件ブロック1905を生成する(ステップ1803)。なお、本発明の第1の実施の形態では、ファイルが「Adata」「Bdata」の2種類であるため、ファイル名「Adata」の条件ブロック1901に対してファイル名「Bdata」用の条件ブロック1905は、「Adata」以外のファイルが選択される、else文を使用している。
次に、CPU101は、配列「a」の場合と同様に、mapメソッドのKeyの引数を配列の添字式に変換するコードを生成する(ステップ1804)。図9の配列表111を参照すると、配列「b」は「2次元」であり、各次元のサイズは「100」であることから、Keyの引数の100の位を1次元目(J1)、1の位を2次元目(J2)に設定するコード1906を生成する。
さらに、CPU101は、イタレーション対応表304の配列名「b」のエントリーのイタレーション1404を参照し、Keyを「(J1,J2,0:99)」に、Valueを「<ID3,data>」に設定して出力するコード1907を生成する(ステップ1806)。「0:99」のように、イタレーションに範囲指定型が含まれる場合には、for文などを利用して(Key,Value)を設定する。また、Valueには、配列名1401が「b」、かつ、イタレーション1404が「(J1,J2,0:99)」に対応するオペランド識別子1403(「ID3」)が設定されている。
その後、未処理のイタレーション及び他の配列が存在しないため、本処理を終了する。
以上が、Map処理(Map1処理)を生成するための手順及び生成されたMap1処理のコードについての説明である。続いて、イタレーションごとに収集したデータに対して、ループ実行文1回分の処理を行うReduce1処理について説明する。
Reduce1処理では、Map1処理の出力結果である(Key:イタレーション,Value:list(<オペランド識別子,データ>))を入力として、(Key:結果変数登録表302の「添字式」,Value:1回分のイタレーション結果)を出力するコードを生成する。入力されたValueには<オペランド識別子,データ>のペアのリストが入力されているため、ループ実行文を構成する各オペランドについて、オペランド識別子に基づいて入力側のValueに格納されたデータを対応付けることが可能となる。そして、ループ実行文にしたがって1イタレーションの結果を演算し、演算結果を出力側のValueとして出力することができる。このとき、出力側のKeyには、結果変数登録表302に基づいて最終的に足しこみを行う添字式が設定される。複数のエントリーが結果変数登録表302に含まれている場合には、出力側のKeyに添字式の情報に加え、変数名の情報を設定することによって識別可能に構成することができる。
以下、図20にReduce処理(Reduce1処理)のコードを生成するための手順を示し、図21に図7に示したループ処理700を対象とした具体例を説明する。
図20は、本発明の第1の実施の形態のReduce1コード生成処理1607の手順を示すフローチャートである。なお、Reduce1コード生成処理1605にも同様である。
CPU101は、まず、結果変数登録表302にエントリーされた変数名1001に対応する結果設定用の変数を用意する(ステップ2001)。なお、ステップ2001の処理で用意された変数を「結果変数」とする。
さらに、CPU101は、オペランド識別子登録表303に登録されたオペランド識別子に対応するオペランド設定用の変数を用意する(ステップ2002)。なお、ステップ2002の処理で用意された変数を「オペランド変数」とする。オペランド変数は、Reduce1処理で入力されたリスト形式のデータを格納するために用意される。
CPU101は、Map1コード生成処理1606のステップ1806の処理でValueとして設定され、Reduce1処理の引数として入力された(<オペランド識別子,データ>)形式で要素が設定されているリストから、オペランド識別子に基づいてデータを抽出し、オペランド変数に設定するコードを生成する(ステップ2003)。
続いて、CPU101は、1イタレーション分の演算を行うコードを生成する(ステップ2004)。具体的には、右辺コードの各オペランドをオペランド変数に置換し、結果変数に代入するコードを生成する。なお、オペランド変数には、ステップ2003の処理で対応するデータを設定するためのコードが生成されているため、ステップ2004の処理で1イタレーションの演算結果を結果変数に代入するコードを生成されることになる。
さらに、CPU101は、結果変数登録表302に複数のエントリーが含まれているか否かを判定する(ステップ2005)。
CPU101は、結果変数登録表302に複数のエントリーが含まれていない場合(ステップ2005の結果が「Yes」)、すなわち、結果変数登録表302に1つの結果変数のみが含まれている場合には、Keyに結果変数登録表302の添字式、Valueに結果変数を設定して出力するコードを生成する(ステップ2006)。すなわち、Keyに、最終的に足しこみを行う添字式、Valueに1イタレーションの結果を設定して出力するコードを生成する。
一方、CPU101は、結果変数登録表302に複数のエントリーが含まれている場合には(ステップ2005の結果が「Yes」)、未処理の結果変数が存在するか否かを判定する(ステップ2007)。存在しない場合には(ステップ2007の結果が「No」)、本処理を終了する。
CPU101は、未処理の結果変数が存在する場合には(ステップ2007の結果が「Yes」)、結果変数登録表302の変数名に「_」及び添字式を付加してKeyを生成し、Valueに結果変数を設定して出力するコードを生成する(ステップ2008)。すなわち、Keyに、足しこみを行う変数名及び添字式、Valueに1イタレーションの結果を設定して出力するコードを生成している。ステップ2006の処理と相違する点としては、複数の結果変数(すなわち、ループ実行文)があり、変数ごとに足しこみを行う必要があるため、Keyに変数の名前をさらに付与している。結果変数の数だけステップ2008の処理を繰り返す。
図21は、本発明の第1の実施の形態のReduce1コード生成処理1607によって生成されたReduce1コードの一例を示す図である。
ここでは、図7のループ処理700に対し、図21に示したフローチャートを適用して、Reduce1コードを生成する過程を説明する。
Reduce1コードには、reduceメソッドが含まれる。reduceメソッドの引数について説明すると、reduceメソッドの第一引数はイタレーションを示し、Keyに対応する変数「(J1,J2,J3)」、第二引数はイタレーションに対応するデータが格納された入力値「values」、第三引数は出力データ「output」である。
Reduce1コード生成処理1607が開始されると、CPU101は、まず、結果変数登録表302に結果変数「sum」が登録されているため、変数「sum」を定義するコード2101を生成する(ステップ2001)。
続いて、CPU101は、オペランド識別子登録表303に3種類のオペランド識別子「ID1」「ID2」「ID3」が登録されているため、オペランド識別子に対応するオペランド変数「A_i_j_k」「A_j_k_i」「B_i_j」を定義するコード2102を生成する(ステップ2002)。
さらに、CPU101は、reduceメソッドの引数であるリスト形式の入力値(values)から取得した<オペランド識別子,データ>に対し、オペランド識別子がID1からID3のそれぞれの場合について、ステップ2002の処理で定義されたオペランド変数A_i_j_k、A_j_k_i、B_i_jにValueを設定するコード2103を生成する(ステップ2003)。
具体的には、<オペランド識別子,データ>のオペランド識別子が「ID1」の場合にはデータを「A_i_j_k」に代入し、オペランド識別子が「ID2」の場合にはデータを「A_j_k_i」に代入し、オペランド識別子が「ID3」の場合にはデータを「B_i_j」に代入するコード2103を生成する。
CPU101は、右辺コードの各オペランドをオペランド変数「A_i_j_k」「A_j_k_i」「B_i_j」に置換し、結果変数「sum」に代入するコード2104を生成する(ステップ2004)。
CPU101は、結果変数登録表302のエントリー数が1であるため(ステップ2005の結果が「No」、Keyに結果変数登録表302の添字式を設定し、Valueに結果変数「sum」を設定して出力するコード2105を生成する(ステップ2006)。すわなち、Keyに最終的に足しこみを行う添字、Valueに1イタレーションの結果を設定して出力するコードを生成する。
以上が、1回目のMapReduce処理のコードを生成する手順の説明である。なお、MapReduce処理が1回のみ実行される場合であっても、MapReduce処理が2回実行される場合であってもここまでの処理は同様に処理される。2回目のMapReduce処理が不要な場合には、この段階で対象のループ処理の結果を取得することができる。
続いて、2回目のMapReduce処理のコードを生成する手順について説明する。
本発明の第1の実施の形態では、2回目のMap処理(Map2処理)は、1回目のReduce処理で出力された(Key,Value)を入力とし、そのまま出力するコードが生成される。Map2コード生成処理1608では、入力されたコードをそのまま出力すればよく、例えば、あらかじめ用意されたテンプレートを出力すればよいため、コード生成する手順については省略する。図22にMap2処理のコード(Map2コード)の一例を示す。
図22は、本発明の第1の実施の形態のMap2コードの一例を示す図である。
Map2コードには、mapメソッドのみが含まれる。map2コードにおけるmapメソッドの引数は、map1コードにおけるmapメソッドと同様に、第一引数は入力側のKey「i」、第二引数は入力値「sum」、第三引数は出力データ「output」である。
mapメソッドの処理は、出力変数outputに対し、入力側のKeyである第一引数「i」を出力Keyとし、入力値「sum」を出力値としてそのまま設定している。Hadoopでは、Reduce処理を実行する場合には、Map処理を省略することができないため、図22に示すような処理が定義される。
続いて、Reduce2処理について説明する。Reduce2処理では、1回目のMapReduce処理でイタレーションごとに収集(演算)されたデータを足しこむ処理を実行する。
具体的には、Reduce2処理では、(Key:結果変数登録表の添字式,Value:list(Reduce1処理によって演算された1イタレーションごとの結果)が入力され、(Key:結果変数登録表の添字式,Value:足しこみ結果)を出力するコードを生成する。すなわち、添字ごとにReduce1処理によって出力された1イタレーションごとの演算結果の足しこみを行い、(結果変数の添字式,足しこみ結果)の形式で処理結果を出力するコードを生成する。結果変数登録表302に複数のエントリーがある場合には、添字式に加えて変数名の情報も含むKeyを生成する。
以下、図23にReduce処理(Reduce2処理)を生成するための手順を示し、図24にReduce2処理によって生成されたReduce2コードの具体例について説明する。
図23は、本発明の第1の実施の形態のReduce2コード生成処理1609の手順を示すフローチャートである。
CPU101は、まず、Reduce2処理の引数として入力されたリスト形式の入力値から、リストに含まれる各値をループ処理などによって取得し、取得された値の足しこみを行うためのコードを生成する(ステップ2301)。
次に、CPU101は、reduceメソッドの引数である入力側のKeyの値を、出力結果のKeyとして設定し、Valueに足しこみ結果を設定して出力するコードを生成する(ステップ2302)。なお、Keyは、結果変数登録表302の添字式、又は結果変数登録表302の変数名に「_」及び添字式を付加したものである。前者の場合には添字ごとに、後者の場合には変数名及び添字の組み合わせごとにリスト形式の入力値に格納された値の足しこみが行われる。
図24は、本発明の第1の実施の形態のReduce2コード生成処理1609によって生成されたReduce2コードの一例を示す図である。
ここでは、図7のループ処理700に対し、図23に示したフローチャートの手順を適用して、Reduce2コードを生成する過程を説明する。
Reduce1コードには、reduceメソッドが含まれる。reduceメソッドの引数について説明すると、reduceメソッドの第一引数は各イタレーションを識別するインデックス(key)「i」、第二引数はMapReduce処理1による結果が格納されたリスト形式の入力値「value」、第三引数は出力データ「output」である。
まず、CPU101は、入力されたリスト形式の入力値「value」から値を取り出し、足しこみを行うコード2401を生成する(ステップ2301)。
次に、CPU101は、Keyにreduceメソッドの引数であるインデックス「i」、Valueに足しこみ結果を設定して出力するコード2402を生成する(ステップ2302)。図7に示したループ処理では、入力側のKeyには結果変数登録表302の「添字式」が設定されている。
以上示した各手順を実行することによって、所定の条件を満たすループ処理を実行するプログラムを、分散並列処理に適したMapReduce処理を実行するプログラムに変換することができる。
本発明の第1の実施の形態によれば、そのままでは複数の計算機で分散並列処理を実行することが困難なループ処理をソースコードから抽出し、分散並列処理に適したMapReduce処理に変換することができる。したがって、多重ループのようなボトルネックになりやすい処理を複数の計算機資源を用いて分散して処理することによって、業務を効率的に行うことが可能となる。
また、本発明の第1の実施の形態によれば、ソースプログラムを入力すると、所定の条件に適合するループ処理を抽出し、自動的にMapReduce処理に変換することが可能となる。したがって、特別な言語でソースプログラムを記述し直すなどの手間を必要とせずに、容易に分散並列処理に適したプログラムに既存のプログラムを変換することが可能となる。
なお、本発明の第1の実施の形態によって生成されたプログラムを、複数の計算機上で並列処理する場合だけでなく、例えば、複数のコアを備えたマルチコアプロセッサが搭載された計算機上で実行させることによって並列処理を実行することが可能となり、処理性能を向上させることができる。
また、本発明の第1の実施の形態では、Java言語によって記述されたプログラムを対象としているが、本発明は開発言語及び実行基盤を限定せずに適用することが可能である。
以上のように、本発明の第1の実施の形態によれば、既存のプログラム(第1プログラム)に含まれるループ処理を、データにキーを付与した中間データを生成する処理(第3プログラム、Map処理)及びキーごとに中間データを集約する処理(第4プログラム、Reduce処理)に変換することによって、並列処理に適したプログラム(第2プログラム)を生成することができる。したがって、既存言語で記述されたプログラムに基づいて分散並列処理を実行可能なプログラムを生成することが可能になるため、システムの開発効率を向上させることができる。
(第2の実施の形態)
本発明の第1の実施の形態では、1回目のMap処理において、配列の1要素分のデータを入力データとし、当該データを使用するイタレーションとオペランドの情報を付与し、1回目のReduce処理において1イタレーション分の演算を行うコードを生成する手順について説明した。
本発明の第1の実施の形態では、1回目のMap処理において、配列の1要素分のデータを入力データとし、当該データを使用するイタレーションとオペランドの情報を付与し、1回目のReduce処理において1イタレーション分の演算を行うコードを生成する手順について説明した。
第2の実施の形態では、ループ処理に含まれるループ実行文で配列を連続アクセスする場合、すなわち、ループ実行文でアクセスされる配列変数の添字が同じ場合に、配列の複数要素をベクトルとして扱う。この場合、Map処理で入力されたベクトルデータに対してKey及びオペランド識別子を付与し、Reduce処理でKeyごとに複数イタレーションを実行することが可能となる。
以下、ループ実行文において配列に連続アクセスする場合について説明する。なお、第1の実施の形態と共通の構成については説明を省略し、相違する構成についてのみ説明する。
図25は、本発明の第2の実施の形態のMapReduce処理に変換可能なループ処理2500の一例を示す図である。
図25に示したループ処理2500は、ループ実行文において配列に連続アクセスする例であり、2種類の配列a、bの各要素の積の総和を計算するループ処理である。
Map1処理については、ステップ1806の処理を除いて第1の実施の形態のMap1コードを生成する手順(図18)と同じである。ステップ1806の処理では、Valueのデータがベクトルデータとなる。
第1の実施の形態では、Reduce1コード生成処理1607のステップ2004の処理において、1イタレーションの演算結果を結果変数に代入するコードを生成していたが、第2の実施の形態では、データがベクトルであるため、複数のイタレーションを実行するために足しこみ演算子を利用する。図25に示すループ処理では、「+=」を利用している。すなわち、データのベクトル化が可能な場合には、Reduce1処理で、Keyごとに部分和を計算するコードを生成する。
以下、図26にMap1コード、図27にReduce1コードの例を示し、第2の実施の形態について説明する。
図26は、本発明の第2の実施の形態のMap1コードの一例を示す図である。
図26に示すMap1コードでは、1つのKeyに対して、ベクトル型のデータをValueとしてmapメソッドに入力するため、mapメソッドの第二引数の型はベクトル型の「VecData」となっている。
また、図19に示した第1の実施の形態と同様に、配列名に対応するファイル名ごとに条件ブロック(ブロック2601及びブロック2604)を生成し、それぞれオペランド識別子を割り当てる。
コード2602及びコード2605を生成する処理は、図18に示したステップ1804の処理に対応し、データのインデックスを配列の添字式に変換している。なお、1次元配列の演算の場合には、mapメソッドの入力側のKey(インデックス)をそのままmapメソッドで入力されたKeyを出力とすればよいため、コード2602及びコード2605を省略することができる。
コード2603では、Keyに「J1」、Valueに「<ID1,data>」を設定して出力しているが、「data」はmapメソッドの第二引数で型がベクトル型に設定されているため、ベクトルデータに対してオペランド識別子「ID1」を付与したことになる。コード2606についても、ベクトルデータに対してオペランド識別子「ID2」が付与されている。
図27は、本発明の第2の実施の形態のReduce1コードの一例を示す図である。
図27に示すReduce1コードでは、第1の実施の形態(図21)と同様に、コード2701に結果変数を定義し、コード2702及びコード2703にオペランド変数を定義する。
第2の実施の形態では、配列a、bのデータをそれぞれベクトルとして扱っているので、2種類Vectorクラスのオブジェクト「VecA」、「VecB」が定義される。
コード2704は、図20のステップ2003の処理に対応し、オペランド識別子が「ID1」の場合にはベクトルデータを「VecA」に設定し、オペランド識別子が「ID2」の場合にはベクトルデータを「VecB」に設定する。
コード2705は、図20のステップ2004の処理に対応し、VecA、VecBに格納されたデータをそれぞれ取得し、取得されたデータに対してイタレーションごとの演算を実行し、結果変数に値を足しこむ。
コード2706は、図20のステップ2006の処理に対応し、Keyに結果変数登録表302の添字式(図25の例では結果変数がスカラーであるため添字式は定数「1」となっている)、Valueに部分和を設定して出力する。
本発明の第2の実施の形態によれば、データをベクトル化してKeyを付与することによって、Reduce1処理でKeyごとに収集したベクトルのリストを利用して部分和を計算するコードを生成することが可能となる。したがって、Map処理で1データごとにKeyを設定する第1の実施の形態と比較し、Map処理後のキーの数を減らすことが可能となり、Reduce処理前にキーが等しいデータを収集する過程で生じる通信オーバーヘッドを削減することができる。
(第3の実施の形態)
本発明の第3の実施の形態では、データを格納するファイルを分割し、分割されたファイルごとに処理を行う分散バッチ処理モデルを適用したプログラムを生成する例について説明する。第1の実施の形態ではMapReduceモデルを適用したプログラム(第3プログラム、第4プログラム)を作成していたが、第3の実施の形態では分散バッチ処理モデルを適用したプログラム(第4プログラムに対応)を作成する。
本発明の第3の実施の形態では、データを格納するファイルを分割し、分割されたファイルごとに処理を行う分散バッチ処理モデルを適用したプログラムを生成する例について説明する。第1の実施の形態ではMapReduceモデルを適用したプログラム(第3プログラム、第4プログラム)を作成していたが、第3の実施の形態では分散バッチ処理モデルを適用したプログラム(第4プログラムに対応)を作成する。
第1の実施の形態と第3の実施の形態では、データを集約する方法に違いがあるが、ソースプログラムからループ処理を抽出して解析した後、プログラムを生成するといった基本的な流れは同じである。したがって、第1の実施の形態における図1、図2、図4、図6については、MapReduce関連処理を分散バッチ処理に変更することによって、第3の実施の形態に適用することが可能である。また、図7、図8、図9についても同様に適用可能である。第3の実施の形態では、第1の実施の形態と共通して適用可能な図面については、説明を省略する。
最初に、第3の実施の形態で生成されるプログラムによって実行される分散バッチ処理の流れについて説明する。
第3の実施の形態では、まず、ループ実行文の配列参照形式を解析し、ファイルに格納されているデータがループ処理におけるアクセス順序と一致するか否かを判定する。そして、ループ処理におけるデータのアクセス順序がファイルの格納順序に一致しない場合には、アクセス順序に対応するようにデータを並べ替えたファイルを作成する。その後、実行基盤によって、ファイルを分割する。
このとき、ファイルには使用する順にデータが並んで格納されているため、ループ実行中にはシーケンシャルにファイルをアクセスすることが可能となる。したがって、データを格納するファイルを分割して分割ファイルを作成することによって、分割ファイルごとにループ実行文を並列して処理することが可能となる。すなわち、複数の計算機にそれぞれ分割ファイルを配布し、各計算機でループ実行文を処理することが可能となる。
また、配列の次元が異なる場合、ループ処理で複数回参照するデータを格納しているファイルにアクセスする場合には、当該ファイルをマスターファイルとして設定し、各分割ファイルから参照できるようにする。
以下、本発明の第3の実施の形態における並列処理プログラム生成方法について説明する。
図28Aは、本発明の第3の実施の形態のデータを格納するファイル形式の一例を示す図である。
データを格納するファイルのファイル2801は、フィールドとして、次元数分存在する各配列次元の添字2802、2803、...、及び添字に対応するデータ2804を含む。添字を表すフィールド(2802、2803)は、右側のフィールドほど高次元(連続次元)とする。以下、一次元目添字のフィールドを[1]、二次元目添字のフィールドを[2]のように表す。
図28Bに示すファイル2805は、3次元配列aに設定されるデータを格納するファイルの一例である。例えば、配列a[1,1,2]に格納されるデータは、1次元目添字[1]2806に「1」、2次元目添字[2]2807に「1」、3次元目添字[3]2808に「2」が設定され、データ2809には「a[1,1,2]の要素」、すなわち、実際に格納されるデータが格納される。
また、図28Cに示すファイル2810は、2次元配列bに設定されるデータを格納するファイルの一例である。なお、図28Aに示したファイル形式は一例であり、添字とデータとの関係が判別可能であれば他の形式でもよい。
図29A及び図29Bは、本発明の第3の実施の形態における並列処理プログラムによる処理の流れを説明する図である。なお、図29A及び図29Bでは、図7に示した第1の実施の形態のループ処理700を用いて説明する。
前述のように、ループ処理700では、a及びbの2種類のデータが処理される。配列参照形式a[I1,I2,I3](701)及び配列参照形式b[I1,I2](703)については、ファイルに格納されている順序(シーケンシャル)でデータにアクセスする。一方、配列参照形式a[I2,I3,I1](702)については、ファイルに格納されている順序ではなく、ファイル内でデータのアクセス位置が前後し、シーケンシャルにはならない。
そこで、第3の実施の形態では、配列参照形式a[I2,I3,I1](702)に対応してファイルa(2902)に格納されたデータをソートし、ファイルa'(2905)を作成する前処理を実行する。具体的には、優先度を[3]、[1]、[2]の順でソートし(2904)、この結果、配列参照形式a[I2,I3,I1](702)についてのデータのアクセス順序がファイル内のデータの格納順序になる。なお、ソートの優先順位決定方法については、図40及び図42にて後述する。
ファイルaをソートし、ファイルa'を作成すると、ファイルa、a'、bのデータをそれぞれ順次読み出すことによって、ループ1回分の計算(a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2])を実行することができる。次のループを実行する場合には、各ファイルにおいて読み出されたデータの次の格納位置(又は同じ位置)のデータを読み出して処理すればよい。
さらに、ファイルaに新たなフィールド2906を追加し、ループ処理の結果を一時的に書き込む。ループ処理700では、I1が等しい結果の足し込み(集約)を行っているため、制御変数I1が対応しているaのフィールド[1]について、足し込みを行う。なお、ループ処理の結果を書き込むファイル及びファイルの形式については一例であり、図29Bに示した形式に限定されない。
図29A及び図29Bで説明した処理の流れのうち分散処理部分について、図30を参照しながら説明する。図30は、本発明の第3の実施の形態における並列処理プログラムによる処理において分散処理部分の詳細を説明する図である。なお、図30では、ファイルに格納されたデータのソートが終了し、実行基盤によってファイルが分割済の状態とする。
ファイルa及びファイルa'は、分散処理を実行するジョブに対応するように分割される。ファイル3001及びファイル3003は、ともにファイルaを分割した分割ファイルである。同様に、ファイル3002及びファイル3004は、ともにファイルa'を分割した分割ファイルである。各ジョブは、対応する分割ファイルの先頭からデータを順次取得し、ループ実行文を処理する。
ファイル3005は、マスターファイルとしたファイルbである。ファイルbのサイズはファイルa及びファイルa'よりも小さく、また、次元も異なるために1つのデータが複数回利用されるため、各ジョブで共通してアクセスされるマスターファイルとしている。詳細については図41、図43及び図44で説明する。
Job1(3008)及びJob2(3009)は、並列して処理されるプロセスを示している。Job1はファイルaの先頭部分([1]=0、[2]=0、[3]=0)に格納されたデータを処理する。一方、Job2は配列aの添字[1]が1、[2]が2、[3]が3のデータを含むデータを処理する。なお、ファイルaでは、[1]はI1、[2]はI2、[3]はI3に対応する。
図30を参照すると、Job1(3008)は、ファイルaの分割ファイル3001の先頭の[1][2]が(0,0)であるため、マスターファイルであるファイルb(3005)の[1][2]が(0,0)であるデータを参照する。また、ファイルa'の分割ファイル3002についても添字の優先度を[3]、[1]、[2]としてソート済であり、マスターファイルもソート済であるため、いずれのファイルも格納順にアクセスすればよい。ただし、ファイル3001の[1][2]のように同じ値が連続する場合には、[1]又は[2]の値に変更があった時点でマスターファイルにおける次の値にアクセスする。マスターファイルのアクセス方法については図37及び図38で説明する。
また、Job2についても同様に、ファイルaの分割ファイル3003で[1][2]が(1,2)であるデータとマスターファイルであるファイルb(3005)の[1][2]が(1,2)であるデータにアクセスする。ファイルaの分割ファイル3003とファイルa'の分割ファイル3004とをそれぞれファイルの先頭からデータを読み出すことで、ループ実行文を1回分処理するために必要なデータの組合せを取得することが可能となる。
以上のように、各ジョブで分割ファイル及びマスターファイルから取得した各データを利用してループ実行文a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]を処理する。処理結果は、フィールド数が最大の分割ファイル(ジョブ1の場合は分割ファイル3001、ジョブ2の場合は分割ファイル3003)に新たなフィールドを追加し((ジョブ1の場合はフィールド3006、ジョブ2の場合はフィールド3007)、当該追加されたフィールドに格納される。処理結果は、各ジョブにおいて、対応する分割ファイルごとに書き込まれる。
続いて、上記した並列分散処理を実現させるためのプログラムの作成手順について説明する。
図31は、本発明の第3の実施の形態の分散バッチ処理情報3101の構成を示す図である。分散バッチ処理情報3101は、第1の実施の形態におけるMapReduce情報112(図1)に相当する。また、第1の実施の形態におけるMapReduce解析部202(図2)に相当する機能として、第3の実施の形態では、分散バッチ処理解析部が備えられている。分散バッチ処理解析部は、分散バッチ処理を行うためのプログラムを作成するために必要な情報を分散バッチ処理情報3101に登録する。
分散バッチ処理情報3101は、結果変数登録表3102、配列添字_制御変数対応表3103、ファイル対応表3104、ソート表3105及びマスターファイルマッチング表3106を含む。また、結果変数登録表3102、配列添字_制御変数対応表3103、ファイル対応表3104、ソート表3105及びマスターファイルマッチング表3106は、構文解析部201によって抽出されたループ処理ごとに生成される。
以下、分散バッチ処理情報3101及び分散バッチ処理情報3101を生成する分散バッチ処理解析部について図32から図44を参照しながら説明する。分散バッチ処理解析処理は、第1の実施の形態におけるMapReduce解析処理(図4のステップ404)に相当する処理である。
図32は、本発明の第3の実施の形態の分散バッチ処理解析部による分散バッチ処理解析処理の手順を示すフローチャートである。
CPU101は、分散バッチ処理解析処理を開始すると、まず、結果変数登録表生成処理を実行する(3201)。結果変数登録表3102には、ループ内で演算される結果が格納される変数の情報が格納される。結果変数登録表3102の詳細については図33にて説明し、さらに、ステップ3201の結果変数登録表3102を生成する手順については、図39にて説明する。
また、結果変数登録表生成処理3201では、後述するように、配列添字_制御変数対応表3103及びファイル対応表3104をさらに作成する。また、ファイル対応表3104を作成する際に、ソート表3105及びマスターファイルマッチング表3106を作成する。
配列添字_制御変数対応表3103には、制御変数が制御している配列参照形式の次元に関する情報が格納される。配列添字_制御変数対応表3103の詳細については図34にて説明し、さらに、配列添字_制御変数対応表3103を生成する手順については、図40にて説明する。
ファイル対応表3104には、配列要素がいずれのファイルに格納されているか、当該ファイルはソートが必要か、分割ファイルとするべきかマスターファイルとするべきかを示す情報が格納される。ファイル対応表3104の詳細については図35にて説明し、さらに、ファイル対応表3104を生成する手順については、図41にて説明する。
ソート表3105には、ソートが必要なファイルに対応するレコードのみが格納され、ソートキーの情報が格納される。ソートが不要なファイルについてはレコードが格納されない。ソート表3105の詳細については図36にて説明し、さらに、ソート表3105を生成する手順については、図42にて説明する。
CPU101は、結果変数登録表生成処理の実行後、マスターファイルマッチング表3106の各フィールドにデータを設定するマスターファイルマッチング表対応フィールド部生成処理を実行する(3202)。
マスターファイルマッチング表3106には、マスターファイルとして配置されるファイルに対応するレコードのみが格納され、分割ファイルとのマッチング情報及びマスターファイルの読み方の情報が格納される。マスターファイルマッチング表3106の詳細については図37、図38にて説明し、さらに、マスターファイルマッチング表3106を生成する手順については、図43及び図44にて説明する。マスターファイルマッチング表3106は、ファイル対応表作成時に生成されるが、マスターファイルマッチング表対応フィールド部生成処理3202の実行時にマスターファイルマッチング表3106の設定が完了する。
以下、各構成について、図33から図44を参照しながら説明する。
図33は、本発明の第3の実施の形態の結果変数登録表3102の一例を示す図である。
結果変数登録表3102は、ループ実行文において計算結果を代入している変数(結果変数)と演算の種類などを表す情報を登録する。本発明の第3の実施の形態では、ループ実行文において集約(足しこみ演算)がなされるか否かに基づいて分散処理後のデータに対して集約を行うか否かを決定する(図45のステップ4508)。また、集約の有無によらず、1イタレーションの結果を格納するべきファイルを決定する際、結果変数登録表3102を参照する(図46のステップ4604)。
結果変数登録表3102は、変数名3301、添字式3302、集約3303、実行文番号3304、元ファイルID3305、ファイルID3306及び集約フィールド3307を含む。
変数名3301は、ループ実行文において、演算結果を代入する結果変数の変数名である。変数名3301は、分散バッチ処理の1イタレーションの結果を代入する変数を設定するためなどに使用される(図46のステップ4601)。
添字式3302は、結果変数が配列変数の場合には配列変数の添字が登録される。
集約3303は、ループ実行文が集約(足しこみ)型であれば「TRUE」、集約型でなければ「FALSE」を登録する。
例えば、ループ処理700では、ループ実行文が集約(足しこみ)型であるため、集約3303には「TRUE」が設定される。また、集約結果を代入する変数が「sum[i]」となっているため、「sum」が変数名3301に登録され、「I1」が添字式3302に登録される。なお、集約は、加算(足しこみ)だけでなく、減算又は乗算などであってもよい。
実行文番号3304は、ループ実行文が複数存在する場合に、各ループ実行文を識別するための番号である。具体的には、複数のループ実行文のうち何番目の処理対象であるかを実行文番号3304に登録する。マスターファイルを使用する場合に、分割ファイルとマスターファイルとを対応づけるために使用する。ただし、ループ実行文が1つのみの場合は実行文番号3304の情報を使用せずに、マスターファイルとの対応をとることが可能である。
元ファイルID3305は、1イタレーションの結果を格納するファイル名を登録する。
ファイルID3306は、集約を行った結果を格納するファイル名を登録する。集約を行わない場合は、元ファイルID3305と同じファイル名を登録する。
図39は、本発明の第3の実施の形態の結果変数登録表3102を生成するための結果変数登録表生成処理3201の手順を示すフローチャートである。
前述のように、結果変数登録表3102を生成する過程で(ステップ3904からステップ3911及びステップ3914からステップ3919)、配列添字_制御変数対応表3103(ステップ3912)、ファイル対応表3104(ステップ3913)を生成する。配列添字_制御変数対応表3103及びファイル対応表3104の詳細と生成手順については図34、図35及び図40、図41にて説明する。
以下、結果変数登録表生成処理3201の手順について図39を参照しながら説明する。
CPU101は、結果変数登録表生成処理3201を開始すると、まず、処理中のループ実行文を識別するための変数iに0を設定する(ステップ3901)。
CPU101は、未処理のループ実行文が存在するか否かを判定する(ステップ3902)。未処理のループ実行文が存在しない場合、すなわち、すべてのループ実行文について、ステップ3903以降の処理を実行した場合には(ステップ3902の結果が「No」)、結果変数登録表生成処理3201を終了する。
CPU101は、未処理のループ実行文が存在する場合には(ステップ3902の結果が「Yes」)、処理対象のループ実行文が代入文であるか否かを判定する(ステップ3903)。処理対象のループ実行文が代入文でない場合には(ステップ3903の結果が「No」)、分散バッチ処理に変換する対象ではないため、以降の処理をスキップし、ステップ3902の処理に戻る。
CPU101は、処理対象のループ実行文が代入文である場合には(ステップ3903の結果が「Yes」)、変数iの値を1加算(インクリメント)し、結果変数登録表3102の実行文番号3304にiを登録する(ステップ3904)。
CPU101は、代入文の左辺変数の変数名を結果変数登録表3102の変数名3301に登録する(ステップ3905)。
CPU101は、左辺変数がスカラー値であるか否かを判定する(ステップ3906)。左辺変数がスカラー値でない場合、すなわち、左辺変数が配列変数の場合には(ステップ3906の結果が「No」)、結果変数登録表3102の添字式3302に配列変数の添字を登録する(ステップ3907)。左辺変数がスカラー値の場合には(ステップ3906の結果が「Yes」)、結果変数登録表3102の添字式3302に「NULL」を登録する(ステップ3908)。
CPU101は、ループ実行文の代入文が集約型か否かを判定する(ステップ3909)。集約型でない場合には(ステップ3909の結果が「No」)、結果変数登録表3102の集約3303に「FALSE」を登録する(ステップ3910)。一方、集約型の場合には(ステップ3909の結果が「Yes」)、結果変数登録表3102の集約3303に「TRUE」を設定する(ステップ3911)。
CPU101は、代入文の右辺の配列参照形式について、配列添字_制御変数対応表3103を生成する(ステップ3912)。
CPU101は、代入文の右辺の配列参照形式について、ファイル対応表3104を生成する(ステップ3913)。
CPU101は、ファイル対応表3104の実行文番号3503がiのエントリーのうち、配列の次元数が最大のエントリーを選択する。そして、選択されたエントリーのファイルID3505を、結果変数登録表3102の元ファイルID3305に登録する(ステップ3914)。なお、配列の次元数が最大のエントリーはファイル対応表3104の配列名3501及び配列表111に基づいて取得することができる。
CPU101は、結果変数登録表3102の集約3303が「TRUE」であるか否かを判定する(ステップ3915)。集約3303が「TRUE」でない場合には(ステップ3915の結果が「No」)、結果変数登録表3102の元ファイルID3305を結果変数登録表3102のファイルID3306に登録する(ステップ3916)。さらに、結果変数登録表3102の集約フィールド3307に「NULL」を登録する(ステップ3917)。
一方、集約3303が「TRUE」の場合には、CPU101は、新規ファイル名を結果変数登録表3102のファイルID3306に登録する(ステップ3918)。さらに、ステップ3914の処理で選択されたファイル対応表3104のファイルID3505の配列参照形式3502と等しい配列参照形式3401を有するエントリーを配列添字_制御変数対応表3103から取得する。そして、結果変数登録表3102の添字式3302と等しい制御変数を取得し、取得された制御変数に登録された値(配列の次元)を結果変数登録表3102の集約フィールド3307に登録する(ステップ3919)。
以上の処理が終了すると、ステップ3902の処理に戻り、未処理のループ実行文が存在しなくなるまで本処理を継続する。
ここで、図7に示したループ処理700に対し、図39に示した結果変数登録表生成処理3201を適用する場合について説明する。
ループ処理700では、前述のように、ループ実行文は「sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となる。
CPU101は、結果変数登録表生成処理3201を開始すると、まず、変数iに0を設定する(ステップ3901)。
CPU101は、未処理のループ実行文が存在するか否かを判定する(ステップ3902)。このとき、未処理のループ実行文が存在するため(ステップ3902の結果が「Yes」)、ループ実行文が代入文であるか否かを判定する(ステップ3903)。ループ実行文は、sum[I1]に、a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]を加算して代入する代入文であるため(ステップ3903の結果が「Yes」)、iを1インクリメントして1とし、結果変数登録表3102の実行文番号3304に「1」を登録する(ステップ3904)。さらに、CPU101は、結果変数登録表3102の変数名3301に「sum」を登録する(ステップ3905)。
CPU101は、結果変数がスカラー値であるか否かを判定する(ステップ3906)。結果変数sum[I1]は、配列変数であり、スカラー値でないため(ステップ3906の結果が「No」)、結果変数登録表3102の添字式3302に「[I1]」を登録する(ステップ3907)。
CPU101は、ループ実行文に複合代入演算子「+=」が含まれているため(ステップ3909の結果が「Yes」)、集約型であると判定し、結果変数登録表3102の集約3303に「TRUE」を登録する。
CPU101は、代入文の右辺「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」に対し、配列添字_制御変数対応表3103を生成する(ステップ3912)。ステップ3912の処理によって、図34に示す配列添字_制御変数対応表3103が生成される。
CPU101は、代入文の右辺「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」に対し、ファイル対応表3104を生成する(ステップ3913)。ステップ3913の処理によって、図35のファイル対応表3104が生成される。
CPU101は、ファイル対応表3104の実行文番号3503が「1」のエントリーのうち、配列の次元数が最大、かつ、ファイル対応表3104のソート3506が「FALSE」である、代入文右辺のa[I1,I2,I3]に対応するエントリーのファイルID3505「ID1」を、結果変数登録表3102の元ファイルID3305に登録する(ステップ3914)。
CPU101は、結果変数登録表3102の集約3303が「TRUE」であるか否かを判定する(ステップ3915)。結果変数登録表3102の集約3303には、ステップ3911の処理で「TRUE」が登録されているため、新規ファイル名「ID4」を結果変数登録表3102のファイルID3505に登録する(ステップ3918)。
さらに、CPU101は、ステップ3914の処理で選択したファイル対応表3104のファイルID3505「ID1」に対応するファイル対応表3104の配列参照形式3502「a[I1,I2,I3]」のエントリーを、配列添字_制御変数対応表3103から取得し、結果変数登録表3102の添字式3302「[I1]」と等しい制御変数「I1」に登録されている「1」を、結果変数登録表3102の集約フィールド3307に登録する(ステップ3919)。
そして、CPU101は、ステップ3902の処理に戻り、ループ実行文が存在しないため(ステップ3902の結果が「No」)、本処理を終了する。
以上のように、結果変数登録表3102を参照すると、図7に示したループ処理を解析した結果、変数名3301の値によって変数「sum」に1イタレーションの演算結果を代入することを把握することが可能となり、元ファイルID3305の値によって1イタレーションの演算結果はファイル名「ID1」に格納すればよいことがわかる。
さらに、集約3303の値によってループ実行文(代入文)が集約(足しこみ)演算であることを把握することが可能となり、元ファイルID3305の値と集約フィールド3307の値によってファイル「ID1」をフィールド[1]について集約(足しこみ)演算を行えばよいことがわかる。また、ファイルID3306の値から集約の結果は「ID4」に格納すればよいことがわかる。
次に、配列添字_制御変数対応表3103について図34を参照しながら説明し、配列添字_制御変数対応表3103を生成する配列添字_制御変数対応表生成処理3912について図40を参照しながら説明する。
図34は、本発明の第3の実施の形態の配列添字_制御変数対応表3103の一例を示す図である。
配列添字_制御変数対応表3103は、制御変数が配列参照形式のいずれの次元を制御しているかを示す情報を登録する。配列添字_制御変数対応表3103に格納された情報は、ファイルのソートが必要か否かを判定する処理(図41のステップ4111)、及び、前述した結果変数登録表3102の集約フィールド3307を決定する処理(図39のステップ3919)で参照される。
配列添字_制御変数対応表3103は、配列参照形式3401及び制御変数(3402、3403、...)を含む。制御変数についてはループの外側から順にフィールドが生成される。ループ処理700のように、制御変数が3つある場合は、図34に示すように制御変数1「I1」3402、制御変数2「I2」3403、制御変数3「I3」3404の3つのフィールドを生成する。
ループ処理700に含まれる配列参照形式「a[I2,I3,I1]」の場合、「a[I2,I3,I1]」が配列添字_制御変数対応表3103の配列参照形式3401に登録される。添字I1は、配列aの3次元目を制御しているため、添字I1に対応するフィールド3402に「3」を登録する。また、添字I2は、配列aの1次元目を制御しているため、添字I2に対応するフィールド3403に「1」を登録する。最後に、添字I3は、配列aの2次元目を制御しているため、添字I3に対応するフィールド3404に「2」を登録する。
図40は、本発明の第3の実施の形態の配列添字_制御変数対応表3103を生成するための配列添字_制御変数対応表生成処理3912の手順を示すフローチャートである。本処理は、結果変数登録表3102に登録された結果変数の右辺コードの各配列参照形式について、添字の次元と制御変数との対応を取得し、配列添字_制御変数対応表3103のエントリーを生成する。
CPU101は、配列添字_制御変数対応表生成処理3912を開始すると、まず、変数iに1を設定する(ステップ4001)。変数iは、ループ表110のエントリーを順に参照するために使用される。
CPU101は、未処理の配列参照が存在するか否かを判定する(ステップ4002)。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には(ステップ4002の結果が「No」)、配列添字_制御変数対応表生成処理3912を終了する。
CPU101は、配列名が結果変数登録表3102の変数名3301に登録済であって、かつ、集約3303の値が「TRUE」であるか否かを判定する(ステップ4003)。配列名が結果変数登録表3102の変数名3301に登録済であって、かつ、集約3303の値が「TRUE」の場合には(ステップ4003の結果が「Yes」)、処理対象の配列変数は結果変数と同一であるため、次の変数を処理するためにステップ4002の処理に戻る。例えば、ループ実行文に複合代入演算子「+=」が含まれておらず、右辺コードに結果変数が含まれる場合である。
CPU101は、配列名が結果変数登録表3102の変数名3301に登録済でない、又は、集約3303の値が「FALSE」の場合には(ステップ4003の結果が「No」)、同じ配列参照形式が既に登録済みであるか否かを判定する(ステップ4004A)。
CPU101は、同じ配列参照形式が既に登録済みである場合には(ステップ4004Aの結果が「Yes」)、次の変数について処理を実行するためにステップ4002の処理に戻る。
一方、CPU101は、同じ配列参照形式が登録済みでない場合には(ステップ4004Aの結果が「No」)、配列参照形式を配列添字_制御変数対応表3103の配列参照形式3401に登録し(ステップ4004B)、ループ表110のループ番号801が変数iの値と一致するエントリーを取得する(ステップ4005)。
CPU101は、ループ表110のループ番号801が変数iの値と一致するエントリーの制御変数802、すなわち、制御変数Iiによって制御される配列参照形式の次元が存在するか否かを判定する(ステップ4006)。
CPU101は、制御変数Iiによって制御される配列参照形式の次元が存在する場合には(ステップ4006の結果が「Yes」)、配列添字_制御変数対応表3103の制御変数Iiに対応するフィールド(3402、3403、...)に、制御変数802によって制御される次元を登録する(ステップ4007)。
一方、CPU101は、制御変数Iiによって制御される配列参照形式の次元が存在しない場合には(ステップ4006の結果が「No」)、配列添字_制御変数対応表3103の制御変数Iiに対応するフィールド(3402、3403、...)に、「NULL」を登録する(ステップ4008)。
CPU101は、ループ表110のループ番号801が変数iの値と一致するエントリーの子ループ806を参照し、子ループが存在するか否かを判定する(ステップ4009)。変数iの値に対応するループに子ループが存在する場合には(ステップ4009の結果が「Yes」)、変数iを1インクリメント(加算)する(ステップ4010)。さらに、ステップ4005の処理に戻り、加算後の変数iについて、すなわち、次の制御変数について同様の処理を実行する。
一方、CPU101は、変数iの値に対応するループに子ループが存在しない場合には(ステップ4009の結果が「No」)、ステップ4002の処理に戻り、次の配列参照形式について同様の処理を実行する。そして、未処理の配列参照形式が存在しなくなるまで本処理を継続する。
ここで、図7に示したループ処理700に対し、図40に示した配列添字_制御変数対応表生成処理3912を適用する手順について説明する。
前述のように、ループ処理700に含まれるループ実行文は「sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となっている。したがって、処理対象となる右辺コードは、「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となる。
CPU101は、配列添字_制御変数対応表生成処理3912を開始すると、変数iに1を設定する(ステップ4001)。さらに、CPU101は、未処理の配列参照が存在するか否かを判定する(ステップ4002)。このとき、未処理の配列参照が存在するため(ステップ4002の結果が「Yes」)、ステップ4003の処理を実行する。
ここで、最初に処理対象となる配列参照は「a[I1,I2,I3]」である。配列参照「a[I1,I2,I3]」は、結果変数登録表3102に登録されていないため(ステップ4003の結果が「No」)、当該配列参照が配列添字_制御変数対応表3103に登録済みであるか否かを判定する(ステップ4004A)。そして、配列添字_制御変数対応表3103にエントリーが登録されていないため(ステップ4004Aの結果が「No」)、ループ表110のループ番号801が「1」のエントリーを取得する(ステップ4005)。
CPU101は、配列参照「a[I1,I2,I3]」に対し、ステップ4005の処理で取得したエントリーの制御変数802「I1」によって制御される次元が存在するか否かを判定する(ステップ4006)。制御変数「I1」は配列参照「a[I1,I2,I3]」の1次元目を制御しているため、配列添字_制御変数対応表3103の制御変数「I1」に対応するフィールド3402に「1」を登録する(ステップ4007)。
CPU101は、ループ表110のループ番号801が「1」のエントリーの子ループ806に子ループの番号が登録されているか否かを判定する(ステップ4009)。ループ表110のループ番号801が「1」のエントリーの子ループ806には「2」が登録されているため(ステップ4009の結果が「Yes」)、変数iの値を1インクリメントすることで2に設定し(ステップ4010)、ステップ4005の処理に戻る。
CPU101は、ループ表110のループ番号801が「2」のエントリーを取得する(ステップ4005)。
CPU101は、配列参照「a[I1,I2,I3]」に対し、ステップ4005の処理で取得したエントリーの制御変数802「I2」によって制御される次元が存在するか否かを判定する(ステップ4006)。制御変数802「I2」は配列参照「a[I1,I2,I3]」の2次元目を制御しているため、配列添字_制御変数対応表3103の配列添字_制御変数対応表3103の制御変数「I2」に対応するフィールド3403に「2」を登録する(ステップ4007)。
CPU101は、ループ表110のループ番号801が「2」のエントリーの子ループ806に子ループの番号が登録されているか否かを判定する(ステップ4009)。ループ表110のループ番号801が「2」のエントリーの子ループ806には「3」が登録されているため(ステップ4009の結果が「Yes」)、変数iの値を1インクリメントすることで3に設定し(ステップ4010)、ステップ4005の処理に戻る。
CPU101は、ループ表110のループ番号801が「3」のエントリーを取得する(ステップ4005)。
CPU101は、配列参照「a[I1,I2,I3]」に対し、ステップ4005の処理で取得したエントリーの制御変数802「I3」によって制御される次元が存在するか否かを判定する(ステップ4006)。制御変数802「I3」は配列参照「a[I1,I2,I3]」の3次元目を制御しているため、配列添字_制御変数対応表3103の配列添字_制御変数対応表3103の制御変数「I3」に対応するフィールド3404に「3」を登録する(ステップ4007)。
CPU101は、ループ表110のループ番号801が「3」のエントリーの子ループ806に子ループの番号が登録されているか否かを判定する(ステップ4009)。ループ表110のループ番号801が「3」のエントリーの子ループ806には子ループの番号が登録されていないため(ステップ4009の結果が「No」)、ステップ4002の処理に戻る。
以降、処理対象である配列参照「a[I2,I3,I1]」及び「b[I1,I2]」についても同様の処理を実行する。
a[I2,I3,I1]については、制御変数I1が制御している次元は「3」、制御変数I2が制御している次元は「1」、制御変数I3が制御している次元は「2」である。したがって、配列添字_制御変数対応表3103の制御変数I1に対応するフィールド3402、制御変数I2に対応するフィールド3403、制御変数I3に対応するフィールド3404にはそれぞれ「3」「1」「2」が登録される。
一方、配列参照b[I1,I2]については、制御変数I1が制御している次元は「1」、制御変数I2が制御している次元は「2」、制御変数I3が制御している次元は存在しない。したがって、配列添字_制御変数対応表3103の制御変数I1に対応するフィールド3402、制御変数I2に対応するフィールド3403、制御変数I3に対応するフィールド3404にはそれぞれ「1」「2」「NULL」が登録される。
以上の処理によって設定された配列添字_制御変数対応表3103の情報は、分割ファイルに格納されたデータをソートする必要があるか否かを判定する処理(図41のステップ4111)、マスターファイルを利用する必要があるか否かを判定する処理(図41のステップ4115)で参照される。
続いて、ファイル対応表3104について図35を参照しながら説明し、ファイル対応表3104を生成するファイル対応表生成処理3913について図41を参照しながら説明する。
ファイル対応表3104には、配列要素がいずれのファイルに格納されているか、配列要素が格納されたファイルにソートが必要か否か、配列要素が格納されたファイルを分割ファイルとするべきかマスターファイルとするべきかを示す情報を登録する。
ファイル対応表3104は、配列名3501、配列参照形式3502、実行文番号3503、元ファイルID3504、ファイルID3505、ソート3506、及び配置3507を含む。
配列名3501は、ループ実行文の右辺コードに含まれる配列変数の変数名である。配列参照形式3502は、添字を含む配列変数に対応する。
実行文番号3503は、ループ実行文のうち何番目の処理対象であるかを示す。元ファイルID3504は、配列名3501が格納されているファイル名を示す。
ソート3506は、元ファイルID3504のソートが必要か否かを示す。ソートが必要な場合は「TRUE」、ソートが不要な場合は「FALSE」である。
ファイルID3505は、ソート3506において値が「TRUE」の場合にはソート後のファイル名が登録され、ソート3506において値が「FALSE」の場合には元ファイルID3504と同じファイル名が登録される。
配置3507は、ファイルID3505を分割ファイルとする場合には、「分割」、ファイルID3505をマスターファイルとする場合には、「マスター」を登録する。
上述のファイル対応表3104に格納された情報は、分散バッチ処理を実行する前にソートが必要か否かを判定する処理、演算を行うために利用するファイルを取得する処理、マスターファイルとのマッチングが必要か否かを判定する処理を実行する際に参照される。
図41は、本発明の第3の実施の形態のファイル対応表3104を生成するためのファイル対応表生成処理3913の手順を示すフローチャートである。本処理は、結果変数登録表3102に登録された結果変数の右辺コードの各項について、ファイル対応表3104のエントリーを生成する。
本処理は、結果変数登録表3102に登録された結果変数の右辺コードの各配列参照形式について、ファイルとの対応を登録したファイル対応表3104のエントリーを生成する。
CPU101は、結果変数登録表生成処理3201のステップ3904(図39)の処理で設定した変数iの値を取得し、準備する(ステップ4101)。変数iに格納された値は、結果変数登録表3102の実行文番号3304に対応する。
CPU101は、未処理の配列参照が存在するか否かを判定する(ステップ4102)。配列参照は、ループ実行文の右辺コードの各項に対応する。未処理の配列参照が存在しない場合には(ステップ4102の結果が「No」)、ファイル対応表生成処理3913を終了する。
一方、CPU101は、未処理の配列参照が存在する場合には(ステップ4102の結果が「Yes」)、配列名が結果変数登録表3102の変数名3301に登録済であって、かつ、集約3303の値が「TRUE」であるか否かを判定する(ステップ4103)。配列名が結果変数登録表3102の変数名3301に登録済であって、かつ、集約3303の値が「TRUE」の場合には(ステップ4103の結果が「Yes」)、次の変数について処理を実行するためにステップ4102の処理に戻る。
一方、CPU101は、配列名が結果変数登録表3102の変数名3301に登録済でない、又は、集約3303の値が「FALSE」の場合には(ステップ4103の結果が「No」)、同じ配列参照形式が既に登録済みであるか否かを判定する(ステップ4104)。
CPU101は、同じ配列参照形式が既に登録済みである場合には(ステップ4104の結果が「Yes」)、実行文番号3503がステップ4101の処理で準備された変数iの値と等しいか否かを判定する(ステップ4107)。実行文番号3503が変数iの値と等しい場合には(ステップ4107の結果が「Yes」)、ファイルとの対応が既に登録済であるため、ステップ4102の処理に戻る。
一方、CPU101は、実行文番号3503が変数iの値と異なる場合には(ステップ4107の結果が「No」)、実行文番号3503に変数iの値を追加する(ステップ4108)。
さらに、CPU101は、ファイル対応表3104の配置3507が「マスター」であるか否かを判定する(ステップ4109)。ファイル対応表3104の配置3507が「マスター」でない場合には(ステップ4109の結果が「No」)、ステップ4102の処理に戻る。
CPU101は、ファイル対応表3104の配置3507が「マスター」である場合には(ステップ4109の結果が「Yes」)、マスターファイルマッチング表3106の実行文番号に変数iの値に対応するエントリーを追加する(ステップ4110)。これらの処理は、ループ実行文ごとに使用されるファイルを対応させるために実行される。
一方、CPU101は、同じ配列参照形式が登録済みでない場合には(ステップ4104の結果が「No」)、当該配列参照の「配列名」及び「配列参照形式」をファイル対応表3103の配列名3501、配列参照形式3502にそれぞれ登録し、実行文番号3503に変数iの値を登録する(ステップ4105)。
CPU101は、当該配列要素を格納しているファイル名を、ファイル対応表3104の元ファイルID3504に登録する(ステップ4106)。
CPU101は、配列要素を格納しているファイルに格納されているデータをソートする必要があるか否かを判定する(ステップ4111)。ここで、ソートの必要があるか否かを判定するためには、前述した配列添字_制御変数対応表3103を参照すればよい。配列添字_制御変数対応表3103のうち、当該配列参照形式のエントリーについて、制御変数がループの内側になるにつれて、登録されている値(次元)が単調に増加している場合には、配列の連続次元を連続的にアクセスすることになるため、ソートは不要と判定することができる。
CPU101は、ソートが必要な場合には(ステップ4111の結果が「Yes」)、ファイル対応表3104のファイルID3505に新規ファイル名を登録し、ソート3506に「TRUE」を登録する(ステップ4112)。さらに、CPU101は、ソート表3105を生成する(ステップ4113)。ソート表生成処理4113の詳細については、図42を参照しながら後述する。
一方、CPU101は、ソートが不要な場合には(ステップ4111の結果が「No」)、ファイル対応表3104の元ファイルID3504をファイルID3505に登録し、ソート3506に「FALSE」を登録する(ステップ4114)。
CPU101は、配列添字_制御変数対応表3103において、当該配列参照のエントリーの制御変数に対応するフィールドに「NULL」が設定されているか否かを判定する(ステップ4115)。
CPU101は、配列添字_制御変数対応表3103において、当該配列参照のエントリーの制御変数に対応するフィールドに「NULL」が設定されている場合には(ステップ4115の結果が「Yes」)、ファイル対応表3104の配置3507に「マスター」を登録する(ステップ4116)。さらに、CPU101は、マスターファイルマッチング表3106に新規エントリーを追加する(ステップ4117)。
一方、CPU101は、配列添字_制御変数対応表3103において、当該配列参照のエントリーの制御変数に対応するフィールドに「NULL」が設定されていない場合には(ステップ4115の結果が「No」)、ファイル対応表3104の配置3507に「分割」を登録する(ステップ4118)。
上述したファイル対応表3104の配置3507の選択では、以下のような判断を行っている。配列添字_制御変数対応表3103において制御変数に対応するフィールドに「NULL」が設定されている場合は、他の配列よりも配列のサイズが小さく、1つのデータが複数回利用されている。そこで、同じデータを繰り返しアクセスするファイルについては、分割せずにマスターファイルとして配置する。
その後、CPU101は、ステップ4102を実行し、未処理の配列参照形式が存在しなくなるまで本処理を実行する。
ここで、図7に示したループ処理700に対し、図41に示したファイル対応表生成処理3913を適用する手順について説明する。
ループ処理700では、前述のように、ループ実行文が「sum[I1]+=a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となっており、処理対象となる右辺コードは、「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」となっている。
CPU101は、ファイル対応表生成処理3913を開始すると、結果変数登録表生成処理3201のステップ3904の処理で設定された変数iの値(「1」)を取得及び準備する(ステップ4101)。
CPU101は、未処理の配列参照が存在するため(ステップ4102の結果が「Yes」)、ステップ4103の処理を実行する。
最初に処理対象となる配列参照は「a[I1,I2,I3]」である。配列参照「a[I1,I2,I3]」は、結果変数登録表3102に登録されていないため(ステップ4103の結果が「No」)、当該配列参照がファイル対応表3104に登録済みであるか否かを判定する(ステップ4104)。そして、ファイル対応表3104に対応するエントリーが登録されていないため(ステップ4104の結果が「No」)、CPU101は、配列名3501として「a」、配列参照形式3502として「a[I1,I2,I3]」を登録し、実行文番号3503として「1」をファイル対応表3104へ登録する(ステップ4105)。
CPU101は、配列名3501「a」を格納しているファイル名「ID1」を元ファイルID3504に登録する(ステップ4106)。
CPU101は、元ファイルID3504「ID1」に対してソートが必要であるか否かを判定する(ステップ4111)。配列添字_制御変数対応表3103の配列参照形式3401が「a[I1,I2,I3]」のエントリーを参照すると、制御変数が「I1→I2→I3」と内側のループになるにつれて、エントリーされている値(次元)が「1→2→3」と単調に増加しているため、ソートは不要と判定する(ステップ4111の結果が「No」)。
CPU101は、ファイル対応表3104の元ファイルID3504「ID1」をファイルID3505に登録し、ソート3506に「FALSE」を登録する(ステップ4114)。
CPU101は、配列添字_制御変数対応表3103において、配列参照形式がa[I1,I2,I3]のエントリーの制御変数に対応するフィールドに「NULL」が設定されていないため(ステップ4115の結果が「No」))、ファイル対応表3104の配置3507に「分割」を登録する(ステップ4118)。
その後、ステップ4102の処理に戻り、配列参照a[I2,I3,I1]、b[I1,I2]についても同様の処理を実行し、図35に示したファイル対応表3104を得ることができる。
図35に示したファイル対応表3104に基づいて、以下の事項を把握することができる。配列参照形式3502「a[I1,I2,I3]」ついては、ソート3506が「FALSE」となっているため、元ファイルID3504に登録されているファイル「ID1」をソートせずに使用可能である。また、配置3507が「分割」となっているため、対応する配列の要素を格納するファイルを分割ファイルとして配置する。
また、配列参照形式3502「a[I2,I3,I1]」については、ソート3506が「TRUE」、かつ、配置3507が「分割」となっているため、元ファイルID3504に登録されたファイル「ID1」をソート後、ファイルID3505「ID2」に格納し、分割ファイルとして配置する。
配列参照形式3502「b[I1,I2]」については、ソート3506が「FALSE」となっているため、元ファイルID3504に登録されたファイル「ID3」をソートせずに使用し、配置3507が「マスター」となっているため、マスターファイルとして配置する。
ファイル対応表3104に格納された情報は、コード生成時の演算コード生成処理(図45のステップ4505)において参照される。
続いて、ソート表3105について図36を参照しながら説明し、ソート表3105を生成するソート表生成処理4113について図42を参照しながら説明する。
ソート表3105には、ソートが必要なファイルに対応するエントリーのみが含まれ、ソートキーの優先順序及びソート後のファイル名を登録する。
ソート表3105は、ファイルID3601及びキーが含まれる。キーは、ソートの対象となる制御変数に対応し、図36に示すソート表3105には、第1キー3602、第2キー3603、第3キー3604が含まれる。制御変数の数だけキーに対応するフィールドが生成される。
ファイルID3601には、ソート後のファイル名が登録される。
キー(第1キー3602、第2キー3603、第3キー3604)には、ソートキーとするフィールド番号が登録される。ソートキーとしては、第1キー3602が最も優先度が高く、第2キー3603、第3キー3604の順で優先度が高くなる。若い番号が付与されたフィールド名のキーほど優先度が高く設定される。
図42は、本発明の第3の実施の形態のソート表3105を生成するためのソート表生成処理4113の手順を示すフローチャートである。
なお、ソート表生成処理4113は、ファイル対応表3104の生成時に、対応するファイルのソートが必要と判定された場合(ステップ4111の結果が「Yes」)に実行される。
CPU101は、ソート表生成処理4113を開始すると、ファイル対応表3104を参照し、ファイル対応表生成処理3913で処理対象のエントリーに含まれるファイルID3505の値をソート表3105のファイルID3601に登録する(ステップ4201)。
CPU101は、ファイル対応表生成処理3913で処理対象のエントリーに含まれる配列参照形式3502を配列添字_制御変数対応表3103から取得し、制御変数に対応する値を順にソート表3105の各キーに対応するフィールドに登録する(ステップ4202)。
つまり、ソートが必要なファイルが存在する場合には、配列添字_制御変数対応表3103に登録された値の列をそのままソートキーとして利用すればよい。
ここで、図7に示したループ処理700に対し、図42に示したソート表生成処理4112を適用する手順について説明する。
まず、ファイル対応表生成処理3913において、右辺コード、「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」のうち、「a[I2,I3,I1]」にソートが必要と判定される(ステップ4111の結果が「Yes」)。以下、「a[I2,I3,I1]」についてソート表3105を生成する手順について説明する。
CPU101は、ファイル対応表3104を参照し、配列参照形式3502「a[I2,I3,I1]」のファイルID3505「ID2」を、ソート表3105のファイルID3601に登録する(ステップ4201)。
CPU101は、配列添字_制御変数対応表3103から配列参照形式3401が「a[I2,I3,I1]」のエントリーを取得し、制御変数1「I1」3402、制御変数2「I2」3403、制御変数3「I3」3404に登録された「3」「1」「2」を、ソート表3105の、第1キー3602、第2キー3603、第3キー3604にそれぞれ登録する(ステップ4202)。
ソート表3105及びファイル対応表3104によって、「a[I2,I3,I1]」にデータを格納するためのファイルは、ファイル「ID1」をフィールドの優先度が第3、第1、第2の順でソートし、ソート後のファイル名を「ID2」として格納すればよいことがわかる。
続いて、マスターファイルマッチング表3106について図37及び図38を参照しながら説明し、マスターファイルマッチング表3106を生成するマスターファイルマッチング表エントリー追加処理(図41のステップ4117)及びマスターファイルマッチング表対応フィールド部生成処理3202について、図43及び図44を参照しながら説明する。
マスターファイルマッチング表3106には、分割ファイルの先頭位置とマスターファイルの読み出し開始位置との対応が登録される。
図37は、本発明の第3の実施の形態のマスターファイルマッチング表3106の一例を示す図である。
マスターファイルマッチング表3106は、ファイルID3701、マッチングキー3702及び読み方3703を含む。
ファイルID3701には、マスターファイルとして配置されたファイル名が登録される。
マッチングキー3702は、実行文番号3704及び対応フィールド3705を含む。実行文番号3704には処理対象となるループ実行文の番号が登録される。対応フィールド3705には、分割ファイルの先頭位置と、マスターファイルの読み出し開始位置との対応が登録される。対応フィールド3705は、演算コード生成処理時(図45のステップ4505)に参照される。
対応フィールド3705は、分割3706及びマスター3707を含む。分割3706にはマッチング対象の分割ファイルのフィールドが登録される。また、マスター3707には、マッチング対象のマスターファイルのフィールドを登録する。
図37に示すマスターファイルマッチング表3106では、分割3706に「ID1[1][2]」、マスター3707に「ID3[1][2]」が登録されているため、分割ファイル「ID1」の先頭の第1フィールド及び第2フィールドがマスターファイル「ID3」の第1フィールド及び第2フィールドに対応していることがわかる。
読み方3703には、分割ファイルの先頭とマスターファイルを対応させた後、マスターファイルに格納されたデータの読み出し方法を示す情報が登録される。
図37に示すマスターファイルマッチング表3106の読み方3703には、「1data」が登録されているため、最初にマッチングしたマスターファイルの1つのデータを、分割ファイル「ID1」の第1フィールド又は第2フィールドの値に変化があるまで連続して取得し続けることを表している。
具体的には、ループ処理700において、最内側ループ制御変数であるI3が変化しても、配列参照形式b[I1,I2](703)の値は変化せず、制御変数I2が次の値に変化するまで同じ値で演算される。このような場合には読み方3703に「1data」を設定する。
また、読み方3703には、「1data」の他に「sequence」が設定される。図38は、読み方3703が「sequence」の場合を示す例である。読み方3703が「sequence」の場合には、マスターファイルマッチング表3106の対応フィールド3705を参照して分割ファイルの先頭位置とマスターファイルの読み出し開始位置を対応させた後、各ファイルに格納されたデータを所定の範囲で順次読み出すことを表している。
具体的には、ループ処理700において、配列参照形式b[I1,I2](703)を「b[I2,I3]」に変更した場合、最内側ループ制御変数であるI3が変化するとともに、b[I2,I3]に格納するデータを読み出す位置も変化する。このような場合には読み方3703に「sequence」を設定する。
また、配列参照形式b[I1,I2](703)を「b[I1,I3]」に変更すると、I1の値が変更されるまで所定の範囲のデータが読み出され、I1の値が変化すると、次の範囲のデータが読み出される。この場合も読み方3703に「sequence」を設定する。
読み方3703が「1data」の場合、I1やI2の値に変化があるまで、つまり、分割ファイルの[1]や[2]のフィールドの値に変化があるまで、マスターファイルの同じデータを使用し続ける。また、読み方3703が「sequence」の場合、I3が上限値に達するまで、つまり、分割ファイルのフィールド[3]が上限値に達するまでは必ず、連続してシーケンシャルにマスターファイルのデータを使用する。
I1やI2が変化するのはI3が上限値に達する時であることに着目すると、ファイルの分割単位を最内側制御変数の上限値とすれば、各分割ファイルの[3]の値は0から99になり、[1]、[2]の値は一定値となる。その結果、各分割ファイルに対応させるべきマスターファイルの所定範囲のデータは一か所となる。
従って、マスターファイルマッチング表3106の対応フィールド3705を利用して、分割ファイルの先頭と、マスターファイルとの1回のマッチングで済むため処理を効率化できる。
I1,I2,I3のループで、I3の上限値が極端に小さい場合は、I3の上限値でファイルを分割すると分割ファイル数が多くなってしまうため、他の閾値でファイルを分割する必要がある。従って一般的には、分割ファイルの先頭及び分割ファイルのフィールドの値が上限値に達した時に、再度マスターファイルマッチング表3106の対応フィールド3705を利用してマッチングし直す。
図43は、本発明の第3の実施の形態のマスターファイルマッチング表3106を生成するためのマスターファイルマッチング表エントリー追加処理の手順を示すフローチャートである。マスターファイルマッチング表エントリー追加処理は、図41のステップ4117で実行される。
なお、マスターファイルマッチング表エントリー追加処理(図41のステップ4117)は、ファイル対応表3104生成時に、マスターに配置するべきファイルが存在する場合(図41のステップ4115の結果が「Yes」)、具体的には配列参照について、配列添字_制御変数対応表3103で「NULL」が存在する場合に実行される。
CPU101は、マスターファイルマッチング表エントリー追加処理(図41のステップ4117)を開始すると、結果変数登録表生成処理3201のステップ3904(図39)の処理で設定した変数iの値を取得し、準備する(ステップ4301)。変数iに格納された値は、結果変数登録表3102の実行文番号3304に対応する。
CPU101は、ファイル対応表3104のファイルID3505を、マスターファイルマッチング表3106のファイルID3701に登録する(ステップ4302)。
CPU101は、変数iに格納された値を、マッチングキー3702の実行文番号3704に登録する(ステップ4303)。
CPU101は、配列添字_制御変数対応表3103の最内側制御変数に対応する値が「NULL」であるか否かを判定する(ステップ4304)。配列添字_制御変数対応表3103の最内側制御変数に対応する値が「NULL」である場合には(ステップ4304の結果が「Yes」)、マスターファイルマッチング表3106の読み方3703に「1data」を登録する(ステップ4305)。
一方、CPU101は、配列添字_制御変数対応表3103の最内側制御変数に対応する値が「NULL」でない場合には(ステップ4304の結果が「No」)、マスターファイルマッチング表3106の読み方3703に「sequence」を登録する(ステップ4306)。
ここで、図7に示したループ処理700に対し、図43に示したマスターファイルマッチング表エントリー追加処理(図41のステップ4117)を適用する手順について説明する。
まず、ファイル対応表生成処理3913において、右辺コード、「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」のうち、「b[I1,I2]」のみが、配列添字_制御変数対応表3103で制御変数3「I3」3404が「NULL」であるため、マスターに配置されるデータと判定される(図41のステップ4115の結果が「Yes」)。
以下、「b[I1,I2]」についてマスターファイルマッチング表エントリー追加処理(図41のステップ4117)手順を説明する。
CPU101は、結果変数登録表生成処理3201のステップ3904(図39)の処理で設定された変数iの値「1」を取得し、準備する(ステップ4301)。
CPU101は、ファイル対応表3104のファイルID3505「ID3」をマスターファイルマッチング表3106のファイルID3701に登録する(ステップ4302)。
CPU101は、変数iの値「1」を、マッチングキー3702の実行文番号3704に登録する(ステップ4303)。
CPU101は、配列添字_制御変数対応表3103のエントリー「b[I1,I2]」の最内側制御変数「I3」3404に対応する値が「NULL」であるか否かを判定する(ステップ4304)。配列添字_制御変数対応表3103のエントリー「b[I1,I2]」の最内側制御変数「I3」3404に対応する値が「NULL」であるため(ステップ4304の結果が「Yes」)、マスターファイルマッチング表3106の読み方3703に「1data」を登録する(ステップ4305)。
続いて、以上の手順によって作成されたマスターファイルマッチング表3106のエントリーの未設定のフィールドの値を設定するための対応フィールド部生成処理3202について説明する。
図44は、本発明の第3の実施の形態のマスターファイルマッチング表3106を生成するための対応フィールド部生成処理3202の手順を示すフローチャートである。
CPU101は、マスターファイルマッチング表対応フィールド部生成処理3202を開始すると、まず、マスターファイルマッチング表3106に未処理のエントリーが存在するか否かを判定する(ステップ4401)。マスターファイルマッチング表3106に未処理のエントリーが存在しない場合には(ステップ4401の結果が「No」)、処理を終了する。
一方、CPU101は、マスターファイルマッチング表3106に未処理のエントリーが存在する場合には(ステップ4401の結果が「Yes」)、マスターファイルマッチング表3106のファイルID3701に対応する配列参照形式3502をファイル対応表3104から取得する(ステップ4402)。
CPU101は、処理対象のマスターファイルマッチング表3106の実行文番号3704に対応するエントリーを結果変数登録表3102から取得する。そして、取得されたエントリーに含まれる元ファイルID3305に対応する配列参照形式3502をファイル対応表3104から取得する(ステップ4403)。
その後、CPU101は、配列添字_制御変数対応表3103を参照し、ステップ4402の処理とステップ4403の処理で取得されたエントリーを比較する(ステップ4404)。
CPU101は、配列添字_制御変数対応表3103において、同じ制御変数が制御している次元(フィールド)の対応を、マッチングキー3702の対応フィールド3705に登録する(ステップ4505)。具体的には、分割3706に分割ファイル名とフィールド、マスター3707にマスターファイル名とフィールドを登録する。
例えば、配列添字_制御変数対応表3103において、「a[I1,I2,I3]」と「b[I1,I2]」のエントリーを比較すると、制御変数「I1」3402、「I2」3403によって制御されるフィールドは、「a[I1,I2,I3]」が[1][2]、「b[I1,I2]」が[1][2]となる。また、「a[I1,I2,I3]」に対応するファイル名は「ID1」、「b[I1,I2]」に対応するファイル名は「ID3」であるため、分割に「ID1[1][2]」、マスターに「ID3[1][2]」を登録する(ステップ4405)。
ここで、図7に示したループ処理700に対し、図44に示したマスターファイルマッチング表対応フィールド部生成処理3202を適用する手順について説明する。
CPU101は、マスターファイルマッチング表対応フィールド部生成処理3202を開始すると、まず、マスターファイルマッチング表3106に未処理のエントリーが存在するため(ステップ4401の結果が「Yes」)、ステップ4402の処理を実行する。
CPU101は、マスターファイルマッチング表3106のファイルID3701「ID3」に対応する配列参照形式3502「b[I1,I2]」をファイル対応表3104から取得する(ステップ4402)。
CPU101は、処理対象のマスターファイルマッチング表3106の実行文番号3704「1」のエントリーを結果変数登録表3102から取得し、元ファイルID3305「ID1」に対応する配列参照形式「a[I1,I2,I3]」をファイル対応表3104から取得する(ステップ4403)。
CPU101は、配列添字_制御変数対応表3103で、配列参照形式「a[I1,I2,I3]」と配列参照形式「b[I1,I2]」とを比較する(ステップ4404)。
CPU101は、配列添字_制御変数対応表3103において、制御変数「I1」3402、「I2」3403によって制御されるフィールドが、「a[I1,I2,I3]」の[1][2]、「b[I1,I2]」の[1][2]に対応しているため、分割3706に「ID1[1][2]」、マスター3707に「ID3[1][2]」を登録する(ステップ4405)。
その後、ステップ4401の処理に戻り、マスターファイルマッチング表3106に未処理のエントリーは存在しないため、処理を終了する。
以上が、分散バッチ処理解析(第1の実施の形態のMapReduce解析処理404に相当)の説明である。続いて、分散バッチ処理解析によって生成された、結果変数登録表3102、配列添字_制御変数対応表3103、ファイル対応表3104、ソート表3105、及びマスターファイルマッチング表3106に基づいて、ソースプログラム106からオブジェクトプログラム1071を生成する手順について説明する。
図45は、本発明の第3の実施の形態の分散バッチ処理コード生成処理(第1の実施の形態におけるMapReduceコード生成処理601に相当)の手順を示すフローチャートである。分散バッチ処理コード生成処理は、ファイル対応表3104のエントリーごとに実行される。
CPU101は、分散バッチ処理コード生成処理を開始すると、ファイル対応表3104に未処理のエントリーが存在するか否かを判定する(ステップ4501)。未処理のエントリーが存在しない場合には(ステップ4501の結果が「No」)、ステップ4505の処理を実行する。一方、未処理のエントリーが存在する場合には(ステップ4501の結果が「Yes」)、該当するエントリーを取得する(ステップ4502)。
CPU101は、ファイル対応表3104のソート3506が「TRUE」であるか否かを判定する(ステップ4503)。ファイル対応表3104のソート3506が「TRUE」でない場合には(ステップ4503の結果が「No」)、ステップ4501の処理を実行する。一方、ファイル対応表3104のソート3506が「TRUE」の場合には(ステップ4503の結果が「Yes」)、ソート表3105に登録されたソートキーを設定し、ソート指示を出力する(ステップ4504)。そして、ステップ4501の処理に戻り、さらに未処理のエントリーを処理する。
ステップ4501から4504までの処理は、演算コード生成処理(ステップ4505)を実行する前に、必要に応じてファイルに格納されたデータをソートする処理である。ファイルに格納されたデータをソートする処理が終了すると、CPU101は、演算用コード生成処理を実行する(ステップ4505)。演算用コード生成処理4505については、図46を参照しながら後述する。演算用コード生成処理4505が実行されると、ループ処理のイタレーション1回分の演算結果を算出するためのコードが生成される。
ループ処理のイタレーション1回分を実行した後、さらに演算結果の集約が必要な場合には、演算結果を集約するためのコードを生成する(ステップ4506から4509)。集約が必要であるか否か、また、どのように演算結果を集約するかについては前述した結果変数登録表3102に基づいて決定することが可能である。
CPU101は、結果変数登録表3102に未処理のエントリーが存在するか否かを判定する(ステップ4506)。未処理のエントリーが存在しない場合には(ステップ4506の結果が「No」)、本処理を終了する。
CPU101は、未処理のエントリーが存在する場合には(ステップ4506の結果が「Yes」)、該当するエントリーを取得し(ステップ4507)、結果変数登録表3102の集約3303が「TRUE」であるか否かを判定する(ステップ4508)。
CPU101は、結果変数登録表3102の集約3303が「TRUE」でない場合には(ステップ4508の結果が「No」)、ステップ4506の処理に戻り、次のエントリーに対して処理を継続する。
CPU101は、結果変数登録表3102の集約3303が「TRUE」である場合には(ステップ4508の結果が「Yes」)、集約コード生成処理を実行し(ステップ4509)、ステップ4506の処理に戻る。集約コード生成処理4509の詳細については、図48を参照しながら後述する。
その後、CPU101は、結果変数登録表3102に未処理のエントリーが存在しなくなるまで本処理を実行する。
以上説明した分散バッチ処理コード生成処理によって、ソートが必要なファイルをソートした後、ループ処理のイタレーション1回分の演算を実行し、集約が必要な場合には演算結果を集約するためのコードが生成される。
続いて、分散バッチ処理コード生成処理の手順に含まれる演算コード生成処理(図45のステップ4505)について説明する。演算コード生成処理では、ループ処理のイタレーション1回分の演算を実行するためのコードを生成する。
図46は、本発明の第3の実施の形態の演算コード生成処理の手順を示すフローチャートである。
CPU101は、演算コード生成処理を開始すると、まず、結果変数登録表3102にエントリーされた変数名3301に対応する結果設定用の変数を準備する(ステップ4601)。なお、ステップ4601の処理で準備された変数を「結果変数」とする。
さらに、CPU101は、ファイル対応表3104に登録された配列参照形式3502に対応するオペランド設定用の変数を準備する(ステップ4602)。なお、ステップ4602の処理で準備された変数を「オペランド変数」とする。オペランド変数は、入力対象のデータを格納するための変数である。
CPU101は、ファイル対応表3104のファイルID3505に登録されているすべてのファイルを入力ファイルとしてオープンするコードを生成する(ステップ4603)。ループ実行文に含まれる配列参照形式は、ファイル対応表3104のファイルID3505と1対1に対応しているためである。
CPU101は、結果変数登録表3102の元ファイルID3305に登録されているすべてのファイルを出力ファイルとしてオープンするコードを生成する(ステップ4604)。
続く処理では、マスターに配置されているファイルが存在する場合に、分割ファイルからの読み出し開始位置を指定するためのコードを生成する。なお、マスターに配置されているファイルが存在するか否かは、ファイル対応表3104を参照すれば判定することができる。
CPU101は、ファイル対応表3104に未処理のエントリーが存在するか否かを判定する(ステップ4605)。ファイル対応表3104に未処理のエントリーが存在しない場合には(ステップ4605の結果が「No」)、ステップ4609の処理を実行する。
ファイル対応表3104に未処理のエントリーが存在する場合には(ステップ4605の結果が「Yes」)、CPU101は、ファイル対応表3104の配置3507が「マスター」であるか否かを判定する(ステップ4607)。
CPU101は、ファイル対応表3104の配置3507が「マスター」でない場合には(ステップ4607の結果が「No」)、ステップ4605の処理に戻り、ファイル対応表3104の次のエントリーに対して処理を継続する。
CPU101は、ファイル対応表3104の配置3507が「マスター」の場合には(ステップ4607の結果が「Yes」)、マスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成し(ステップ4608)、ステップ4605の処理に戻る。なお、マスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成する処理4608については、図47を参照しながら後述する。
CPU101は、ファイル対応表3104のすべてのエントリーに対し、マスターファイルが存在するか否かを判定した後、オープンされたすべての入力ファイルに対し、データ2804をオペランド変数に設定するコードを生成する(ステップ4609)。
続いて、CPU101は、1イタレーション分の演算を実行するコードを生成する(ステップ4610)。具体的には、右辺コードの各オペランドをオペランド変数に置換し、結果変数に代入するコードを生成する。なお、オペランド変数には、ステップ4602の処理で対応するデータを設定するためのコードが生成されているため、ステップ4610の処理では、1イタレーションの演算結果を結果変数に代入するコードを生成したことになる。
さらに、CPU101は、オープンした出力用ファイルの変数名フィールド(図30に示した例では、フィールド3006、フィールド3007に該当)に結果変数の値を出力するコードを生成する(ステップ4611)。なお、結果変数にはステップ4610の処理で1イタレーションの演算結果が代入されていたため、ステップ4611の処理では、1イタレーションの演算結果がファイルに出力されたことになる。
続いて、演算コード生成処理(図45のステップ4505、図46)の手順に含まれるマスターファイルマッチング表3106の読み方3703に基づいてデータを取得するコードを生成する処理(図46のステップ4608)について説明する。本処理では、マスターファイルに格納されたデータの読み出し開始位置を設定するコードを生成する。
図47は、本発明の第3の実施の形態のマスターファイルマッチング表3106の読み方3703に基づいてデータを取得するコードを生成する処理の手順を示すフローチャートである。
CPU101は、マスターファイルマッチング表3106の読み方3703に基づいてデータを取得するコードを生成する処理を開始すると、まず、マスターファイルマッチング表3106の対応フィールド3705の分割3706に登録されているフィールドと、マスター3707に登録されているフィールドの値が等しい位置を、マスターファイルの読み出し開始位置とするコードを生成する(ステップ4701)。
続いて、CPU101は、マスターファイルマッチング表3106の読み方3703が「1data」であるか否かを判定する(ステップ4702)。なお、マスターファイルマッチング表3106の読み方3703には、前述のように、「1data」及び「sequence」が含まれる。
CPU101は、マスターファイルマッチング表3106の読み方3703が「1data」である場合には(ステップ4702の結果が「Yes」)、配列添字_制御変数対応表3103を参照して、分割3706に登録されているフィールドのうち、ループ処理の内側ループ制御変数に対応するフィールドの値が変化した場合に、マスターファイル3701に格納されたデータの次の値を取得するコードを生成する(ステップ4703)。その後、本処理を終了する。なお、前述したように、分割ファイルが最内側ループ制御変数の上限値で分割されている場合には、最内側ループ制御変数以外に対応する分割ファイルのフィールドの値は一定値であるため、フィールドの値の変化は調べず、ステップ4701でマッチングさせたデータの取得のみ行えばよい。
一方、CPU101は、マスターファイルマッチング表3106の読み方3703が「1data」でない場合には(ステップ4702の結果が「No」)、すなわち、マスターファイルマッチング表3106の読み方3703が「sequence」である場合には、ステップ4704以降の処理を実行する。
CPU101は、マスターファイルから次に取得するデータの読み出し位置を特定するコードを生成する(ステップ4704)。具体的には、分割3706に登録されているフィールドのうち、内側のループ制御変数に対応するフィールドの値がループ制御変数の上限値804に達した場合に、分割ファイルの次のエントリーを読み出す際、マスターファイルの"次のエントリー"からデータを読み出すか、ループ制御変数の下限値803に対応するエントリーへ戻ってデータを読み出すかを決定するコードを生成する。なお、前述したように、分割ファイルが最内側ループ制御変数の上限値で分割されている場合には、分割ファイルの終わりが最内側ループ制御変数の上限値に対応しているため、次に取得するデータの読み出し位置の特定(ステップ4704)は不要となる。
最後に、CPU101は、ステップ4704の処理で特定されたデータの読み出し位置から再びマスターファイルを順次に読み出すコードを生成する(ステップ4705)。
続いて、分散バッチ処理コード生成処理に含まれる集約コード生成処理(図45のステップ4509)について説明する。集約コード生成処理では、ループ処理の1イタレーションの結果を集約する必要がある場合に集約用のコードを生成する。
図48は、本発明の第3の実施の形態の集約コード生成処理の手順を示すフローチャートである。
CPU101は、集約コード生成処理を開始すると、まず、ファイルをオープンするコードが未生成であるか否かを判定する(ステップ4801)。ファイルをオープンするコードが未生成でない場合には(ステップ4801の結果が「No」)、ステップ4804の処理を実行する。
CPU101は、ファイルをオープンするコードが未生成である場合には(ステップ4801の結果が「Yes」)、結果変数登録表3102の元ファイルID3305を入力ファイルとしてオープンするコードを生成する(ステップ4802)。前述のように、結果変数登録表3102の元ファイルIDは、1イタレーションの結果が格納されるファイルである。さらに、CPU101は、結果変数登録表3102のファイルID3306を出力ファイルとしてオープンするコードを生成する(ステップ4803)。
続いて、CPU101は、結果変数登録表3102の添字式3302が「FALSE」であるか否かを判定する(ステップ4804)。結果変数登録表3102の添字式3302が「FALSE」である場合には(ステップ4804の結果が「Yes」)、結果変数登録表3102の元ファイルID3305に登録されたファイルの「変数名」のフィールドの値をすべて集約するコードを生成する(ステップ4807)。さらに、CPU101は、変数名及び集約結果の2つの値を出力ファイルに追記するコードを生成する(ステップ4808)。
一方、CPU101は、結果変数登録表3102の添字式3302が「FALSE」でない場合には(ステップ4804の結果が「No」)、結果変数登録表3102の集約フィールド3307の値をキーとして、元ファイルID3305に登録されたファイルの「変数名」のフィールドの値を集約するコードを生成する(ステップ4805)。さらに、CPU101は、変数名、集約フィールドの値及び集約結果の3つの値を、出力ファイルに追記するコードを生成する(ステップ4806)。
なお、ステップ4806及びステップ4808で値が追記される出力ファイルは、ステップ4803の処理でオープンするコードが生成された出力ファイルと同じである。
ここで、図7に示したループ処理700に対し、図45に示した分散バッチ処理コード生成処理を適用する手順について説明する。
CPU101は、分散バッチ処理コード生成処理を開始すると、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4501の結果が「Yes」)、先頭の「a[I1,I2,I3]」のエントリーを取得する(ステップ4502)。
CPU101は、ファイル対応表3104のソート3506が「FALSE」であるため、ステップ4501の処理に戻る(ステップ4503)。
CPU101は、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4501の結果が「Yes」)、次の「a[I2,I3,I1]」のエントリーを取得する(ステップ4502)。
CPU101は、ファイル対応表3104のソート3506が「TRUE」であるため、ソート表3105のファイルID3601が「ID2」のソートキー「3」「1」「2」を設定し、元ファイルID3504「ID1」をファイルID3505「ID2」に変換するソート指示を出力する(ステップ4504)。そして、ステップ4501の処理に戻る。
CPU101は、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4501の結果が「Yes」)、次の「b[I1,I2]」のエントリーを取得する(ステップ4502)。
CPU101は、ファイル対応表3104のソート3506が「FALSE」であるため、ステップ4501の処理に戻る(ステップ4503)。
CPU101は、ファイル対応表3104に未処理のエントリーが存在しないため(ステップ4501の結果が「No」)、ステップ4505の処理を実行する。なお、ステップ4505の演算コード生成処理は、図46を参照しながら説明する。
CPU101は、演算コード生成処理を開始すると、まず、結果変数登録表3102に変数名3301「sum」が登録されているため、変数「sum」を定義するコードを生成する(ステップ4601)。
続いて、CPU101は、ファイル対応表3104に3種類の配列参照形式3502「a[I1,I2,I3]」、「a[I2,I3,I1]」、「b[I1,I2]」が登録されているため、これらに対応するオペランド設定用変数(オペランド変数)を定義するコードを生成する(ステップ4602)。
CPU101は、ファイル対応表3104のファイルID3601に登録されている、「ID1」、「ID2」、「ID3」を入力ファイルとしてオープンするコードを生成する(ステップ4603)。
CPU101は、結果変数登録表3102の元ファイルID3305に登録されている「ID1」を出力ファイルとしてオープンするコードを生成する(ステップ4604)。
続いて、CPU101は、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4605の結果が「Yes」)、先頭の「a[I1,I2,I3]」のエントリーを取得する(ステップ4606)。
CPU101は、ファイル対応表3104の配置3507が「分割」のため、ステップ4605の処理に戻る(ステップ4607)。
CPU101は、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4605の結果が「Yes」)、次の「a[I2,I3,I1]」のエントリーを取得する(ステップ4606)。
CPU101は、ファイル対応表3104の配置3507が「分割」のため、ステップ4605の処理に戻る(ステップ4607)。
CPU101は、ファイル対応表3104に未処理のエントリーが存在するため(ステップ4605の結果が「Yes」)、次の「b[I1,I2]」のエントリーを取得する(ステップ4606)。
CPU101は、ファイル対応表3104の配置3507が「マスター」のため、マスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成する処理を実行する(ステップ4608)。
マスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成する処理4608については、図47を参照しながら説明する。
CPU101は、マスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成する処理4608を開始すると、まず、マスターファイルマッチング表3106の対応フィールド3705に、分割3706「ID1[1][2]」及びマスター3707「ID3[1][2]」が登録されているため、分割ファイル「ID1」の先頭の第1フィールド、第2フィールドと等しい「ID3」の第1フィールド、第2フィールドの位置をマスターファイル「ID3」の読み出し開始位置とするコードを生成する(ステップ4701)。
CPU101は、マスターファイルマッチング表3106の読み方3703に「1data」が登録されているため(ステップ4702の結果が「Yes」)、ステップ4703の処理を実行する。
CPU101は、マスターファイルマッチング表3106の分割3706「ID1[1][2]」について、配列添字_制御変数対応表3103を参照すると、ID1と「a[I1,I2,I3]」が対応していることから、フィールド[1]及び[2]は制御変数「I1」3402「I2」3403にそれぞれ対応していると判断することができる。この場合、内側のループに対応する制御変数は「I2」となる。そこで、制御変数「I2」に対応するID1のフィールド[2]の値が変化する時に、マスターファイル「ID3」の次のエントリーに対応するデータを読む出すコードを生成する(ステップ4703)。
以上、演算コード生成処理4505に含まれるマスターファイルマッチング表3106の読み方3703に基づいて、ファイルからデータを取得するコードを生成する処理について説明した。以下、図46の演算コード生成処理4505のフローチャートの説明を再開する。
CPU101は、ファイルに未処理のエントリーが存在しないため(ステップ4605の結果が「No」)、各ファイル名「ID1」、「ID2」、「ID3」の「データ」フィールドのデータをオペランド変数に設定するコードを生成する(ステップ4609)。
CPU101は、右辺コード「a[I1,I2,I3]+a[I2,I3,I1]*b[I1,I2]」のオペランド部をステップ4602の処理で定義されたオペランド変数に置換し、ステップ4601の処理で定義された結果変数「sum」に代入するコードを生成する(ステップ4610)。
CPU101は、出力ファイル「ID1」の「変数名」フィールドに結果変数(ループ処理における1イタレーションの結果)を出力するコードを生成する(ステップ4611)。
以上、分散バッチ処理コード生成処理に含まれる演算コード生成処理4505について説明した。以下、図45に示した分散バッチ処理コード生成処理のフローチャートの説明を再開する。
CPU101は、結果変数登録表3102に未処理のエントリーが存在するため(ステップ4506の結果が「Yes」)、変数名3301が「sum」のエントリーを取得する(ステップ4507)。
CPU101は、結果変数登録表3102の集約3303が「TRUE」であるため、集約コード生成処理を実行する(ステップ4509)。集約コード生成処理4509については、図48を参照しながら説明する。
CPU101は、集約コード生成処理4509を開始すると、まず、結果変数登録表3102の元ファイルIDに登録されている「ID1」をオープンするコードが未生成であるか否かを判定する(ステップ4801)。
CPU101は、結果変数登録表3102の元ファイルIDに登録されている「ID1」をオープンするコードが未生成であるため(ステップ4801の結果が「Yes」)、「ID1」を入力ファイルとしてオープンするコードを生成する(ステップ4802)。
さらに、CPU101は、結果変数登録表3102のファイルID「ID4」を出力ファイルとしてオープンするコードを生成する(ステップ4803)。
CPU101は、結果変数登録表3102の添字式3302に「I1」が登録されているため(ステップ4804の結果が「No」)、結果変数登録表3102の集約フィールド3307に登録されているフィールド「1」をキーとして、入力ファイル「ID1」の「変数名」フィールドの値を集約するコードを生成する(ステップ4805)。
CPU101は、(sum,ID1の1番目のフィールドの値,集約結果)を出力ファイル「ID4」に追記するコードを生成する(ステップ4806)。つまり、出力ファイル「ID4」には、(sum,0,[1]の値が0の場合の集約結果)、(sum,1,[1]の値が1の場合の集約結果)、(sum,2,[1]の値が2の場合の集約結果)、...のように演算結果が出力される。
以上のように、本発明の第3の実施の形態によれば、所定の条件を満たすループ処理を実行するプログラムを、分散バッチ処理に適したプログラムに変換することができ、第1の実施の形態と同様に、システムの開発効率を向上させることができる。
また、本発明の第3の実施の形態によれば、分割ファイルごとにマスターファイルの読むべき範囲が特定できるため、分散されて実行される各処理を効率化することが可能となり、さらなる性能の向上を期待することができる。
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
本発明は、所定の構造のループ処理を有するプログラムを含むアプリケーションに利用可能である。
Claims (31)
- 入力データを処理して結果を出力する第1プログラムに基づいて、並列処理が可能な第2プログラムを生成するプログラム生成装置において、前記第2プログラムを生成する並列処理プログラム生成方法であって、
前記プログラム生成装置は、前記並列処理プログラム生成方法を実行するプロセッサ、及び前記並列処理プログラム生成方法を実行するために必要な情報が記憶される記憶部を備え、
前記並列処理プログラム生成方法は、
前記プロセッサが、前記第1プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、
前記プロセッサが、前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記プロセッサが、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、
前記プロセッサが、前記収集されたデータを前記キーに基づいて集約する処理を含む第4プログラムを生成し、
前記プロセッサが、前記第1プログラムに含まれる前記ループ処理以外の処理と、前記第4プログラムを実行させるための処理と、を含む第5プログラムを生成し、
前記プロセッサが、前記第4プログラム及び前記第5プログラムを含むプログラムを、前記第2プログラムとして出力することを特徴とする並列処理プログラム生成方法。 - 請求項1に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータを収集する処理は、
前記ループ変数に基づいて前記処理変数に対応するキーを生成するステップと、
前記処理変数に代入されたデータを前記生成されたキーに対応させて出力する処理を含む第3プログラムを生成するステップとを含み、
前記第4プログラムは、前記第3プログラムによって出力されたデータを前記生成されたキーに基づいて集約する処理を含み、
前記第2プログラムは、前記第3プログラムをさらに含むことを特徴とする並列処理プログラム生成方法。 - 請求項2に記載の並列処理プログラム生成方法であって、
前記ループ処理に複数のループ変数が含まれている場合には、前記プロセッサが、前記各ループ変数の組合せに対応するイタレーション情報を生成し、
前記キーは、前記イタレーション情報に基づいて生成されることを特徴とする並列処理プログラム生成方法。 - 請求項3に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の変数名と前記処理変数の配列の添字との対応を示すオペランド識別子を生成し、
前記第3プログラムによって出力されるデータは、当該データに対応するオペランド識別子とともに出力され、
前記第4プログラムは、前記オペランド識別子に基づいて、前記集約されたデータに対して前記所定の処理を実行する処理をさらに含むことを特徴とする並列処理プログラム生成方法。 - 請求項4に記載の並列処理プログラム生成方法であって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第3プログラムは、前記入力データを前記入力変数に格納する処理をさらに含み、
前記第4プログラムは、前記所定の処理の実行結果を前記結果変数に格納する処理をさらに含むことを特徴とする並列処理プログラム生成方法。 - 請求項5に記載の並列処理プログラム生成方法であって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記プロセッサが、前記所定の処理の実行結果が格納された結果変数を入力変数とする、第3プログラム及び第4プログラムをさらに生成し、
前記第5プログラムは、前記入力データを入力変数とする第3プログラム及び第4プログラムと、前記結果変数を入力変数とする第3プログラム及び第4プログラムとを含むことを特徴とする並列処理プログラム生成方法。 - 請求項1に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータを収集する処理は、前記処理変数に代入するデータが格納された順序が前記所定の処理を実行する順序と異なる場合には、前記ループ変数に基づいて、前記処理変数に代入するデータを前記所定の処理を実行する順序で並び替えるステップを含み、
前記第4プログラムは、前記処理変数に代入するデータを前記並び替えられた順序で集約する処理を含むことを特徴とする並列処理プログラム生成方法。 - 請求項7に記載の並列処理プログラム生成方法であって、
前記ループ処理に複数のループ変数が含まれている場合には、前記プロセッサが、配列添字と制御変数との対応情報を生成し、
前記処理変数に代入するデータは、前記配列添字と制御変数との対応情報に基づいて並び替えられることを特徴とする並列処理プログラム生成方法。 - 請求項8に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の変数名と前記処理変数の配列の添字との対応を示すデータ格納ファイル情報を生成し、
前記第4プログラムは、前記データ格納ファイル情報に基づいて、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成方法。 - 請求項9に記載の並列処理プログラム生成方法であって、
前記処理変数に代入するデータは、前記配列変数ごとのファイルに格納され、
前記ファイルは、前記処理変数が複数回参照される場合に、当該複数回参照される処理変数の配列の添字に対応するデータが格納されたマスターファイルを含み、
前記並列処理プログラム生成方法は、
前記マスターファイルに格納されたデータの格納位置と、前記マスターファイル以外のファイルに格納されたデータの格納位置との対応を含むマッチング情報を生成し、
前記第4プログラムは、前記マッチング情報に基づいて、前記処理変数に代入するデータを前記ファイルから取得し、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成方法。 - 請求項10に記載の並列処理プログラム生成方法であって、
前記マッチング情報は、前記マスターファイルに格納されたデータを、複数回連続して利用するか、順次新たにデータを読み出して利用するかを示す情報を含むことを特徴とする並列処理プログラム生成方法。 - 請求項11に記載の並列処理プログラム生成方法であって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第4プログラムは、前記入力データを前記入力変数に格納する処理と、前記所定の処理の実行結果を前記結果変数に格納する処理と、をさらに含むことを特徴とする並列処理プログラム生成方法。 - 請求項12に記載の並列処理プログラム生成方法であって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記プロセッサが、前記所定の処理の実行結果が格納された結果変数を入力変数とする第4プログラムをさらに生成し、
前記第5プログラムは、前記入力データを入力変数とする第4プログラムと、前記結果変数を入力変数とする第4プログラムとを含むことを特徴とする並列処理プログラム生成方法。 - 請求項13に記載の並列処理プログラム生成方法であって、
前記プロセッサが、前記処理変数の配列添字と前記ループ変数との対応情報を生成し、前記対応情報に基づいて、前記結果変数に格納されたデータを格納する領域を特定し、
前記結果変数を入力変数とする前記第4プログラムは、前記特定された領域に格納された結果変数に格納されたデータを処理することによって前記ループ処理の結果を導出する処理をさらに含むことを特徴とする並列処理プログラム生成方法。 - 請求項1に記載の並列処理プログラム生成方法であって、
前記ループ処理は、密多重ループである場合に前記第1プログラムから抽出されることを特徴とする並列処理プログラム生成方法。 - 入力データを処理して結果を出力する第1プログラムに基づいて、並列処理が可能な第2プログラムを生成するプログラム生成装置に実行させるプログラムであって、
前記第1プログラムから、所定の処理が繰り返し実行されるループ処理を抽出する手順と、
前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出する手順と、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集する手順と、
前記収集されたデータを前記キーに基づいて集約する処理を含む第4プログラムを生成する手順と、
前記第1プログラムに含まれる前記ループ処理以外の処理と、前記第4プログラムを実行させるための処理と、を含む第5プログラムを生成する手順と、
前記第4プログラム及び前記第5プログラムを含むプログラムを、前記第2プログラムとして出力する手順と、を含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項16に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータを収集する手順は、
前記ループ変数に基づいて前記処理変数に対応するキーを生成する手順と、
前記処理変数に代入されたデータを前記生成されたキーに対応させて出力する処理を含む第3プログラムを生成する手順とを含み、
前記第4プログラムは、前記第3プログラムによって出力されたデータを前記生成されたキーに基づいて集約する処理を含み、
前記第2プログラムは、前記第3プログラムをさらに含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項17に記載の並列処理プログラム生成プログラムであって、
前記ループ処理に複数のループ変数が含まれている場合には、前記各ループ変数の組合せに対応するイタレーション情報を生成する手順をさらに含み、
前記キーは、前記イタレーション情報に基づいて生成されることを特徴とする並列処理プログラム生成プログラム。 - 請求項18に記載の並列処理プログラム生成プログラムであって、
前記処理変数の変数名と前記処理変数の配列の添字との対応を示すオペランド識別子を生成する手順をさらに含み、
前記第3プログラムによって出力されるデータは、当該データに対応するオペランド識別子とともに出力され、
前記第4プログラムは、前記オペランド識別子に基づいて、前記集約されたデータに対して前記所定の処理を実行する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項19に記載の並列処理プログラム生成プログラムであって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第3プログラムは、前記入力データを前記入力変数に格納する処理をさらに含み、
前記第4プログラムは、前記所定の処理の実行結果を前記結果変数に格納する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項20に記載の並列処理プログラム生成プログラムであって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記所定の処理の実行結果が格納された結果変数を入力変数とする、第3プログラム及び第4プログラムをさらに生成する手順をさらに含み、
前記第5プログラムは、前記入力データを入力変数とする第3プログラム及び第4プログラムと、前記結果変数を入力変数とする第3プログラム及び第4プログラムとを含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項16に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータを収集する手順は、前記処理変数に代入するデータが格納された順序が前記所定の処理を実行する順序と異なる場合には、前記ループ変数に基づいて、前記処理変数に代入するデータを前記所定の処理を実行する順序で並び替える手順を含み、
前記第4プログラムは、前記処理変数に代入するデータを前記並び替えられた順序で集約する処理を含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項22に記載の並列処理プログラム生成プログラムであって、
前記ループ処理に複数のループ変数が含まれている場合には、配列添字と制御変数との対応情報を生成する手順をさらに含み、
前記処理変数に代入するデータは、前記配列添字と制御変数との対応情報に基づいて並び替えられることを特徴とする並列処理プログラム生成プログラム。 - 請求項23に記載の並列処理プログラム生成プログラムであって、
前記処理変数の変数名と前記処理変数の配列の添字との対応を示すデータ格納ファイル情報を生成する手順をさらに含み、
前記第4プログラムは、前記データ格納ファイル情報に基づいて、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項24に記載の並列処理プログラム生成プログラムであって、
前記処理変数に代入するデータは、前記配列変数ごとのファイルに格納され、
前記ファイルは、前記処理変数が複数回参照される場合に、当該複数回参照される処理変数の配列の添字に対応するデータが格納されたマスターファイルを含み、
前記並列処理プログラム生成プログラムは、
前記マスターファイルに格納されたデータの格納位置と、前記マスターファイル以外のファイルに格納されたデータの格納位置との対応を含むマッチング情報を生成する手順をさらに含み、
前記第4プログラムは、前記マッチング情報に基づいて、前記処理変数に代入するデータを前記ファイルから取得し、前記所定の処理を実行する処理を含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項25に記載の並列処理プログラム生成プログラムであって、
前記マッチング情報は、前記マスターファイルに格納されたデータを、複数回連続して利用するか、順次新たにデータを読み出して利用するかを示す情報を含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項26に記載の並列処理プログラム生成プログラムであって、
前記処理変数は、前記入力データを格納する入力変数と、前記入力変数を処理した結果を格納する結果変数と、を含み、
前記第4プログラムは、前記入力データを前記入力変数に格納する処理と、前記所定の処理の実行結果を前記結果変数に格納する処理と、をさらに含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項27に記載の並列処理プログラム生成プログラムであって、
前記結果変数に格納されたデータを処理することによって前記ループ処理の結果が導出される場合には、前記所定の処理の実行結果が格納された結果変数を入力変数とする第4プログラムをさらに生成する手順を、さらに含み、
前記第5プログラムは、前記入力データを入力変数とする第4プログラムと、前記結果変数を入力変数とする第4プログラムとを含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項28に記載の並列処理プログラム生成プログラムであって、
前記処理変数の配列添字と前記ループ変数との対応情報を生成し、前記対応情報に基づいて、前記結果変数に格納されたデータを格納する領域を特定する手順をさらに含み、
前記結果変数を入力変数とする前記第4プログラムは、前記特定された領域に格納された結果変数に格納されたデータを処理することによって前記ループ処理の結果を導出する処理をさらに含むことを特徴とする並列処理プログラム生成プログラム。 - 請求項16に記載の並列処理プログラム生成プログラムであって、
前記ループ処理を抽出する手順は、前記ループ処理が密多重ループである場合に前記第1プログラムから当該ループ処理を抽出することを特徴とする並列処理プログラム生成プログラム。 - プロセッサ及び記憶部を備え、入力データを処理して結果を出力する第1プログラムに基づいて、並列処理が可能な第2プログラムを生成するプログラム生成装置であって、
前記プロセッサは、
前記第1プログラムから、所定の処理が繰り返し実行されるループ処理を抽出し、
前記抽出されたループ処理から、前記所定の処理の実行回数に対応するループ変数及び前記所定の処理で使用される処理変数を抽出し、
前記処理変数が前記ループ変数によって特定される配列変数である場合には、前記ループ変数に対応するキーに基づいて、前記処理変数に代入するデータを収集し、
前記収集されたデータを前記キーに基づいて集約する処理を含む第4プログラムを生成し、
前記第1プログラムに含まれる前記ループ処理以外の処理と、前記第4プログラムを実行させるための処理と、を含む第5プログラムを生成し、
前記第4プログラム及び前記第5プログラムを含むプログラムを、前記第2プログラムとして出力することを特徴とするプログラム生成装置。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010010218 | 2010-01-20 | ||
JP2010010218 | 2010-01-20 | ||
PCT/JP2011/050771 WO2011090032A1 (ja) | 2010-01-20 | 2011-01-18 | 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPWO2011090032A1 true JPWO2011090032A1 (ja) | 2013-05-23 |
Family
ID=44306834
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011550911A Pending JPWO2011090032A1 (ja) | 2010-01-20 | 2011-01-18 | 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 |
Country Status (2)
Country | Link |
---|---|
JP (1) | JPWO2011090032A1 (ja) |
WO (1) | WO2011090032A1 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8612368B2 (en) * | 2011-03-01 | 2013-12-17 | International Business Machines Corporation | Systems and methods for processing machine learning algorithms in a MapReduce environment |
US10198185B2 (en) * | 2014-12-31 | 2019-02-05 | Samsung Electronics Co., Ltd. | Computing system with processing and method of operation thereof |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001147819A (ja) * | 1999-11-19 | 2001-05-29 | Fujitsu Ltd | 最適化装置および記録媒体 |
JP2003256124A (ja) * | 2002-02-26 | 2003-09-10 | Ricoh Co Ltd | 座標入力装置 |
JP2003256214A (ja) * | 2002-02-27 | 2003-09-10 | Hitachi Ltd | 配列拡張によるループ変換方法 |
-
2011
- 2011-01-18 WO PCT/JP2011/050771 patent/WO2011090032A1/ja active Application Filing
- 2011-01-18 JP JP2011550911A patent/JPWO2011090032A1/ja active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001147819A (ja) * | 1999-11-19 | 2001-05-29 | Fujitsu Ltd | 最適化装置および記録媒体 |
JP2003256124A (ja) * | 2002-02-26 | 2003-09-10 | Ricoh Co Ltd | 座標入力装置 |
JP2003256214A (ja) * | 2002-02-27 | 2003-09-10 | Hitachi Ltd | 配列拡張によるループ変換方法 |
Non-Patent Citations (4)
Title |
---|
CSND200900248006; 藤田昭人: 'Hadoopで学習するMapReduceプログラミング:Hadoop/MapReduce' UNIX magazine Vol.24,No.2(通巻246号), 20090401, pp.64〜65, 株式会社アスキー・メディアワークス * |
CSNG200900413009; 小出誠二、武田英明: '解説 人工知能用言語Lispの今と将来' 人工知能学会誌 第24巻,第5号(通巻137号), 20090901, pp.687〜688, 社団法人人工知能学会 * |
JPN6011012029; 藤田昭人: 'Hadoopで学習するMapReduceプログラミング:Hadoop/MapReduce' UNIX magazine Vol.24,No.2(通巻246号), 20090401, pp.64〜65, 株式会社アスキー・メディアワークス * |
JPN6013020383; 小出誠二、武田英明: '解説 人工知能用言語Lispの今と将来' 人工知能学会誌 第24巻,第5号(通巻137号), 20090901, pp.687〜688, 社団法人人工知能学会 * |
Also Published As
Publication number | Publication date |
---|---|
WO2011090032A1 (ja) | 2011-07-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6939132B2 (ja) | アプリケーション・プロファイリング・ジョブ管理システム、プログラム、及び方法 | |
US8527971B2 (en) | Parallel program generation method | |
AU2013290313B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
JP2011081539A (ja) | 並列化処理方法、システム、及びプログラム | |
JP4962564B2 (ja) | 並列化プログラム生成方法、並列化プログラム生成装置、及び並列化プログラム生成プログラム | |
JP6584672B2 (ja) | サブグラフインターフェースの生成 | |
JP2003323463A5 (ja) | ||
JP2010267264A (ja) | コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法、その方法を実行するプログラムを含むコンピュータ可読の記憶媒体、およびコンパイラ | |
CN112346730B (zh) | 一种中间表示的生成方法、计算机设备及存储介质 | |
CN108874395A (zh) | 一种组件化流处理过程中的硬编译方法及装置 | |
WO2011090032A1 (ja) | 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 | |
RU2681408C2 (ru) | Способ и система графо-ориентированного создания масштабируемых и сопровождаемых программных реализаций сложных вычислительных методов | |
Ejjaaouani et al. | , a Programming Model to Decouple Performance from Algorithm in HPC Codes | |
JP2003067186A (ja) | データフロー自動生成方法 | |
WO2008041442A1 (fr) | Procédé de création de programme par parallélisation, dispositif de création de programme par parallélisation, et programme de création de programme par parallélisation | |
RU2691860C1 (ru) | Способ распараллеливания программ в среде логического программирования в вычислительной системе | |
Dieterle et al. | Iterating Skeletons: Structured Parallelism by Composition | |
Chang et al. | Support NNEF execution model for NNAPI | |
Jacob et al. | Domain-specific languages for developing and deploying signature discovery workflows | |
JP2017111749A (ja) | 計算コード生成装置、方法及びプログラム | |
WO2012137390A1 (ja) | 並列化設計支援システム、プログラム、および方法 | |
Ramamoorthy et al. | Compilation techniques for recognition of parallel processable tasks in arithmetic expressions | |
CN115309407B (zh) | 一种可实现算力抽象的方法和系统 | |
RU2685018C1 (ru) | Способ распараллеливания программ в вычислительной системе | |
EP4242837A1 (en) | Data processing apparatus and method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20130222 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130507 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20130910 |