(57)【要約】【課題】効果的なループ融合を実行することを課題とする。【解決手段】コンパイラは、プログラム言語で記述されたソースコードを読み込んで最適化してオブジェクトコードを生成する。このようなコンパイラは、処理対象のコードに存在する複数のループ各々について、処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定する。そして、コンパイラは、ループ融合可否の判定結果にしたがって、ループ処理の融合を実行する。【選択図】図１
2014228891.tif 000002
【特許請求の範囲】
【請求項１】
処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を実行することを特徴とするコンパイラ。
【請求項２】
前記処理対象のコードに存在する複数のループ各々のループ条件に基づいて、ループ処理を融合する対象の組合せを決定する処理を前記コンパイラがさらに実行し、
前記判定する処理は、決定した各組合せについて、前記処理対象のコードが実行されるシステムの性能情報、および、組み合わせた場合の演算数およびデータ転送数に基づいて、各組合せのループ融合可否を判定することを特徴とする請求項１に記載のコンパイラ。
【請求項３】
前記判定する処理は、さらに、前記組み合わせた場合の命令数、または、前記組み合わせた各ループがアクセスするメモリのキャッシュライン数を用いて、前記ループ融合可否を判定することを特徴とする請求項２に記載のコンパイラ。
【請求項４】
前記ループ処理の融合を実行する処理は、前記ループ融合可能と判定された複数の組み合わせに同じループが存在する場合、前記組み合わせた場合のデータ転送数と演算数の比率と、前記システムの性能条件によって特定される閾値との差が小さい組合せに該当するループを融合させることを特徴とする請求項２または３に記載のコンパイラ。
【請求項５】
コンピュータが、
処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を含んだことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラおよびコンパイル方法に関する。
【背景技術】
【０００２】
コンパイラでは、データの局所性を高め、ループの判定の繰り返し処理にかかるコストを削減して実行性能を高速化させる最適化技術として、ループ融合が利用されている。ループ融合は、ソースプログラム中に存在する多重ループの処理構造に対して、隣接するループの初期値、終値、増分値が同じであり、融合によって依存関係が壊れない場合に、ループを融合してループの判定回数の削減をする。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０９−１１４６７５号公報
【特許文献２】特開昭６２−３５９４４号公報
【特許文献３】特開２００９−１０４４２２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、上記のループ融合の条件だけでは、ループ融合後にデータアクセス待ちや演算処理待ちが発生する場合があり、効果的ではないループ融合が発生するという問題がある。
【０００５】
例えば、隣接するループ同士かつ初期値、終値、増分値が同じループ同士であっても、データアクセスが演算数に比べて多いループ同士を融合した場合、データアクセス待ちが発生するので、性能が向上しない。同様に、演算数がデータアクセスに比べて多いループ同士を融合した場合、演算処理待ちが発生するので、性能が向上しない。
【０００６】
１つの側面では、効果的なループ融合を実行することができるコンパイラおよびコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
第１の案では、コンパイラは、処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定する。コンパイラは、ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する。
【発明の効果】
【０００８】
本発明の１実施形態によれば、効果的なループ融合を実行することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施例１に係るコンパイラを含む情報処理装置の構成を示す機能ブロック図である。
【図２】図２は、ループの初期値、終値、増分値を観点にしたループ融合判定の例を示す図である。
【図３】図３は、データ依存を観点にしたループ融合判定の例１を示す図である。
【図４】図４は、データ依存を観点にしたループ融合判定の例２を示す図である。
【図５】図５は、タイトリを観点にしたループ融合判定の例を示す図である。
【図６】図６は、ループ融合の例を説明する図である。
【図７】図７は、実施例１に係るループ融合の全体的な処理の流れを示すフローチャートである。
【図８】図８は、実施例１に係るループ融合におけるデータ生成処理の流れを示すフローチャートである。
【図９】図９は、ループ融合を判定する対象の処理コード例を示す図である。
【図１０】図１０は、ループ融合対象リストの例を示す図である。
【図１１】図１１は、ループ融合判定リストの生成例を示す図である。
【図１２】図１２は、各種データのカウント対象の例を示す図である。
【図１３】図１３は、同一ストリームの説明をソースコードを例にして説明する図である。
【図１４】図１４は、同一ストリームの説明を中間言語を例にして説明する図である。
【図１５】図１５は、Ｂ／Ｆ値の算出例を説明する図である。
【図１６】図１６は、ループ融合の可否判定を説明する図である。
【図１７】図１７は、情報処理装置のハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１０】
以下に、本願の開示するコンパイラおよびコンパイル方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。以下の実施例は、矛盾を起こさない範囲で適宜組み合わせることができる。
【実施例１】
【００１１】
［機能構成］
図１は、実施例１に係るコンパイラを含む情報処理装置の構成を示す機能ブロック図である。この情報処理装置１０は、プログラム言語で記述されたソースコードを読み込んで最適化してオブジェクトコードを生成し、オブジェクトコードをリンクさせて実行ファイルを生成するコンピュータ装置である。つまり、情報処理装置は、一般的なコンパイラとしての機能を有する。
【００１２】
図１に示すように、情報処理装置１０は、記憶部１１とコンパイラ実行部１２とリンカ２０とを有する。なお、図示した処理部は、あくまで例示であり、例えばディスプレイなどの表示部やキーボードなどの入力部を有していてもよい。
【００１３】
記憶部１１は、ソースプログラム１１ａ、中間言語１１ｂ、オブジェクトファイル１１ｃ、実行ファイル１１ｄを記憶する記憶装置である。例えば、記憶部１１の一例としては、メモリやハードディスクなどがある。なお、ソースプログラム１１ａは、複数の処理対象コードが記述される。
【００１４】
コンパイラ実行部１２は、ソースコードをコンパイルする処理部である。コンパイラ実行部１２の一例としては、プロセッサが実行するコンパイラなどがある。このコンパイラ実行部１２は、ソースプログラム入力部１３、入出力制御部１４、中間言語生成部１５、最適化部１６、コード生成部１７、オブジェクトファイル出力部１８を有する。
【００１５】
ソースプログラム入力部１３は、コンパイラ実行部１２から指定されたソースプログラム１１ａをオープンする処理部である。例えば、ソースプログラム入力部１３は、コンパイラ実行部１２からコンパイル開始が指示されると、記憶部１１に記憶されるソースプログラムを読み込んで入出力制御部１４に出力する。
【００１６】
入出力制御部１４は、オプションやファイルの種別に応じて各種処理の選択を実行する処理部である。例えば、入出力制御部１４は、ソースプログラム入力部１３からソースプログラム１１ａが入力された場合には、当該ソースプログラム１１ａを中間言語生成部１５に出力する。また、入出力制御部１４は、コード生成部１７からアセンブリ言語から入力された場合に、当該アセンブリ言語をオブジェクトファイル出力部１８に出力する。
【００１７】
中間言語生成部１５は、入出力制御部１４から入力されたソースプログラム１１ａから中間言語１１ｂを生成して、メモリ上に格納する処理部である。具体的には、中間言語生成部１５は、ソースプログラム１１ａを最適化部１６で利用される中間コード、すなわち、コンパイラ内部で利用するコードに変換する処理部である。そして、中間言語生成部１５は、変換した中間言語１１ｂを記憶部１１等に格納する。
【００１８】
最適化部１６は、ソースプログラム１１ａの実行を高速化するために、ループ融合などの最適化を実行する処理部である。この最適化部１６は、ソース解析部１６ａ、組合せ抽出部１６ｂ、情報抽出部１６ｃ、比率算出部１６ｄ、判定部１６ｅ、融合部１６ｆを有する。
【００１９】
ソース解析部１６ａは、中間言語１１ｂを解析する処理部である。例えば、ソース解析部１６ａは、中間言語１１ｂを記憶部１１から読み込み、行再構築、字句解析、構文解析、意味解析などを実行し、その結果を組合せ抽出部１６ｂに出力する。
【００２０】
組合せ抽出部１６ｂは、ループ融合が可能なループの組合せを抽出する処理部である。具体的には、組合せ抽出部１６ｂは、ソース解析部１６ａからの解析結果から、ソースプログラム１１ａまたは中間言語１１ｂに存在する複数のループ各々のループ条件に基づいて、ループ処理を融合する対象の組合せ（以下、仮想ループと記載する場合がある）を決定する。
【００２１】
例えば、組合せ抽出部１６ｂは、ループの初期値、終値、増分値に基づいて、仮想ループを抽出する。図２は、ループの初期値、終値、増分値を観点にしたループ融合判定の例を示す図である。図２の（ａ）の場合、組合せ抽出部１６ｂは、ループ１とループ２との間で、ループの初期値、終値、増分値が一致するので、ループ融合が可能な組合せと判定する。一方、図２の（ｂ）の場合、組合せ抽出部１６ｂは、ループ１とループ２との間で、ループの初期値が異なるので、ループ融合が可能ではない組合せと判定する。
【００２２】
また、組合せ抽出部１６ｂは、ループのデータ依存に基づいて、仮想ループを抽出する。図３は、データ依存を観点にしたループ融合判定の例１を示す図である。図３の（ａ）の場合、組合せ抽出部１６ｂは、ループ１とループ２との間で、Ａ（ｊ）とＡ（ｊ＋１）とが依存しているが、順方向の依存であることから、融合してもデータが壊れないと判断できるので、ループ融合が可能な組合せと判定する。一方、図３の（ｂ）の場合、組合せ抽出部１６ｂは、ループ１とループ２との間で、Ａ（ｊ＋１）とＡ（ｊ）とが依存しているが、逆方向の依存であることから、融合するとデータが壊れると判断できるので、ループ融合が可能ではない組合せと判定する。
【００２３】
図４は、データ依存を観点にしたループ融合判定の例２を示す図である。図４の（ａ）の場合、組合せ抽出部１６ｂは、ループ１とループ２とを融合候補とした場合、ループ３がループ２の算出結果を利用しないことから、ループ２とループ３とが依存関係にないと判断する。その結果、組合せ抽出部１６ｂは、ループ１とループ２とをループ融合が可能な組合せと判定する。
【００２４】
一方、図４の（ｂ）の場合、組合せ抽出部１６ｂは、ループ１とループ２とを融合候補とした場合、ループ３がループ２の算出結果を利用することから、ループ２とループ３とが依存関係にあると判断する。その結果、組合せ抽出部１６ｂは、ループ１とループ２とをループ融合が可能ではない組合せと判定する。
【００２５】
また、組合せ抽出部１６ｂは、タイトリに基づいて、仮想ループを抽出する。つまり、組合せ抽出部１６ｂは、重ループにおいて、最内ループにのみ演算を所有するループを組合せ候補と判定し、途中のループの間に演算を含む場合は、演算を含むループより下のループをタイトとみなして、組合せ候補から除外する。
【００２６】
図５は、タイトリを観点にしたループ融合判定の例を示す図である。図５の（ａ）の場合、組合せ抽出部１６ｂは、ループ１もループ２もともにタイトリであるから、ループ融合が可能な組合せと判定する。一方、図５の（ｂ）の場合、組合せ抽出部１６ｂは、ループ２はタイトリであるが、ループ１には最内ループ内以外に演算式「ｃ＝ｄ＊１」が存在するのでタイトリではないと判定する。その結果、組合せ抽出部１６ｂは、ループ１とループ２とをループ融合が可能ではない組合せと判定する。
【００２７】
図１に戻り、情報抽出部１６ｃは、組合せ抽出部１６ｂが抽出したループ融合の候補、すなわち、仮想ループについて演算数、データ転送数、命令数、ストリーム数を抽出する処理部である。
【００２８】
例えば、情報抽出部１６ｃは、各組み合わせに対して、「ＭＵＬＴ」命令や「ＡＤＤ」命令などレジスタの浮動小数点演算を実行する演算命令の数を計数して、演算数を算出する。また、情報抽出部１６ｃは、各組み合わせに対して、各ループがアクセスするメモリのキャッシュラインの数を計数し、ストリーム数として算出する。
【００２９】
また、情報抽出部１６ｃは、各組み合わせに対して、データをレジスタにロードする「ＬＯＡＤ」命令、データをメモリにストアする「ＳＴＯＲＥ」命令などの命令数を計数する。そして、情報抽出部１６ｃは、各命令の数と各命令が参照されるバイト数とから、データ転送数言い換えるとデータアクセス数を算出する。なお、「ＳＴＯＲＥ」命令については、一度レジスタにロードしてから、ロードした領域にストアするので、データ転送数としては２倍となる。
【００３０】
比率算出部１６ｄは、情報抽出部１６ｃが抽出した各種データを用いて、各組合せについてデータ転送数と演算数の比率を算出する処理部である。具体的には、比率算出部１６ｄは、「仮想ループ内の総データ転送数／仮想ループ内の総演算数＝Ｂ（Ｂｙｔｅ）／Ｆ（ＦＬＯＰ）値」を算出する。例えば、比率算出部１６ｄは、データ転送数が「７８」で演算数が「１５６」であった場合、Ｂ／Ｆ値を「０．５」と算出する。
【００３１】
判定部１６ｅは、比率算出部１６ｄが算出したＢ／Ｆ値に基づいて、各組合せがループ融合可能か否かを判定する処理部である。具体的には、判定部１６ｅは、各組合せのＢ／Ｆ値が、プロセッサの演算性能を最大限利用し、メモリバンド幅を使い切る最適な状態である場合に、ループ融合可能と判定する。
【００３２】
例えば、判定部１６ｅは、Ｂ／Ｆ値が所定の範囲内にある組合せをループ融合可能と判定する。ここで、閾値となる値について説明する。例えば、１６ＧＦＬＯＰＳ、８コアで動作するコンピュータについて、１秒間に実行した浮動小数点演算の演算数値は、１６×８＝１２８ＧＦＬＯＰＳとなる。そして、メモリの論理スループットを６４ＧＢ／ｓとした場合、コンピュータのシステム資源を最大限に使いきる理想的なＢ／Ｆ値は「６４／１２８＝０．５」となる。この値は、マシンの諸元に依存し、メモリスループットやＦＬＯＰＳ値によって変動する。この例の場合では、この理想的なＢ／Ｆ値を基準にして、閾値となる範囲は、０．３＜Ｂ／Ｆ値＜０．６などと設定される。
【００３３】
なお、判定部１６ｅは、ループ融合可能と判定された複数の組み合わせに同じループが存在する場合、Ｂ／Ｆ値と、上記閾値（理想値）との差が小さい組合せに該当するループを融合させる。そして、判定部１６ｅは、ループ融合可能と判定されたループ以外が含まれる組合せについて、同様の判定を実行する。
【００３４】
また、判定部１６ｅは、ストリーム数や命令数を考慮して判定することもできる。例えば、Ｂ／Ｆ値が条件を満たす仮想ループであっても、ストリーム数や命令数が閾値以上である場合には、当該仮想ループを融合可能ではないと判定する。
【００３５】
融合部１６ｆは、判定部１６ｅによってループ融合可能と判定されたループ同士を融合させる処理部である。図６は、ループ融合の例を説明する図である。図６に示すように、融合部１６ｆは、ループＡとループＢとが融合可能と判定された場合、ループＡにおける演算式の次にループＢの演算式を挿入して、１つのループとして処理させる。このようにすることで、ループの判定の繰り返し処理にかかるコストを削減して実行性能を高速化させることができる。
【００３６】
コード生成部１７は、最適化部１６によって最適化された中間言語からアセンブリ言語を生成する処理部である。そして、コード生成部１７は、生成したアセンブリ言語を入出力制御部１４に出力する。
【００３７】
オブジェクトファイル出力部１８は、入出力制御部１４からアセンブリ言語が入力されると、当該アセンブリ言語からオブジェクトファイル１１ｃを生成して、記憶部１１に格納する処理部である。
【００３８】
リンカ２０は、オブジェクトファイル出力部１８によって生成されたオブジェクトファイル１１ｃを記憶部１１から読み込み、オブジェクトファイル１１ｃとライブラリファイルとを結合して実行ファイル１１ｄを生成する処理部である。そして、リンカ２０は、生成した実行ファイル１１ｄを記憶部１１に格納する。
【００３９】
［処理の流れ］
次に、情報処理装置が実行する処理の流れについて説明する。ここでは、ループ融合の全体的な流れと、全体的な流れで実行されるデータ生成処理とについて説明する。
【００４０】
（全体的な流れ）
図７は、実施例１に係るループ融合の全体的な処理の流れを示すフローチャートである。図７に示すように、ソースプログラム入力部１３は、コンパイル処理が開始されると（Ｓ１０１：Ｙｅｓ）、記憶部１１からソースプログラム１１ａを読み込む（Ｓ１０２）。
【００４１】
続いて、中間言語生成部１５は、ソースプログラム入力部１３が読み込んだソースプログラム１１ａから中間言語１１ｂを生成する（Ｓ１０３）。その後、ソース解析部１６ａによる解析等が実行される。
【００４２】
そして、組合せ抽出部１６ｂは、ループ融合の候補となる組合せを示す仮想ループを抽出する（Ｓ１０４）。その後、情報抽出部１６ｃおよび比率算出部１６ｄは、抽出された仮想ループの中から１つの仮想ループを選択し（Ｓ１０５）、データ生成処理を実行する（Ｓ１０６）。
【００４３】
そして、情報抽出部１６ｃおよび比率算出部１６ｄは、選択した仮想ループに対するデータ生成処理が完了すると、全仮想ループについて処理が終了したか否かを判定する（Ｓ１０７）。ここで、未処理の仮想ループが存在する場合（Ｓ１０７：Ｎｏ）、情報抽出部１６ｃおよび比率算出部１６ｄは、Ｓ１０５に戻って以降の処理を繰り返す。
【００４４】
一方、全仮想ループについて処理が終了したと判定された場合（Ｓ１０７：Ｙｅｓ）、判定部１６ｅは、Ｂ／Ｆ値が条件を満たす仮想ループを抽出する（Ｓ１０８）。このとき、判定部１６ｅは、ストリーム数や命令数を考慮してもよい。
【００４５】
続いて、判定部１６ｅは、条件を満たす仮想ループのうちＢ／Ｆ値が理想値に最も近い仮想ループを融合対象に決定する（Ｓ１０９）。そして、判定部１６ｅは、融合対象に決定された仮想ループに属するループを融合対象から除外する（Ｓ１１０）。つまり、判定部１６ｅは、融合が決定されたループを含む他の仮想ループを、融合対象から除外する。
【００４６】
その後、判定部１６ｅは、条件を満たす他の仮想ループが存在すると判定した場合（Ｓ１１１：Ｙｅｓ）、Ｓ１０９に戻って以降の処理を繰り返す。一方、判定部１６ｅが条件を満たす他の仮想ループが存在しないと判定した場合（Ｓ１１１：Ｎｏ）、融合部１６ｆは、融合対象と決定された仮想ループに属する各ループを融合する（Ｓ１１２）。その後は、一般的なコンパイル処理が実行される。
【００４７】
（データ生成処理の流れ）
図８は、実施例１に係るループ融合におけるデータ生成処理の流れを示すフローチャートである。ここで実行される処理は、図７のＳ１０６で実行される処理に該当する。
【００４８】
図８に示すように、情報抽出部１６ｃは、選択された仮想ループ内の命令を探索し（Ｓ２０１）、未探索の命令が探索された場合（Ｓ２０２：Ｙｅｓ）、探索された命令が「ＳＴＯＲＥ」命令か否かを判定する（Ｓ２０３）。
【００４９】
続いて、情報抽出部１６ｃは、探索された命令が「ＳＴＯＲＥ」命令であると判定した場合（Ｓ２０３：Ｙｅｓ）、対象となっている仮想ループ内の各ループがアクセスするストリームが同一ではないか否かを判定する（Ｓ２０４）。
【００５０】
そして、情報抽出部１６ｃは、同一ストリームへのアクセスではないと判定した場合（Ｓ２０４：Ｙｅｓ）、データ転送数すなわちデータアクセス数をカウントし（Ｓ２０５）、Ｓ２０２に戻って以降の処理を繰り返す。このとき、情報抽出部１６ｃは、仮想ループ内でアクセスされるストリームの数も計数する。なお、情報抽出部１６ｃは、同一ストリームへのアクセスであると判定した場合（Ｓ２０４：Ｎｏ）、データ転送数をカウントすることなく、Ｓ２０２に戻って以降の処理を繰り返す。
【００５１】
一方、Ｓ２０３において、情報抽出部１６ｃは、探索された命令が「ＳＴＯＲＥ」命令ではなく（Ｓ２０３：Ｎｏ）、「ＬＯＡＤ」命令であると判定した場合（Ｓ２０６：Ｙｅｓ）、Ｓ２０７を実行する。すなわち、情報抽出部１６ｃは、対象となっている仮想ループ内の各ループがアクセスするストリームと同一ではないか否かを判定する（Ｓ２０７）。
【００５２】
そして、情報抽出部１６ｃは、同一ストリームへのアクセスではないと判定した場合（Ｓ２０７：Ｙｅｓ）、データ転送数すなわちデータアクセス数をカウントし（Ｓ２０８）、Ｓ２０２に戻って以降の処理を繰り返す。このとき、情報抽出部１６ｃは、仮想ループ内でアクセスされるストリームの数も計数する。なお、情報抽出部１６ｃは、同一ストリームへのアクセスであると判定した場合（Ｓ２０７：Ｎｏ）、データ転送数をカウントすることなく、Ｓ２０２に戻って以降の処理を繰り返す。
【００５３】
一方、Ｓ２０６において、情報抽出部１６ｃは、探索された命令が「ＬＯＡＤ」命令でもなく（Ｓ２０６：Ｎｏ）、ＡＤＤなどの四則演算命令であると判定した場合（Ｓ２０９：Ｙｅｓ）、Ｓ２１０を実行する。すなわち、情報抽出部１６ｃは、探索された四則演算命令が浮動小数点型の命令であるか否かを判定する。
【００５４】
そして、情報抽出部１６ｃは、探索された四則演算命令が浮動小数点型の命令であると判定した場合（Ｓ２１０：Ｙｅｓ）、演算数すなわち浮動小数点演算数をカウントし（Ｓ２１１）、Ｓ２０２に戻って以降の処理を繰り返す。
【００５５】
なお、情報抽出部１６ｃは、探索された四則演算命令が浮動小数点型の命令ではないと判定した場合（Ｓ２１０：Ｎｏ）、演算数をカウントすることなく、Ｓ２０２に戻って以降の処理を繰り返す。
【００５６】
また、情報抽出部１６ｃは、探索された命令が四則演算命令でもないと判定した場合（Ｓ２０９：Ｎｏ）、演算数をカウントすることなく、Ｓ２０２に戻って以降の処理を繰り返す。
【００５７】
また、情報抽出部１６ｃは、Ｓ２０３〜Ｓ２１１を実行し、Ｓ２０２において未探索の命令が残っていないと判定した場合（Ｓ２０２：Ｎｏ）、Ｓ２０３〜Ｓ２１１で算出されたデータ転送数およびストリーム数を、仮想ループに対応付けて登録する（Ｓ２１２）。
【００５８】
続いて、情報抽出部１６ｃは、Ｓ２０３〜Ｓ２１１で算出された浮動小数点演算数についても、Ｓ２１２の情報に対応付けて登録する（Ｓ２１３）。さらに、比率算出部１６ｄは、算出されたデータ転送数と浮動小数点演算数とからＢ／Ｆ値を算出して、Ｓ２１２およびＳ２１３の情報に対応付けて登録する（Ｓ２１４）。このようにして、最適化部１６は、１つの仮想ループについて、演算数、データ転送数、命令数、ストリーム数、Ｂ／Ｆ値を算出する。
【００５９】
［具体例］
次に、上述したループ融合の具体例を説明する。図９は、ループ融合を判定する対象の処理コード例を示す図である。図９に示すように、ループ融合の判定を行うソースコードは、ループ１からループ５の５つのループで構成されている。以下では、このループ１からループ５について、どの組合せがループ融合として最適化を判定する例を説明する。
【００６０】
（組合せ抽出）
まず、組合せ抽出部１６ｂは、中間言語生成部１５が生成した図９に示したソースコードの中間言語から、ループ融合の組合せ候補、すなわち仮想ループを抽出する。図９の場合、組合せ抽出部１６ｂは、ループ１をトリガーにして候補を抽出し、ループ２、ループ３、ループ４、ループ５をトリガーにして順に判定する。
【００６１】
まず、ループ１をトリガーにする。例えば、組合せ抽出部１６ｂは、ループ１とループ２とでは初期値が異なるので、組合せ不可と判定する。続いて、組合せ抽出部１６ｂは、ループ１とループ３とでは、初期値、終値、増分値が同一、かつ、Ａ（ｊ）とＡ（ｊ＋１）とが順方向の依存関係にあり、ループ２とループ３は依存関係にないので、組合せ可能と判定する。また、組合せ抽出部１６ｂは、ループ１とループ４とでは、初期値、終値、増分値が同一、かつ、ループ４がループ３のデータに対して順方向の依存関係でありデータを壊さないので、組合せ可能と判定する。また、組合せ抽出部１６ｂは、ループ１とループ５とでは、初期値が異なるので、組合せ不可と判定する。
【００６２】
次に、ループ２をトリガーにする。組合せ抽出部１６ｂは、ループ２とループ３とでは初期値が異なるので、組合せ不可と判定する。続いて、組合せ抽出部１６ｂは、ループ２とループ４とでは、初期値が異なるので、組合せ不可と判定する。また、組合せ抽出部１６ｂは、ループ２とループ５とでは、初期値、終値、増分値が同一、かつ、ループ５がループ４のデータに依存しておらず依存関係を壊さないので、組合せ可能と判定する。
【００６３】
次に、ループ３をトリガーにする。組合せ抽出部１６ｂは、ループ３とループ４とでは初期値、終値、増分値が同一、かつ、Ｃ（ｊ）とＣ（ｊ＋１）とが順方向の依存関係にあるので、組合せ可能と判定する。続いて、組合せ抽出部１６ｂは、ループ３とループ５とでは、初期値が異なるので、組合せ不可と判定する。次に、ループ４をトリガーにする。組合せ抽出部１６ｂは、ループ４とループ５とでは初期値が異なるので、組合せ不可と判定する。
【００６４】
このようにして、抽出した組合せを図１０に示す。図１０は、ループ融合対象リストの例を示す図である。図１０に示すように、組合せ抽出部１６ｂは、「ループ１」に対しては「ループ３、ループ４」を融合可能と特定し、「ループ２」に対しては「ループ５」を融合可能と特定し、「ループ３」に対しては「ループ４」を融合可能と特定する。なお、図１０に示した表は、組合せ抽出部１６ｂが内部メモリや一時領域に作成してもよい。
【００６５】
続いて、組合せ抽出部１６ｂは、抽出した組合せ結果から、図１１に示したループ融合判定リストを生成する。図１１は、ループ融合判定リストの生成例を示す図である。図１１に示すように、組合せ抽出部１６ｂは、「ループ１、ループ３」、「ループ１、ループ４」、「ループ１、ループ３、ループ４」、「ループ２、ループ５」、「ループ３、ループ４」の組合せを仮想ループとして生成する。また、組合せ抽出部１６ｂは、各仮想ループについて「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」を格納する領域を対応付けたループ判定リストを生成する。なお、図１１に示したループ判定リストは、組合せ抽出部１６ｂが内部メモリや一時領域に作成してもよい。
【００６６】
（情報抽出）
次に、各仮想ループから「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」を抽出する例を説明する。図１２は、各種データのカウント対象の例を示す図である。ここでは、図１２に示した中間言語およびループ１とループ３の仮想ループを例にして説明する。なお、図１２では、メモリをｍｅｍと表記する。図１２に示した中間言語で記述されたコードでは、メモリ１〜メモリ３ついて、１アクセスで４バイトの領域にアクセスすることを示し、メモリ４〜メモリ８ついて、１アクセスで８バイトの領域にアクセスすることを示す。
【００６７】
（情報抽出：命令数）
まず、命令数について説明する。情報抽出部１６ｃは、ループ１とループ３とについて各ループで実行される各命令を計数する。図１２の場合、ループ１について、情報抽出部１６ｃは、６つのＬＯＡＤ命令、２つのＭＵＬＴ命令、３つのＡＤＤ命令、２つのＳＴＯＲＥ命令を検出するので、ループ１の命令数を「１３」と抽出する。同様の手法で、情報抽出部１６ｃは、ループ３の命令数を「３３８」と抽出する。この結果、情報抽出部１６ｃは、ループ１とループ３とから構成される仮想ループの命令数を「１３＋３３８＝３５１」と算出して、ループ判定リストに格納する。
【００６８】
（情報抽出：浮動小数点演算数）
次に、浮動小数点演算数について説明する。情報抽出部１６ｃは、ループ１とループ３とについて各ループで実行される各命令から浮動小数点演算の数を計数する。図１２の場合、ループ１について、情報抽出部１６ｃは、浮動小数点演算として、２つのＭＵＬＴ命令、３つのＡＤＤ命令を検出するので、ループ１の浮動小数点演算数を「５」と抽出する。同様の手法で、情報抽出部１６ｃは、ループ３の浮動小数点演算数を「１５１」と抽出する。この結果、情報抽出部１６ｃは、ループ１とループ３とから構成される仮想ループの浮動小数点演算数を「５＋１５１＝１５６」と算出して、ループ判定リストに格納する。
【００６９】
（情報抽出：ストリーム数）
次に、ストリーム数について説明する。ここでは、同一ストリームの考え方について説明する。図１３は、同一ストリームの説明をソースコードを例にして説明する図である。Ａ（ｉ）を基準（０）でそれぞれの配列の距離を考える。Ａ（ｉ＋１０）は、基準から１０離れており、対象のメモリアクセスが８バイトであることから、Ａ（ｉ）から８０バイト離れた所をアクセスする。ここで、１キャッシュラインを１２８バイトとすると、８０バイト先の領域は、同じキャッシュライン上であると判定できる。一方、Ａ（ｉ＋２０）は、基準から２０離れており、対象のメモリアクセスが８バイトであることから、Ａ（ｉ）から１６０バイト離れた所をアクセスする。そのため、Ａ（ｉ＋２０）がアクセスする領域は、Ａ（ｉ）と同じキャッシュラインではないので、同じストリームではないと判定し、データアクセス数すなわちデータ転送数にカウントする。
【００７０】
図１４は、同一ストリームの説明を中間言語を例にして説明する図である。図１４の場合、（１）はｍｅｍＡの先頭をアクセスし、（２）は先頭から８０離れた先をアクセスしている。また、（３）は先頭から１６０離れた先をアクセスしている。ここで、１キャッシュラインを１２８バイトとすると、（１）と（２）は、同一のキャッシュラインにアクセスするため、同じストリームと考える。しかし、（３）は、（１）や（２）がアクセスするキャッシュラインにのっていないため、同じストリームとして考えない。
【００７１】
（情報抽出：データ転送数）
次に、データ転送数について説明する。情報抽出部１６ｃは、ループ１とループ３とについて、各命令がアクセスする数を計数する。ループ１について、情報抽出部１６ｃは、ｍｅｍ０１からｍｅｍ０６各々についてＬＯＡＤ命令を抽出する。また、ｍｅｍ０１からｍｅｍ０３へのアクセスは、４バイト単位であり、ｍｅｍ０４からｍｅｍ０８へのアクセスは、８バイト単位である。この結果、情報抽出部１６ｃは、ＬＯＡＤ命令の合計アクセス数として、「４（ｍｅｍ０１）＋４（ｍｅｍ０２）＋４（ｍｅｍ０３）＋８（ｍｅｍ０４）＋８（ｍｅｍ０５）＋８（ｍｅｍ０６）＝３６個」を算出する。
【００７２】
また、情報抽出部１６ｃは、ｍｅｍ０７とｍｅｍ０８についてＳＴＯＲＥ命令を抽出する。また、ｍｅｍ０７およびｍｅｍ０８へのアクセスは、８バイト単位である。また、ＳＴＯＲＥ命令は、ロードした領域にストアするので、データ転送数としては２倍となる。これらの結果、情報抽出部１６ｃは、ＳＴＯＲＥ命令の合計アクセス数として、「２×８（ｍｅｍ０７）＋２×８（ｍｅｍ０８）＝３２個」を算出する。
【００７３】
したがって、情報抽出部１６ｃは、ループ１についてのデータ転送数として、ＬＯＡＤ命令の「３６」バイト＋ＳＴＯＲＥ命令の「３２」個＝「６８」個を算出する。同様の手法で、情報抽出部１６ｃは、ループ３についてのデータ転送数として、「１０」を算出する。これらの結果、情報抽出部１６ｃは、ループ１とループ３とから構成される仮想ループのデータ転送数を「６８＋１０＝７８個」と算出して、ループ判定リストに格納する。
【００７４】
（Ｂ／Ｆ値算出）
次に、Ｂ／Ｆ値について説明する。図１５は、Ｂ／Ｆ値の算出例を説明する図である。図１５に示すように、比率算出部１６ｄは、ループ１とループ３とについて、上述した浮動小数点演算数およびデータ転送数を用いて、Ｂ／Ｆ値を算出する。例えば、比率算出部１６ｄは、情報抽出部１６ｃが抽出したデータ転送数「７８個」を情報抽出部１６ｃが抽出した浮動小数点演算数「１５６」で除算して、Ｂ／Ｆ値「０．５」を算出する。そして、比率算出部１６ｄは、ループ１とループ３とから構成される仮想ループのＢ／Ｆ値「０．５」をループ判定リストに格納する。
【００７５】
（融合可否判定）
次に、情報抽出部１６ｃと比率算出部１６ｄとが生成した結果を用いて、ループ融合の可否を判定する例について説明する。図１６は、ループ融合の可否判定を説明する図である。図１６に示すように、情報抽出部１６ｃと比率算出部１６ｄとが、仮想ループ「１、３」について「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」として「７８、１５６、０．５、３５０、１３」を生成したとする。
【００７６】
同様に、情報抽出部１６ｃと比率算出部１６ｄとが、仮想ループ「１、４」について「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」として「７８、１３０、０．６、４５０、１３」を生成したとする。
【００７７】
また、情報抽出部１６ｃと比率算出部１６ｄとが、仮想ループ「１、３、４」について「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」として「８３、２８１、０．２９５、５５０、１５」を生成したとする。
【００７８】
また、情報抽出部１６ｃと比率算出部１６ｄとが、仮想ループ「３、４」について「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」として「１５、２７６、０．０５４、３５０、１３」を生成したとする。
【００７９】
また、情報抽出部１６ｃと比率算出部１６ｄとが、仮想ループ「２、５」について「データ転送数、浮動小数点演算数、Ｂ／Ｆ値、命令数、ストリーム数」として「２４、１４５、０．１６５、５４０、１０」を生成したとする。
【００８０】
このような場合、判定部１６ｅは、Ｂ／Ｆ値が閾値「０・２５＜Ｂ／Ｆ値＜０．７５」に該当する仮想ループとして、仮想ループ「１、３」と仮想ループ「１、４」を抽出する。なお、判定部１６ｅは、その他の仮想ループについては融合不可と判定する。
【００８１】
そして、判定部１６ｅは、仮想ループ「１、３」のＢ／Ｆ値が「０．５」であり、仮想ループ「１、４」のＢ／Ｆ値が「０．６」であることから、Ｂ／Ｆ値がより閾値の範囲内にある仮想ループ「１、３」を選択する。
【００８２】
続いて、判定部１６ｅは、融合対象と決定されたループ１またはループ３を含む仮想ループを融合対象から除外する。つまり、判定部１６ｅは、Ｂ／Ｆ値が閾値内にあるとして抽出された仮想ループ「１、４」についても、対象外とする。こうして、判定部１６ｅは、仮想ループ「１、３」すなわちループ１とループ３とを融合対象と決定する。その後、融合部１６ｆは、ループ１とループ３とを融合する。
【００８３】
なお、判定部１６ｅは、融合対象と決定された仮想ループについても、命令数やストリーム数が閾値を超える場合には、融合対象外と決定することもできる。この結果、命令数が非常に多くなるループ融合やメモリアクセスが効率的でなくなるループ融合を抑制できるので、ループ融合により実行性能の低下を抑制することができる。
【００８４】
上述したように、情報処理装置１０は、処理対象コードにある複数のループ処理の融合可否判定に際して、融合後の演算数とデータアクセス数との比率を算出し、システム利用効率が向上すれば、ループ融合可と判定するので、効果的なループ融合を実現できる。
【００８５】
つまり、情報処理装置１０は、ソースプログラム１１ａのループ構造に対して、浮動小数点演算数、データ伝送要求を用いてＢ／Ｆ値を計算する。そして、情報処理装置１０は、算出したＢ／Ｆ値から、プロセッサの演算性能を最大限利用し、メモリバンド幅を使い切るループをグルーピングする。その後、情報処理装置１０は、グルーピングしたループを融合することで、実行性能を向上させることができる。
【００８６】
この結果、情報処理装置１０は、データアクセスが演算数に比べて多いループ同士の融合や演算数がデータアクセスに比べて多いループ同士の融合を抑制できるので、ループ有効後のデータアクセス待ちや演算処理待ちを抑制でき、効果的なループ融合を実現できる。
【実施例２】
【００８７】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【００８８】
（対象プログラム）
実施例１では、ループ融合を判定するための各種データを中間言語から抽出する例で説明したが、これに限定されるものではない。例えば、ソースプログラム１１ａから抽出することもでき、仮想ループの特定はソースプログラム１１ａを用いて実行し、データの抽出は中間言語１１ｂを用いて抽出することもできる。
【００８９】
（演算数）
実施例１では、浮動小数点演算の例としてＭＵＬＴやＡＤＤを例示したが、これに限定されるものではなく、例えばＳＵＢ命令やＤＩＶ命令であっても同様に処理することができる。また、実施例１では、仮想ループを作成してから、演算数やデータ転送数を算出する例を説明したが、これに限定されるものではなく、各ループについて演算数やデータ転送数等を算出してから、仮想ループを生成してもよい。
【００９０】
（最適化）
実施例１では、最適化の例としてループ融合を実行する例を説明したが、上述したループ融合以外の他の最適化処理を実行してもよい。
【００９１】
（ハードウェア）
図１７は、情報処理装置のハードウェア構成例を示す図である。図１７に示すように、情報処理装置１０は、ＣＰＵ（Central  Processing  Unit）１０１、メモリ１０２、ＨＤＤ（Hard  Disk  Drive）１０３、通信インタフェース１０４、入力装置１０５、表示装置１０６を有する。
【００９２】
ＨＤＤ１０３は、図１に示した機能を動作させるプログラムや各ＤＢを記憶する。記録媒体の例としてＨＤＤ１０３を例に挙げたが、ＲＯＭ（Read  Only  Memory）、ＲＡＭ、ＣＤ−ＲＯＭ等の他のコンピュータが読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
【００９３】
通信インタフェース１０４は、ネットワークインタフェースカードなどである。入力装置１０５は、例えばキーボードなどであり、表示装置１０６は、例えばタッチパネルやディスプレイなど、各種情報を表示する表示装置である。
【００９４】
ＣＰＵ１０１は、図１に示した各処理部と同様の処理を実行するプログラムをＨＤＤ１０３等から読み出してメモリ１０２に展開することで、図２等で説明した各機能を実行するプロセスを動作させる。すなわち、このプロセスは、情報処理装置１０が有する各処理と同様の機能を実行する。具体的には、ＣＰＵ１０１は、コンパイラ実行部１２が有する各処理部と同様の機能を有するプログラムをＨＤＤ１０３等から読み出す。そして、ＣＰＵ１０１は、各処理部と同様の処理を実行するプロセスを実行する。
【００９５】
このように情報処理装置１０は、プログラムを読み出して実行することでコンパイル方法を実行する情報処理装置として動作する。また、情報処理装置１０は、媒体読取装置によって記録媒体から上記プログラムを読み出し、読み出された上記プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、情報処理装置１０によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【００９６】
（システム）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９７】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散や統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００９８】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００９９】
（付記１）処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を実行することを特徴とするコンパイラ。
【０１００】
（付記２）前記処理対象のコードに存在する複数のループ各々のループ条件に基づいて、ループ処理を融合する対象の組合せを決定する処理を前記コンパイラがさらに実行し、
前記判定する処理は、決定した各組合せについて、前記処理対象のコードが実行されるシステムの性能情報、および、組み合わせた場合の演算数およびデータ転送数に基づいて、各組合せのループ融合可否を判定することを特徴とする付記１に記載のコンパイラ。
【０１０１】
（付記３）前記判定する処理は、さらに、前記組み合わせた場合の命令数、または、前記組み合わせた各ループがアクセスするメモリのキャッシュライン数を用いて、前記ループ融合可否を判定することを特徴とする付記２に記載のコンパイラ。
【０１０２】
（付記４）前記ループ処理の融合を実行する処理は、前記ループ融合可能と判定された複数の組み合わせに同じループが存在する場合、前記組み合わせた場合のデータ転送数と演算数の比率と、前記システムの性能条件によって特定される閾値との差が小さい組合せに該当するループを融合させることを特徴とする付記２または３に記載のコンパイラ。
【０１０３】
（付記５）コンピュータが、
処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を含んだことを特徴とするコンパイル方法。
【０１０４】
（付記６）メモリと、
前記メモリに接続されるプロセッサとを有し、
前記プロセッサは、処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を実行することを特徴とする情報処理装置。
【０１０５】
（付記７）処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する処理をコンピュータに実行させるコンパイル制御プログラムを記憶する、コンピュータ読み取り可能な記憶媒体。
【符号の説明】
【０１０６】
１０  情報処理装置
１１  記憶部
１１ａ  ソースプログラム
１１ｂ  中間言語
１１ｃ  オブジェクトファイル
１１ｄ  実行ファイル
１２  コンパイラ実行部
１３  ソースプログラム入力部
１４  入出力制御部
１５  中間言語生成部
１６  最適化部
１６ａ  ソース解析部
１６ｂ  組合せ抽出部
１６ｃ  情報抽出部
１６ｄ  比率算出部
１６ｅ  判定部
１６ｆ  融合部
１７  コード生成部
１８  オブジェクトファイル出力部
２０  リンカ
【図１】
2014228891.tif 000003
【図２】
2014228891.tif 000004
【図３】
2014228891.tif 000005
【図４】
2014228891.tif 000006
【図５】
2014228891.tif 000007
【図６】
2014228891.tif 000008
【図７】
2014228891.tif 000009
【図８】
2014228891.tif 000010
【図９】
2014228891.tif 000011
【図１０】
2014228891.tif 000012
【図１１】
2014228891.tif 000013
【図１２】
2014228891.tif 000014
【図１３】
2014228891.tif 000015
【図１４】
2014228891.tif 000016
【図１５】
2014228891.tif 000017
【図１６】
2014228891.tif 000018
【図１７】
2014228891.tif 000019