(57)【要約】  従来のループ並列化方法では、含まれるループ運搬依存変数について全てのイタレーションにおける値がループを最初から逐次実行することなく算出できるループにおいて、ループ運搬依存変数を含むことを理由にＤＯＡＬＬ型の並列化変換は不可能であると判定されるため、逐次実行されるか、ループ運搬依存変数を含むループを逐次に実行するＤＯＡＣＲＯＳＳ型のループ変換を適応しており、ループ運搬依存が存在する式は並列化できず、マルチプロセッサで効率的に処理できないという課題を有している。  初期値算出コード４１１、４２１を生成することにより、並列化前のソースコード４００のループ運搬依存を解決し、ソースコード４００におけるループを分割して並列実行が行えるサブループ４１０，４２０に変換することによりマルチプロセッサ上で効率的に処理することができる。
2012086148.tif 000002
【特許請求の範囲】
【請求項１】
逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイル装置であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析部と、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定部と、
前記ループ並列化判定部が並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加部と
を含むことを特徴とするコンパイル装置。
【請求項２】
前記ループ並列化判定部は、
前記ループ運搬依存変数を含むループに含まれる変数について、前記ループ運搬依存変数でない変数を、ループを逐次実行することなく全てのイタレーションにおける値を算出することができる算出可能変数として判別し、
前記ループ運搬依存変数の値を算出するために必要な変数が全て算出可能変数である場合に前記ループ運搬依存変数を算出可能変数として判別する処理を、算出可能変数であると判別される変数が増加するたびに前記ループ運搬依存変数を含むループに含まれ算出可能変数と判別されないループ運搬依存変数に対して繰り返し、
前記ループ運搬依存変数を含むループに含まれる変数が全て算出可能変数であれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定する
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記ループ並列化判定部は、
前記ループ運搬依存変数を含むループに含まれる変数であって、ループ運搬依存変数ではない前記算出可能変数のリストを作成し、
前記ループ運搬依存変数を含むループに含まれるループ運搬依存変数について、前記ループ運搬存変数が左辺値となる式において右辺値の変数が全て前記リストに含まれていれば前記左辺値のループ運搬依存変数を前記算出可能変数として前記リストに追加することを、前記リストに追加する変数がなくなるまで繰り返し行い、
前記ループ運搬依存変数を含むループに含まれる変数が全て前記リストに含まれていれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定する
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項４】
前記初期値算出コード追加部は、
前記ループにおいて、前記サブループの最初のイタレーションとなるイタレーションを特定し、
前記ループ運搬依存変数を前記サブループごとに異なる局所変数に置き換え、
前記特定したイタレーションにおける前記ループ運搬依存変数の値をループ運搬依存変数でない変数を用いて算出して前記局所変数に代入する初期値算出コードを生成し、
前記生成した初期値算出コードを前記サブループの前に追加する
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項５】
前記初期値算出コード追加部は、
ループ運搬依存変数のリストである初期値追加リストを作成し、
前記初期値追加リストの変数について、前記サブループの最初のイタレーションで参照される値を左辺値とする導出式を前記ループから生成し初期値算出コードとして前記サブループの前に追加し、
直前に追加した初期値算出コードについて、右辺値に含まれるループ運搬依存変数のリストである第２追加リストを生成し、前記第２追加リストの変数について、前記変数を左辺値とする導出式を前記ループから生成し初期値算出コードとして既に追加されている初期値算出コードの前に追加する処理を前記第２追加リストに変数があれば繰り返し行う
ことを特徴とする請求項４に記載のコンパイル装置。
【請求項６】
逐次型のソースプログラムから並列型の目的プログラムを生成するプログラムであって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を含むことを特徴とするコンパイルプログラム。
【請求項７】
逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイルプログラムが記録されているコンピュータ読み取り可能な記録媒体であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を実行させるためのプログラムが記録されているコンピュータ読み取り可能な記憶媒体。
【請求項８】
逐次型のソースプログラムから並列型の目的プログラムを生成するループ並列化方法であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を含むことを特徴とするループ並列化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は逐次形式のソースプログラムから並列化された目的プログラムを生成するコンパイル技術及びループ並列化方法に関する。
【背景技術】
【０００２】
並列処理は、マルチプロセッサで目的プログラムを実行する上で、各プロセッサを有効活用し、実行性能を向上させるための重要な機能である。並列化された目的プログラムを作成する方法として、ループ処理を繰り返される処理の単位（以下、イタレーションと呼ぶ）で複数のサブループ処理に分割して並列化する方法が知られている。従来のループ並列化方法として、データ依存が存在しないループを対象に並列化を行う（以下、ＤＯＡＬＬ型変換と呼ぶ）ものがある（例えば、非特許文献１参照）。ここで、データ依存とは、ある命令Ｂが、他の命令Ａが完了するまで実行できない関係を指し、その原因が変数ａにある場合（例えば、命令Ａが変数ａに代入して命令Ｂが変数ａを参照）、「変数ａにデータ依存がある」と表現する。ＤＯＡＬＬ型変換は、例えば、図９（ａ）に示すような、データ依存がないループを対象にしたものである。【０００３】
ループ内に存在するデータ依存において、上述の命令Ａと命令Ｂとが異なるイタレーションに属する場合には、命令Ａが属するイタレーションと命令Ｂが属するイタレーションとの間に依存関係が存在する。このように２以上のイタレーションの間にデータ依存が存在する場合には、ＤＯＡＬＬ型変換をそのまま適用することができないためループ処理の並列化が困難である。【０００４】
イタレーションの間に存在するデータ依存には、値の代入がされるイタレーションの後に実行される別のイタレーションで値の参照が行われるデータ依存（以下、ループ運搬依存と呼ぶ）、値が参照されるイタレーションの後に実行される別のイタレーションで値が代入されるデータ依存（以下、参照先行依存と呼ぶ）、及び値が代入されるイタレーションの後に実行される別のイタレーションで値が代入されるデータ依存（以下、出力依存と呼ぶ）がある。【０００５】
イタレーションの間に存在するデータ依存の具体例と、並列化における問題点を図９を用いて説明する。図９（ｂ）に示す変数ａにはループ運搬依存がある。ループが逐次実行される場合、ｉ＝ｋ＋１のイタレーションが実行されるときに変数ａはｉ＝ｋのイタレーションの実行結果であるａ＝ｘ［ｋ］を参照する。一方、ループをイタレーション単位で分割して並列化を行う場合、各イタレーションの実行順序はループを逐次処理する場合とは異なるので、ｙ［ｋ＋１］＝ａ＊ｂの実行時に変数ａの値はｘ［ｋ］であるとは言えない。このため、変数ｙ［ｋ＋１］の値がループを逐次処理した結果と同一にならないという問題が発生する。【０００６】
また、図９（ｃ）に示す配列ｃは参照先行依存の例であり、ループを実行する前にｃ［２］〜ｃ［１０１］には値が代入されている。ループをイタレーション単位で分割して並列化を行う場合、各イタレーションの実行順序はループを逐次処理する場合とは異なるので、ｉ＝ｋ＋１のイタレーションがｉ＝ｋのイタレーションより先に実行されることがある。このとき、ｉ＝ｋのイタレーションを実行時にｃ［ｋ＋１］にはｉ＝ｋ＋１のイタレーションの結果が代入されているため、ｚ［ｋ］の値がループを逐次処理する場合と同一にならないという問題が発生する。【０００７】
また、図９（ｄ）に示す配列ｇは出力依存変数である。ループをイタレーション単位で分割して並列化を行う場合、各イタレーションの実行順序はループを逐次処理する場合とは異なるので、ｉ＝ｋ＋１のイタレーションがｉ＝ｋのイタレーションより先に実行されることがある。このとき、ｉ＝ｋのイタレーションがｇ［ｋ＋１］の値を上書きするため、ｇ［ｋ＋１］の値がループを逐次処理する場合と同一にならないという問題が発生する。【０００８】
データ依存が存在するループを並列化する従来の方法が、特許文献１に開示されている。特許文献１に記載のコンパイル装置を図１０に示す。コンパイル装置８００は、ＦＯＲＴＲＡＮ言語などの逐次型のソースプログラム７００を入力として、並列型の目的プログラム９００を出力するものであり、ループ並列化変換部８２０はＤＯＡＬＬ型変換が可能なものについてはＤＯＡＬＬ型変換部８２１で並列化を行い、パイプライン型の並列化が可能なものについては、多重ループ中にプロセッサ間の同期を実行する文を挿入することによるパイプライン化（以下、ＤＯＡＣＲＯＳＳ型変換と呼ぶ）をＤＯＡＣＲＯＳＳ型変換部８２２で行う。【０００９】
また、別の従来例が特許文献２に開示されている。特許文献２のコンパイル装置では、ループに参照先行依存がある場合に、参照先行依存変数について、その変数が用いられる前に値が代入されて値が変わることがないように、予め参照先行依存変数の値を一時変数に格納し、参照先行依存変数が参照される式について参照先行依存変数を一時変数に置き換えることで、参照先行依存を解決してループの並列処理化を行う。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００５−３２７３２０号公報
【特許文献２】特開２０１０−１９１５０６号公報
【非特許文献】
【００１１】
【非特許文献１】Ａ．Ｖ．エイホ、Ｍ．Ｓ．ラム、Ｒ．セシィ、Ｊ．Ｄ．ウルマン共著原田賢一訳「コンパイラ［第２版］−原理・技法・ツール−」サイエンス社出版、２００９年５月２５日（Ｐ７９０−Ｐ７９３）
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、特許文献１のコンパイル装置では、ループ処理にループ運搬依存が存在すると判定されるとＤＯＡＬＬ型変換による並列化を図ることができず、ＤＯＡＣＲＯＳＳ型変換が行えなければ並列化を図ることができない。 また、ＤＯＡＣＲＯＳＳ型変換により並列化を行う場合には、ループ運搬依存が存在するイタレーションについて同期命令を用いて各イタレーションの実行順序を維持するので、ループ運搬依存の関係にある依存元イタレーションと依存先イタレーションとを並列に実行することができない。【００１３】
一方、特許文献２のコンパイル装置は、値が参照されるイタレーションの後に実行される別のイタレーションで値が代入される参照先行依存が存在するループにおいて、予め参照先行依存変数の値を一時変数の値として複製しておき、値が参照されるイタレーションにおける参照先行依存変数を当該一時変数に置き換えることで、値が代入されるイタレーションによって参照先行依存変数の値が上書きされても、値が参照されるイタレーションが一時変数からループ実行前の参照先行依存変数の値を得られるようにしている。しかしながら、ループ運搬依存が存在するループにおいて、値が参照されるイタレーションが必要とするループ運搬依存変数の値は、値が代入されるイタレーションが当該ループ運搬依存変数に格納する値であってループが開始される前のループ運搬依存変数の値ではないため、特許文献２の技術ではループ運搬依存を解決することができない。【００１４】
本発明は、前記従来の課題を解決するもので、ループ運搬依存が存在するループについて並列化を図ることができるコンパイル装置、コンパイルプログラム及びループ並列化方法を提供することを目的とする。
【課題を解決するための手段】
【００１５】
前記従来の課題を解決するために、本発明のコンパイル装置は、逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイル装置であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析部と、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定部と、前記ループ並列化判定部が並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加部とを含むことを特徴とする。【００１６】
また、本発明のコンパイルプログラムは、逐次型のソースプログラムから並列型の目的プログラムを生成するプログラムであって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とする。【００１７】
また、本発明の記憶媒体は、逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイルプログラムが記録されているコンピュータ読み取り可能な記録媒体であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを実行させるためのプログラムが記録されていることを特徴とする。【００１８】
また、本発明のループ並列化方法は、逐次型のソースプログラムから並列型の目的プログラムを生成するループ並列化方法であって、前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値を算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップとを含むことを特徴とする。
【発明の効果】
【００１９】
これら上記の構成によれば、ループを最初から逐次処理しなくても全てのイタレーションにおけるループ運搬依存変数の値を算出できる場合には、ループを複数のサブループに分割して、サブループの最初のイタレーションにおけるループ運搬依存変数の値を算出する初期値算出コードを追加することにより、演算結果に影響を与えることなくループを分割して並列に実行することができる。
【図面の簡単な説明】
【００２０】
【図１】本発明の実施の形態におけるコンパイル装置の構成図
【図２】本発明の実施の形態におけるループ並列化変換部のフローを示す図
【図３】本発明の実施の形態におけるループ並列化変換部におけるループ並列化判定のフローを示す図
【図４】本発明の実施の形態における初期値算出コード追加型変換のフローを示す図
【図５】本発明の実施の形態におけるソースプログラムと目的プログラムを表す図
【図６】本発明の実施の形態におけるループ並列化判定の実行例を表す図
【図７】本発明の実施の形態における初期値算出コード追加型変換の実施例を表す図
【図８】本発明の実施の形態におけるループ並列化判定の実施例を表す図
【図９】データ依存関係を示す図
【図１０】従来のコンパイル装置の構成図
【発明を実施するための形態】
【００２１】
以下、本発明の１実施の形態について、図面を参照しながら説明する。
＜構成＞
図１は本発明の実施の形態におけるループ並列化方法を実行するコンパイル装置２００を示す構成図である。コンパイル装置２００は、Ｃ言語などの逐次型のソースプログラム１００を入力し、ＯｐｅｎＭＰ  Ｃ言語などの並列型の目的プログラム３００を出力とする。コンパイル装置２００は、データ依存解析部２１０、ループ並列化変換部２２０を備える。
【００２２】
データ依存解析部２１０は、ソースプログラム１００に含まれるループについて、ループ運搬依存変数が存在するか否かを解析する。ループ運搬依存変数は前述の通り、値を代入するイタレーションの後に実行される別のイタレーションにおいて代入された値が参照される変数である。ここで、ループ運搬依存変数を含むループにおける１つのイタレーションに着目すると、ループ運搬依存変数は同一のイタレーションの中で値が参照された後に値の代入がなされる変数であるとも言えるので、このような変数であるか否かを判定することで、ループ運搬依存変数であるか否かを解析できる。これは、代入された値は次のイタレーションにおける値の代入まで更新されることがなく、その値は当該イタレーションでなく次のイタレーションにおいて参照されるからである。
【００２３】
ループ並列化変換部２２０は、データ依存解析部２１０からループごとにループ運搬依存変数を含むか否かの解析結果を受け取り、ソースプログラム１００に含まれるすべてのループに対してループがイタレーション単位で並列化できるか判定し、並列化可能と判断されたループについて、並列化可能な方法によりループの変換を行い、目的プログラム３００を生成する。
【００２４】
このループ並列化変換部２２０は、ＤＯＡＬＬ型変換部２２１、初期値算出コード追加部２２２とＤＯＡＣＲＯＳＳ型変換部２２３を備え、これら各部がループの変換を行う。
【００２５】
ＤＯＡＬＬ型変換部２２１は、特許文献２のＤＯＡＬＬ型変換部８２１と同じ機能を有するもので、ループ並列化変換部２２０がＤＯＡＬＬ型変換による並列化が可能であると判定したループを、従来の並列化方法によりループの並列化を行う。
【００２６】
初期値算出コード追加部２２２は、ループ並列化変換部２２０が初期値算出コード追加型変換による並列化が可能であると判定したループを、初期値算出コード追加型変換によりループの並列化を行う。初期値算出コード追加型変換の詳細は後述する。
【００２７】
ＤＯＡＣＲＯＳＳ型変換部２２３はＤＯＡＣＲＯＳＳ型変換部８２２と同じ機能を有するもので、ループ並列化変換部２２０がＤＯＡＣＲＯＳＳ型変換による並列化が可能であると判定したループのパイプライン化を行う。
＜動作＞
以上の構成をもとに、本発明の実施の形態に係るコンパイル装置２００の動作について説明する。
（１）ループ並列化変換の概要
図２は本発明の実施の形態におけるループ並列化変換部２２０のフローを示す図である。図２に示すフローを参照してループ並列化変換部２２０における処理動作を説明する。
【００２８】
ループ並列化変換判定部２２０は、次のようにソースプログラム１００内のすべてのループに対してＤＯＡＬＬ型変換が可能なループであるか否か、初期値算出コード追加型変換が可能であるか否か、ＤＯＡＣＲＯＳＳ型変換が可能なループであるか否かのループ並列化判定を行う。
【００２９】
ループ並列化変換部２２０は、データ依存解析部２１０よりループごとにループ運搬依存変数を含むか否かの解析結果を受け取り、ＤＯＡＬＬ型変換が適用可能かを判定し（Ｓ１０）、ＤＯＡＬＬ型変換が適用可能な場合、ＤＯＡＬＬ型変換部２２１がＤＯＡＬＬ型変換を実行する（Ｓ１１）。なお、Ｓ１０におけるループ並列化変換部２２０の動作はループ並列化変換部８２０と、Ｓ１１におけるＤＯＡＬＬ型変換部２２１の動作はＤＯＡＬＬ型変換部８２１と同様である。
【００３０】
ＤＯＡＬＬ型変換が適用不可能であると判定された場合（Ｓ１０でＮＯ）、ループ並列化変換部２２０は初期値算出コード追加型変換が適用可能かを判定し（Ｓ２０）、初期値算出コード追加型変換が適用可能な場合、初期値算出コード追加部２２２で初期値算出コード追加型変換を実行する（Ｓ２１）。ここで、初期値算出コード追加型変換が可能なループとはループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができるループを指す。初期値算出コード追加型変換の可否判断（Ｓ２０）および変換（Ｓ２１）についての詳細は後述する。
【００３１】
初期値算出コード追加型変換が適用不可能であると判定された場合（Ｓ２０でＮＯ）、ループ並列化変換部２２０はＤＯＡＣＲＯＳＳ型変換が適用可能かを判定し（Ｓ３０）、ＤＯＡＣＲＯＳＳ型変換が適用可能な場合、ＤＯＡＣＲＯＳＳ型変換部２２３でＤＯＡＣＲＯＳＳ型変換を実行する（Ｓ３１）。なお、Ｓ３０におけるループ並列化変換部２２０の動作はループ並列化変換部８２０と、Ｓ３１におけるＤＯＡＣＲＯＳＳ型変換部２２３の動作はＤＯＡＣＲＯＳＳ型変換部８２２と同様である。
【００３２】
Ｓ３０において、ＤＯＡＣＲＯＳＳ型変換が適用不可能であると判定された場合、並列化を行わず、Ｓ１０でソースプログラム１００内の次のループを処理する。なお、並列化されないループは、逐次実行されることになる。
（２）ループ並列化判定
図３は本発明の実施の形態におけるステップＳ２０におけるループ並列化変換部２２０のフローを示す図である。図３に示すフローを参照してＳ２０における初期値算出コード追加型変換の適用の判定の処理動作を説明する。
【００３３】
ループ並列化変換部２２０は、データ依存解析部２１０からループ運搬依存が存在するか否かの解析結果を受け取って、ループに含まれる変数のうち、ループ運搬依存変数でない変数のリストを作成する（Ｓ１１０）。これらの変数はループ運搬依存変数ではないためループ内の各イタレーションの実行結果に依存せず、ループを逐次実行しなくても、各イタレーションにおける値を算出することが可能である。以下、このような全てのイタレーションにおける値が算出できる変数を算出可能変数と呼び、このリストは算出可能変数のリストとなる。
【００３４】
ループ並列化変換部２２０は、左辺値がリストにない変数を持つ式のうち、右辺値に存在する変数がすべてリストに存在する式の左辺値をリストに追加する（Ｓ１２０）。追加されるループ運搬依存変数は、算出可能変数にのみ依存する変数であるので、算出可能変数のみを含む導出式から全てのイタレーションにおいて値が算出可能な算出可能変数に該当する。
【００３５】
次に、ループ並列化変換部２２０は、Ｓ１２０においてリストに追加された変数が存在するか確認する（Ｓ１３０）。追加された変数が存在しない場合は、初期値算出コード追加型変換が適用できないと判定し（Ｓ１４０）、Ｓ１４０によりＳ２０の判定がＮＯであることが確定する。詳細な説明については後述する。ループ並列化変換部２２０はこのループについて、ＤＯＡＣＲＯＳＳ型変換が適用可能か判定を行う（Ｓ３０）。
【００３６】
Ｓ１２０においてリストに追加された変数が存在する場合、ループ並列化変換部２２０はリスト内にループ内のループ運搬依存変数がすべて列挙されているかを確認する（Ｓ１５０）。すべてのループ運搬依存変数がリスト内に列挙されている場合は、ループ並列化判定部２２０は初期値算出コード追加型変換が適用できると判定し（Ｓ１５０）、Ｓ１５０によりＳ２０の判定がＹＥＳであることが確定する。この場合、全てのループ運搬依存変数が算出可能変数であるので、ループを逐次実行しなくても全てのイタレーションにおいてループ運搬依存変数の値が算出可能である。これにより、初期値算出コード追加部２２２は当該ループの変換を行う（Ｓ２１）。
【００３７】
Ｓ１５０においてリスト内にループ運搬依存変数がすべて列挙されていない場合は、列挙されていないループ運搬依存変数がリストに新たに追加された算出可能変数に依存した変数であるか否かを判定するため、再度Ｓ１２０からフローを実行する。
【００３８】
ループに算出可能変数に該当しないループ運搬依存変数が含まれている場合には、算出可能変数が全てリストに列挙された時点で、算出可能変数に該当しないループ運搬依存変数がリストに列挙されていないためＳ１５０でＹＥＳ と判定された後、再度実施されるＳ１２０において、新たにリストに追加する算出可能変数が存在しないためＳ１３０においてＮＯと判定され、上述のように初期値算出コード追加型変換が適用できないと判定されることになる。
（３）初期値算出コード追加型変換
図４は本発明の実施の形態における初期値算出コード追加部２２２の動作Ｓ２１のフローを示す図である。図４に示すフローを参照してＳ２１における初期値算出コード追加型の変換の処理動作を説明する。
【００３９】
初期値算出コード追加部２２２は、分割前のループの誘導変数の初期値を変数ｐに記録し、イタレーションが終了した後次のイタレーションが実行されるときのループ誘導変数の変化値を変数ｓに記録する（Ｓ２１０）。
【００４０】
初期値算出コード追加部２２２は、Ｍ個のイタレーションからなるループをＮ個のプロセッサに割り当てる場合は（Ｍ／Ｎ）個のイタレーションごとに分割し、各プロセッサに割り当てる。分割したすべてのサブループに対して、ループ運搬依存変数はサブループごとに異なる変数を用いてプライベート化し、プロセッサ毎に個別の領域を使用する変数に変換して、目的プログラム３００に出力する（Ｓ２２０）。
【００４１】
初期値算出コード追加部２２２は、Ｓ２２０において分割を行ったすべてのサブループに対して、Ｓ２３１からステップＳ２３７を実行する。
【００４２】
初期値算出コード追加部２２２は、分割したサブループの誘導変数の初期値を変数ｑに記録する（Ｓ２３１）。
【００４３】
初期値算出コード追加部２２２は、データ依存解析部２１０からの情報を元に、ループ運搬依存変数のリストを作成する（Ｓ２３２）。このリストはサブループの最初のイタレーションにおける値が算出されていないループ運搬依存変数のリストとなる。
【００４４】
初期値算出コード追加部２２２は、変数ｐを変数ｑと変数ｓの和と比較し（Ｓ２３３）、ｑがｐ＋ｓより小さい場合は、リストに存在する変数についてプライベート化される前の変数の値を代入する導出式を初期値算出コードとして目的プログラム３００に追加する（Ｓ２３７）。これは、誘導変数ｑのイタレーションにおけるループ運搬依存変数が、分割前のループにおける誘導変数ｑ−ｓのイタレーションではなく（このような誘導変数の値がｐ未満となるイタレーションは元のループに存在しない）、誘導変数ｐのイタレーションの実行前の値、すなわちループ実行前の初期値に依存しているからである。
【００４５】
なお、初期値算出コードを目的プログラム３００に追加するときは、対応するサブループより前に実行されるように追加する。また、既に同じサブループに対応する初期値算出コードが目的プログラム３００に追加されている場合は、既存の初期値算出コードより先に実行されるように追加する。ただし、プライベート化される前の変数に値を代入するコードより後に初期値算出コードが実行されるように目的プログラム３００を構成する。
【００４６】
Ｓ２３３においてｑがｐ＋ｓ以上である場合は、初期値算出コード追加部２２２は変数ｑにｑ−ｓを代入し、リスト内の変数を左辺値とするループ内の式を初期値算出コードとして追加する（Ｓ２３４）。このとき、追加する式で使用されている誘導変数の値として変数ｑの値を用いる。
【００４７】
初期値算出コード追加部２２２は、Ｓ２３４において追加された初期値算出コードの式の右辺値の変数のうち、ループ運搬依存変数のリストを作成し、Ｓ２３２あるいは前回のＳ２３５において作成したリストを新たに生成したリストで上書きする（Ｓ２３５）。
【００４８】
初期値算出コード追加部２２２は、Ｓ２３５において作成したリストに変数が存在しているかを確認し、変数が存在する場合はＳ２３３から再度フローを実行する。リストに変数が存在しない場合は、当該サブループの変換を終了し、Ｓ２２０において作成された、初期値算出コードを追加していない他の分割サブループに対して、Ｓ２３１から初期値算出コード追加型変換を行う（Ｓ２３６）。
＜プログラムの変換例＞
図５は本発明の実施の形態における初期値算出コード追加型変換を行う前後のプログラム例を表す図である。図５に示すプログラムを参照して、本発明に係るコンパイル装置２００の動作を説明する。
【００４９】
プログラム４００はソースプログラム１００に記述されたループを示す例で、Ｃ言語で記述されたｆｏｒループである。このｆｏｒループは１００個のイタレーションで構成され、変数ａと変数ｂに関してループ運搬依存が存在し、変数ｂの導出式の右辺値となる変数ｘに対してはループ運搬依存が存在しない。
【００５０】
本実施の形態においては、プログラム４００に示すループを２つのプロセッサを使用して並列に実行するものとする。
【００５１】
データ依存解析部２１０は、変数ａと変数ｂがループ運搬依存変数であることを検出する。ループ並列化変換部２２０は、変数ａと変数ｂがループ運搬依存変数であるため、プログラム４００のループをＤＯＡＬＬ型変換することができないと判定する（Ｓ１０）。
【００５２】
次に、データ並列化変換部２２０は、プログラム４００のループについて、初期値算出コード追加型変換が適用できるか判定する（Ｓ２０）。以下にその詳細を示す。
（１）ループ並列化判定
図６はプログラム４００に対するループ並列化判定の実行例を表す図である。
【００５３】
プログラム５００はプログラム４００におけるループ運搬依存を矢印で示したものである。
【００５４】
ループ並列化変換部２２０は、プログラム４００のループのうちループ運搬依存が存在しない変数ｘを要素としたリスト５０１を作成する（Ｓ１１０）。
【００５５】
ループ並列化変換部２２０は、左辺値がリストにない変数を持つ式Ｌ４０３と式Ｌ４０４のうち、右辺値に存在する変数がすべてリスト５０１に存在する式Ｌ４０４の左辺値である変数ｂをリストに追加し、リスト５１１を作成する（Ｓ１２０）。
【００５６】
ループ並列化変換部２２０は、変数ｂがＳ１１０でリスト５１１に追加されたためＳ１３０においてＹＥＳと判定し、Ｓ１５０を実行する。
【００５７】
ループ並列化変換部２２０は、プログラム４００において、リスト５１１に列挙されていないループ運搬依存変数が存在しないか判定する（Ｓ１５０）。プログラム５１０に示されるように、プログラム４００において式Ｌ４０３から式Ｌ４０２に対して変数ａによるループ運搬依存が存在するため（変数ａがループ運搬依存変数）、ループ並列化変換部２２０は再度Ｓ１２０を実行する。なお、リストに追加された変数によるループ運搬依存は破線の矢印で示す。
【００５８】
ループ並列化変換部２２０は、左辺値がリストにない変数を持つ式Ｌ４０３の右辺値に存在する変数がすべてリスト５０１に存在するので、式Ｌ４０３の左辺値である変数ａをリストに追加し、リスト５２１を作成する（Ｓ１２０）。
【００５９】
ループ並列化変換部２２０は、変数ａがＳ１２０でリスト５２１に追加されたためＳ１３０においてＹＥＳと判定し、Ｓ１５０を実行する。
【００６０】
ループ並列化変換部２２０は、Ｓ１５０でプログラム４００においてリスト５２１に存在しないループ運搬依存変数が存在しないため、Ｓ１６０において初期値算出コード追加型変換が適応可能であると判定される。
【００６１】
以上の動作により、プログラム４００のループは初期値算出コード追加型変換が適用できると判定されたので（Ｓ２０）、初期値算出コード追加部２２２はこのループを変換して並列化する（Ｓ２１）。詳細を以下に示す。
（２）初期値算出コード追加型変換
図７はプログラム４００のループの初期値算出コード追加型変換の実行例を表す図である。
【００６２】
初期値算出コード追加部２２２は、プログラム４００のループの誘導変数ｉの初期値１を変数ｐに代入し、ループの誘導変数ｉの変化値１（ｉ＋＋を１回実行したときのｉの変化量）を変数ｓに代入する（Ｓ２１０）。
【００６３】
初期値算出コード追加部２２２は、プログラム４００を２つのプロセッサを用いて実行するためにループを２つに分割し、ループ運搬依存変数ａとｂをプライベート化する（Ｓ２２０）。結果をプログラム６００とプログラム６５０に示す。プログラム６００では変数ａ，ｂをそれぞれ変数ａ＿１，ｂ＿１に変更し、プログラム６５０では変数ａ，ｂをそれぞれ変数ａ＿２，ｂ＿２に変更している。
【００６４】
プログラム６００とプログラム６５０の双方に対してＳ２３１からＳ２３７を実行する。
【００６５】
まず、プログラム６００の変換について説明する。
【００６６】
初期値算出コード追加部２２２は、サブループの誘導変数ｉの初期値１を変数ｑに代入する（Ｓ２３１）。
【００６７】
初期値算出コード追加部２２２は、ループ運搬依存変数ａ＿１とｂ＿１を要素としたリスト６０１を作成する（Ｓ２３２）。
【００６８】
初期値算出コード追加部２２２は、変数ｐを変数ｑと変数ｓの和と比較する（Ｓ２３３）。このとき、ｑ＝１、ｐ＝１、ｓ＝１であり、ｑはｐ＋ｓより小さいので、Ｓ２３７を実行する。
【００６９】
初期値算出コード追加部２２２は、リスト６０１に存在するプライベート化されたループ運搬依存変数ａ＿１とｂ＿１に対して、プライベート化される前の変数ａと変数ｂを代入する式Ｌ５９１とＬ５９２をプログラム６００の先頭に追加する（Ｓ２２７）。変換後のプログラムをプログラム６１０に示す。
【００７０】
次に、プログラム６５０の変換について説明する。
【００７１】
初期値算出コード追加部２２２は、サブループの誘導変数ｉの初期値５１を変数ｑに代入する（Ｓ２３１）。
【００７２】
初期値算出コード追加部２２２は、ループ運搬依存変数ａ＿２とｂ＿２を要素とするリスト６５１を作成する（Ｓ２３２）。
【００７３】
初期値算出コード追加部２２２は、変数ｐを変数ｑと変数ｓの和と比較する（Ｓ２３３）。このとき、ｑ＝５１、ｐ＝１、ｓ＝１であり、ｑはｐ＋ｓ以上となるためＳ２３４を実行する。
【００７４】
初期値算出コード追加部２２２は、変数ｑにｑ−ｓの値である５０を代入し、リスト６１１内の変数ａ＿２と変数ｂ＿２を左辺値とする式Ｌ７０３と式Ｌ７０４を式Ｌ６９１と式Ｌ６９２としてプログラム６１０の先頭に追加する（Ｓ２３４）。このとき、誘導変数ｉには変数ｑの値（ｑ＝５０）を代入する。初期化算出コードを追加したプログラムをプログラム６６０に示す。
【００７５】
初期値算出コード追加部２２２は、追加された式Ｌ６９１と式Ｌ６９２の右辺値に含まれるループ運搬依存変数ｂ＿２を要素とするリスト６６１を作成し、リスト６５１を上書きする（Ｓ２３５）。
【００７６】
初期値算出コード追加部２２２は、Ｓ２３６においてリスト６６１は空ではないのでＳ２３３を実行する。
【００７７】
初期値算出コード追加部２２２は、Ｓ２３３において、ｑ＝５０、ｐ＝１、ｓ＝１であり、ｑはｐ＋ｓ以上であるのでＳ２３４を実行する。
【００７８】
初期値算出コード追加部２２２は、変数ｑに４９を代入し、リスト６３１内の変数ｂ＿２を左辺値とする式Ｌ７０４に対し、誘導変数ｉに変数ｑの値（ｑ＝４９）を代入した式Ｌ６８１をプログラム６３０の初期値算出コードの先頭に追加する（Ｓ２３４）。初期値算出コードの先頭に式Ｌ６８１を追加したプログラムをプログラム６７０に示す。
【００７９】
初期値算出コード追加部２２２は、追加された式Ｌ６８１の右辺値にループ運搬依存変数は存在しないため、空のリスト６７１を作成し、リスト６６１を上書きする（Ｓ２３５）。
【００８０】
初期値算出コード追加部２２２は、リスト６７１が空なので初期値算出コード追加型変換を終了する（Ｓ２２６）。
【００８１】
以上の動作により、ループ並列化変換部２２０は図５に示すサブループ４１２と４２２を生成する。サブループ４１２とサブループ４２２はプログラム４００に示すループを分割したサブループであり、１００個のイタレーションからなるｆｏｒループを、１回目から５０回目のイタレーションと５１回目から１００回目のイタレーションに分割している。コンパイル装置２００は、サブループ４１２とサブループ４２２をそれぞれ別プロセッサに割り当てた目的プログラム３００を生成する。
【００８２】
初期値算出コード４１１と初期値算出コード４２１は初期値算出コードである。プログラム４１０に初期値算出コード４１１、プログラム４２０に初期値算出コード４２１をそれぞれ追加することにより、プログラム４００において存在した５１回目のイタレーションから５０回目のイタレーションへの依存関係を解消したプログラム４１０とプログラム４１０を生成することができ、プログラム４００を並列に処理することができる。
＜初期値算出コード追加型変換ができないと判断されるプログラムの例＞
以下に初期値算出コード追加型変換が適用できないと判定される場合について、図８を用いて説明する。
【００８３】
プログラム５５０は初期値算出コード追加型変換が適用できないループの例で、ループ運搬依存を矢印で示したものである。
【００８４】
ループ並列化変換部２２０は、プログラム５５０のループのうちループ運搬依存が存在しない変数ｘを要素としたリスト５５１を作成する（Ｓ１１０）。
【００８５】
ループ並列化変換部２２０は、左辺値がリストにない変数を持つ式Ｌ５０３と式Ｌ５０４のうち、右辺値に存在する変数がすべてリスト５０１に存在する式Ｌ５０４の左辺値である変数ｂをリストに追加し、リスト５６１を作成する（Ｓ１２０）。
【００８６】
ループ並列化変換部２２０は、変数ｂがＳ１１０でリスト５６１に追加されたためＳ１３０においてＹＥＳと判定し、Ｓ１５０を実行する。
【００８７】
ループ並列化変換部２２０は、プログラム４００において、リスト５６１に列挙されていないループ運搬依存変数が存在しないか判定する（Ｓ１５０）。プログラム５１０に示されるように、プログラム４００において式Ｌ５０３から式Ｌ５０２に対して変数ａによるループ運搬依存が存在するため（変数ａがループ運搬依存変数）、ループ並列化変換部２２０は再度Ｓ１２０を実行する。なお、リストに追加された変数によるループ運搬依存は破線の矢印で示す。
【００８８】
ループ並列化変換部２２０は、リストに存在する変数ｂ、ｘを右辺値とし、リストに存在しない変数を左辺値とする式が存在しないので、リストの更新を行わない（Ｓ１２０）。
【００８９】
ループ並列化変換部２２０は、Ｓ１２０でリストに追加された変数がないためＳ１３０においてＮＯと判定し、初期値算出コード追加型変換が適用できないと判定する。
【００９０】
＜本実施の形態に係るその他の変形例＞
（１）本実施の形態においては、ソースプログラム１００がＣ言語、目的プログラム３００がＯｐｅｎＭＰ  Ｃ言語で記述されている場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、ソースプログラム１００がＦＯＲＴＲＡＮなど他の言語で記述されていてもよいし、目的プログラム３００は並列化を行える言語であれば他の言語であってもよい。あるいは、目的プログラム３００はマルチプロセッサで実行できるオブジェクトファイルであってもよい。
【００９１】
（２）本実施の形態においては、変数ａ、ｂはスカラ変数、変数ｘは配列である場合について説明したが、本発明は必ずしもこの場合に限定されない。各変数はベクトル変数や多次元配列など、任意のデータ構造であってよい。
【００９２】
（３）本実施の形態においては、ソースプログラムに含まれるループについて、Ｓ１０、Ｓ２０、Ｓ３０の各ステップで変換が適用できるか確認し、適用できる場合はＳ１１、Ｓ２１、Ｓ３１の各ステップで変換を行う場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、ソースプログラムに含まれるループ処理全てに対して変換の可否を判定した後、判定結果を用いて変換処理をまとめて行ってもよい。
【００９３】
（４）本実施の形態においては、Ｓ１０、Ｓ３０の各ステップでそれぞれＤＯＡＬＬ型変換、ＤＯＡＣＲＯＳＳ型変換が適用できるか確認し、適用できる場合はＳ１１、Ｓ３１の各ステップで変換を行う場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、ＤＯＡＬＬ型変換部２２１がなく、ＤＯＡＬＬ型変換の可否を判定せずに初期値算出コード追加型変換が行えるかどうか判定してもよい。あるいは、例えばＤＯＡＣＲＯＳＳ型変換部２２３がなく、初期値算出コード追加型変換が行えないと判定したループに対してＤＯＡＣＲＯＳＳ型変換が適用できるか否かを判定せず逐次処理のままとしてもよいし、他に並列化や実行効率の向上を図れる技術があればそれらの適用を試みてもよい。このようにすることで、初期値算出コード追加型変換を行えるループに対して初期値算出コード追加型変換を行う特徴を持ちながら様々な構成を持つコンパイル装置を実現することができる。
【００９４】
（５）本実施の形態においては、Ｓ１２０〜Ｓ１５０においてリストの変数とループ運搬依存変数が一致するまで判定処理を繰り返しているが、本発明は必ずしもこの場合に限定されない。例えば、Ｓ１２０からＳ１５０を実施する回数の上限を設定することにより、分割されたサブループの最初のイタレーションに対して一定回数以上前に実行されるイタレーションに依存するループ運搬依存変数がある場合には、初期値算出コード追加型の変換を適用しないとしてもよい。このようにすることで、ループの並列化による処理速度の向上が追加される初期値算出コードによるオーバーヘッドを上回る場合にのみ並列化を行うことが可能になる。
【００９５】
（６）本実施の形態においては、Ｍ個のイタレーションからなるループをＮ個のプロセッサで並列実行を行うため、連続する（Ｍ／Ｎ）個のイタレーションからなるサブループをそれぞれのプロセッサに割り当てているが、本発明は必ずしもこの場合に限定されない。例えば、サブループに含まれるイタレーションの数がプロセッサごとに異なっていてもよい。
【００９６】
（７）本実施の形態においては、誘導変数ｉの変化量ｓが１（誘導変数ｉの変更文がｉ＋＋）である場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、誘導変数ｉの変更文をｉ＝ｉ＋２として、誘導変数ｉの変化量ｓが２であってもよい。あるいは、誘導変数ｉの変更文をｉ−−として、誘導変数ｉの変化量ｓが−１であり、Ｓ２２３における判定式ｑ≧ｐ＋ｓをｑ≦ｐ＋ｓに置き換えてもよい。このようにすることで様々な条件のループ処理に対して本発明の実施が可能となる。
【００９７】
（８）本実施の形態においては、誘導変数ｉの変更文がｉ＋＋である場合について誘導変数ｉの変化量ｓに１を代入する場合について説明したが、本発明は必ずしもこの場合に限定されない。例えば、予めｓの初期値を１としておき、誘導変数ｉの変更文がｉ＋＋でない場合にｓの値を変更するものとしてもよい。このようにすることで、誘導変数ｉの変更文がｉ＋＋であるほとんどのループにおいて変換処理を簡略化できる。
【産業上の利用可能性】
【００９８】
本発明によれば、逐次型で作成されたソースプログラム資産を、簡単にマルチコアプロセッサ向けの並列化された目的プログラムに変換することができ、マルチコアプロセッサを搭載した家電製品等に広く利用することができる。
【符号の説明】
【００９９】
２００  コンパイル装置
２１０  データ依存解析部
２２０  ループ並列化部
２２１  ループ並列化判定部
２３０  ループ変換部
２３１  ＤＯＡＬＬ型変換部
２３２  初期値算出コード追加型変換部
２３３  ＤＯＡＣＲＯＳＳ型変換部
３００  目的プログラム
【図１】
2012086148.tif 000003
【図２】
2012086148.tif 000004
【図３】
2012086148.tif 000005
【図４】
2012086148.tif 000006
【図５】
2012086148.tif 000007
【図６】
2012086148.tif 000008
【図７】
2012086148.tif 000009
【図８】
2012086148.tif 000010
【図９】
2012086148.tif 000011
【図１０】
2012086148.tif 000012
【手続補正書】
【提出日】平成24年5月1日(2012.5.1)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイル装置であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析部と、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定部と、
前記ループ並列化判定部が並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値をループ内で実行される一つ以上の処理を一回以上実行することにより算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加部と
を含むことを特徴とするコンパイル装置。
【請求項２】
前記ループ並列化判定部は、
前記ループ運搬依存変数を含むループに含まれる変数について、前記ループ運搬依存変数でない変数を、ループを逐次実行することなく全てのイタレーションにおける値を算出することができる算出可能変数として判別し、
前記ループ運搬依存変数の値を算出するために必要な変数が全て算出可能変数である場合に前記ループ運搬依存変数を算出可能変数として判別する処理を、算出可能変数であると判別される変数が増加するたびに前記ループ運搬依存変数を含むループに含まれ算出可能変数と判別されないループ運搬依存変数に対して繰り返し、
前記ループ運搬依存変数を含むループに含まれる変数が全て算出可能変数であれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定する
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記ループ並列化判定部は、
前記ループ運搬依存変数を含むループに含まれる変数であって、ループ運搬依存変数ではない前記算出可能変数のリストを作成し、
前記ループ運搬依存変数を含むループに含まれるループ運搬依存変数について、前記ループ運搬存変数が左辺値となる式において右辺値の変数が全て前記リストに含まれていれば前記左辺値のループ運搬依存変数を前記算出可能変数として前記リストに追加することを、前記リストに追加する変数がなくなるまで繰り返し行い、
前記ループ運搬依存変数を含むループに含まれる変数が全て前記リストに含まれていれば、前記ループ運搬依存変数を含むループを並列化可能ループであると判定する
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項４】
前記初期値算出コード追加部は、
前記ループにおいて、前記サブループの最初のイタレーションとなるイタレーションを特定し、
前記ループ運搬依存変数を前記サブループごとに異なる局所変数に置き換え、
前記特定したイタレーションにおける前記ループ運搬依存変数の値をループ運搬依存変数でない変数を用いて算出して前記局所変数に代入する初期値算出コードを生成し、
前記生成した初期値算出コードを前記サブループの前に追加する
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項５】
前記初期値算出コード追加部は、
ループ運搬依存変数のリストである初期値追加リストを作成し、
前記初期値追加リストの変数について、前記サブループの最初のイタレーションで参照される値を左辺値とする導出式を前記ループから生成し初期値算出コードとして前記サブループの前に追加し、
直前に追加した初期値算出コードについて、右辺値に含まれるループ運搬依存変数のリストである第２追加リストを生成し、前記第２追加リストの変数について、前記変数を左辺値とする導出式を前記ループから生成し初期値算出コードとして既に追加されている初期値算出コードの前に追加する処理を前記第２追加リストに変数があれば繰り返し行う
ことを特徴とする請求項４に記載のコンパイル装置。
【請求項６】
逐次型のソースプログラムから並列型の目的プログラムを生成するプログラムであって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値をループ内で実行される一つ以上の処理を一回以上実行することにより算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を含むことを特徴とするコンパイルプログラム。
【請求項７】
逐次型のソースプログラムから並列型の目的プログラムを生成するコンパイルプログラムが記録されているコンピュータ読み取り可能な記録媒体であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値をループ内で実行される一つ以上の処理を一回以上実行することにより算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を実行させるためのプログラムが記録されているコンピュータ読み取り可能な記憶媒体。
【請求項８】
逐次型のソースプログラムから並列型の目的プログラムを生成するループ並列化方法であって、
前記ソースプログラムに含まれるループについて、値を代入するイタレーションの後に実行される別のイタレーションにおいて前記代入された値が参照されるループ運搬依存変数が存在するか否かを解析するデータ依存解析ステップと、
前記ループ運搬依存変数を含むループについて、ループを逐次実行することなく全てのイタレーションにおける前記ループ運搬依存変数の値を算出することができる並列化可能ループであるか否かを判定するループ並列化判定ステップと、
前記ループ並列化判定ステップが並列化可能ループと判定するループについて、複数のサブループに分割するために前記サブループの開始位置を決定し、前記開始位置のそれぞれにおける前記ループ運搬依存変数の値をループ内で実行される一つ以上の処理を一回以上実行することにより算出する初期値算出コードを生成し、前記ループを前記開始位置に従って前記サブループに分割し、前記初期値算出コードがそれぞれ対応する前記サブループより前に実行されるように目的プログラムを生成する初期値算出コード追加ステップと
を含むことを特徴とするループ並列化方法。
【国際調査報告】
2012086148.tif 000013
2012086148.tif 000014
2012086148.tif 000015
2012086148.tif 000016