(57)【要約】【課題】コンパイラによって行われたループ交換に関する情報を容易に取得することを可能とする情報処理装置、コンパイル方法及びコンパイルプログラムを提供する。【解決手段】ソースコードをコンパイルする際に、ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における特定のループに関する第１の情報、または、ループの交換が行われなかった場合における特定のループに関する第２の情報を生成し、生成した第１の情報または第２の情報を出力する。【選択図】図１１
2019028540.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成する情報生成部と、
生成した前記第１の情報または前記第２の情報を出力する情報出力部と、を有する、
ことを特徴とする情報処理装置。
【請求項２】
請求項１において、
前記情報生成部は、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われる場合、前記特定のループに対するループの交換を推奨しないことを示す情報を前記第１の情報として生成する、
ことを特徴とする情報処理装置。
【請求項３】
請求項１において、
前記情報生成部は、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われない場合、前記特定のループに対するループの交換を推奨することを示す情報を前記第２の情報として生成する、
ことを特徴とする情報処理装置。
【請求項４】
請求項２または３において、
前記情報生成部は、前記特定のループにおける１次元目の添え字の値が前記特定のループの最内ループ内において不変であり、前記特定のループにおける２次元目以降の添え字が前記最内ループの制御変数である場合、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われないと判定する、
ことを特徴とする情報処理装置。
【請求項５】
請求項２または３において、
前記情報生成部は、前記特定のループにおける１次元目の添え字が前記特定のループの最内ループの制御変数であり、前記特定のループにおける２次元目の添え字の値が前記最内ループ内において不変である場合、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われると判定する、
ことを特徴とする情報処理装置。
【請求項６】
請求項１において、
前記特定のループは、前記ソースコードに含まれるループから分割された複数のループであり、
前記情報生成部は、前記複数のループのそれぞれについて、前記第１の情報または前記第２の情報の生成を行う、
ことを特徴とする情報処理装置。
【請求項７】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成する情報生成部と、
生成した前記第１の情報または前記第２の情報を出力する情報出力部と、を有する、
ことを特徴とする情報処理装置。
【請求項８】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
ことを特徴とするコンパイル方法。
【請求項９】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
ことを特徴とするコンパイル方法。
【請求項１０】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
処理をコンピュータに実行させることを特徴とするコンパイルプログラム。
【請求項１１】
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
処理をコンピュータに実行させることを特徴とするコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、コンパイル方法及びコンパイルプログラムに関する。
【背景技術】
【０００２】
例えば、ＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｎｐｕｔｉｎｇ）等に用いられるコンパイラは、ソースコードのコンパイルを行う際に、処理速度等の処理性能を向上させるための最適化処理を行う。
【０００３】
具体的に、上記のようなコンパイラは、例えば、ソースコードに含まれる各ループを複数のループに分割するループ分割や、ソースコードに含まれる各ループにおいて用いられる添え字の交換を行うループ交換を行う。これにより、コンパイラは、例えば、ソースコードに対応する処理の実行時におけるメモリアクセスを効率的に行うことが可能になる。そのため、コンパイラは、ソースコードから生成されたオブジェクトコードの実行時におけるＨＰＣの処理性能を向上させることが可能になる（例えば、特許文献１乃至３参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１５−１９４８８１号公報
【特許文献２】特開２００７−２２６５８９号公報
【特許文献３】特開２００５−１２２５０６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記のようなループ分割やループ交換は、例えば、ソースコードの開発者（以下、単に開発者とも呼ぶ）による指定が行われた場合だけでなく、コンパイラの判断によって自動的に行われる場合がある。具体的に、コンパイラは、例えば、開発者によってループ交換を行う旨の指定が行われたループに対しても自動的にループ分割を行う。そして、コンパイラは、この場合、ループ分割によって生成した複数のループのそれぞれに対してループ交換を行う。
【０００６】
ここで、ループ分割によって生成された複数のループのそれぞれに対してループ交換が行われる場合、これらのループ交換には、ＨＰＣの処理性能を向上する観点から行われない方が好ましいループ交換が含まれている場合がある。そのため、開発者は、例えば、コンパイラによって行われたループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かを検証する必要がある。
【０００７】
しかしながら、上記のような検証を行う場合、開発者は、例えば、コンパイラが生成したオブジェクトコードを実機において動作させる必要があり、必要な情報を容易に取得することができない。そのため、開発者は、コンパイラによって行われたループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かについての検証を容易に行うことができない場合がある。
【０００８】
そこで、一つの側面では、コンパイラによって行われたループ交換に関する情報を容易に取得することを可能とする情報処理装置、コンパイル方法及びコンパイルプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
実施の形態の一つの態様によれば、ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成する情報生成部と、生成した前記第１の情報または前記第２の情報を出力する情報出力部と、を有する。
【発明の効果】
【００１０】
一つの側面によれば、コンパイラによって行われたループ交換に関する情報を容易に取得することを可能とする。
【図面の簡単な説明】
【００１１】
【図１】図１は、情報処理システム１０の全体構成を示す図である。
【図２】図２は、情報処理装置１が行うコンパイル処理を説明するフローチャートである。
【図３】図３は、情報処理装置１が行うコード実行処理を説明するフローチャートである。
【図４】図４は、ソースコード１３１の具体例について説明する図である。
【図５】図５は、ソースコード１３１の具体例について説明する図である。
【図６】図６は、ストライドアクセスが行われる場合における具体例を説明する図である。
【図７】図７は、連続アクセスが行われる場合における具体例を説明する図である。
【図８】図８は、情報処理装置１のハードウエア構成を説明する図である。
【図９】図９は、情報処理装置１の機能のブロック図である。
【図１０】図１０は、情報格納領域１３０に記憶された情報のブロック図である。
【図１１】図１１は、Ｓ３の処理の概略について説明するフローチャートである。
【図１２】図１２は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャートである。
【図１３】図１３は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャートである。
【図１４】図１４は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャートである。
【図１５】図１５は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャートである。
【図１６】図１６は、ループ交換が指示されているループの具体例を説明する図である。
【図１７】図１７は、図１６に示すループに対してループ分割が行われた後のループの具体例を説明する図である。
【図１８】図１８は、図１７に示すループに対してループ交換が行われた後のループの具体例を説明する図である。
【図１９】図１９は、図１８（Ａ）に示すループから生成される第１の情報１３５の具体例を説明する図である。
【図２０】図２０は、図１８（Ｂ）に示すループから生成される第１の情報１３５の具体例を説明する図である。
【図２１】図２１は、ループ交換が指示されていないループの具体例を説明する図である。
【図２２】図２２は、図２１に示すループに対してループ分割が行われた後のループの具体例を説明する図である。
【図２３】図２３は、図２２（Ａ）に示すループから生成される第２の情報１３６の具体例を説明する図である。
【図２４】図２４は、図２２（Ｂ）に示すループから生成される第２の情報１３６の具体例を説明する図である。
【図２５】図２５は、第２の推奨情報１３６ｃが追加された第２の情報１３６の具体例を説明する図である。
【図２６】図２６は、第１の推奨情報１３５ｃが追加された第１の情報１３５の具体例を説明する図である。
【発明を実施するための形態】
【００１２】
［情報処理システムの構成］
図１は、情報処理システム１０の全体構成を示す図である。図１に示す情報処理システム１０は、情報処理装置１（コンパイラが動作する情報処理装置）と、記憶装置２と、操作端末３とを含む。図１に示す操作端末３は、操作端末３ａ、３ｂ及び３ｃが含まれている。
【００１３】
情報処理装置１（情報処理装置１のＣＰＵ）は、コンパイルを開始するタイミング（以下、コンパイル開始タイミングとも呼ぶ）になった場合、例えば、記憶装置２に記憶されたソースコード（以下、ソースコード１３１とも呼ぶ）を取得し、取得したソースコード１３１のコンパイルを行う処理（以下、コンパイル処理とも呼ぶ）を行うことによってオブジェクトコード（以下、オブジェクトコード１３３とも呼ぶ）を生成する。コンパイル開始タイミングは、例えば、操作端末３からコンパイルを行う旨の指示を受け付けたタイミングであってよい。
【００１４】
また、情報処理装置１は、オブジェクトコード１３３を実行するタイミング（以下、コード実行タイミングとも呼ぶ）になった場合、コンパイル処理によって生成されたオブジェクトコード１３３を実行する処理（以下、コード実行処理とも呼ぶ）を行う。以下、情報処理装置１が行うコンパイル処理及びコード実行処理について説明を行う。
【００１５】
［情報処理装置によるコンパイル処理］
初めに、情報処理装置１が行うコンパイル処理について説明を行う。図２は、情報処理装置１が行うコンパイル処理を説明するフローチャートである。
【００１６】
情報処理装置１は、図２に示すように、コンパイル開始タイミングまで待機する（Ｓ１のＮＯ）。そして、コンパイル開始タイミングになった場合（Ｓ１のＹＥＳ）、情報処理装置１は、ソースコード１３１の字句解析及び構文解析を行うことにより、中間言語(以下、中間言語１３２とも呼ぶ)を生成する（Ｓ２）。そして、情報処理装置１は、例えば、生成した中間言語１３２を情報格納領域１３０に記憶する。
【００１７】
その後、情報処理装置１は、Ｓ２の処理において生成された中間言語１３２の最適化を行う（Ｓ３）。具体的に、情報処理装置１は、中間言語１３２に含まれるループのそれぞれに対して、ループ分割やループ交換等を行う。
【００１８】
そして、情報処理装置１は、例えば、Ｓ２で最適化を行った中間言語１３２からオブジェクトコード１３３の生成を行う（Ｓ４）。そして、情報処理装置１は、例えば、生成したオブジェクトコード１３３を記憶装置２に記憶する。
【００１９】
これにより、情報処理装置１は、オブジェクトコード１３３の実行時におけるＨＰＣの処理性能の最適化を図ることが可能になる。
【００２０】
［情報処理装置によるコード実行処理］
次に、情報処理装置１が行うコード実行処理について説明を行う。図３は、情報処理装置１が行うコード実行処理を説明するフローチャートである。
【００２１】
情報処理装置１は、図３に示すように、コード実行タイミングまで待機する（Ｓ１１のＮＯ）。そして、コード実行タイミングになった場合（Ｓ１１のＹＥＳ）、情報処理装置１は、Ｓ４の処理で生成したオブジェクトコード１３３の実行を行う（Ｓ１２）。具体的に、情報処理装置１は、例えば、記憶装置２に記憶されたオブジェクトコード１３３を取得して実行する。
【００２２】
［ソースコードの具体例］
続いて、ソースコード１３１の具体例について説明を行う。図４及び図５は、ソースコード１３１の具体例について説明する図である。なお、ソースコード１３１は、Ｆｏｒｔｒａｎによって記述されたソースコードである。
【００２３】
具体的に、図４に示すソースコード１３１において、「ａ（ｉ，ｊ）＝ｂ（ｉ，ｊ）＋ｃ（ｉ，ｊ）」という文字列からなる命令は、二重ループの中に含まれている。また、図４に示すソースコードにおいて、「ｘ（ｊ）＝ｊ」という文字列から命令は、二重ループにおける外側ループの中であって最内ループの外に位置している。
【００２４】
そして、コンパイラは、例えば、Ｓ３の処理において、図４で説明した二重ループに対してループ分割等を行うことにより、図５に示す中間言語１３２を生成する。なお、以下、中間言語１３２をソースコード１３１と同じ形式によって表現する。
【００２５】
具体的に、コンパイラは、図５に示すように、「ｘ（ｊ）＝ｊ」という文字列からなる命令を、図４で説明した二重ループと異なるループの中に含める。
【００２６】
これにより、コンパイラは、図４で説明したソースコード１３１から生成されたオブジェクトコード１３３の実行時において、１つのループ内の処理においてアクセスする必要があるデータの量を減少させることが可能になる。そのため、コンパイラは、例えば、メインメモリに記憶されたキャッシュラインをキャッシュメモリに記憶する回数を抑制することが可能になり、キャッシュメモリに記憶されたデータに対するアクセスが発生した場合におけるキャッシュミスの発生率を抑えることが可能になる。
【００２７】
［メモリアクセスの具体例］
次に、オブジェクトコード１３３の実行時におけるメモリアクセスの具体例について説明を行う。図６は、ストライドアクセスが行われる場合における具体例を説明する図である。また、図７は、連続アクセスが行われる場合における具体例を説明する図である。具体的に、図６（Ａ）は、ストライドアクセスが行われる二重ループの具体例を説明する図であり、図６（Ｂ）は、キャッシュメモリに記憶されたデータに対してストライドアクセスが行われる場合を説明する図である。また、図７（Ａ）は、連続アクセスが行われる二重ループの具体例を説明する図であり、図７（Ｂ）は、キャッシュメモリに記憶されたデータに対して連続アクセスが行われる場合を説明する図である。
【００２８】
なお、以下、ストライドアクセスが、連続する記憶領域に対して順に行われないメモリアクセスのことであり、連続アクセスが、連続する記憶領域に対して順に行われるメモリアクセスのことであるものとして説明を行う。
【００２９】
図６（Ａ）に示す二重ループにおいて、最内ループの制御変数はｊであり、外側ループの制御変数はｉである。また、図６（Ａ）に示す二重ループにおいて、最内ループ及び外側ループの繰返し回数はそれぞれ１０（回）である。そして、図６（Ａ）に示す二重ループの最内ループには、「ａ（ｉ，ｊ）＝ｂ（ｉ，ｊ）＊２＋１」という文字列からなる命令が含まれている。そのため、図６（Ａ）に示す二重ループが実行された場合、配列ａ及び配列ｂの（ｉ，ｊ）には、「（１，１）、（１，２）、（１，３）、・・・（１，９）、（１，１０）、（２，１）、（２，２）、・・・」の順で値が設定される。
【００３０】
一方、図６（Ｂ）に示すキャッシュメモリには、「配列ｂ（１，１）のデータ、配列ｂ（２，１）のデータ、配列ｂ（３，１）のデータ、・・・配列ｂ（９，１）のデータ、配列ｂ（１０，１）のデータ、・・・配列ｂ（１，２）のデータ、配列ｂ（２，２）のデータ、・・・」の順にデータが記憶されている。そのため、図６（Ａ）に示す二重ループの実行時にメモリアクセスが行われる場合、図６（Ａ）に示す二重ループでは、図６（Ｂ）に示すように、ストライド幅が１０のストライドアクセスが行われる。
【００３１】
これに対し、図７（Ａ）に示す二重ループにおいて、最内ループの制御変数がｉであり、外側ループの制御変数がｊである。また、図７（Ａ）に示す二重ループにおいて、最内ループ及び外側ループの繰返し回数はそれぞれ１０（回）である。そして、図７（Ａ）に示す二重ループの最内ループには、「ａ（ｉ，ｊ）＝ｂ（ｉ，ｊ）＊２＋１」という文字列からなる命令が含まれている。そのため、図７（Ａ）に示す二重ループが実行された場合、配列ａ及び配列ｂの（ｉ，ｊ）には、「（１，１）、（２，１）、（３，１）、・・・（９，１）、（１０，１）、（１，２）、（２，２）、・・・」の順で値が設定される。
【００３２】
一方、図７（Ｂ）に示すキャッシュメモリには、図６（Ｂ）で説明した場合と同様に、「配列ｂ（１，１）のデータ、配列ｂ（２，１）のデータ、配列ｂ（３，１）のデータ、・・・配列ｂ（９，１）のデータ、配列ｂ（１０，１）のデータ、・・・配列ｂ（１，２）のデータ、配列ｂ（２，２）のデータ、・・・」の順にデータが記憶されている。そのため、図７（Ａ）に示す二重ループの実行時にメモリアクセスが行われる場合、図７（Ａ）に示す二重ループでは、図７（Ｂ）に示すように、連続アクセスが行われる。
【００３３】
すなわち、開発者は、図７（Ａ）に示す二重ループをＨＰＣに実行させることにより、図６（Ａ）に示す二重ループをＨＰＣに実行させる場合と比較して、オブジェクトコード１３３の実行時における処理性能を高めることが可能になる。そのため、開発者は、例えば、コンパイラに対して、ソースコード１３１のコンパイル時において必要なループ交換を行う旨の指示を予め行う。
【００３４】
ここで、ループ分割やループ交換は、開発者による指定が行われた場合だけでなく、コンパイラの判断によって自動的に行われる場合がある。具体的に、コンパイラは、例えば、開発者によってループ交換を行う旨の指定が行われたループに対してもループ分割を自動的に行う。そして、コンパイラは、この場合、ループ分割によって生成した複数のループのそれぞれに対してループ交換を行う。
【００３５】
そのため、コンパイラが自動的に行ったループ分割によって生成された複数のループのそれぞれに対してループ交換が行われる場合、それらのループ交換には、ＨＰＣの処理性能を向上する観点から行われない方が好ましいループ交換が含まれている場合がある。したがって、開発者は、例えば、上記のようなループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かを検証する必要がある。
【００３６】
しかしながら、上記のような検証を行う場合、開発者は、例えば、コンパイラが生成したオブジェクトコード１３３を実機において動作させる必要があり、必要な情報を容易に取得することができない。そのため、開発者は、上記のようなループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かについての検証を容易に行うことができない場合がある。
【００３７】
そこで、本実施の形態における情報処理装置１は、ソースコード１３１をコンパイルする際に、ソースコード１３１に含まれるループのうち、ループ交換が指示されたループ（以下、第１のループとも呼ぶ）において行われるメモリアクセスの順序に基づいて、ループ交換が行われた場合における第１のループに関する情報（以下、第１の情報とも呼ぶ）、または、ループ交換が行われなかった場合における第１のループに関する情報（以下、第２の情報とも呼ぶ）を生成する。そして、情報処理装置１は、生成した第１の情報または第２の情報を出力する。
【００３８】
また、情報処理装置１は、ソースコード１３１をコンパイルする際に、ソースコード１３１に含まれるループのうち、ループ交換が指示されていないループ（以下、第２のループとも呼ぶ）において行われるメモリアクセスの順序に基づいて、ループ交換が行われた場合における第２のループに関する第１の情報、または、ループ交換が行われなかった場合における第２のループに関する第２の情報を生成する。そして、情報処理装置１は、生成した第１の情報または第２の情報を出力する。
【００３９】
すなわち、情報処理装置１は、例えば、ソースコード１３１のコンパイルが行われる際に、第１のループまたは第２のループ（以下、特定のループとも呼ぶ）において行われるメモリアクセスが連続アクセスであるかストライドアクセスであるか否かを判定する。そして、例えば、特定のループにおいてループ交換が行われる場合であって、その特定のループにおいて連続アクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきでないことを示す情報（第１の情報）を出力する。一方、例えば、特定のループにおいてループ交換が行われない場合であって、その特定のループにおいてストライドアクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきであることを示す情報（第２の情報）を出力する。
【００４０】
これにより、開発者は、情報処理装置１が出力した情報を参照することで、例えば、オブジェクトコード１３３を実機において動作させることなく、コンパイラによって行われたループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かについての検証を容易に行うことが可能になる。
【００４１】
［情報処理装置のハードウエア構成］
次に、情報処理装置１のハードウエア構成について説明する。図８は、情報処理装置１のハードウエア構成を説明する図である。
【００４２】
情報処理装置１は、図８に示すように、プロセッサであるＣＰＵ１０１と、メインメモリ１０２（以下、単にメモリ１０２とも呼ぶ）と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体（ストレージ）１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００４３】
記憶媒体１０４は、記憶媒体１０４内のプログラム格納領域（図示しない）に、コンパイル処理及びコード実行処理を行うプログラム１１０を記憶する。
【００４４】
ＣＰＵ１０１は、図８に示すように、プログラム１１０の実行時に、プログラム１１０を記憶媒体１０４からメモリ１０２にロードし、プログラム１１０と協働することによってコンパイル処理を行う。
【００４５】
記憶媒体１０４は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）やＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等であり、コンパイル処理等を行う際に用いられる情報を記憶する情報格納領域１３０（以下、記憶部１３０とも呼ぶ）を有する。なお、図１で説明した記憶装置２は、例えば、記憶媒体１０４に対応するものであってよい。
【００４６】
また、外部インターフェース１０３は、ネットワークを介して操作端末３と通信を行う。
【００４７】
［情報処理装置のソフトウエア構成］
次に、情報処理装置１のソフトウエア構成について説明する。図９は、情報処理装置１の機能のブロック図である。図１０は、情報格納領域１３０に記憶された情報のブロック図である。
【００４８】
ＣＰＵ１０１は、図９に示すように、プログラム１１０と協働することにより、ループ分割部１１１と、情報生成部１１２と、ループ交換部１１３と、情報出力部１１４と、コード生成部１１５と、コード実行部１１６して動作する。また、情報格納領域１３０には、図１０に示すように、ソースコード１３１と、中間言語１３２と、オブジェクトコード１３３と、ループ分割後情報１３４と、第１の情報１３５（以下、単に第１のループ情報１３５とも呼ぶ）と、第２の情報１３６（以下、単に第２のループ情報１３６とも呼ぶ）とが記憶されている。
【００４９】
なお、以下、ループ分割部１１１、情報生成部１１２、ループ交換部１１３及び情報出力部１１４が、図２で説明したＳ３の処理の少なくとも一部を行うものとして説明を行う。また、コード生成部１１５が、図２で説明したＳ４の処理の少なくとも一部を行うものとして説明を行う。さらに、コード実行部１１６が、図３で説明したＳ１２の処理の少なくとも一部を行うものとして説明を行う。
【００５０】
ループ分割部１１１は、ソースコード１３１に含まれるループに対してループ分割を行う。具体的に、ループ分割部１１１は、ソースコード１３１に対して字句解析や構文解析が行われることによって生成された中間言語１３２に含まれるループのうち、ループ分割を行った方がオブジェクトコード１３３の実行時におけるＨＰＣの処理性能が向上すると判定したループに対してループ分割を行う。
【００５１】
情報生成部１１２は、ソースコード１３１に含まれるループのうち、特定のループにおいて行われるメモリアクセスの順序に基づいて、ループ交換が行われた場合における特定のループに関する第１の情報１３５を生成する。また、情報生成部１１２は、ソースコード１３１に含まれるループのうち、特定のループにおいて行われるメモリアクセスの順序に基づいて、ループ交換が行われなかった場合における特定のループに関する第２の情報１３６を生成する。具体的に、情報生成部１１２は、ループ分割部１１１がループ分割を行うことによって生成した複数のループに関する情報であるループ分割後情報１３４を参照し、第１の情報１３５または第２の情報１３６の生成を行う。
【００５２】
ループ交換部１１３は、ソースコード１３１に含まれるループのうち、ループ交換が指示された特定のループに対してループ交換を行う。ループ交換の指示は、例えば、開発者によってソースコード１３１に予め記述されるものであってよい。
【００５３】
情報出力部１１４は、情報生成部１１２が生成した第１の情報１３５または第２の情報１３６を出力する。具体的に、例えば、情報出力部１１４は、第１の情報１３５または第２の情報１３６を、開発者が閲覧可能な操作端末３に出力する。
【００５４】
コード生成部１１５は、例えば、ループ分割部１１１によるループ分割やループ交換部１１３によるループ交換等が行われた中間言語１３２からオブジェクトコード１３３を生成する。そして、コード生成部１１５は、例えば、生成したオブジェクトコード１３３を情報格納領域１３０に記憶する。
【００５５】
コード実行部１１６は、例えば、コード実行タイミングになった場合、情報格納領域１３０に記憶されたオブジェクトコード１３３を実行する。
【００５６】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明する。具体的に、ここでは、図２で説明したＳ３の処理の概略について説明する。図１１は、Ｓ３の処理の概略について説明するフローチャートである。
【００５７】
ループ分割部１１１は、Ｓ２の処理で生成された中間言語を取得する（Ｓ２１）。そして、ループ分割部１１１は、Ｓ２の処理で生成された中間言語１３２に含まれるループに対してループ分割を行うことにより、複数のループを生成する（Ｓ２２）。
【００５８】
続いて、情報生成部１１２は、Ｓ２２の処理でループ分割が行われた後の複数のループに関する情報であるループ分割後情報１３４を取得する（Ｓ２３）。
【００５９】
その後、情報生成部１１２及びループ交換部１１３は、Ｓ２３の処理で取得したループ分割後情報１３４を参照し、Ｓ２２の処理で生成した複数のループのうち、特定のループにループ交換を行う。また、情報生成部１１２は、ループ交換部１１３によってループ交換が行われる際に、特定のループで行われるメモリアクセスの順序に基づいて、ループ交換が行われた場合における特定のループに関する第１の情報１３５、または、ループ交換が行われなかった場合における特定のループに関する第２の情報１３６を生成する（Ｓ２４）。
【００６０】
そして、情報出力部１１４は、Ｓ２４の処理で生成した第１の情報１３５、または、第２の情報１３６を出力する（Ｓ２５）。
【００６１】
すなわち、情報処理装置１は、例えば、ソースコード１３１のコンパイルが行われる際に、特定のループにおいて行われるメモリアクセスが連続アクセスであるかストライドアクセスであるか否かを判定する。そして、例えば、特定のループにおいてループ交換が行われる場合であって、その特定のループにおいて連続アクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきでないことを示す情報（第１の情報１３５）を出力する。一方、例えば、特定のループにおいてループ交換が行われない場合であって、その特定のループにおいてストライドアクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきであることを示す情報（第２の情報１３６）を出力する。
【００６２】
これにより、開発者は、情報処理装置１が出力した情報を参照することで、例えば、オブジェクトコード１３３を実機において動作させることなく、コンパイラによって行われたループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かについての検証を容易に行うことが可能になる。そして、開発者は、この場合、例えば、ソースコード１３１に含まれるループに対して手動で行うことによって複数のループを生成し、生成した複数のループのうち、情報処理装置１が出力した情報に基づいてループ交換を行うべきであると判定したループに対してのみ、ループ交換の指示を行うことが可能になる。
【００６３】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１２から図１５は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャートである。具体的に、図１２から図１５は、図１１で説明したＳ２４の処理の詳細について説明するフローチャートである。また、図１６から図２６は、第１の実施の形態におけるコンパイル処理の詳細を説明する図である。図１６から図２６を参照しながら、図１２から図１５に示すＳ２４の処理の詳細について説明を行う。
【００６４】
情報生成部１１２は、図１２に示すように、Ｓ２３の処理で取得したループ分割後情報１３４に情報が含まれるループを１つ特定する（Ｓ３１）。
【００６５】
そして、Ｓ３１の処理で特定したループに対してループ交換が指示されている場合（Ｓ３２のＹＥＳ）、ループ交換部１１３は、Ｓ３１の処理で特定したループに対してループ交換を行う（Ｓ３４）。その後、情報生成部１１２は、Ｓ３４の処理でループ交換が行われたループを解析し、Ｓ３４でループ交換が行われたループに対応する第１の情報１３５を生成する（Ｓ３５）。
【００６６】
すなわち、ループ交換部１１３は、この場合、ループ交換が行われた後のループに関する情報を第１の情報１３５として生成する。以下、第１の情報１３５が生成される場合の具体例について説明を行う。
【００６７】
［第１の情報が生成される場合の具体例］
初めに、ループ交換が指示されているループと、ループ分割が行われた後のループと、ループ分割及びループ交換が行われた後のループとの具体例について説明を行う。図１６は、ループ交換が指示されているループの具体例を説明する図である。また、図１７は、図１６に示すループに対してループ分割が行われた後のループの具体例を説明する図である。さらに、図１８は、図１７に示すループに対してループ交換が行われた後のループの具体例を説明する図である。
【００６８】
図１６に示す二重ループにおいて、最内ループの制御変数はｉであり、外側ループの制御変数はｊである。また、図１６に示す二重ループにおいて、最内ループの繰返し回数は１０（回）であり、外側ループの繰返し回数は１００００（回）である。そして、図１６に示す二重ループの最内ループには、「ｂ（ｊ）＝ｂ（ｊ）＋ａ（ｊ，ｉ）」という文字列からなる命令と、「ｃ（ｉ）＝ｃ（ｉ）＋ｄ（ｉ，ｊ）−ｅ（ｉ，ｊ）」という文字列からなる命令とが含まれている。さらに、図１６に示す二重ループの前には、ループ交換を行うことの指示である「！ｉとｊを入れ替える指示」という文字列が記述されている。
【００６９】
そのため、ループ分割部１１１は、Ｓ２１の処理において、図１７（Ａ）及び（Ｂ）に示すように、図１６に示すループを、「ｂ（ｊ）＝ｂ（ｊ）＋ａ（ｊ，ｉ）」が含まれるループと「ｃ（ｉ）＝ｃ（ｉ）＋ｄ（ｉ，ｊ）−ｅ（ｉ，ｊ）」が含まれるループとに分割する。そして、ループ交換部１１３は、Ｓ３４の処理において、ループ交換を行う旨の指示に応じて、図１８（Ａ）及び（Ｂ）に示すように、図１７に示すループに含まれる添え字ｉと添え字ｊとを交換する。
【００７０】
次に、図１８（Ａ）及び（Ｂ）に示すループから生成される第１の情報１３５の具体例について説明を行う。図１９は、図１８（Ａ）に示すループから生成される第１の情報１３５の具体例を説明する図である。また、図２０は、図１８（Ｂ）に示すループから生成される第１の情報１３５の具体例を説明する図である。以下、図１８（Ａ）に示すループから生成される第１の情報１３５を第１の情報１３５ａとも呼び、図１８（Ｂ）に示すループから生成される第１の情報１３５を第１の情報１３５ｂとも呼ぶ。
【００７１】
具体的に、情報生成部１１２は、例えば、図１９に示す第１の情報１３５ａのように、図１８（Ａ）に示すループ全体の情報が設定される「[[ｌｏｏｐｓ]]」の項目に、ループの識別子を示す「ｉｄ」として「“ｌｏｏｐ１＿ｉｎｔｅｒｃｈａｎｇｅｄ”」を設定し、ループの次元数を示す「ｄｉｍｅｎｓｉｏｎ」として「２」を設定し、添え字のアクセス順を示す「ｉｎｄｅｘ」として「“ｊ，ｉ”」を設定する。そして、情報生成部１１２は、例えば、図１９に示す第１の情報１３５ａのように、「[[ｌｏｏｐｓ]]」の項目に、最内ループの添え字を示す「ｉｎｎｅｒｍｏｓｔ  ｌｏｏｐ  ｉｎｄｅｘ」として「“ｊ”」を設定し、ループの繰返し回数を示す「ｉｔｅｒａｔｉｏｎ＿ｃｏｕｎｔ」として「１００００＊１０」を設定し、ループの増分値を示す「ｉｎｃｒｅｍｅｎｔ」として「“１”」を設定する。
【００７２】
また、情報生成部１１２は、例えば、図１９に示す第１の情報１３５ａのように、図１８（Ａ）に示すループに含まれる配列ｂについての情報が設定される１番目の「[[ｌｏｏｐｓ．ａｒｒａｙｓ]]」の項目に、配列に対する演算子を示す「ｏｐｅｒａｔｅｒ」としてブランクを設定し、ソースコード１３１における配列ｂの行番号を示す「ｌｉｎｅ」として「“３”」を設定し、配列名を示す「ｎａｍｅ」として「“ｂ”」を設定する。そして、情報生成部１１２は、例えば、図１９に示す第１の情報１３５ａのように、「[[ｌｏｏｐｓ．ａｒｒａｙｓ]]」の項目に、配列の次元数を示す「ｄｉｍｅｎｓｉｏｎ」として「“１”」が設定され、添え字のアクセス順を示す「ｉｎｄｅｘ」として「“ｊ”」を設定し、参照定義の情報を示す「ｄｅｆ＿ｒｅｆ」として「“ｄｅｆ”」を設定し、配列のサイズを示す「ｓｉｚｅ」として「１００００」を設定する。
【００７３】
なお、図１９に示す第１の情報１３５ａのうち、図１８（Ａ）に示すループに含まれる配列ｂについての情報が設定される２番目の「[[ｌｏｏｐｓ．ａｒｒａｙｓ]]」の項目に設定される情報と、図１８（Ａ）に示すループに含まれる配列ａについての情報が設定される３番目の「[[ｌｏｏｐｓ．ａｒｒａｙｓ]]」の項目に設定される情報とについては説明を省略する。
【００７４】
また、図２０に示す第１の情報１３５ｂに含まれる内容は、図１９で説明した第１の情報１３５ａに含まれる内容と同じである。そのため、図２０に示す第１の情報１３５ｂについては詳細な説明を省略する。
【００７５】
図１２に戻り、Ｓ３１の処理で特定したループに対してループ交換が指示されていない場合（Ｓ３２のＮＯ）、情報生成部１１２は、Ｓ３１の処理で特定したループを解析し、Ｓ３１の処理で特定したループに対応する第２の情報１３６を生成する（Ｓ３３）。
【００７６】
すなわち、ループ交換部１１３は、この場合、ループ交換が行われなかった場合のループに関する情報を第２の情報１３６として生成する。以下、第２の情報１３６が生成される場合の具体例について説明を行う。
【００７７】
［第２の情報が生成される場合の具体例］
初めに、ループ交換が指示されていないループと、ループ分割が行われた後のループとの具体例について説明を行う。図２１は、ループ交換が指示されていないループの具体例を説明する図である。また、図２２は、図２１に示すループに対してループ分割が行われた後のループの具体例を説明する図である。
【００７８】
図２１に示す二重ループにおいて、最内ループの制御変数はｉであり、外側ループの制御変数はｊである。また、図２１に示す二重ループにおいて、最内ループのループ回数は１０（回）であり、外側ループのループ回数は１００００（回）である。そして、図２１に示す二重ループには、「ｂ（ｊ）＝ｂ（ｊ）＋ａ（ｊ，ｉ）」という文字列からなる命令と、「ｃ（ｉ）＝ｃ（ｉ）＋ｄ（ｉ，ｊ）−ｅ（ｉ，ｊ）」という文字列からなる命令とが含まれている。なお、図２１に示す二重ループの前には、ループ交換を行うことの指示が記述されていない。
【００７９】
そのため、ループ分割部１１１は、Ｓ２１の処理において、図２２（Ａ）及び（Ｂ）に示すように、図２１に示すループを、「ｂ（ｊ）＝ｂ（ｊ）＋ａ（ｊ，ｉ）」が含まれるループと「ｃ（ｉ）＝ｃ（ｉ）＋ｄ（ｉ，ｊ）−ｅ（ｉ，ｊ）」が含まれるループとに分割する。なお、ループ交換部１１３は、この場合、図１８で説明した場合と異なり、図２１に示すループに含まれる添え字ｉと添え字ｊとの交換を行わない。
【００８０】
そして、図２３は、図２２（Ａ）に示すループから生成される第２の情報１３６の具体例を説明する図である。また、図２４は、図２２（Ｂ）に示すループから生成される第２の情報１３６の具体例を説明する図である。以下、図２２（Ａ）に示すループから生成される第２の情報１３６を第２の情報１３６ａとも呼び、図２２（Ｂ）に示すループから生成される第２の情報１３６を第２の情報１３６ｂとも呼ぶ。
【００８１】
図２３に示す第２の情報１３６ａ及び図２４に示す第２の情報１３６ｂに含まれる内容は、図１９で説明した第１の情報１３５ａに含まれる内容と同じである。そのため、図２３に示す第２の情報１３６ａ及び図２４に示す第２の情報１３６ｂについては詳細な説明を省略する。
【００８２】
図１２に戻り、Ｓ３３またはＳ３５の処理の後、情報生成部１１２は、図１３に示すように、Ｓ３１の処理で特定したループに含まれる配列を１つ特定する（Ｓ４１）。
【００８３】
そして、Ｓ４１の処理で特定した配列が多次元配列である場合（Ｓ４２のＹＥＳ）、情報生成部１１２は、Ｓ４１の処理で特定した配列の１次元目の添え字の値が、最内ループ内で不変であるか否かを判定する（Ｓ４３）。
【００８４】
その結果、Ｓ４１の処理で特定した配列の１次元目の添え字の値が最内ループ内で不変であると判定した場合（Ｓ４４のＹＥＳ）、情報生成部１１２は、Ｓ４１の処理で特定した配列の２次元目以降の添え字が、最内ループの制御変数であるか否かを判定する（Ｓ４５）。
【００８５】
そして、Ｓ４１の処理で特定した配列の２次元目以降の添え字が最内ループの制御変数であると判定した場合（Ｓ４６のＹＥＳ）、情報生成部１１２は、図１５に示すように、Ｓ３１の処理で特定したループに対してループ交換が指示されているか否かを判定する（Ｓ６１）。
【００８６】
その結果、Ｓ３１の処理で特定したループに対してループ交換が指示されてないと判定した場合（Ｓ６１のＮＯ）、情報生成部１１２は、Ｓ４１の処理で特定した配列について、ループ交換を推奨することを示す情報（以下、第２の推奨情報１３６ｃとも呼ぶ）を生成する（Ｓ６２）。一方、Ｓ３１の処理で特定したループに対してループ交換が指示されていると判定した場合（Ｓ６１のＹＥＳ）、情報生成部１１２は、Ｓ６２の処理を行わない。
【００８７】
すなわち、Ｓ４１の処理で特定した配列の１次元目の添え字の値が最内ループ内で不変であって、Ｓ４１の処理で特定した配列の２次元目以降の添え字のいずれかが最内ループの制御変数である場合、情報生成部１１２は、Ｓ４１の処理で特定した配列において行われるメモリアクセスがストライドアクセスであると判定する。そのため、情報生成部１１２は、Ｓ４１の処理で特定した配列を含むループ（Ｓ３１の処理で特定したループ）がループ交換を行うべきループであると判定する。具体的に、情報生成部１１２は、この場合、Ｓ４１の処理で特定した配列を含むループが、２次元目以降の添え字のうち、最内ループの制御変数であった添え字と、１次元目の添え字とを交換すべきループであると判定する。したがって、情報生成部１１２は、Ｓ３１の処理で特定したループに対してループ交換が指示されていない場合、Ｓ４１の処理で特定した配列に関し、Ｓ３１の処理で特定したループに対してループ交換を行うべきことを推奨する情報（第２の推奨情報１３６ｃ）の生成を行う。
【００８８】
なお、情報生成部１１２は、第２の推奨情報１３６ｃを生成した場合、Ｓ３３の処理で生成した第２の情報１３６に第２の推奨情報１３６ｃを追加するものであってよい。以下、第２の推奨情報１３６ｃが追加された第２の情報１３６の具体例について説明を行う。
【００８９】
［第２の推奨情報が追加された第２の情報の具体例］
図２５は、第２の推奨情報１３６ｃが追加された第２の情報１３６ａの具体例を説明する図である。
【００９０】
図２２（Ａ）に示す例において、ループに含まれる配列ａの１次元目の添え字ｊの値は、最内ループの制御変数がｉであるため不変である。そして、配列ａの２次元目の添え字ｉは、最内ループの制御変数である。さらに、図２２（Ａ）に示すループには、ループ交換の指示が記述されていない。そのため、例えば、Ｓ３１の処理において図２２（Ａ）に示すループが特定され、Ｓ４１の処理において配列ａが特定された場合、情報生成部１１２は、Ｓ６２の処理において、配列ａに関し、図２２（Ａ）に示すループに対してループ交換を行った方がＨＰＣの処理性能を向上させることができることを示す第２の推奨情報１３６ｃの生成を行う。
【００９１】
そのため、情報生成部１１２は、例えば、図２５に示すように、図２３で説明した第２の情報１３６ａのうちの配列ａに対応する情報に対し、「ｈｉｎｔ=“ループ交換を指定した方が実行効率の向上を図ることができます”」という内容の第２の推奨情報１３６ｃを追加する。
【００９２】
これにより、情報生成部１１２は、ソースコード１３１のコンパイル時において、例えば、コンパイルを行った開発者に対し、ＨＰＣの処理性能を向上させるための情報を提供することが可能になる。そのため、開発者は、例えば、コンパイラが生成したオブジェクトコード１３３を実機において動作させることなく、ＨＰＣの処理性能を向上させるための情報を容易に取得することが可能になる。
【００９３】
図１３に戻り、Ｓ４１の処理で特定した配列の１次元目の添え字の値が最内ループ内で不変でないと判定した場合（Ｓ４４のＮＯ）、または、Ｓ４１の処理で特定した配列の２次元目以降の添え字が最内ループの制御変数でないと判定した場合（Ｓ４６のＮＯ）、情報生成部１１２は、図１４に示すように、情報生成部１１２は、Ｓ４１の処理で特定した配列の１次元目の添え字が、最内ループの制御変数であるか否かを判定する（Ｓ５１）。
【００９４】
その結果、Ｓ４１の処理で特定した配列の１次元目の添え字が最内ループの制御変数であると判定した場合（Ｓ５２のＹＥＳ）、情報生成部１１２は、Ｓ４１の処理で特定した配列の２次元目以降の添え字の値が、最内ループ内で不変であるか否かを判定する（Ｓ５３）。
【００９５】
そして、Ｓ４１の処理で特定した配列の２次元目以降の添え字の値が最内ループ内で不変であると判定した場合（Ｓ５４のＹＥＳ）、情報生成部１１２は、図１５に示すように、Ｓ３１の処理で特定したループに対してループ交換が指示されているか否かを判定する（Ｓ６５）。
【００９６】
その結果、Ｓ３１の処理で特定したループに対してループ交換が指示されていると判定した場合（Ｓ６５のＹＥＳ）、情報生成部１１２は、Ｓ４１の処理で特定した配列について、ループ交換を推奨しないことを示す情報（以下、第１の推奨情報１３５ｃとも呼ぶ）を生成する（Ｓ６６）。一方、Ｓ３１の処理で特定したループに対してループ交換が指示されていないと判定した場合（Ｓ６５のＮＯ）、情報生成部１１２は、Ｓ６６の処理を行わない。
【００９７】
すなわち、情報生成部１１２は、Ｓ４１の処理で特定した配列において行われるメモリアクセスがストライドアクセスでないと判定した場合、Ｓ４１の処理で特定した配列において行われるメモリアクセスが連続アクセスであるか否かの判定を行う。具体的に、情報生成部１１２は、Ｓ４１の処理で特定した配列の１次元目の添え字が最内ループの制御変数であって、Ｓ４１の処理で特定した配列の２次元目以降の添え字の値が最内ループ内で不変である場合、Ｓ４１の処理で特定した配列において行われるメモリアクセスが連続アクセスであると判定する。そのため、情報生成部１１２は、この場合、Ｓ４１の処理で特定した配列を含むループ（Ｓ３１の処理で特定したループ）がループ交換を行うべきではないループであると判定する。したがって、情報生成部１１２は、Ｓ３１の処理で特定したループに対してループ交換が指示されている場合、Ｓ４１の処理で特定した配列に関し、Ｓ３１の処理で特定したループに対してループ交換を行うべきことを推奨しない情報（第１の推奨情報１３５ｃ）の生成を行う。
【００９８】
なお、情報生成部１１２は、第１の推奨情報１３５ｃを生成した場合、Ｓ３５の処理で生成した第１の情報１３５に第１の推奨情報１３５ｃを追加するものであってよい。以下、第１の推奨情報１３５ｃが追加された第１の情報１３５の具体例について説明を行う。
【００９９】
［第１の推奨情報が追加された第１の情報の具体例］
図２６は、第１の推奨情報１３５ｃが追加された第１の情報１３５の具体例を説明する図である。
【０１００】
図１８（Ｂ）に示す例において、ループに含まれる配列ｄの１次元目の添え字ｉの値は、最内ループの制御変数がｊであるため不変である。そして、配列ｄの２次元目の添え字ｊは、最内ループの制御変数である。さらに、図１８（Ｂ）に示すループには、ループ交換の指示が記述されている。そのため、例えば、Ｓ３１の処理において図１８（Ｂ）に示すループが特定され、Ｓ４１の処理において配列ｄが特定された場合、情報生成部１１２は、Ｓ６６の処理において、配列ｄに関し、図１８（Ｂ）に示すループに対してループ交換を行わない方がＨＰＣの処理性能を向上させることができることを示す第１の推奨情報１３５ｃの生成を行う。同様に、情報生成部１１２は、図１８（Ｂ）に示すループに含まれる配列ｅに関しても同様に、第１の推奨情報１３５ｃの生成を行う。
【０１０１】
そのため、情報生成部１１２は、例えば、図２６に示すように、図２０で説明した第１の情報１３５のうちの配列ｄに対応する情報に対し、「ｈｉｎｔ=“ループ交換を指定しない方が実行効率の向上を図ることができます”」という内容の第１の推奨情報１３５ｃを追加する。また、情報生成部１１２は、図２０で説明した第１の情報１３５のうちの配列ｅに対応する情報に対しても同様に、「ｈｉｎｔ=“ループ交換を指定しない方が実行効率の向上を図ることができます”」という内容の第１の推奨情報１３５ｃを追加する。
【０１０２】
これにより、情報生成部１１２は、ソースコード１３１のコンパイル時において、例えば、コンパイルを行った開発者に対し、ＨＰＣの処理性能を向上させるための情報を提供することが可能になる。そのため、開発者は、例えば、コンパイラが生成したオブジェクトコード１３３を実機において動作させることなく、ＨＰＣの処理性能を向上させるための情報を容易に取得することが可能になる。
【０１０３】
図１５に戻り、Ｓ６２の処理、または、Ｓ６６の処理の後、情報生成部１１２は、Ｓ４１の処理で配列の全ての特定が完了したか否かを判定する（Ｓ６３）。なお、Ｓ４１の処理で特定した配列が多次元配列でない場合（Ｓ４２のＮＯ）、Ｓ４１の処理で特定した配列の１次元目の添え字が最内ループの制御変数でないと判定した場合（Ｓ５２のＮＯ）、または、Ｓ４１の処理で特定した配列の２次元目以降の添え字の値が最内ループ内で不変でないと判定した場合も同様に（Ｓ５４のＮＯ）、情報生成部１１２は、Ｓ６３の処理を行う。
【０１０４】
その結果、Ｓ４１の処理で全ての配列の特定が完了したと判定した場合（Ｓ６３のＹＥＳ）、情報生成部１１２は、Ｓ３１の処理で全てのループの特定が完了したか否かを判定する（Ｓ６４）。一方、Ｓ４１の処理で全ての配列の特定が完了していないと判定した場合（Ｓ６３のＮＯ）、情報生成部１１２は、Ｓ４１以降の処理を再度行う。
【０１０５】
そして、Ｓ３１の処理で全てのループの特定が完了したと判定した場合（Ｓ６４のＹＥＳ）、情報処理装置１は、Ｓ２４の処理を終了する。一方、Ｓ３１の処理で全てのループの特定が完了したと判定した場合（Ｓ６４のＮＯ）、情報生成部１１２は、Ｓ３１以降の処理を再度行う。
【０１０６】
図１１に戻り、情報出力部１１４は、Ｓ２４の処理で生成した第１の情報または第２の情報を出力する（Ｓ２５）。具体的に、情報出力部１１４は、Ｓ２で生成された中間言語１３２に含まれる各ループのそれぞれについて、Ｓ２４の処理で生成した第１の情報または第２の情報の出力を行う。
【０１０７】
このように、本実施の形態における情報処理装置１は、ソースコード１３１をコンパイルする際に、ソースコード１３１に含まれるループのうち、ループ交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループ交換が行われた場合における特定のループに関する第１の情報１３５、または、ループ交換が行われなかった場合における特定のループに関する第２の情報１３６を生成する。そして、情報処理装置１は、生成した第１の情報１３５または第２の情報１３６を出力する。
【０１０８】
すなわち、情報処理装置１は、例えば、ソースコード１３１のコンパイルが行われる際に、特定のループにおいて行われるメモリアクセスが連続アクセスであるかストライドアクセスであるか否かを判定する。そして、例えば、特定のループにおいてループ交換が行われる場合であって、その特定のループにおいて連続アクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきでないことを示す情報（第１の情報１３５）を出力する。一方、例えば、特定のループにおいてループ交換が行われない場合であって、その特定のループにおいてストライドアクセスが行われると判定した場合、情報処理装置１は、その特定のループにおいてループ交換を行うべきであることを示す情報（第２の情報１３６）を出力する。
【０１０９】
これにより、開発者は、情報処理装置１が出力した情報を参照することで、例えば、オブジェクトコード１３３を実機において動作させることなく、コンパイラによって行われたループ交換のそれぞれが、ＨＰＣの処理性能を向上するために必要であったか否かについての検証を容易に行うことが可能になる。
【０１１０】
以上の実施の形態をまとめると、以下の付記の通りである。
【０１１１】
（付記１）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成する情報生成部と、
生成した前記第１の情報または前記第２の情報を出力する情報出力部と、を有する、
ことを特徴とする情報処理装置。
【０１１２】
（付記２）
付記１において、
前記情報生成部は、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われる場合、前記特定のループに対するループの交換を推奨しないことを示す情報を前記第１の情報として生成する、
ことを特徴とする情報処理装置。
【０１１３】
（付記３）
付記１において、
前記情報生成部は、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われない場合、前記特定のループに対するループの交換を推奨することを示す情報を前記第２の情報として生成する、
ことを特徴とする情報処理装置。
【０１１４】
（付記４）
付記２または３において、
前記情報生成部は、前記特定のループにおける１次元目の添え字の値が前記特定のループの最内ループ内において不変であり、前記特定のループにおける２次元目以降の添え字が前記最内ループの制御変数である場合、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われないと判定する、
ことを特徴とする情報処理装置。
【０１１５】
（付記５）
付記２または３において、
前記情報生成部は、前記特定のループにおける１次元目の添え字が前記特定のループの最内ループの制御変数であり、前記特定のループにおける２次元目の添え字の値が前記最内ループ内において不変である場合、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われると判定する、
ことを特徴とする情報処理装置。
【０１１６】
（付記６）
付記１において、
前記特定のループは、前記ソースコードに含まれるループから分割された複数のループであり、
前記情報生成部は、前記複数のループのそれぞれについて、前記第１の情報または前記第２の情報の生成を行う、
ことを特徴とする情報処理装置。
【０１１７】
（付記７）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成する情報生成部と、
生成した前記第１の情報または前記第２の情報を出力する情報出力部と、を有する、
ことを特徴とする情報処理装置。
【０１１８】
（付記８）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
ことを特徴とするコンパイル方法。
【０１１９】
（付記９）
付記８において、
前記生成する工程では、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われる場合、前記特定のループに対するループの交換を推奨しないことを示す情報を前記第１の情報として生成する、
ことを特徴とするコンパイル方法。
【０１２０】
（付記１０）
付記８において、
前記生成する工程では、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われない場合、前記特定のループに対するループの交換を推奨することを示す情報を前記第２の情報として生成する、
ことを特徴とするコンパイル方法。
【０１２１】
（付記１１）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
ことを特徴とするコンパイル方法。
【０１２２】
（付記１２）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示された特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
処理をコンピュータに実行させることを特徴とするコンパイルプログラム。
【０１２３】
（付記１３）
付記１２において、
前記生成する工程では、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われる場合、前記特定のループに対するループの交換を推奨しないことを示す情報を前記第１の情報として生成する、
ことを特徴とするコンパイルプログラム。
【０１２４】
（付記１４）
付記１２において、
前記生成する工程では、前記特定のループにおいて行われる前記メモリアクセスが、連続する記憶領域に対して順に行われない場合、前記特定のループに対するループの交換を推奨することを示す情報を前記第２の情報として生成する、
ことを特徴とするコンパイルプログラム。
【０１２５】
（付記１５）
ソースコードをコンパイルする際に、前記ソースコードに含まれるループのうち、ループの交換が指示されていない特定のループにおいて行われるメモリアクセスの順序に基づいて、ループの交換が行われた場合における前記特定のループに関する第１の情報、または、ループの交換が行われなかった場合における前記特定のループに関する第２の情報を生成し、
生成した前記第１の情報または前記第２の情報を出力する、
処理をコンピュータに実行させることを特徴とするコンパイルプログラム。
【符号の説明】
【０１２６】
１：情報処理装置          ２：記憶装置
３：操作端末              １０１：ＣＰＵ
１０２：メモリ            １０３：Ｉ／Ｏユニット
１０４：記憶媒体          １３０：情報格納領域
【図１】
2019028540.tif 000003
【図２】
2019028540.tif 000004
【図３】
2019028540.tif 000005
【図４】
2019028540.tif 000006
【図５】
2019028540.tif 000007
【図６】
2019028540.tif 000008
【図７】
2019028540.tif 000009
【図８】
2019028540.tif 000010
【図９】
2019028540.tif 000011
【図１０】
2019028540.tif 000012
【図１１】
2019028540.tif 000013
【図１２】
2019028540.tif 000014
【図１３】
2019028540.tif 000015
【図１４】
2019028540.tif 000016
【図１５】
2019028540.tif 000017
【図１６】
2019028540.tif 000018
【図１７】
2019028540.tif 000019
【図１８】
2019028540.tif 000020
【図１９】
2019028540.tif 000021
【図２０】
2019028540.tif 000022
【図２１】
2019028540.tif 000023
【図２２】
2019028540.tif 000024
【図２３】
2019028540.tif 000025
【図２４】
2019028540.tif 000026
【図２５】
2019028540.tif 000027
【図２６】
2019028540.tif 000028