"逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイル装置であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析部と、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定部と、前記ループ並列化判定部が並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加部とを含むことを特徴とするコンパイル装置。前記ループ並列化判定部は、前記ループ運搬依存変数を含むループに含まれる変数について、前記ループ運搬依存変数でない変数を、ループを逐次実行することなく全てのイタレーションにおける値を算出することができる算出可能変数として判別し、前記ループ運搬依存変数の値を算出するために必要な変数が全て算出可能変数である場合に前記ループ運搬依存変数を算出可能変数として判別する処理を、算出可能変数であると判別される変数が増加するたびに前記ループ運搬依存変数を含むループに含まれ算出可能変数と判別されないループ運搬依存変数に対して繰り返し、前記ループ運搬依存変数を含むループに含まれる変数が全て算出可能変数であれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定することを特徴とする請求項1に記載のコンパイル装置。前記ループ並列化判定部は、前記ループ運搬依存変数を含むループに含まれる変数であって、ループ運搬依存変数ではない前記算出可能変数のリストを作成し、前記ループ運搬依存変数を含むループに含まれるループ運搬依存変数について、前記ループ運搬存変数が左辺値となる式において右辺値の変数が全て前記リストに含まれていれば前記左辺値のループ運搬依存変数を前記算出可能変数として前記リストに追加することを、前記リストに追加する変数がなくなるまで繰り返し行い、前記ループ運搬依存変数を含むループに含まれる変数が全て前記リストに含まれていれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定することを特徴とする請求項2に記載のコンパイル装置。前記初期値算出コード追加部は、前記ループにおいて、前記サブループの最初のイタレーションとなるイタレーションを特定し、前記ループ運搬依存変数を前記サブループごとに異なる局所変数に置き換え、前記特定したイタレーションにおける前記ループ運搬依存変数の値をループ運搬依存変数でない変数を用いて算出して前記局所変数に代入する初期値算出コードを生成し、前記生成した初期値算出コードを前記サブループの前に追加することを特徴とする請求項2に記載のコンパイル装置。前記初期値算出コード追加部は、ループ運搬依存変数のリストである初期値追加リストを作成し、前記初期値追加リストの変数について、前記サブループの最初のイタレーションで参照される値を左辺値とする導出式を前記ループから生成し初期値算出コードとして前記サブループの前に追加し、直前に追加した初期値算出コードについて、右辺値に含まれるループ運搬依存変数のリストである第2追加リストを生成し、前記第2追加リストの変数について、前記変数を左辺値とする導出式を前記ループから生成し初期値算出コードとして既に追加されている初期値算出コードの前に追加する処理を前記第2追加リストに変数があれば繰り返し行うことを特徴とする請求項4に記載のコンパイル装置。逐次型のソースプログラムから並列型の目的プログラムを生成するプログラムであって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とするコンパイルプログラム。逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイルプログラムが記録されているコンピュータ読み取り可能な記録媒体であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを実行させるためのプログラムが記録されているコンピュータ読み取り可能な記憶媒体。逐次型のソースプログラムから並列型の目的プログラムを生成するループ並列化方法であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とするループ並列化方法。しかしながら、特許文献1のコンパイル装置では、ループ処理にループ運搬依存が存在すると判定されるとDOALL型変換による並列化を図ることができず、DOACROSS型変換が行えなければ並列化を図ることができない。また、DOACROSS型変換により並列化を行う場合には、ループ運搬依存が存在するイタレーションについて同期命令を用いて各イタレーションの実行順序を維持するので、ループ運搬依存の関係にある依存元イタレーションと依存先イタレーションとを並列に実行することができない。一方、特許文献2のコンパイル装置は、値が参照されるイタレーションの後に実行される別のイタレーションで値が代入される参照先行依存が存在するループにおいて、予め参照先行依存変数の値を一時変数の値として複製しておき、値が参照されるイタレーションにおける参照先行依存変数を当該一時変数に置き換えることで、値が代入されるイタレーションによって参照先行依存変数の値が上書きされても、値が参照されるイタレーションが一時変数からループ実行前の参照先行依存変数の値を得られるようにしている。しかしながら、ループ運搬依存が存在するループにおいて、値が参照されるイタレーションが必要とするループ運搬依存変数の値は、値が代入されるイタレーションが当該ループ運搬依存変数に格納する値であってループが開始される前のループ運搬依存変数の値ではないため、特許文献2の技術ではループ運搬依存を解決することができない。本発明は、前記従来の課題を解決するもので、ループ運搬依存が存在するループについて並列化を図ることができるコンパイル装置、コンパイルプログラム及びループ並列化方法を提供することを目的とする。前記従来の課題を解決するために、本発明のコンパイル装置は、逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイル装置であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析部と、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定部と、前記ループ並列化判定部が並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加部とを含むことを特徴とする。また、本発明のコンパイルプログラムは、逐次型のソースプログラムから並列型の目的プログラムを生成するプログラムであって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とする。また、本発明の記憶媒体は、逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイルプログラムが記録されているコンピュータ読み取り可能な記録媒体であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを実行させるためのプログラムが記録されていることを特徴とする。また、本発明のループ並列化方法は、逐次型のソースプログラムから並列型の目的プログラムを生成するループ並列化方法であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とする。これら上記の構成によれば、ループを最初から逐次処理しなくても全てのイタレーションにおけるループ運搬依存変数の値を算出できる場合には、ループを複数のサブループに分割して、サブループの最初のイタレーションにおけるループ運搬依存変数の値を算出する初期値算出コードを追加することにより、演算結果に影響を与えることなくループを分割して並列に実行することができる。以下、本発明の1実施の形態について、図面を参照しながら説明する。<構成>図1は本発明の実施の形態におけるループ並列化方法を実行するコンパイル装置200を示す構成図である。コンパイル装置200は、C言語などの逐次型のソースプログラム100を入力し、OpenMPC言語などの並列型の目的プログラム300を出力とする。コンパイル装置200は、データ依存解析部210、ループ並列化変換部220を備える。データ依存解析部210は、ソースプログラム100に含まれるループについて、ループ運搬依存変数が存在するか否かを解析する。ループ運搬依存変数は前述の通り、値を代入するイタレーションの後に実行される別のイタレーションにおいて代入された値が参照される変数である。ここで、ループ運搬依存変数を含むループにおける1つのイタレーションに着目すると、ループ運搬依存変数は同一のイタレーションの中で値が参照された後に値の代入がなされる変数であるとも言えるので、このような変数であるか否かを判定することで、ループ運搬依存変数であるか否かを解析できる。これは、代入された値は次のイタレーションにおける値の代入まで更新されることがなく、その値は当該イタレーションでなく次のイタレーションにおいて参照されるからである。ループ並列化変換部220は、データ依存解析部210からループごとにループ運搬依存変数を含むか否かの解析結果を受け取り、ソースプログラム100に含まれるすべてのループに対してループがイタレーション単位で並列化できるか判定し、並列化可能と判断されたループについて、並列化可能な方法によりループの変換を行い、目的プログラム300を生成する。このループ並列化変換部220は、DOALL型変換部221、初期値算出コード追加部222とDOACROSS型変換部223を備え、これら各部がループの変換を行う。DOALL型変換部221は、特許文献2のDOALL型変換部821と同じ機能を有するもので、ループ並列化変換部220がDOALL型変換による並列化が可能であると判定したループを、従来の並列化方法によりループの並列化を行う。初期値算出コード追加部222は、ループ並列化変換部220が初期値算出コード追加型変換による並列化が可能であると判定したループを、初期値算出コード追加型変換によりループの並列化を行う。初期値算出コード追加型変換の詳細は後述する。DOACROSS型変換部223はDOACROSS型変換部822と同じ機能を有するもので、ループ並列化変換部220がDOACROSS型変換による並列化が可能であると判定したループのパイプライン化を行う。<動作>以上の構成をもとに、本発明の実施の形態に係るコンパイル装置200の動作について説明する。1ループ並列化変換の概要図2は本発明の実施の形態におけるループ並列化変換部220のフローを示す図である。図2に示すフローを参照してループ並列化変換部220における処理動作を説明する。ループ並列化変換判定部220は、次のようにソースプログラム100内のすべてのループに対してDOALL型変換が可能なループであるか否か、初期値算出コード追加型変換が可能であるか否か、DOACROSS型変換が可能なループであるか否かのループ並列化判定を行う。ループ並列化変換部220は、データ依存解析部210よりループごとにループ運搬依存変数を含むか否かの解析結果を受け取り、DOALL型変換が適用可能かを判定しS10、DOALL型変換が適用可能な場合、DOALL型変換部221がDOALL型変換を実行するS11。なお、S10におけるループ並列化変換部220の動作はループ並列化変換部820と、S11におけるDOALL型変換部221の動作はDOALL型変換部821と同様である。DOALL型変換が適用不可能であると判定された場合S10でNO、ループ並列化変換部220は初期値算出コード追加型変換が適用可能かを判定しS20、初期値算出コード追加型変換が適用可能な場合、初期値算出コード追加部222で初期値算出コード追加型変換を実行するS21。ここで、初期値算出コード追加型変換が可能なループとはループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができるループを指す。初期値算出コード追加型変換の可否判断S20および変換S21についての詳細は後述する。初期値算出コード追加型変換が適用不可能であると判定された場合S20でNO、ループ並列化変換部220はDOACROSS型変換が適用可能かを判定しS30、DOACROSS型変換が適用可能な場合、DOACROSS型変換部223でDOACROSS型変換を実行するS31。なお、S30におけるループ並列化変換部220の動作はループ並列化変換部820と、S31におけるDOACROSS型変換部223の動作はDOACROSS型変換部822と同様である。S30において、DOACROSS型変換が適用不可能であると判定された場合、並列化を行わず、S10でソースプログラム100内の次のループを処理する。なお、並列化されないループは、逐次実行されることになる。2ループ並列化判定図3は本発明の実施の形態におけるステップS20におけるループ並列化変換部220のフローを示す図である。図3に示すフローを参照してS20における初期値算出コード追加型変換の適用の判定の処理動作を説明する。ループ並列化変換部220は、データ依存解析部210からループ運搬依存が存在するか否かの解析結果を受け取って、ループに含まれる変数のうち、ループ運搬依存変数でない変数のリストを作成するS110。これらの変数はループ運搬依存変数ではないためループ内の各イタレーションの実行結果に依存せず、ループを逐次実行しなくても、各イタレーションにおける値を算出することが可能である。以下、このような全てのイタレーションにおける値が算出できる変数を算出可能変数と呼び、このリストは算出可能変数のリストとなる。ループ並列化変換部220は、左辺値がリストにない変数を持つ式のうち、右辺値に存在する変数がすべてリストに存在する式の左辺値をリストに追加するS120。追加されるループ運搬依存変数は、算出可能変数にのみ依存する変数であるので、算出可能変数のみを含む導出式から全てのイタレーションにおいて値が算出可能な算出可能変数に該当する。次に、ループ並列化変換部220は、S120においてリストに追加された変数が存在するか確認するS130。追加された変数が存在しない場合は、初期値算出コード追加型変換が適用できないと判定しS140、S140によりS20の判定がNOであることが確定する。詳細な説明については後述する。ループ並列化変換部220はこのループについて、DOACROSS型変換が適用可能か判定を行うS30。S120においてリストに追加された変数が存在する場合、ループ並列化変換部220はリスト内にループ内のループ運搬依存変数がすべて列挙されているかを確認するS150。すべてのループ運搬依存変数がリスト内に列挙されている場合は、ループ並列化判定部220は初期値算出コード追加型変換が適用できると判定しS150、S150によりS20の判定がYESであることが確定する。この場合、全てのループ運搬依存変数が算出可能変数であるので、ループを逐次実行しなくても全てのイタレーションにおいてループ運搬依存変数の値が算出可能である。これにより、初期値算出コード追加部222は当該ループの変換を行うS21。S150においてリスト内にループ運搬依存変数がすべて列挙されていない場合は、列挙されていないループ運搬依存変数がリストに新たに追加された算出可能変数に依存した変数であるか否かを判定するため、再度S120からフローを実行する。ループに算出可能変数に該当しないループ運搬依存変数が含まれている場合には、算出可能変数が全てリストに列挙された時点で、算出可能変数に該当しないループ運搬依存変数がリストに列挙されていないためS150でYESと判定された後、再度実施されるS120において、新たにリストに追加する算出可能変数が存在しないためS130においてNOと判定され、上述のように初期値算出コード追加型変換が適用できないと判定されることになる。3初期値算出コード追加型変換図4は本発明の実施の形態における初期値算出コード追加部222の動作S21のフローを示す図である。図4に示すフローを参照してS21における初期値算出コード追加型の変換の処理動作を説明する。初期値算出コード追加部222は、分割前のループの誘導変数の初期値を変数pに記録し、イタレーションが終了した後次のイタレーションが実行されるときのループ誘導変数の変化値を変数sに記録するS210。初期値算出コード追加部222は、M個のイタレーションからなるループをN個のプロセッサに割り当てる場合はM/N個のイタレーションごとに分割し、各プロセッサに割り当てる。分割したすべてのサブループに対して、ループ運搬依存変数はサブループごとに異なる変数を用いてプライベート化し、プロセッサ毎に個別の領域を使用する変数に変換して、目的プログラム300に出力するS220。初期値算出コード追加部222は、S220において分割を行ったすべてのサブループに対して、S231からステップS237を実行する。初期値算出コード追加部222は、分割したサブループの誘導変数の初期値を変数qに記録するS231。初期値算出コード追加部222は、データ依存解析部210からの情報を元に、ループ運搬依存変数のリストを作成するS232。このリストはサブループの最初のイタレーションにおける値が算出されていないループ運搬依存変数のリストとなる。初期値算出コード追加部222は、変数pを変数qと変数sの和と比較しS233、qがpsより小さい場合は、リストに存在する変数についてプライベート化される前の変数の値を代入する導出式を初期値算出コードとして目的プログラム300に追加するS237。これは、誘導変数qのイタレーションにおけるループ運搬依存変数が、分割前のループにおける誘導変数q-sのイタレーションではなくこのような誘導変数の値がp未満となるイタレーションは元のループに存在しない、誘導変数pのイタレーションの実行前の値、すなわちループ実行前の初期値に依存しているからである。なお、初期値算出コードを目的プログラム300に追加するときは、対応するサブループより前に実行されるように追加する。また、既に同じサブループに対応する初期値算出コードが目的プログラム300に追加されている場合は、既存の初期値算出コードより先に実行されるように追加する。ただし、プライベート化される前の変数に値を代入するコードより後に初期値算出コードが実行されるように目的プログラム300を構成する。S233においてqがps以上である場合は、初期値算出コード追加部222は変数qにq-sを代入し、リスト内の変数を左辺値とするループ内の式を初期値算出コードとして追加するS234。このとき、追加する式で使用されている誘導変数の値として変数qの値を用いる。初期値算出コード追加部222は、S234において追加された初期値算出コードの式の右辺値の変数のうち、ループ運搬依存変数のリストを作成し、S232あるいは前回のS235において作成したリストを新たに生成したリストで上書きするS235。初期値算出コード追加部222は、S235において作成したリストに変数が存在しているかを確認し、変数が存在する場合はS233から再度フローを実行する。リストに変数が存在しない場合は、当該サブループの変換を終了し、S220において作成された、初期値算出コードを追加していない他の分割サブループに対して、S231から初期値算出コード追加型変換を行うS236。<プログラムの変換例>図5は本発明の実施の形態における初期値算出コード追加型変換を行う前後のプログラム例を表す図である。図5に示すプログラムを参照して、本発明に係るコンパイル装置200の動作を説明する。プログラム400はソースプログラム100に記述されたループを示す例で、C言語で記述されたforループである。このforループは100個のイタレーションで構成され、変数aと変数bに関してループ運搬依存が存在し、変数bの導出式の右辺値となる変数xに対してはループ運搬依存が存在しない。本実施の形態においては、プログラム400に示すループを2つのプロセッサを使用して並列に実行するものとする。データ依存解析部210は、変数aと変数bがループ運搬依存変数であることを検出する。ループ並列化変換部220は、変数aと変数bがループ運搬依存変数であるため、プログラム400のループをDOALL型変換することができないと判定するS10。次に、データ並列化変換部220は、プログラム400のループについて、初期値算出コード追加型変換が適用できるか判定するS20。以下にその詳細を示す。1ループ並列化判定図6はプログラム400に対するループ並列化判定の実行例を表す図である。プログラム500はプログラム400におけるループ運搬依存を矢印で示したものである。ループ並列化変換部220は、プログラム400のループのうちループ運搬依存が存在しない変数xを要素としたリスト501を作成するS110。ループ並列化変換部220は、左辺値がリストにない変数を持つ式L403と式L404のうち、右辺値に存在する変数がすべてリスト501に存在する式L404の左辺値である変数bをリストに追加し、リスト511を作成するS120。ループ並列化変換部220は、変数bがS110でリスト511に追加されたためS130においてYESと判定し、S150を実行する。ループ並列化変換部220は、プログラム400において、リスト511に列挙されていないループ運搬依存変数が存在しないか判定するS150。プログラム510に示されるように、プログラム400において式L403から式L402に対して変数aによるループ運搬依存が存在するため変数aがループ運搬依存変数、ループ並列化変換部220は再度S120を実行する。なお、リストに追加された変数によるループ運搬依存は破線の矢印で示す。ループ並列化変換部220は、左辺値がリストにない変数を持つ式L403の右辺値に存在する変数がすべてリスト501に存在するので、式L403の左辺値である変数aをリストに追加し、リスト521を作成するS120。ループ並列化変換部220は、変数aがS120でリスト521に追加されたためS130においてYESと判定し、S150を実行する。ループ並列化変換部220は、S150でプログラム400においてリスト521に存在しないループ運搬依存変数が存在しないため、S160において初期値算出コード追加型変換が適応可能であると判定される。以上の動作により、プログラム400のループは初期値算出コード追加型変換が適用できると判定されたのでS20、初期値算出コード追加部222はこのループを変換して並列化するS21。詳細を以下に示す。2初期値算出コード追加型変換図7はプログラム400のループの初期値算出コード追加型変換の実行例を表す図である。初期値算出コード追加部222は、プログラム400のループの誘導変数iの初期値1を変数pに代入し、ループの誘導変数iの変化値1iを1回実行したときのiの変化量を変数sに代入するS210。初期値算出コード追加部222は、プログラム400を2つのプロセッサを用いて実行するためにループを2つに分割し、ループ運搬依存変数aとbをプライベート化するS220。結果をプログラム600とプログラム650に示す。プログラム600では変数a,bをそれぞれ変数a_1,b_1に変更し、プログラム650では変数a,bをそれぞれ変数a_2,b_2に変更している。プログラム600とプログラム650の双方に対してS231からS237を実行する。まず、プログラム600の変換について説明する。初期値算出コード追加部222は、サブループの誘導変数iの初期値1を変数qに代入するS231。初期値算出コード追加部222は、ループ運搬依存変数a_1とb_1を要素としたリスト601を作成するS232。初期値算出コード追加部222は、変数pを変数qと変数sの和と比較するS233。このとき、q=1、p=1、s=1であり、qはpsより小さいので、S237を実行する。初期値算出コード追加部222は、リスト601に存在するプライベート化されたループ運搬依存変数a_1とb_1に対して、プライベート化される前の変数aと変数bを代入する式L591とL592をプログラム600の先頭に追加するS227。変換後のプログラムをプログラム610に示す。次に、プログラム650の変換について説明する。初期値算出コード追加部222は、サブループの誘導変数iの初期値51を変数qに代入するS231。初期値算出コード追加部222は、ループ運搬依存変数a_2とb_2を要素とするリスト651を作成するS232。初期値算出コード追加部222は、変数pを変数qと変数sの和と比較するS233。このとき、q=51、p=1、s=1であり、qはps以上となるためS234を実行する。初期値算出コード追加部222は、変数qにq-sの値である50を代入し、リスト611内の変数a_2と変数b_2を左辺値とする式L703と式L704を式L691と式L692としてプログラム610の先頭に追加するS234。このとき、誘導変数iには変数qの値q=50を代入する。初期化算出コードを追加したプログラムをプログラム660に示す。初期値算出コード追加部222は、追加された式L691と式L692の右辺値に含まれるループ運搬依存変数b_2を要素とするリスト661を作成し、リスト651を上書きするS235。初期値算出コード追加部222は、S236においてリスト661は空ではないのでS233を実行する。初期値算出コード追加部222は、S233において、q=50、p=1、s=1であり、qはps以上であるのでS234を実行する。初期値算出コード追加部222は、変数qに49を代入し、リスト631内の変数b_2を左辺値とする式L704に対し、誘導変数iに変数qの値q=49を代入した式L681をプログラム630の初期値算出コードの先頭に追加するS234。初期値算出コードの先頭に式L681を追加したプログラムをプログラム670に示す。初期値算出コード追加部222は、追加された式L681の右辺値にループ運搬依存変数は存在しないため、空のリスト671を作成し、リスト661を上書きするS235。初期値算出コード追加部222は、リスト671が空なので初期値算出コード追加型変換を終了するS226。以上の動作により、ループ並列化変換部220は図5に示すサブループ412と422を生成する。サブループ412とサブループ422はプログラム400に示すループを分割したサブループであり、100個のイタレーションからなるforループを、1回目から50回目のイタレーションと51回目から100回目のイタレーションに分割している。コンパイル装置200は、サブループ412とサブループ422をそれぞれ別プロセッサに割り当てた目的プログラム300を生成する。初期値算出コード411と初期値算出コード421は初期値算出コードである。プログラム410に初期値算出コード411、プログラム420に初期値算出コード421をそれぞれ追加することにより、プログラム400において存在した51回目のイタレーションから50回目のイタレーションへの依存関係を解消したプログラム410とプログラム410を生成することができ、プログラム400を並列に処理することができる。<初期値算出コード追加型変換ができないと判断されるプログラムの例>以下に初期値算出コード追加型変換が適用できないと判定される場合について、図8を用いて説明する。プログラム550は初期値算出コード追加型変換が適用できないループの例で、ループ運搬依存を矢印で示したものである。ループ並列化変換部220は、プログラム550のループのうちループ運搬依存が存在しない変数xを要素としたリスト551を作成するS110。ループ並列化変換部220は、左辺値がリストにない変数を持つ式L503と式L504のうち、右辺値に存在する変数がすべてリスト501に存在する式L504の左辺値である変数bをリストに追加し、リスト561を作成するS120。ループ並列化変換部220は、変数bがS110でリスト561に追加されたためS130においてYESと判定し、S150を実行する。ループ並列化変換部220は、プログラム400において、リスト561に列挙されていないループ運搬依存変数が存在しないか判定するS150。プログラム510に示されるように、プログラム400において式L503から式L502に対して変数aによるループ運搬依存が存在するため変数aがループ運搬依存変数、ループ並列化変換部220は再度S120を実行する。なお、リストに追加された変数によるループ運搬依存は破線の矢印で示す。ループ並列化変換部220は、リストに存在する変数b、xを右辺値とし、リストに存在しない変数を左辺値とする式が存在しないので、リストの更新を行わないS120。ループ並列化変換部220は、S120でリストに追加された変数がないためS130においてNOと判定し、初期値算出コード追加型変換が適用できないと判定する。<本実施の形態に係るその他の変形例>1本実施の形態においては、ソースプログラム100がC言語、目的プログラム300がOpenMPC言語で記述されている場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、ソースプログラム100がFORTRANなど他の言語で記述されていてもよいし、目的プログラム300は並列化を行える言語であれば他の言語であってもよい。あるいは、目的プログラム300はマルチプロセッサで実行できるオブジェクトファイルであってもよい。2本実施の形態においては、変数a、bはスカラ変数、変数xは配列である場合について説明したが、本発明は必ずしもこの場合に限定されない。各変数はベクトル変数や多次元配列など、任意のデータ構造であってよい。3本実施の形態においては、ソースプログラムに含まれるループについて、S10、S20、S30の各ステップで変換が適用できるか確認し、適用できる場合はS11、S21、S31の各ステップで変換を行う場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、ソースプログラムに含まれるループ処理全てに対して変換の可否を判定した後、判定結果を用いて変換処理をまとめて行ってもよい。4本実施の形態においては、S10、S30の各ステップでそれぞれDOALL型変換、DOACROSS型変換が適用できるか確認し、適用できる場合はS11、S31の各ステップで変換を行う場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、DOALL型変換部221がなく、DOALL型変換の可否を判定せずに初期値算出コード追加型変換が行えるかどうか判定してもよい。あるいは、例えばDOACROSS型変換部223がなく、初期値算出コード追加型変換が行えないと判定したループに対してDOACROSS型変換が適用できるか否かを判定せず逐次処理のままとしてもよいし、他に並列化や実行効率の向上を図れる技術があればそれらの適用を試みてもよい。このようにすることで、初期値算出コード追加型変換を行えるループに対して初期値算出コード追加型変換を行う特徴を持ちながら様々な構成を持つコンパイル装置を実現することができる。5本実施の形態においては、S120~S150においてリストの変数とループ運搬依存変数が一致するまで判定処理を繰り返しているが、本発明は必ずしもこの場合に限定されない。例えば、S120からS150を実施する回数の上限を設定することにより、分割されたサブループの最初のイタレーションに対して一定回数以上前に実行されるイタレーションに依存するループ運搬依存変数がある場合には、初期値算出コード追加型の変換を適用しないとしてもよい。このようにすることで、ループの並列化による処理速度の向上が追加される初期値算出コードによるオーバーヘッドを上回る場合にのみ並列化を行うことが可能になる。6本実施の形態においては、M個のイタレーションからなるループをN個のプロセッサで並列実行を行うため、連続するM/N個のイタレーションからなるサブループをそれぞれのプロセッサに割り当てているが、本発明は必ずしもこの場合に限定されない。例えば、サブループに含まれるイタレーションの数がプロセッサごとに異なっていてもよい。7本実施の形態においては、誘導変数iの変化量sが1誘導変数iの変更文がiである場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、誘導変数iの変更文をi=i2として、誘導変数iの変化量sが2であってもよい。あるいは、誘導変数iの変更文をi--として、誘導変数iの変化量sが-1であり、S223における判定式q≧psをq≦psに置き換えてもよい。このようにすることで様々な条件のループ処理に対して本発明の実施が可能となる。8本実施の形態においては、誘導変数iの変更文がiである場合について誘導変数iの変化量sに1を代入する場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、予めsの初期値を1としておき、誘導変数iの変更文がiでない場合にsの値を変更するものとしてもよい。このようにすることで、誘導変数iの変更文がiであるほとんどのループにおいて変換処理を簡略化できる。"