(57)【要約】【課題】プログラムのコンパイルにおけるプログラムの最適化に関し、コンパイラが実行する最適化の中間段階に対する指示に基づいて、プログラムに対する最適化の指示をコンパイラの使用者の負担なく行えるようにして、コンパイラが持つ最適化機能による実行性能の向上効果を引き出す。【解決手段】最適化適用対象の抽出部１０１は、ソースプログラムまたは最適化適用結果の中間プログラム１１０と、最適化指示ファイル１２０を入力とし、最適化指示を抽出する。最適化適用正当性の判定部１０２は、最適化指示の正当性を確認する。最適化適用妥当性の判定部１０３は、最適化指示を適用することによる実行性能向上の可能性を判断する。最適化指示ファイルによって、プログラムの最初の状態からの最適化指示を適用順に従って与えることにより、最初の状態には存在しない中間段階のプログラムの部分に対する最適化指示を与えることが可能となる。【選択図】図１
2015194881.tif 000002
【特許請求の範囲】
【請求項１】
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出部と、
前記最適化指示の正当性を確認する最適化適用正当性の判定部と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定部と、
を備えることを特徴とするコンパイル装置。
【請求項２】
前記最適化適用妥当性の判定部は、前記最適化指示の適用において当該最適化指示に対応する前記プログラム最適化の中間段階のプログラムの部分が満たすべき適用条件の充足度を判定することにより前記プログラムの部分ごとに前記実行性能向上の可能性を判断する、
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記最適化適用対象の抽出部は、前記プログラムと前記最適化指示ファイルを入力し、当該最適化指示ファイルから最適化を適用する部分と最適化の種類および内容を抽出して、前記プログラムの部分との対応付けを行う、
ことを特徴とする請求項１または２のいずれかに記載のコンパイル装置。
【請求項４】
前記最適化適用正当性の判定部は、前記最適化指示に基づいて前記プログラムに対して最適化の指示を仮適用し、当該仮適用の結果前記プログラム内のデータの依存関係が変化しないか否かを解析することにより、前記仮適用した最適化の指示により前記プログラムが正しく実行されるか否かを判定する、
ことを特徴とする請求項１ないし３のいずれかに記載のコンパイル装置。
【請求項５】
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分が、キャッシュのサイズに納まること、または前記プログラムの部分を構成するループ処理間にデータ依存があることのいずれかの条件を含む、
ことを特徴とする請求項２ないし４のいずれかに記載のコンパイル装置。
【請求項６】
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内の配列変数データに対するアクセスがキャッシュのサイズに納まること、または当該プログラムの部分内で前記配列変数データの再利用があることのいずれかの条件を含む、
ことを特徴とする請求項２ないし５のいずれかに記載のコンパイル装置。
【請求項７】
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内の配列変数データに対するアクセスが連続になることの条件を含む、
ことを特徴とする請求項２ないし６のいずれかに記載のコンパイル装置。
【請求項８】
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内でデータ依存がなくなることの条件を含む、
ことを特徴とする請求項２ないし７のいずれかに記載のコンパイル装置。
【請求項９】
前記最適化の適用条件は、前記最適化の指示の種類ごとに予め設定され、前記最適化の指示の種類は、ループ融合指示、ループ分割指示、ループ交換指示、ループ逆転指示、ループ傾斜指示、ループ細分指示、ループタイル化指示の少なくとも１つを含む、
ことを特徴とする請求項２ないし８のいずれかに記載のコンパイル装置。
【請求項１０】
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出処理と、
前記最適化指示の正当性を確認する最適化適用正当性の判定処理と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定処理と、
をコンピュータに実行させるためのコンパイラプログラム。
【請求項１１】
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出処理と、
前記最適化指示の正当性を確認する最適化適用正当性の判定処理と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定処理と、
をコンピュータに実行させるためのコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
プログラムのコンパイルにおけるプログラムの最適化に関する。
【背景技術】
【０００２】
従来、プログラムの最初の状態に対して、特定の部分に最適化指示行を挿入して特定の最適化を指示する手段が、一般的なコンパイラにおいて知られている。
【０００３】
最適化の効率を向上させる従来技術として、次のような技術が知られている（例えば特許文献１に記載の技術）。この従来技術は、基本最適化機能のいずれとも異なる第二の最適化機能を有する第二最適化単機能処理手段を備える。最適化単機能履歴情報生成手段はさらに、第二最適化単機能処理手段が行った最適化に関する履歴情報を、基本最適化機能を組み合わせた形式で生成する第二最適化単機能履歴情報生成手段を含む。
【０００４】
最適化の効率を向上させる他の従来技術として、次のような技術が知られている（例えば特許文献２に記載の技術）。最適化命令と非最適化命令（通常命令）とを含むプログラム中のある命令が最適化命令か否かを判別し、最適化命令の場合にのみ最適化処理を行ない、最適化命令のみに対するポインタの集合からなる最適化命令テーブルを作成する。最適化処理でサイズの変化した命令があると、最適化命令テーブルに最適化命令が残っていない状態になるまで、最適化命令テーブルを用いて再度最適化処理を行なう。最適化処理でサイズの変化した命令がなくなると、つまり、サイズの変化が収束すると最適化処理を終了する。
【０００５】
最適化の効率を向上させるさらに他の従来技術として、次のような技術が知られている（例えば特許文献３に記載の技術）。評価プログラム生成部は、ループ処理を含む計算機用プログラム部分に適用する最適化指示文を、複数の最適化指示文の中から一つずつ選択して、各ループ（プログラム部分）の直前に挿入する。これと共に、評価プログラム生成部は、各ループの実行時間を計測するためのコードを生成し、評価プログラムを作成する。コンパイル・実行部は、この評価プログラムをコンパイル、実行し、各ループの実行時間を計測する。最適オプション決定部は、計測結果に基づきループ毎に最高速となる最適化指示文を検出する。最適化指示文挿入部１０９は、最適化指示文を各ループの直前に挿入したプログラムを生成する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１０−２１０８６号公報
【特許文献２】特開２００４−２１４９８号公報
【特許文献３】特開２００３−１７３２６２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、上述の従来技術では、コンパイラが持つ最適化機能による実行性能の向上効果を十分に引き出せなかった。
【０００８】
そこで、本発明の１つの側面では、コンパイラが実行する最適化の中間段階に対する指示に基づいて、コンパイラが持つ最適化機能による実行性能のさらなる向上効果を引き出すことを目的とする。
【課題を解決するための手段】
【０００９】
態様の一例では、最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出部と、最適化指示の正当性を確認する最適化適用正当性の判定部と、最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定部と、を備える。
【発明の効果】
【００１０】
コンパイラが実行する最適化の中間段階に対する指示に基づいて、コンパイラが持つ最適化機能による実行性能のさらなる向上効果を引き出すことが可能となる。
【図面の簡単な説明】
【００１１】
【図１】本発明によるコンパイル装置の実施形態の構成を示す図である。
【図２】最適化適用対象の抽出処理プログラムの処理例を示すフローチャートである。
【図３】最適化適用正当性の判定処理の詳細例を示すフローチャートである。
【図４】データ依存関係の解析処理の説明図（その１）である。
【図５】データ依存関係の解析処理の説明図（その２）である。
【図６】最適化適用条件シナリオテーブルの例を示す図である。
【図７】適用条件が「内側ループで配列アクセスが連続になること」である場合における動作例の説明図である。
【図８】最適化適用妥当性の判定処理の詳細例を示すフローチャートである。
【図９】ソースプログラムのイメージの例を示した図（その１）である。
【図１０】最適化指示ファイル１２０（図１）の記述例を示す図である。
【図１１】最適化動作の説明図（その１）である。
【図１２】最適化動作の説明図（その２）である。
【図１３】最適化動作の説明図（その３）である。
【図１４】ソースプログラムのイメージの例を示した図（その２）である。
【図１５】最適化動作の説明図（その４）である。
【図１６】各ループ操作指示に対する最適化動作の説明図（その１）である。
【図１７】各ループ操作指示に対する最適化動作の説明図（その２）である。
【図１８】最適化指示によって実行性能が改善するソースプログラムの例を示す図である。
【図１９】図１８のソースプログラムに対するループ融合指示後の最適化の状態を示す図である。
【図２０】図１９の中間段階のソースプログラムイメージに対するループ分割指示後の最適化の状態を示す図である。
【図２１】本実施形態による最適化の効果を示す図である。
【図２２】ループと識別子の対応の例を示す図である。
【図２３】本実施形態によるコンパイラプログラムを実行可能なコンピュータのハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
通常のコンパイラの最適化技術では、コンパイラが行った最適化の特定の部分に対して、さらなる最適化を指示して行うことができない。また、プログラムの最初の状態からの最適化を指示する場合においても、１回以上の最適化を適用した後の最初の状態に存在しない部分に対して、部分を特定した最適化を指示することができない。具体例としては、コンパイラが自動的な判断でループ融合の最適化を適用した場合、その最適化に引き続いて、融合した位置とは別の位置でループを分割する最適化を使用者が行いたい場合でも、この最適化を指示することができない。
【００１３】
上述のような行いたい最適化の指示ができないことによって、コンパイラが持つ最適化機能による実行性能の向上効果を引き出せない可能性がある。
【００１４】
さらに、コンパイラの使用者が、最適化した結果が正しいこと及び最適化を適用した方が実行性能が向上することを確認した上で最適化を指示することは使用者の負担である。
【００１５】
以下に説明するコンパイラの実施形態では、コンパイラが持つ最適化機能による実行性能のさらなる向上効果を引き出すことを可能とするものである。
【００１６】
図１は、本発明によるコンパイル装置１００の実施形態の構成を示す図である。コンパイル装置１００は、最適化適用対象の抽出部１０１、最適化適用正当性の判定部１０２、最適化適用妥当性の判定部１０３、および最適化適用処理部１０４を備える。これらの機能によって、コンパイラが構成される。以下の説明において、単に「コンパイラ」というときは、コンパイル装置１００が上記の各機能を実行することによって実現される機能またはプログラムを指す。
【００１７】
最適化適用対象の抽出部１０１は、ソースプログラムまたは最適化適用結果の中間プログラム（以下「プログラム」と記載する）１１０と、最適化指示ファイル１２０を入力とし、最適化指示を抽出する。例えば、最適化適用対象の抽出部１０１は、最適化指示ファイル１２０から最適化を適用する部分と最適化の内容を抽出する。これにより、最適化適用対象の抽出部１０１は、最適化指示ファイル１２０とプログラム１１０の部分との対応付けを行う。最適化適用対象の抽出部１０１は、最適化指示ファイル１２０によって、コンパイラが行う最適化の中間段階に対する指示及び、プログラム１１０の最初の状態に存在しない部分に対して、部分を特定して最適化を指示することができる。ここで、最適化の中間段階とは、コンパイラがプログラムに対して１回以上の最適化を行った後であってまだ最適化が完了していない段階をいう。より具体的には、最適化適用対象の抽出部１０１は、最適化指示ファイル１２０によって、コンパイラが自動で行う最適化適用後の状態に対して、さらなる最適化を指示することが可能である。最適化適用対象の抽出部１０１は特に、最適化指示ファイル１２０によって、プログラム１１０中のループに対して適用したい最適化の順番および組合せを任意に指示することを可能とする。ループに対して指示可能とする最適化は例えば、ループ融合、ループ分割、ループ逆転、ループ交換、ループ傾斜、ループ細分(ストリップマイニング)、ループタイル化である。これらの最適化の詳細については、後述する。
【００１８】
最適化適用正当性の判定部１０２は、最適化指示による最適化の結果、プログラム１１０が正しく実行されるか否か、すなわち最適化指示の正当性を確認する。例えば、最適化適用正当性の判定部１０２は、最適化適用対象の抽出部１０１が抽出した最適化指示に基づいてプログラム１１０に対して最適化の指示を仮適用する。ここで、仮適用とは、最適化の指示を取り消すことができるように元のプログラム１１０の状態をメモリ等に退避させた上で、最適化の指示を適用することをいう。最適化適用正当性の判定部１０２は、その仮適用の結果、プログラム１１０内のデータの依存関係が変化したか否かを判定する。最適化適用正当性の判定部１０２は、プログラム１１０内のデータの依存関係が変化しない場合にプログラム１１０が正しく実行されて最適化が正当と判定し、データの依存関係が変化した場合にプログラム１１０が正しく実行されず最適化が不当と判定する。最適化適用正当性の判定部１０２は、最適化が不当であると判定した場合には、プログラム１１０に対する最適化の仮適用を取り消して、プログラム１１０の状態を最適化適用前の状態に戻す。
【００１９】
最適化適用妥当性の判定部１０３は、最適化指示を適用することによる実行性能向上の可能性を判断する。例えば、最適化適用妥当性の判定部１０３は、最適化指示の適用においてその最適化指示に対応するプログラム１１０の部分が満たすべき適用条件の充足度を判定することによりプログラム１１０の部分ごとに実行性能向上の可能性（例えば実行時間の短縮化）を判断する。
【００２０】
最適化適用処理部１０４は、最適化適用妥当性の判定部１０３で所定の充足度が満たされた仮適用された最適化を正式な最適化適用結果１３０として、プログラム１１０に反映させて出力する。
【００２１】
以上により、最適化指示ファイル１２０を用いて記述を行うことにより、コンパイラが実行する最適化の中間段階に対する指示を最初から行うことができる。すなわち、コンパイラが行った最適化の特定部分に対してさらなる最適化の指示を行うことができる。これにより、プログラムに対する最適化の指示をコンパイラの使用者の負担なく行えるようになった上に、コンパイラが持つ最適化機能による実行性能のさらなる向上効果を引き出すことが可能となる。
【００２２】
図２は、コンピュータのＣＰＵ（中央演算処理装置）が、図１の最適化適用対象の抽出部１０１の機能を実現するために、例えば外部記憶装置からメモリに読み出して実行する最適化適用対象の抽出処理プログラムの処理例を示すフローチャートである。
【００２３】
まず、例えば外部記憶装置から最適化指示ファイル１２０がメモリに読み込まれ、最適化指示ファイル１２０の先頭が取り出し位置とされる（ステップＳ２０１）。
【００２４】
次に、最適化指示ファイル１２０から最適化の指示対象が取り出される（ステップＳ２０２）。最適化の指示対象は例えば、最適化を実行すべきプログラム１１０内の特定のループ処理である。
【００２５】
次に、最適化指示ファイル１２０から、ステップＳ２０２の最適化の指示対象に続いて記述されている最適化の種類と適用内容が取り出される（ステップＳ２０３）。最適化の種類は、ステップＳ２０２の最適化の指示対象に対してどのような処理を実行するかを示す処理内容であり、例えば、ループ融合、ループ分割、ループ交換、ループ逆転、ループ傾斜、ループタイル化などである。これらの詳細については、後述する。最適化の適用内容は、ステップＳ２０２の最適化の指示対象に対して上記最適化の種類の処理を実行するときの具体的な内容であり、例えば、上記最適化の種類の処理が実行されるときの、最適化の指示対象に対する相手となるプログラム１１０内の特定のループ処理である。より具体的には、例えば最適化の指示対象がプログラム１１０内の「ループ１」で、最適化の種類が「ループ融合」であった場合に、融合される相手としてのプログラム１１０内の「ループ２」が最適化の適用内容である。
【００２６】
次に、ステップＳ２０２の最適化の指示対象に対応するプログラム１１０の部分が取り出される（ステップＳ２０４）。
【００２７】
その後、最適化適用正当性の判定処理が実行される（ステップＳ２０５）。この処理では、図２の最適化適用正当性の判定部１０２の機能と、そこから呼び出される最適化適用妥当性の判定部１０３の機能および最適化適用処理部１０４の機能が実行され、プログラム１１０に対する最適化適用結果１３０（図１）が出力される。
【００２８】
その後、最適化指示ファイル１２０の取り出し位置が１行進められる（ステップＳ２０６）。
【００２９】
そして、最適化指示ファイル１２０の末尾に到達したか否かが判定される（ステップＳ２０７）。
【００３０】
ステップＳ２０７の判定がＮＯならば、ステップＳ２０２で最適化指示ファイル１２０から取り出された最適化の指示対象に対する指示が終了したか否かが判定される（ステップＳ２０８）。
【００３１】
ステップＳ２０８の判定がＮＯならば、ステップＳ２０３の処理に戻って、次の最適化の種類と適用内容が取り出され、プログラム１１０に最適化が適用されてゆく。
【００３２】
最適化の指示対象に対する指示が終了しステップＳ２０８の判定がＹＥＳになると、ステップＳ２０２の処理に戻り、最適化指示ファイル１２０から次の最適化の指示対象が取り出され、その指示対象に対して最適化が適用されてゆく。次の最適化の指示対象は例えば、最初の「ループ１」に対するプログラム１１０の最適化結果の中間段階における「ループ１」あるいは別の「ループ２」などである。
【００３３】
最適化指示ファイル１２０からの読み出しが末尾に到達しステップＳ２０７の判定がＮＯになると、図２の最適化適用対象の抽出処理が終了する。
【００３４】
図３は、図２のステップＳ２０５の最適化適用正当性の判定処理の詳細例を示すフローチャートである。
【００３５】
まず、図２のステップＳ２０４でプログラム１１０から取り出されたステップＳ２０２の最適化の指示対象に対応するプログラム１１０の部分に対して、ステップＳ２０３で取り出された最適化の種類と適用内容に対応する最適化が仮適用される（ステップＳ３０１）。このとき、最適化前の状態がメモリ等に退避される。
【００３６】
次に、最適化適用後のプログラム１１０の部分の状態に対して、データ依存関係が解析される（ステップＳ３０２）。
【００３７】
ステップＳ３０２の処理の結果、データ依存関係が変化したか否かが判定される（ステップＳ２０３）。
【００３８】
データ依存関係が変化せずステップＳ２０３の判定がＮＯならば、最適化は正当であると判定されて（ステップＳ３０４）、最適化適用妥当性の判定処理へ進む（ステップＳ３０５）。この処理では、図１の最適化適用妥当性の判定部１０３の機能および最適化適用処理部１０４の機能が実行される。この処理の後、図３のフローチャートの処理が終了し、図２のステップＳ２０５の最適化適用正当性の判定処理が終了する。
【００３９】
データ依存関係が変化してステップＳ３０３の判定がＹＥＳになると、最適化は不当であると判定される（ステップＳ３０６）。そして、図２のステップＳ２０４のプログラム１１０の部分の状態が、ステップＳ３０１でメモリ等に保存してあった最適化前の状態に戻される（ステップＳ３０７）。その後、図３のフローチャートの処理が終了し、図２のステップＳ２０５の最適化適用正当性の判定処理が終了する。
【００４０】
上述した図３のフローチャートで示される最適化適用正当性の判定処理において、ステップＳ３０２で実行されるデータの依存関係の解析の処理について説明する。
【００４１】
図４は、データ依存関係の解析処理の説明図（その１）である。図４（ａ）に示されるプログラムの部分に対して、ループ分割の最適化をして図４（ｂ）に示されるようにする場合を例に説明する。ここで、「ループ分割」とは、プログラムの部分中の１つのループ処理を複数のループ処理に変換する最適化をいう。図４（ａ）のプログラムの部分におけるデータ依存関係は、「文２でA[i]を定義した後に、文１でA[i-1]を参照する。」である。これに対して、最適化後の図４（ｂ）のプログラムの部分におけるデータ依存関係は、「文１でA[i-1]を参照した後に、文２でA[i]を定義する。」となる。この場合、図４（ａ）と図４（ｂ）とでは、明らかにデータ依存関係が変化してしまうため、この最適化（ループ分割）は不当であると判定される。
【００４２】
データ依存関係が存在する場合、２つの実行順序を変更するとデータ依存関係が変化して、実行結果が変化する可能性があるため、そのようなプログラム変換をコンパイラが行ってはならない。
【００４３】
図５は、データ依存関係の解析処理の説明図（その２）である。
図５（ａ）に例示されるプログラムの部分の中のForループにおけるデータ依存関係は、文１の「A[a*i+b]」（「*」は乗算の演算を示す）と文２の「A[c*i+d]」がメモリ上の同じ場所である時に発生する。「A[a*i+b]」と「A[c*i+d]」がメモリ上の同じ場所になるのは、これらの添字が等しい場合である。これを式で表すと、以下の関係になる。
a*s+b = c*t+d  ・・・（１）
【００４４】
上記（１）式のs,tの整数解がForループによるループ範囲(1<=s,t<N)の中に存在するかどうかを解析することが、データ依存関係の解析である。解が存在すればデータ依存関係あり、解が存在しなければデータ依存関係なしと判定することができる。
【００４５】
データ依存解析の対象の配列変数が多次元配列の場合には、次元毎に方程式を立て、連立方程式を解く必要がある。このような連立方程式は、例えば、下記文献に記載の多面体解析を用いた解法を採用することができる。
Nixolas Vasilache, “Violated Dependence Analysis”, ICS06, 2006
【００４６】
データ依存関係の解析処理の簡単な例について、図５（ｂ）のプログラムの部分の例を用いて説明する。この例において、左辺側の配列変数Ａ［ｉ］の添字ｉをｓとし、右辺側の配列変数Ａ［ｉ−１］の添字ｉ−１をｔ−１としたとき、Ａ［ｉ］とＡ［ｉ−１］がメモリ上の同じ場所となるのはこれらの添字が等しい場合であるとする。ここで、添字ｉは、実際にはメモリ上に確保されている変数であるが、以後の説明では単に「添字」と呼ぶことにする。この場合、データ依存関係の解析の連立方程式は、次式となる。
s=t-1
2<=s<=10
2<=t<=10
・・・（２）
【００４７】
上記（２）を解くと、
s=k
t=k+1
2<=k<=9
・・・（３）
となる。この結果、2<=k<=9であるループの繰返し値kで定義される配列変数A[k]と、値k+1で参照される配列変数A[k]との間にデータ依存解が存在することがわかる。
【００４８】
図６は、図３のステップＳ３０５の最適化適用妥当性の判定処理において参照される、例えば外部記憶装置からメモリに読み出されて記憶される最適化適用条件シナリオテーブルの例を示す図である。図１の説明で前述したように、最適化適用正当性の判定処理が実行する最適化適用正当性の判定部１０２の機能では、最適化指示の適用においてその最適化指示に対応するプログラム１１０の部分が満たすべき適用条件の充足度が判定される。これにより、プログラム１１０の部分ごとに実行性能向上の可能性が判断される。そこで、本実施形態では、最適化指示に対応するプログラム１１０の部分ごとに、その部分に対して適用される、最適化の種類とその種類に対応する適用条件の組の羅列が、図６に例示される最適化適用条件シナリオテーブルとして、外部記憶装置またはメモリ等に記憶される。
【００４９】
図６の例において、「No」列の数値１、２、３、４、５が、或るプログラム１１０の部分に対して適用されるシナリオを構成する最適化の種類ごとの適用条件である。
【００５０】
「最適化の種類」列には、「ループ融合」「ループ分割」「ループ交換」「ループ細分」「ループタイル化」「ループ逆転」「ループ傾斜」等の最適化の種類が登録される。「ループ融合」は、複数のループを１つのループにする最適化である。「ループ分割」は、１つのループを複数のループにする最適化である。「ループ交換」は、多重ループの入れ子の順序を入れ替える最適化である。「ループ細分(ストリップマイニング)」は、回転数ｎのループをｍに細分して（ｎ＞ｍ）、それを（ｎ／ｍ）回繰り返すようにする最適化である。「ループタイル化」は、多重ループに対してループ細分をする最適化である。「ループ逆転」は、ループの繰返しの順序を逆にする最適化である。「ループ傾斜」は、外側ループの制御変数を内側ループの制御変数に加える最適化である。
【００５１】
「適用条件」列には、「最適化の種類」列に登録される上記最適化の種類ごとに、その最適化の種類を適用できるための適用条件が登録される。
【００５２】
最適化の種類が「ループ融合」の場合には、適用条件は「融合後にキャッシュサイズに納まること、もしくは、ループ間にデータ依存があること」である。キャッシュサイズに納まるか否かは例えば、コンパイルされるプログラム１１０が実行される対象となるコンピュータ（ターゲットマシン）により決まるキャッシュサイズと、ループ内でアクセスされる配列変数の範囲とが比較されることにより、判定される。ループ間にデータ依存があるか否かは例えば、前述した図３のステップＳ３０２と同様のデータ依存関係の解析処理が実行されることにより、判定される。「融合後にキャッシュサイズに納まる」という適用条件が満たされることにより、プログラムの実行時にもっぱらキャッシュに対するアクセス頻度が高くなり、主記憶メモリに対するアクセス頻度が低くなる。この結果、プログラム１１０の実行時間が短くなって実行性能が向上する。「ループ間にデータ依存があること」という適用条件が満たされることにより、ループ融合によってデータ依存があるデータ同士が１つのループにまとめられる。この結果、それらのデータが例えばキャッシュに納まる可能性が高くなったりアクセスの連続性が高まったりして、プログラム１１０の実行時間が短くなって実行性能が向上する。
【００５３】
最適化の種類が「ループ分割」の場合には、適用条件は「ループ内の配列アクセスがキャッシュサイズに納まること。ループ内で配列の再利用があること」である。ループ内で再利用される配列をそれぞれ別々のループ内に入れることにより、それぞれのループ実行時に、それぞれのループ内のデータが例えばキャッシュに納まる可能性が高くなったりアクセスの連続性が高まったりする。この結果、プログラム１１０の実行時間が短くなって実行性能が向上する。
【００５４】
最適化の種類が「ループ交換」の場合には、適用条件は「内側ループで配列アクセスが連続になること」である。配列アクセスが連続か否かは例えば、配列変数がメモリ上にどのように配置されているかと、ループ内でどのような順番でアクセスされるかとが比較されて、判定される。例えば、Ｃ言語で記述されたプログラムの場合、２次元の配列変数A[10][5]は、メモリ上にA[1][1]，A[1][2]，A[1][3]，A[1][4]，A[1][5]，A[2][1]，A[2][2]，・・・のような順番に配置される。このケースの場合、例えば図７（ａ）に示されるプログラムの部分では、内側のForループにおいて、配列変数A[i][j]の、上述のようにメモリ上で連続するほうの添字「j」が順次インクリメントされてゆくので、連続アクセスと判定される。一方、例えば図７（ｂ）に示されるプログラムの部分では、内側のForループにおいて、配列変数A[j][i]の、上述のようにメモリ上で連続していないほうの添字「j」が順次インクリメントされてゆくので、連続アクセスではないと判定される。内側ループ内での配列アクセスが連続になることにより、例えばメモリアクセスにおけるアクセス領域が連続となってメモリアクセスが高速化される可能性が高くなり、プログラム１１０の実行時間が短くなって実行性能が向上する。
【００５５】
最適化の種類が「ループ細分」または「ループタイル化」の場合には、適用条件は「内側ループでの配列アクセスがキャッシュサイズに納まること」である。キャッシュサイズに納まるか否かの判定は、「ループ融合」の場合と同様である。
【００５６】
「ループ逆転」または「ループ傾斜」の場合には、適用条件は「変換後にデータ依存がなくなること」である。データ依存がなくなるか否かの判定は、「ループ融合」の場合と同様である。
【００５７】
図８は、図３のステップＳ３０５の最適化適用妥当性の判定処理の詳細例を示すフローチャートである。この処理では、メモリ上等に記憶される図６に例示される最適化適用条件シナリオテーブルを用いた制御動作が実行される。
【００５８】
まず、図２のステップＳ２０３の最適化の種類ごとに、図６に例示される最適化適用条件シナリオテーブルが参照される。この結果、最適化についての適用条件がコンパイラ内部（メモリ）から取り出される。このときの最適化の種類ごとの適用条件の数をＤｎ、各適用条件をＤ（ｉ）、ｉ＝１〜Ｄｎとする（以上、ステップＳ８０１）。
【００５９】
次に、メモリ上の変数ｉの初期値が０に設定される（ステップＳ８０２）。
次に、プログラム１１０の部分が適用条件Ｄ（ｉ＋１）を満たすか否かが判定される（ステップＳ８０３）。
ステップＳ８０３の判定がＹＥＳならば、添字ｉの値が＋１される（ステップＳ８０４）。
【００６０】
その後、添字ｉの値がＤｎに等しくなったか否かが判定される（ステップＳ８０５）。
ステップＳ８０５の判定がＮＯならば、ステップＳ８０３の処理に戻って、処理が繰り返される。
【００６１】
上述の繰り返しにおいて、プログラム１１０の部分が適用条件Ｄ（ｉ＋１）を満たさなくなりステップＳ８０３の判定がＮＯになると、その時点で繰り返し処理が打ち切られてステップＳ８０８に移行する。
【００６２】
添字ｉの値がＤｎに等しくなってステップＳ８０５の判定がＹＥＳになると、プログラム１１０の部分が適用条件Ｄ（ｉ）を全て満たすか否かが判定される（ステップＳ８０６）。
【００６３】
ステップＳ８０６の判定がＹＥＳならば、図２のステップＳ２０３の最適化の種類と適用内容に対応する最適化が実施される（ステップＳ８０７）。すなわち、プログラム１１０の部分が、最適化指示ファイル１２０によって最適化条件Ｄ（ｉ）で指定された全ての適用条件を満たすとき、その適用条件に対応する最適化種類の最適化が実施される。その後、図８のフローチャートの処理が終了し、図３のステップＳ３０５の最適化適用妥当性の判定処理が終了する。
【００６４】
ステップＳ８０６の判定がＮＯとなるか、ステップＳ８０３の判定がＮＯとなると、コンパイラの使用者が値Ｘをオプション指定し、かつ、適用条件Ｄ（ｉ＋１）を満たした数ｉの値をＤｎで割って１００を乗算したパーセント値が算出される。そして、そのパーセント値がオプション指定された値Ｘ以上であるか否かが判定される（以上、ステップＳ８０８）。ここで、使用者がオプション指定する値Ｘは、Ｄｎ個の適用条件をどれだけ満たすかという充足率（パーセント）を表す。例えば、Ｄｎ個の適用条件のうちｍ個が満たされる場合は、ｍ÷Ｄｎ×１００（パーセント）の値がＸ以上であるか否かが判定される。
【００６５】
ステップＳ８０８の判定がＹＥＳならば、図２のステップＳ２０３の最適化の種類と適用内容に対応する最適化が実施される（ステップＳ８０７）。その後、図８のフローチャートの処理が終了し、図３のステップＳ３０５の最適化適用妥当性の判定処理が終了する。
【００６６】
ステップＳ８０８の判定がＮＯならば、最適化は実施されず（ステップＳ８０９）、図８のフローチャートの処理が終了し、図３のステップＳ３０５の最適化適用妥当性の判定処理が終了する。
【００６７】
以上説明した図２、図３、および図８のフローチャートによって示される本実施形態によるコンパイラの動作例について、以下に説明する。
【００６８】
ソースプログラムまたは最適化適用結果である中間プログラムに対して、部分を特定して指示された最適化について、上述のフローチャートによる処理によって、最適化を適用した結果が正しいと判定され、かつ、最適化を適用した方が実行性能が向上すると判定された場合に、最適化が適用される。
【００６９】
図９は、ソースプログラムのイメージの例を示した図である。このソースプログラム例に対して、以下のような最適化をしたい場合を例に説明する。
・ループ融合指示: ループ１とループ２を融合する。
・ループ分割指示: ループ融合指示で融合したループの実行文２と実行文３の間で分割する。
・ループ交換指示: ループ分割指示で分割された２番目のループの入れ子を交換する。
【００７０】
図１０は、上述の最適化を指示するための最適化指示ファイル１２０（図１）の記述例を示す図である。図１０において、「＠Loop1」や「＠Loop2」は、図２のステップＳ２０２で取り出される最適化の指示対象である。
【００７１】
「Fusion(＠Loop2)」はループ融合指示を示す最適化指示である。図２のステップＳ２０３において、「Fusion」が認識されることにより、「ループ融合」という最適化の種類が取り出される。また、括弧内の「＠Loop2」が認識されることにより、ループ２をループ１に融合するという適用内容が取り出される。
【００７２】
「Fission(＠2)」はループ分割指示を示す最適化指示である。図２のステップＳ２０３において、「Fission」が認識されることにより「ループ分割」という最適化の種類が取り出される。また、括弧内の「＠2」が認識されることによって、ループ融合後の２番目の文の後で２つループに分割するという適用内容が取り出される。
【００７３】
「Interchange(＠1,＠2)」はループ交換指示を示す最適化指示である。図２のステップＳ２０３において、「Interchange」が認識されることにより「ループ交換」という最適化の種類が取り出される。また、括弧内の「＠1,＠2」が認識されることによって、指定されている最適化の指示対象内の１番目の入れ子のループ（＠1）と２番目の入れ子のループ（＠2）を交換するという適用内容が取り出される。
【００７４】
上述の最適化指示のうち、ループ融合指示は、従来技術により、例えば図９のソースプログラム上に記述することが可能である。しかし、ループ分割指示およびループ交換指示は、ループ融合指示の結果に対する指示であるため、従来技術では、図９のソースプログラム上に記述することはできなかった。これに対して本実施形態では、図１０の最適化指示ファイル１２０に最初からループ分割指示およびループ交換指示を記述することが可能となる。本実施形態では、最適化を指示するための最適化指示ファイル１２０を用いて最適化指示をした後のさらなる最適化指示を行えるようになる。これにより、プログラムに対する最適化の指示をコンパイラの使用者の負担なく行えるようになった上に、コンパイラが持つ最適化機能による実行性能のさらなる向上効果を引き出すことが可能となる。
【００７５】
コンパイラの使用者は、図６に例示した最適化適用条件シナリオテーブルの設定内容の裏返しとして、最適化指示ファイル１２０に各ループ操作指示を記述する。すなわち例えば、ソースプログラム内のループが大きくてキャッシュに収まりそうになければ、ループ分割を指示する。また、或る内側ループで配列が連続アクセスとなりそうになければ、ループ交換を指示する。さらに、内側ループでキャッシュに納まらりそうになければ、ループ細分やループタイル化を指示する。
【００７６】
前述した図２のフローチャートの最適化適用対象の抽出処理によって、図１０に例示される最適化指示ファイル１２０から、最適化の指示対象と、最適化の種類および適用内容が、順次取り出される。
【００７７】
まず、図１０に例示される最適化指示ファイル１２０から、図１１（ａ）に示される最適化指示の部分が取り出される。この最適化指示の部分に基づいて、前述した図３のフローチャートの最適化適用正当性の判定処理および図８のフローチャートの最適化適用妥当性の判定処理が実行されることにより、ループ１とループ２が融合される。すなわち、最適化指示の仮適用の結果、図８のステップＳ８０１で取り出された最適化条件Ｄ（ｉ）で指定された全ての適用条件を満たすとき、あるいは一定の割合以上を満たすときに、その適用条件に対応する最適化種類の最適化が確定する。この結果、図９に示されるソースプログラムイメージは、図１１（ｂ）に示される中間段階のソースプログラムイメージに最適化される。すなわち、ループ２内で実行されていた実行文２が、ループ１内で実行文１とともに実行されるように最適化される。
【００７８】
次に、図１０に例示される最適化指示ファイル１２０から、さらに最適化指示の部分が取り出されて、図１２（ａ）に示される如くとなる。この最適化指示の部分に基づいて、図１１（ｂ）の融合結果において、２番目の文（＠2）の後でループ２とループ３という２つの２重ループに分割されて、その２重ループ内で実行文３が実行されるように最適化される。この結果、図１１（ｂ）に示される中間段階のソースプログラムイメージは、図１２（ｂ）に示される中間段階のソースプログラムイメージに最適化される。
【００７９】
最後に、図１０に例示される最適化指示ファイル１２０から、さらに最適化指示の部分が取り出されて、図１３（ａ）に示される如くとなる。この最適化指示の部分に基づいて、図１２（ｂ）の分割結果において、２番目のループ２の１番目の入れ子（＠1）のループ２と２番目の入れ子（＠2）のループ３が交換される。この結果、図１２（ｂ）に示される中間段階のソースプログラムイメージは、図１３（ｂ）に示される最終段階のソースプログラムイメージに最適化される。
【００８０】
以上のようにして、図１０に例示される最適化指示ファイル１２０によって、図９に例示されるソースプログラムイメージが、図１３（ｂ）に例示される最終段階のソースプログラムイメージに最適化される。
【００８１】
図１４は、ソースプログラムのイメージのより具体的な例を示した図である。このソースプログラムイメージに対して、前述した図１０の最適化指示ファイル１２０による最適化が実行される場合の動作について、説明する。
【００８２】
まず、図１０に例示される最適化指示ファイル１２０から、図１１（ａ）に示される最適化指示の部分が取り出される。
この最適化指示の部分に基づいて、前述した図３のフローチャートの最適化適用正当性の判定処理および図４のフローチャートの最適化適用妥当性の判定処理が実行されることにより、図１４の１番目のForループと２番目のForループが融合される。この結果、図１４に示されるソースプログラムイメージは、図１５（ａ）に示される中間段階のソースプログラムイメージに最適化される。すなわち、図１４において２番目のForループ内で実行されていた配列変数B[i]への代入文が、図１５（ａ）では、配列変数A[i]への代入文とともに１番目のForループ内で実行されるように最適化される。
【００８３】
次に、図１０に例示される最適化指示ファイル１２０から、さらに最適化指示の部分が取り出されて、図１２（ａ）に示される如くとなる。この最適化指示の部分に基づいて、図１５（ａ）の融合結果において、２番目のForループ文（＠2）の後で２つの２重Forループに分割されて、その２重Forループ内で配列変数C[j][i]への代入文が実行されるように最適化される。この結果、図１５（ａ）に示される中間段階のソースプログラムイメージは、図１５（ｂ）に示される中間段階のソースプログラムイメージに最適化される。
【００８４】
最後に、図１０に例示される最適化指示ファイル１２０から、さらに最適化指示の部分が取り出されて、図１３（ａ）に示される如くとなる。この最適化指示の部分に基づいて、図１５（ｂ）の分割結果において、２番目のForループの１番目の入れ子（＠1）のForループと２番目の入れ子（＠2）のForループが交換される。この結果、図１５（ｂ）に示される中間段階のソースプログラムイメージは、図１５（ｃ）に示される最終段階のソースプログラムイメージに最適化される。
【００８５】
以上のようにして、図１０に例示される最適化指示ファイル１２０によって、図１４に例示されるソースプログラムイメージが、図１５（ｃ）に例示される最終段階のソースプログラムイメージに最適化される。
【００８６】
図１０に例示される最適化指示ファイル１２０によって、図１４のソースプログラムイメージに対して、以下に示される最適化効果が得られる。まず、ループ融合指示によって、配列変数Aを同一ループ内で使用することによるキャッシュの効率化を図ることが可能となる。また、ループ分割指示によって、配列Cによって配列変数A,Bがキャッシュから追い出されることを防ぐことが可能となる。さらに、ループ交換指示によって、最内ループにおける配列変数Cのアクセスが連続になることによる処理の高速化を図ることが可能となる。
【００８７】
従来のコンパイラおいては、ループ融合指示相当の最適化がコンパイラによる判断で自動的に行われる場合でも，その後にループ分割する最適化指示を与えることができなかった。これに対して、本実施形態によるコンパイラにおける最適化指示方式では、図１０に例示されるループ分割指示によって、ループ融合後にループ分割という最適化指示を与えることができる。さらにその後の最適化指示として、ループ交換指示のように与えることができるようになる。このような指示が可能になることによって、上記のような最適化効果を狙って、コンパイラの最適化を動作させることができるようになる。
【００８８】
図１６と図１７は、図１０で説明したループ融合，ループ分割，ループ交換以外に本実施形態のコンパイラが実施可能な、ループ逆転、ループ傾斜、ループ細分(ストリップマイニング)、ループタイル化等の各ループ操作指示に対する最適化動作の説明図である。
【００８９】
図１６（ａ）は、ループ逆転の最適化指示に対する最適化動作の説明図である。ループ逆転指示により、Forループの繰返し順序が逆転される最適化が実行される。
【００９０】
図１６（ｂ）は、ループ傾斜の最適化指示に対する最適化動作の説明図である。ループ傾斜指示により、外側のForループの変数iが内側のForループの変数jに加えられる最適化が実行される。
【００９１】
図１７（ｃ）は、ループ細分（ストリップマイニング）の最適化指示に対する最適化動作の説明図である。ループ細分（ストリップマイニング）指示により、Forループの回転が大きさkに細分化される最適化が実行される。
【００９２】
図１７（ｄ）は、ループタイル化の最適化指示に対する最適化動作の説明図である。ループタイル化指示により、内側ループでk1×k2の範囲をアクセスするように２重ループそれぞれをループ細分する最適化が実行される。
【００９３】
図１８は、最適化指示によって実行性能が改善するソースプログラムの例を示す図である。また、図１９は、図１８のソースプログラムに対するループ融合指示後の最適化の状態を示す図である。さらに、図２０は、図１９の中間段階のソースプログラムイメージに対するループ分割指示後の最適化の状態を示す図である。
【００９４】
図１８から図２０において、ループ内で使われる配列変数x1,x2,x3,x4,x5,y1,y2の要素数は、各々N=524288個である。各配列変数はdouble型なので、１要素の大きさは８バイトとなる。従って、個々の配列変数のサイズは、N×8=494304バイト=4メガバイトとなる。図１８で、配列変数x1〜x5を含むループでアクセスされるデータサイズは、4×5=20メガバイトである。
【００９５】
これに対して、ループ融合された図１９のループ内でアクセスされる配列変数のデータサイズは、4×7=28メガバイトになる。キャッシュサイズが20メガバイトの場合、図１９のループ内でアクセされる配列変数は、キャッシュに乗り切らずにあふれてしまい(キャッシュミス)、キャッシュに乗り切る場合よりも実行性能が低下する。
【００９６】
これを、図２０のようにループ分割すると、いずれのループもキャッシュに乗り切るので、性能が改善する。なお、元の図１８の場合は、１番目のループでキャッシュに乗せたデータを２番目のループであふれさせれしまっているので、図２０の最適化結果よりも性能が悪い。よって、本実施形態のコンパイラにより、図１８、図１９、図２０の順で最適化を行うことにより、プログラムの実行性能を向上させることが可能となる。
【００９７】
図２１は、本実施形態による最適化の効果を示す図である。或る計算機（キャッシュメモリ20MB）での実行において、実行時間は図２１に示されるようになる。従来のコンパイラによって自動最適化でループ融合だけを行った場合よりも、本実施形態のコンパイラによってループ融合後にループ分割を行った場合の方が、実行性能が改善することが可能となる。
【００９８】
本実施形態のコンパイラにおける最適化指示方式は、指示する最適化機能の種別を限定するものではないが、特にループ対する最適化を制御可能にするために、最適化対象のループを特定することが可能な最適化指示ファイルの形式とする。図１０で例示した最適化指示ファイルのデータ構成例では、@Loop1,@Loop2のようにループ毎に追番を付けたラベルでループが特定されている。
【００９９】
このほか、最適化指示ファイルは、ループの出現位置が特定できる識別子を備えればよく、例えばループの深さだけの桁数を持ち、同じ深さにおけるループの出現順序(0,1,2,…)を値としてもつ数値によっても識別可能である。図２２は、このような識別子とループとの対応の例を示す図である。
【０１００】
識別子０および１は、１番目の階層の１番目および２番目の各Forループを示している。
【０１０１】
識別子００および０１は、１番目の階層の１番目のForループ内の、２番目の階層の１番目および２番目の各Forループを示している。同様に、識別子１０は、１番目の階層の２番目のForループ内の、２番目の階層の１番目のForループを示している。
【０１０２】
識別子０１０および０１１は、１番目の階層の２番目のForループ内の、３番目の階層の１番目および２番目の各Forループを示している。同様に、識別子１００は、１番目の階層の１番目のForループ内の、３番目の階層の１番目のForループを示している。
【０１０３】
ループ対する最適化の制御を特に考慮する理由は、一般にプログラムにおいて実行時間の比率が高い部分はループであるからである。
【０１０４】
図２３は、本実施形態によるコンパイラプログラムを実行可能なコンピュータのハードウェア構成例を示す図である。
【０１０５】
図２３に示されるコンピュータは、ＣＰＵ２３０１、メモリ２３０２、入力装置２３０３、出力装置２３０４、外部記憶装置２３０５、可搬記録媒体２３０９が挿入される可搬記録媒体駆動装置２３０６、及び通信インタフェース２３０７を有し、これらがバス２３０８によって相互に接続された構成を有する。同図に示される構成は図１の機能を備えるコンパイル装置１００を実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
【０１０６】
ＣＰＵ２３０１は、当該コンピュータ全体の制御を行う。メモリ２３０２は、プログラムの実行、データ更新等の際に、外部記憶装置２３０５（或いは可搬記録媒体２３０９）に記憶されているプログラム又はデータを一時的に格納するＲＡＭ等のメモリである。ＣＵＰ２３０１は、プログラムをメモリ２３０２に読み出して実行することにより、全体の制御を行う。
【０１０７】
入力装置２３０３は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をＣＰＵ２３０１に通知する。
【０１０８】
出力装置２３０４は、ＣＰＵ２３０１の制御によって送られてくるデータを表示装置や印刷装置に出力する。
【０１０９】
外部記憶装置２３０５は、例えばハードディスク記憶装置である。主に各種データやプログラムの保存に用いられる。
【０１１０】
可搬記録媒体駆動装置２３０６は、光ディスクやＳＤＲＡＭ、コンパクトフラッシュ（登録商標）等の可搬記録媒体２３０９を収容するもので、外部記憶装置２３０５の補助の役割を有する。
【０１１１】
通信インターフェース２３０７は、例えばＬＡＮ（ローカルエリアネットワーク）又はＷＡＮ（ワイドエリアネットワーク）の通信回線を接続するための装置である。
【０１１２】
本実施形態によるシステムは、図２、図３、および図８のフローチャート等で実現される機能を搭載したプログラムをＣＰＵ２３０１が実行することで実現される。そのプログラムは、例えば外部記憶装置２３０５や可搬記録媒体２３０９に記録して配布してもよく、或いは通信インタフェース２３０７によりネットワークから取得できるようにしてもよい。
【０１１３】
従来は、最適化によってソースプログラム上に存在しない部分が生成された場合に、ソースプログラム上に”存在しない部分”に対する最適化指示をソースプログラム上に記述することが困難であった。これに対して、本実施形態では、最適化指示ファイルによって、プログラムの最初の状態からの最適化指示を適用順に従って与えることにより、最初の状態には存在しない部分に対する最適化指示を与えることが可能となる。
【０１１４】
なお、本実施形態では、コンパイラによって「１回以上の最適化」が自動に適用された後の状態に対して最適化を指示する場合は、コンパイル前の予測した状態になっている場合に最適化が適用される。
【０１１５】
以上説明したようにして、本実施形態によれば、コンパイル装置が行う最適化の中間段階に対する指示に基づいて、プログラムに対する最適化を適用することで、コンパイル装置が持つ最適化機能による実行性能の向上効果を引き出すことが可能となる。
【０１１６】
また、最適化の適用が正しいかどうか及び最適化を適用した方が実行性能が向上するかどうかを判断する手段を備えたことによって、コンパイル装置の使用者が最適化の指示の妥当性を考慮する負担をなくすことが可能となる。
【０１１７】
さらに、コンパイル装置が持つ自動最適化機能を強化することなく、既存の最適化機能の適用方法を制御する手段によって、実行性能の向上効果を引き出すことが可能となる。
【０１１８】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出部と、
前記最適化指示の正当性を確認する最適化適用正当性の判定部と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定部と、
を備えることを特徴とするコンパイル装置。
（付記２）
前記最適化適用妥当性の判定部は、前記最適化指示の適用において当該最適化指示に対応する前記プログラム最適化の中間段階のプログラムの部分が満たすべき適用条件の充足度を判定することにより前記プログラムの部分ごとに前記実行性能向上の可能性を判断する、
ことを特徴とする付記１に記載のコンパイル装置。
（付記３）
前記最適化適用対象の抽出部は、前記プログラムと前記最適化指示ファイルを入力し、当該最適化指示ファイルから最適化を適用する部分と最適化の種類および内容を抽出して、前記プログラムの部分との対応付けを行う、
ことを特徴とする付記１または２のいずれかに記載のコンパイル装置。
（付記４）
前記最適化適用正当性の判定部は、前記最適化指示に基づいて前記プログラムに対して最適化の指示を仮適用し、当該仮適用の結果前記プログラム内のデータの依存関係が変化しないか否かを解析することにより、前記仮適用した最適化の指示により前記プログラムが正しく実行されるか否かを判定する、
ことを特徴とする付記１ないし３のいずれかに記載のコンパイル装置。
（付記５）
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分が、キャッシュのサイズに納まること、または前記プログラムの部分を構成するループ処理間にデータ依存があることのいずれかの条件を含む、
ことを特徴とする付記２ないし４のいずれかに記載のコンパイル装置。
（付記６）
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内の配列変数データに対するアクセスがキャッシュのサイズに納まること、または当該プログラムの部分内で前記配列変数データの再利用があることのいずれかの条件を含む、
ことを特徴とする付記２ないし５のいずれかに記載のコンパイル装置。
（付記７）
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内の配列変数データに対するアクセスが連続になることの条件を含む、
ことを特徴とする付記２ないし６のいずれかに記載のコンパイル装置。
（付記８）
前記最適化の適用条件は、最適化の仮適用の結果に対応する前記プログラムの部分内でデータ依存がなくなることの条件を含む、
ことを特徴とする付記２ないし７のいずれかに記載のコンパイル装置。
（付記９）
前記最適化の適用条件は、前記最適化の指示の種類ごとに予め設定され、前記最適化の指示の種類は、ループ融合指示、ループ分割指示、ループ交換指示、ループ逆転指示、ループ傾斜指示、ループ細分指示、ループタイル化指示の少なくとも１つを含む、
ことを特徴とする付記２ないし８のいずれかに記載のコンパイル装置。
（付記１０）
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出処理と、
前記最適化指示の正当性を確認する最適化適用正当性の判定処理と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定処理と、
をコンピュータに実行させるためのコンパイラプログラム。
（付記１１）
最適化指示ファイルからプログラム最適化の中間段階に対する最適化指示を抽出する最適化指示抽出処理と、
前記最適化指示の正当性を確認する最適化適用正当性の判定処理と、
前記最適化指示を適用することによる実行性能向上の可能性を判断する最適化適用妥当性の判定処理と、
をコンピュータに実行させるためのコンパイル方法。
【符号の説明】
【０１１９】
１００  コンパイル装置
１０１  最適化適用対象の抽出部
１０２  最適化適用正当性の判定部
１０３  最適化適用妥当性の判定部
１０４  最適化適用処理部
１１０  プログラム
１２０  最適化指示ファイル
１３０  最適化適用結果
２３０１  ＣＰＵ
２３０２  メモリ
２３０３  入力装置
２３０４  出力装置
２３０５  外部記憶装置
２３０６  可搬記録媒体駆動装置
２３０７  通信インタフェース
２３０８  バス
２３０９  可搬記録媒体
【図１】
2015194881.tif 000003
【図２】
2015194881.tif 000004
【図３】
2015194881.tif 000005
【図４】
2015194881.tif 000006
【図５】
2015194881.tif 000007
【図６】
2015194881.tif 000008
【図７】
2015194881.tif 000009
【図８】
2015194881.tif 000010
【図９】
2015194881.tif 000011
【図１０】
2015194881.tif 000012
【図１１】
2015194881.tif 000013
【図１２】
2015194881.tif 000014
【図１３】
2015194881.tif 000015
【図１４】
2015194881.tif 000016
【図１５】
2015194881.tif 000017
【図１６】
2015194881.tif 000018
【図１７】
2015194881.tif 000019
【図１８】
2015194881.tif 000020
【図１９】
2015194881.tif 000021
【図２０】
2015194881.tif 000022
【図２１】
2015194881.tif 000023
【図２２】
2015194881.tif 000024
【図２３】
2015194881.tif 000025