(57)【要約】【課題】キャッシュミスが少ないループ分割候補の集合をより効率的に抽出する。【解決手段】ループ分割検出プログラムは，ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに，変換する手順と，試験プログラムをループ分割指定パラメータを変更しながら順次実行し，キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第１のループ分割候補群に抽出し，基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順と，ループ分割指定パラメータのループ分割を，第１のループ分割候補群内のループ分割候補のループ分割と比較し，キャッシュミス回数が基準回数を超えるループ分割を，試験プログラムの実行対象候補から除外する手順とを有する。【選択図】図３
2015141543.tif 000002
【特許請求の範囲】
【請求項１】
ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに，変換する手順と，
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し，前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第１のループ分割候補群に抽出し，前記基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順と，
前記ループ分割指定パラメータのループ分割を，前記第１のループ分割候補群内のループ分割候補のループ分割と比較し，前記キャッシュミス回数が前記基準回数を超えるループ分割を，前記試験プログラムの実行対象候補から除外する手順と，
を有する処理をコンピュータに実行させるループ分割検出プログラム。
【請求項２】
更に，前記処理は，
前記第２のループ分割候補群内のループ分割候補から，前記キャッシュミス回数が少ない順に所望の候補数を残す手順と，
前記基準回数を，前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する請求項１に記載されたループ分割検出プログラム。
【請求項３】
前記抽出する手順では，前記キャッシュミス回数が基準回数を超えた分割番号と，前記ループ分割とを前記第１のループ分割候補群に登録し，
前記除外する手順では，前記ループ分割指定パラメータのループ分割と，前記第１のループ分割候補群内のループ分割とが，最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に，前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する，
請求項１に記載されたループ分割検出プログラム。
【請求項４】
更に，前記処理は，
前記ループ分割指定パラメータに基づいて分割される分割ループ内の命令文の数が，第１の命令文数より少ないか，前記第１の命令文数より多い第２の命令文数より多いか，または前記第１の命令文数より少なく且つ前記第２の命令文数より多いか，のいずれかに該当する場合は，前記ループ分割指定パラメータのループ分割候補を，前記試験プログラムの実行対象候補から除外する手順を有する請求項１に記載されたループ分割検出プログラム。
【請求項５】
前記変換する手順では，前記ループ分割対象プログラム内の変数を使用する命令文の前に前記変数の一時配列変数を読み込む変数読み込み文を追加し，前記変数を定義する命令文の後に前記変数を一時配列変数に書き込む変数書き込み文を追加する，
請求項１に記載されたループ分割検出プログラム。
【請求項６】
前記変数読み込み文の追加は，前記変数を使用する命令文が属する分割ループ内に，前記変数を使用するまたは定義する命令文が存在しない場合に行い，
前記変数書き込み文の追加は，前記変数を定義する命令文が属する分割ループとは異なる分割ループ内に，前記変数を使用する命令文が存在する場合に行う，
請求項５に記載されたループ分割検出プログラム。
【請求項７】
ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに変換する手順と，
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し，前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第１のループ分割候補群に抽出し，前記基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順を実行させる手順と，
前記ループ分割指定パラメータのループ分割を，前記第１のループ分割候補群内のループ分割候補のループ分割と比較し，前記キャッシュミス回数が前記基準回数を超えるループ分割を，前記試験プログラムの実行対象候補から除外する手順と，
を有する処理を，プロセッサに実行させるループ分割検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，ループ分割検出プログラム及びループ分割検出方法に関する。
【背景技術】
【０００２】
ループ分割とは，アプリケーションプログラム内にあるサイズが大きいループを複数のループに分割することである。例えば，スーパーコンピュータが実行するＨＰＣ（High Performance Computing)アプリケーションプログラムなどは，サイズが大きいループを有している。そして，実行時間の殆どがこのループで消費されることが多い。大きいサイズのループは，一般的にキャッシュミスが多くなる。その理由は，第１に，大きいサイズのループは多くの命令を有しているので，命令キャッシュでのキャッシュミスが多くなる傾向にある。第２に，大きいサイズのループは多くの変数を有している場合が多く，その場合はデータキャッシュでのキャッシュミスも多くなる傾向にある。
【０００３】
そこで，大きなサイズのループに対して最適なループ分割を行うことにより，キャッシュミスを少なくし，プログラムの実行時間を短くすることができる場合がある。但し，ループ分割をした結果，ループ分割しない場合よりもキャッシュミスが多くなる場合もある。
【０００４】
一方で，コンパイラは，アプリケーションプログラムを最適化する機能を有する。最適化には，例えば，命令の並列化，複数の同じ命令を単一の命令に変更するＳＩＭＤ（Single Instruction Multiple Data)化，命令の順番を入れ替えて複数の演算器によるパイプライン化を行うソフトウエアパイプライニング，そして，複数のループを単一のループに変更して複数ループによるオーバヘッド処理時間をなくすループアンローリングなどが知られている。
【０００５】
上記の最適化を行うことで，プログラムの実行時間を短くすることができる。但し，ループ分割を行うことで，各分割ループに対してより良い最適化を行うことができる場合がある。また，最適化によりプログラム実行時間を短くすることができるが，ループ分割してキャッシュミスを少なくしたプログラムに最適化を行うことで，プログラム実行時間がより短くなる場合がある。
【０００６】
したがって，ループ分割を行うだけでは，プログラムの実行時間を最短化することはできないし，最適化を行うだけでは，プログラム実行時間を最短化する解を求めることができるとは限らない。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００９−１０４４２２号公報
【特許文献２】国際公開第９８／１９２４９号
【特許文献３】特開平６−２５０８４６号公報
【特許文献４】特開２００１−５７９２号公報
【非特許文献】
【０００８】
【非特許文献１】中田育男，コンパイラの構造と最適化（第２版），朝倉書店，2009
【発明の概要】
【発明が解決しようとする課題】
【０００９】
そこで，ループ分割とプログラムの最適化とを組み合わせることで，最短のプログラム実行時間を有するプログラムを生成することが望ましい。しかしながら，ループ分割したプログラムのキャッシュミスが多い場合でも，分割されたループがコンパイラにとって最適化しやすいループ形状であれば，最適化の結果より高性能（短い実行時間）の結果が得られる場合がある。
【００１０】
最適なループ分割を検出するためには，理論的に可能な全てのループ分割について実行時間などの性能比較を行い，最も性能がよい結果を抽出すればよい。しかし，理論的に可能なループ分割の総数は膨大な数になるので，この総当たり方法で最適解を求めることは現実的ではない。
【００１１】
そこで，実施の形態の一つの目的は，キャッシュミスが少ないループ分割候補の集合をより効率的に抽出することができるループ分割検出プログラム及びループ分割検出方法を提供することにある。
【課題を解決するための手段】
【００１２】
開示された実施の形態の一つの側面は，ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに，変換する手順と，
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し，前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第１のループ分割候補群に抽出し，前記基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順と，
前記ループ分割指定パラメータのループ分割を，前記第１のループ分割候補群内のループ分割候補のループ分割と比較し，前記キャッシュミス回数が前記基準回数を超えるループ分割を，前記試験プログラムの実行対象候補から除外する手順と，
を有する処理をコンピュータに実行させるループ分割検出プログラムである。
【発明の効果】
【００１３】
上記の側面によれば，キャッシュミスが少ないループ分割候補の集合を効率的に抽出することができる。
【図面の簡単な説明】
【００１４】
【図１】本実施の形態におけるループ分割検出方法を行う情報処理装置の構成図である。
【図２】図１のコンピュータのCPU１の概略構成を示す図である。
【図３】ループ分割プログラム５がコンピュータにより実行されることにより行われるループ分割処理のフローチャート図である。
【図４】コンピュータがソースコードトランスレータTを実行した場合の処理のフローチャート図である。
【図５】ループ分割対象プログラムPの一例を示す図である。
【図６】テンプレートコードTLの一例を示す図である。
【図７】テンプレートコードTLの編集を説明する図である。
【図８】ループコードトランスレータTによりループ分割対象プログラムPがソースコード変換された試験プログラムQを示す図である。
【図９】コンピュータがループ分割群検出プログラムEを実行した場合の処理のフローチャート図である。
【図１０】図５のループ分割対象プルグラムPから，最大整数値ｍ＝２を有するループ分割指定djに基づいて生成されたループ分割されたプログラムPjを示す図である。
【図１１】ループ分割対象プログラムPのサンプルプログラムを示す図である。
【図１２】コンピュータがソースコードトランスレータTを実行することで，図１１のループ分割対象プログラムPをソースコード変換して生成した試験プログラムQを示す図である。
【図１３】ｄ＝{0, 0, 0, 1, 1, 1, 2, 2, 2}，MAX_MISS＝999を与えられた試験プログラムQを示す図である。
【図１４】図１３と実質的に同じ試験プログラムQを示す図である。
【図１５】ループ分割プログラムPjの例を示す図である。
【図１６】変形例２におけるソースコードトランスレータTによる処理のフローチャート図である。
【図１７】図１６の処理X15のフローチャート図である。
【図１８】変形例２を説明するための図である。
【図１９】変形例２による一時配列の読み込み処理と書き込み処理を追加するプログラム例を示す図である。
【図２０】変形例２による一時配列が追加された試験プログラムの例を示す図である。
【図２１】変形例２による一時配列が追加された試験プログラムの例を示す図である。
【図２２】処理X27で試す価値がないと判定されるループ分割指定パラメータｄの例を示す図である。
【発明を実施するための形態】
【００１５】
図１は，本実施の形態におけるループ分割検出方法を行う情報処理装置の構成図である。図１に示された情報処理装置（コンピュータ）は，CPU1と，DRAMなどのメインメモリ２と，入出力装置３と，ハードディスク等の大容量の記憶装置４と，それらを接続するバスBUSとを有する。
【００１６】
記憶装置４は，オペレーティングシステムOSと，プログラムを最適化すると共にソースコードをオブジェクトコードに変換するコンパイラCMPとを記憶している。さらに，記憶装置４は，本実施の形態のループ分割処理をコンピュータに実行させるループ分割プログラム５を記憶する。
【００１７】
ループ分割プログラム５は，ループ分割対象プログラムPを試験プログラムQにソースコード変換するソースコードトランスレータTと，試験プログラムQを実行してループ分割の解の集合Aを出力するループ分割群検出プログラムEと，ループ分割の解にもとづいてループ分割されたループ分割プログラムの集合PSETを生成するループ分割プログラム生成プログラムFとを有する。
【００１８】
コンピュータのCPU１は，記憶装置４内のオペレーティングシステムOS,コンパイラCMP，プログラム群T, E, F, P, Q, PSETをメモリ２内に展開して，それらを実行する。
【００１９】
図２は，図１のコンピュータのCPU１の概略構成を示す図である。CPU１は，演算ユニット１０と，キャッシュユニット２０と，メモリコントローラ３０とを有する。演算ユニット１０は，実行中のプログラムの命令をメモリ２からフェッチする命令フェッチ１１と，フェッチした命令をデコードするデコーダ１２と，デコード結果に応じて演算する演算部１３とを有する。キャッシュユニット２０は，メインメモリ２内のデータを一時的に記憶する高速のキャッシュメモリ２２と，演算ユニット１０によるメモリアクセスに応答してアクセス先のデータがキャッシュメモリ２２内にあるか否かを判定し，アクセスされたデータをキャッシュメモリ２２に書き込み，アクセス頻度が少ないキャッシュメモリ内のデータをメインメモリ２に書き出すキャッシュコントローラ２１と，キャッシュミスするたびにカウントアップするキャッシュミスカウンタ２２とを有する。このキャッシュミスカウンタ２２をカウント開始する命令，カウント終了する命令，カウント回数を読み出す命令などのキャッシュミス計測命令が，CPUのライブラリに登録されている。
【００２０】
［ループ分割処理の概略］
図３は，ループ分割プログラム５がコンピュータにより実行されることにより行われるループ分割処理のフローチャート図である。以下，このフローチャートにしたがって，本実施の形態のループ分割処理の概略を説明する。
【００２１】
ループ分割対象プログラムPは，例えば比較的大きなサイズのループを有するHPCアプリケーションプログラムなどである。コンピュータは，ループ分割プログラム５を実行することにより，ループ分割対象プログラムPを入力し，プログラムPの内部のループを複数の分割ループに分割したループ分割プログラムの集合PSETを出力する。
【００２２】
コンピュータは，ソースコードトランスレータTを実行することにより，ループ分割対象プログラムPを試験プログラムQにソースコード変換する（X1）。試験プログラムQは，ループ分割指定パラメータに基づいてループ分割対象プログラムP内のループをループ分割した複数の分割ループを有し，更に，試験プログラムQをコンピュータが実行したときにキャッシュミスの回数を計測するキャッシュミス計測命令を有する。キャッシュミス計測命令は，前述のとおり，CPUのライブラリに登録されている。
【００２３】
コンピュータは，ループ分割群検出プログラムEを実行することにより，試験プログラムQを，ループ分割指定パラメータを変更しながら順次実行し，キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第１のループ分割候補群に抽出し，基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する（X2）。第２のループ分割候補群内のキャッシュミス回数が少ない上位N個のループ分割候補の集合が，ループ分割の解djの集合Aである。
【００２４】
コンピュータは，ループ分割プログラム生成プログラムFを実行することにより，集合A内のループ分割の解djに基づいてループ分割プログラムPjを生成し，ループ分割プログラムPjの集合PSETを生成する（X3）。ループ分割プログラムPjの集合PSETは，N個（Nは複数）のキャッシュミス回数が少ないループ分割されたプログラムの集合である。以上で，ループ分割処理が完了する。
【００２５】
そして，本実施の形態では，コンピュータが，最適化コンパイラCMPを実行することで，集合PSET内のN個のループ分割プログラムPjをそれぞれ最適化処理してコンパイルし，コンパイルされたオブジェクトコードを実行して実行時間を計測し，最高速のループ分割プログラムを検出する（X4）。
【００２６】
［ループ分割処理の詳細］
［ソースコードトランスレータTによる処理X1］
図４は，コンピュータがソースコードトランスレータTを実行した場合の処理のフローチャート図である。コンピュータが，ソースコードトランスレータTを実行することで，図４の処理を行う。まず，コンピュータは，ソースコードトランスレータTを実行することで，ループ分割対象プログラムPを入力する（X11）。そして，コンピュータは，ソースコードトランスレータTを実行することで，試験プログラムの元になるテンプレートコードTLを呼び出す（X12）。コンピュータは，ソースコードトランスレータTを実行することで，テンプレートコードTL内の変数を，ループ分割対象プログラムPに基づいて生成し，テンプレートコードTLに上書きすることで，テンプレートコードTLを編集する（X13）。そして，コンピュータは，ソースコードトランスレータTを実行することで，編集されたテンプレートコードTLを試験プログラムQとして出力する（X14）。これにより，ループ分割対象プログラムPが試験プログラムQにソースコード変換される。以下，各工程X11,X12,X13について，説明する。
【００２７】
図５は，ループ分割対象プログラムPの一例を示す図である。このループ分割プログラムPは，for文のループ内にn個の実行文S1-Snを有する。このループがループ分割対象のループである。
【００２８】
図６は，テンプレートコードTLの一例を示す図である。図７は，テンプレートコードTLの編集を説明する図である。
【００２９】
テンプレートコードTL内の00行の関数read_loop_group(‘分割番号変数名のリスト’) は，与えられるループ分割指定パラメータを読み込み，各分割番号変数に各実行文Sの分割番号をセットする関数文である。トランスレータTは，分割番号変数名のリストを，ループ分割対象ループ内の実行文の数だけ生成する。図５のように実行文がn個の場合は，分割番号変数名のリストは，図７（A）にリスト４０で示すように，以下のようになる。
&GS1, &GS2,...&GSn
&GS1は実行文S1が属する分割ループの分割番号変数であり，＆GS2は実行文S2が属する分割ループの分割番号変数であり，&GSnは実行文Snが属する分割ループの分割番号変数である。ループ分割指定パラメータについては後述する。
【００３０】
01行の関数read_max_miss(&MAX_MISS)は，キャッシュミス回数の最大値MAX_MISSを読み込む関数文である。このキャッシュミス回数の最大値MAX_MISSは，ループ分割の解djの集合Aである第２のループ分割候補群内のキャッシュミス回数が少ない上位N個のループ分割候補のうち，最もキャッシュミス回数が大きいループ分割候補のキャッシュミス回数である。この最大値MAX_MISSが，第１のループ分割候補群と第２のループ分割候補群とを区別する基準回数になる。
【００３１】
02行の関数start_cache_miss_count()は，キャッシュミスのカウントを開始処理し，10行の関数end_cache_miss_count()は，キャッシュミスのカウントを終了し，キャッシュミス回数を出力し，プログラムを終了させる処理を行う関数である。
【００３２】
03行の'分割数の最大値’は，分割対象ループ内の実行文Sの数nとする。図７（B）に分割数の最大値４１で示すとおりである。つまり，図５の例では，分割対象ループ内の実行文Sはn個あり，全ての実行文Sを１個ずつ有するn個のループに分割したときに，分割数が最大値nになる。
【００３３】
04行の‘ループ本体部分のコード’は，図７（C）に示すように生成される。まず，トランスレータTは，外側のループ４４として，図５に示したループ分割対象のループのコードである00行と04行のループコードをそのまま利用する。そして，このループ内は次のように作成する。すなわち，トランスレータTは，各実行文Siについて，図７（C）のコード４２に示すように，次のコードを作成する。
if(G==GSi){Si;}
このコードは，０から分割数の最大値nまで変化する変数Gが，実行文Siの分割番号変数GSiと等しい場合に，実行文Siを実行することを意味する。これにより，各実行文Siは，自分が所属する分割番号の分割ループ内で実行される。
【００３４】
図７（C）に示された編集後のループ本体部分のコード４３は，分割数の最大値nがn=3の例であり，実行文S1,S2,S3それぞれがコードif(G==GSi){Si;}に変換されている。
【００３５】
07行の関数not_promising(G)は，キャッシュミス回数が最大値MAX_MISSを超えた場合，超えたときの実行中の分割番号Gをファイルに出力して，プログラムを終了させる処理を行う。
【００３６】
図８は，ループコードトランスレータTによりループ分割対象プログラムPがソースコード変換された試験プログラムQを示す図である。図８の例は，図５のループ分割対象プログラムのループ内の実行文Siが３個（n=3）の例である。この試験プログラムQの動作の概略は次のとおりである。
【００３７】
まず，試験プログラムQにループ分割指定の候補を表す変数d（ループ分割指定パラメータｄ）と最大値MAX_MISSを与えて実行すると，複数の実行文Siが変数dに基づいて分割されて実行される。ループ分割指定パラメータdは，例えばd＝{0,0,1}などであり，この例は，実行文S1,S2が分割番号０の分割ループ内にあり，実行文S3が分割番号１の分割ループ内にあるようにループ分割することを指定する。つまり，ループ分割指定パラメータｄは，分割対象ループ内の実行文Siの数だけ分割番号を指定する。
【００３８】
そして，00行の関数read_loop_group(&GS1,&GS2,&GS3)により，ループ分割指定パラメータd＝{0,0,1}の各分割番号は，分割番号変数GS1, GS2, GS3にセットされる。さらに，01行の関数read_max_miss(&MAX_MISS)により，最大値パラメータMAX_MISSが最大値変数MAX_MISSにセットされる。
【００３９】
さらに，コンピュータは，試験プログラムQを実行することにより，02行の関数start_cache_miss_count()により，キャッシュミスカウンタをカウント開始させる処理を行う。
【００４０】
そして，図８中に示したように，03行から12行のコードは，GS1=0, GS2=0, GS3=1により，実行文S1,S2のループと09-11行のキャッシュミス回数が最大値MAX_MISSを超えた場合に関数not_promising(G)を実行するコードとを有するループと，実行文S3のループと09-11行のコードとを有するループとに，ループ分割されて，実行される。
【００４１】
したがって，コンピュータは，試験プログラムQを実行することで，ループ分割指定パラメータdに基づいてループ内の実行文Siを単一または複数の分割ループに分割して実行する。そして，コンピュータは，各分割ループが終了する度にキャッシュミス回数が最大値MAX_MISS以上になったか否か判定し，以上になればその時の分割番号Gを出力して試験プログラムQを終了し，超えていなければ次の分割ループを実行する。そして，キャッシュミス回数が最大値未満のまま最後まで分割ループを実行すると，キャッシュミス回数を出力して試験プログラムQを終了する。
【００４２】
［ループ分割群検出プログラムEの処理X2］
次に，コンピュータが，ループ分割群検出プログラムEを実行することで，試験プログラムQをループ分割指定パラメータdを変更しながら順次実行し，キャッシュミスが少ない順のN個のループ分割候補を効率的に抽出する処理X2について説明する。
【００４３】
図９は，コンピュータがループ分割群検出プログラムEを実行した場合の処理のフローチャート図である。まず，コンピュータは，プログラムEを実行することで，ループ分割指定パラメータｄをd={0,0,0,...0}で，キャッシュミス回数の最大値MAX_MISSを無限大（∞）で，削除データベースXを空で，それぞれ初期化する（X21)。次に，コンピュータは，プログラムEを実行することで，ループ分割指定パラメータdを試験プログラムQに与えて試験プログラムQを実行する（X22)。
【００４４】
コンピュータがループ分割指定パラメータｄと最大値MAX_MISSを試験プログラムQに与えて実行すると，図８の試験プログラムQに示されるように，コンピュータは，ループ分割指定パラメータｄが示す分割ループの分割番号毎に，分割ループ内の単一または複数の実行文Siを実行し（04-08行），キャッシュミス回数が最大値MAX_MISS以上になるとそのときの分割番号Gを出力するか（09-11行），全分割ループ内の実行文Siの実行を完了してキャッシュミス回数Mdを出力する（13行）。
【００４５】
したがって，コンピュータは，プログラムEを実行することで，処理X22の試験プログラムQを実行した結果の出力がキャッシュミス回数の値Mdの場合は，全実行文Siの実行を完了しキャッシュミス回数が最大値MAX_MISS未満であることを意味するので，候補のループ分割指定パラメータｄとキャッシュミス回数Mdとをループ分割の解の集合Aに登録し，キャッシュミス回数が少ない順にソートする（X23)。そして，コンピュータは，ループ分割の解の集合A内のキャッシュミス回数Mdが少ない上位N個の候補を残して，残りを削除し，残したN個の候補のうち最下位のキャッシュミス回数Mdを最大値MAX_MISSにセットする（X23)。
【００４６】
一方，コンピュータは，プログラムEを実行することで，処理X22の出力が分割番号Gの場合は，全実行文Siの実行を完了せずG番目の分割ループを完了した時点でキャッシュミス回数が最大値MAX_MISS以上になったことを意味するので，ループ分割候補ｄと分割番号Gとからパターンデータｘを作成し，パターンデータｘを削除データベースXに登録する（X24)。パターンデータｘの作成方法については，後述する。
【００４７】
コンピュータは，プログラムEを実行することで，処理X23またはX24の後に，次のループ分割指定パラメータｄを求める（X25)。具体的には，ループ分割指定パラメータｄをｍ桁のｍ進数と見なして，ｄを１増やす。例えば，分割指定パラメータｄが
{0, 1, 2}
であれば，３桁の３進数とみなして１増やすことで，更新したｄは
{0, 2, 0}
となる。
【００４８】
もし，ループ分割指定パラメータｄが全部０になったら，全てのループ分割の候補を試したことを意味するので，コンピュータは，プログラムEを終了する（X26のYES)。
【００４９】
次に，コンピュータは，プログラムEを実行することで，次のループ分割指定パラメータｄによる候補が，処理X22,X23,X24を試す価値があるか否かをチェックする（X27,X28,X29)。
【００５０】
第１の試す価値があるか否かのチェックX27では，コンピュータは，ループ分割指定パラメータｄを構成する整数が０を含み，且つ連続する整数であるか否か判定する。この判定結果がYESであれば試す価値があるループ分割候補であるので次のチェック処理X27に進む。判定結果がNOであれば既に試されたループ分割と同じであるので，処理X25に進んで次のループ分割指定パラメータｄを生成する。
【００５１】
図２２は，処理X27で試す価値がないと判定されるループ分割指定パラメータｄの例を示す図である。この例は，ループ分割指定パラメータｄが３桁３進数の例であり，０を含まないｄと，連続する整数でないｄに対して，図中Xが印されると共に，重複する例が記されている。
【００５２】
例えば，ｄ１＝{1, 2, 2}とｄ２＝{0, 1, 1}は，同じループ分割を表すので，０を含まないｄ１＝{1, 2, 2}は試す価値がない。また，ｄ３＝{0, 2, 2}とｄ４＝{0, 1, 1}は，同じルー分割を表すので，連続した整数ではないｄ３＝{0, 2, 2}は試す価値がない。したがって，第１のチェックX27では，コンピュータは，ループ分割指定パラメータｄを構成する整数が０を含み且つ連続する整数である場合に，試す価値があると判定して処理X28に進み，０を含まないかまたは連続しない整数かのいずれかに該当する場合に，試す価値がないと判定して処理X25に進む。
【００５３】
第２の試す価値があるか否かのチェックX28では，コンピュータは，ループ分割指定パラメータｄによりループ分割された試験プログラムQを，データ依存解析して，適切なループ分割か否か判定する。ここで，データ依存解析とは，ループ分割された試験プログラムQ内の実行順序が，元のループ分割対象プログラムPのロジックを破壊しているか否かをチェックする解析であり，破壊している場合は，ループ分割された試験プログラムQのループ分割は不適切と判定される。不適切なループ分割と判定されると処理X25に進み，適切なループ分割と判定されると処理X29に進む。元のループ分割対象プログラムPのロジックを破壊する例として，変数を定義する文の前に変数を利用する文が実行されるように，変数の定義の後にその変数を利用するというロジックが逆転しているものがある。
【００５４】
第３の試す価値があるか否かのチェックX29では，コンピュータは，ループ分割指定パラメータｄが，削除データベースX内のパターンデータｘと一致するか否か判定する。この判定処理は，後で詳述するが，ループ分割指定パラメータｄが既にキャッシュミス回数が最大値MAX_MISS以上になって途中終了したループ分割候補と同じ結果になるか否かを判定する。コンピュータは，同じ結果になると判定すれば（X29のYES)，試す価値がないと判定して処理X25に進み，同じ結果になると判定されなければ（X29のNO)，試す価値があると判定して処理X22に進んで，そのループ分割指定パラメータｄで試験プログラムQを実行する。
【００５５】
［処理X24でのパターンデータｘの生成処理と，処理X29での判定処理］
処理X24でのパターンデータｘの生成処理は次の通りである。ループ分割候補ｄに対して，試験プログラムQの実行途中でキャッシュミス回数が最大値MAX_MISS以上になった場合に，分割番号Gが出力される。そこで，ループ分割指定パラメータｄの中で分割番号G以下の番号を残し，それ以上の番号を記号？（？はワイルドカード）に変換する。例えば，ｄ, Gが以下の場合に，
d＝{0, 0, 1, 1, 2, 2}
G＝１
パターンデータｘは次のようになる。
ｘ＝{0, 0, 1, 1, ?, ?}
記号?は，分割番号Gより大きい整数を表す。
【００５６】
次に，処理X29でのループ分割指定パラメータｄが，削除データベースX内のパターンデータｘと一致するか否か判定処理は，次の通りである。処理X29では，コンピュータは，判定対象のループ分割指定パラメータｄが，パターンデータｘの？以外の整数が全て同じか否かを判定する。この判定で全て同じでなければ，候補ｄはパターンデータｘに一致しないと判定する。もし同じと判定すれば，コンピュータは，更に，候補ｄの？部分の整数を検査する。即ち，コンピュータは，候補ｄの？部分の整数が全てパターンデータｘが含む最大値よりも大きければ，候補ｄはパターンデータｘに一致すると判定する。候補ｄの？部分の整数が１つでもパターンデータｘが含む最大値以下の場合，候補ｄはパターンデータｘに不一致と判定する。
【００５７】
例えば，前述のパターンデータｘ＝{0, 0, 1, 1, ?, ?}の場合，一致する候補ｄと一致しない候補ｄの例は，次の通りになる。
一致する候補ｄの例
d5＝{0, 0, 1, 1, 2, 2}
d6＝{0, 0, 1, 1, 2, 3}
一致しない候補ｄの例
d7＝{0, 0, 1, 1, 0, 0}
d8＝{0, 0, 1, 1, 1, 2}
候補d5,d6は，実行文S0,S1が分割番号０のループで実行され，実行文S2,S3が分割番号１のループで実行されるので，パターンデータｘ＝{0, 0, 1, 1, ?, ?}と同じように，分割番号１のループを終了した時点で，キャッシュミス回数が最大値MAX_MISS以上になることは明らかである。よって，候補d5,d6は，試す価値がないループ分割である。
【００５８】
しかし，候補d7は，実行文S0,S1,S4,S5が分割番号０のループで実行され，実行文S2,S3が分割番号１のループで実行されるので，必ずしもパターンデータｘ＝{0, 0, 1, 1, ?, ?}と同じ結果になるとは限らない。同様に，候補d8は，実行文S0,S1が分割番号０のループで実行され，実行文S2,S3,S4が分割番号１のループで実行されるので，必ずしもパターンデータｘ＝{0, 0, 1, 1, ?, ?}と同じ結果になるとは限らない。つまり，候補d8の実行文S2,S3,S4を同じループ内で実行した場合のキャッシュミス回数と，パターンデータｘの実行文S2,S3を同じループ内で実行した場合のキャッシュミス回数とは，必ずしも一致しないからであり，候補d8のほうがキャッシュミス回数が少なくなる場合もあるからである。
【００５９】
図９のループ分割群検出プログラムEによる処理では，キャッシュミス回数の最大値MAX_MISSは，初期値の無限大（∞）から徐々に減少していくので，初期の段階では，ループ分割の解の集合A内には，キャッシュミス回数が大きいループ分割の候補ｄも含まれる。しかし，処理X23では，キャッシュミス回数Mdが少ない上位N個の候補ｄを残して，残りの候補を削除するので，キャッシュミス回数が少ない候補ｄを取りこぼすことはなく，最終的にキャッシュミス回数Mdが少ない上位N個の候補ｄを集合Aに残すことができる。
【００６０】
［ループ分割プログラム生成プログラムFの処理X3］
コンピュータが，ステップX3でループ分割プログラム生成プログラムFを実行することで，ループ分割プログラム集合のPSETを生成する処理について，以下に説明する。コンピュータは，プログラムFを実行することで，ループ分割検出プログラムEが検出したループ分割の解の集合A内の解djから，ループ分割プログラム集合PSETのループ分割されたプログラムPjを生成する。
【００６１】
ループ分割の解djからループ分割プログラムPjを生成する処理は，次の通りである。まず，ループ分割指定djが含む最大の整数値ｍを求める。最大の整数値ｍは，ｍ＋１個のループに分割されることを意味する。よって，ループ分割対象の元のプログラムPが図５の例であれば，図７（C)のループコード４４のコピーをｍ＋１個用意する。例えば，図５の例でｍ＝２であれば，図１０に示すようにループを３つ用意すれば良い。次に，図１０内の'分割ｋの命令' の部分に（ｋは整数），ループ分割指定djが示す文をループ分割対象プログラムPからコピーして置けば良い。
【００６２】
図１０は，図５のループ分割対象プルグラムPから，最大整数値ｍ＝２を有するループ分割指定djに基づいて生成されたループ分割されたプログラムPjを示す図である。図１０の例では，３つのループ内に，それぞれに属する実行文Siが’分割ｋの命令’の中に記述される。
【００６３】
［サンプルプログラムについてのループ分割処理］
上記の説明で本実施の形態におけるループ分割処理が理解できた。そこで，以下，サンプルプログラムPについて，ループ分割処理をより具体的に説明する。
【００６４】
図１１は，ループ分割対象プログラムPのサンプルプログラムを示す図である。このループ分割対象プログラムPは，分割対象ループであるfor文の中に実行文S1-S9が含まれている。
【００６５】
（１）図３の処理X1では，コンピュータがソースコードトランスレータTを実行することで，図１１のループ分割対象プログラムPをソースコード変換して試験プログラムQを生成する。
【００６６】
図１２は，コンピュータがソースコードトランスレータTを実行することで，図１１のループ分割対象プログラムPをソースコード変換して生成した試験プログラムQを示す図である。すなわち，コンピュータは，ソースコードトランスレータTを実行して，図１０のループ分割対象プログラムPを図１２の試験プログラムQに変換する。試験プログラムQ内の各関数の意味は図６，８で説明した通りである。
【００６７】
そこで，図９で説明したとおり，コンピュータは，ループ分割群検出プログラムEを実行して，図１２の試験プログラムQにループ分割指定ｄとキャッシュミス回数の最大値MAX_MISSを与えて実行する。そこで，一例として以下のパラメータｄ，MAX_MISSを与えたとする。
ｄ＝{0, 0, 0, 1, 1, 1, 2, 2, 2}
MAX_MISS＝999
図１３は，ｄ＝{0, 0, 0, 1, 1, 1, 2, 2, 2}，MAX_MISS＝999を与えられた試験プログラムQを示す図である。図１３において，00行で分割番号変数GS1-GS9にループ分割指定パラメータｄの値が設定され，01行でキャッシュミス回数の最大値MAX_MISSに999が設定されている。それ以外のソースコードは，図１２と同じである。
【００６８】
図１４は，図１３と実質的に同じ試験プログラムQを示す図である。図１４において，01-08行が分割番号０の分割ループであり，09-16行が分割番号１の分割ループであり，17-24行が分割番号２の分割ループである。各分割ループ内には，実行文S1-S3，S4-S6，S7-S9が埋め込まれている。
【００６９】
（２）図３，図９の処理X2では，コンピュータがループ分割群検出プログラムEを実行して，図１４の試験プログラムQを実行する。試験プログラムQを実行すると，次の結果のいずれかになる。
【００７０】
第１の結果：キャッシュミス回数が最大値MAX_MISSより少ない場合に，キャッシュミスの回数Mdを出力して試験プログラムQを終了する（図９のX23)。
【００７１】
第２の結果：キャッシュミス回数が最大値MAX_MISS以上の場合に，キャッシュミス回数が最大値MAX_MISSに達したまたは越えた分割ループの分割番号Gを出力して試験プログラムQを終了する（図９のX24)。
【００７２】
第１の結果の場合は，コンピュータは，プログラムEを実行することで，ループ分割候補ｄをループ分割の解の集合Aに登録し，キャッシュミス回数が少ない順にソートし，キャッシュミス回数が少ない上位N個の候補ｄを残す。そして，次の候補のために，最下位のキャッシュミスの回数を最大値MAX_MISSにセットする（X23)。
【００７３】
第２の結果の場合は，コンピュータは，プログラムEを実行することで，ループ分割指定ｄと分割番号Gとからパターンデータｘを作成し，削除データベースXに登録する（X24)。例えば，ループ分割してｄと分割番号Gが次の場合は，
ｄ＝{0, 0, 0, 1, 1, 1, 2, 2, 2}
G＝１
パターンデータｘは，次のとおりである。
ｘ＝{0, 0, 0, 1, 1, 1, ?, ?, ?}
ここで，？はG=1より大きい任意の番号を意味する。このパターンデータｘと一致するループ分割候補は，その試験プログラムQを実行してもキャッシュミス回数が最大値MAX_MISS以上になることが確定しているので，コンピュータは，試験プログラムを実行する候補から削除する（X29)。例えば，次のようなループ分割候補は，上記のパターンデータｘと一致して削除対象になる。
ｄ＝{0, 0, 0, 1, 1, 1, 2, 2, 3}
ｄ＝{0, 0, 0, 1, 1, 1, 2, 3, 3}
ｄ＝{0, 0, 0, 1, 1, 1, 2, 3, 4}
一方，次のようなループ分割候補は，上記のパターンデータｘと一致せず試験プログラムQの実行対象になる。
ｄ＝{0, 0, 0, 1, 1, 1, 0, 2, 2}
ｄ＝{0, 0, 0, 1, 1, 1, 1, 2, 2}
上記のように，既に試験プログラムQを実行してキャッシュミス回数が最大値MAX_MISS以上になったパターンデータｘと実行結果が同じになるループ分割候補を削除することで，無駄に試験プログラムQを実行する処理が行われず。コンピュータは，プログラムEを実行することで，効率的にキャッシュミスが少ないループ分割候補を検出することができる。
【００７４】
（３）図３の処理X3では，コンピュータがループ分割プログラム生成プログラムFを実行することで，集合Aのループ分割の解djに基づいて，集合PSETのループ分割プログラムPjを生成する。例えば，コンピュータが，プログラムEを実行することで，図１１のループ分割プログラムPに対して求めたループ分割候補ｄが次の場合は，
ｄ＝{0, 0, 1, 1, 1, 1, 2, 2, 2}
コンピュータは，プログラムFを実行することで，図１５に示したループ分割プログラムPjを生成する。
【００７５】
図１５は，ループ分割プログラムPjの例を示す図である。この例は，ｄ＝{0, 0, 1, 1, 1, 1, 2, 2, 2}に基づいてループ分割されたプログラムPjである。プログラムPjは，文S1,S2，文S3-S6，文S7-S9にループ分割されている。
【００７６】
（４）図３の処理X4では，コンピュータが，集合PSET内のN個のループ分割プログラムPjを順に最適化コンパイラでコンパイルし，実行時間を評価し，最高速のループ分割プログラムを検出する。この処理X4では，一つのループ分割プログラムPjから，最適化コンパイラの複数の最適化戦略を利用することで，複数の結果を得ることができる。そして，その複数の結果から，最高速のプログラムを検出することでより高速のループ分割プログラムを検出することができる。
【００７７】
集合PSET内のN個のループ分割プログラムPjは，キャッシュミス回数が少ないことが保証済みであるので，これらのループ分割プログラムPjを元にして，各ループに個別の最適化を適用することで，最適化コンパイラの最適化処理だけでは得られなかった高い性能のプログラムを検出できる可能性がある。
【００７８】
［変形例１：ループ分割候補の絞り込み処理］
プログラムの意味を変更しないループ分割指定ｄの集合サイズは，一般的に巨大になる可能性がある。そこで，以下のようなループ分割候補の絞り込みをすることが望ましい。
【００７９】
第１の絞り込み方法は，次の通りである。ループを分割する場合に，ループ内の実行文Siの数が少ないループに分割することは，ループの回転処理のオーバヘッドが増えるので一般的に好ましくない。また，ループ内の実行文Siが多すぎるとキャッシュミス回数が増大して一般的に好ましくない。そこで，第１の絞り込み方法では，ループ内の実行文Siの数が最小値nmin以下のものを含むループ分割候補と，ループ内の実行文Siの数が最大値nmax以上のものを含むループ分割候補を，ループ分割候補から削除する。この削除処理は，図９の処理X27内で行うことが好ましい。
【００８０】
第２の絞り込み方法は，次の通りである。図９の処理X21ではキャッシュミス回数が最大値MAX_MISSの初期値を無限大に設定した。しかし，ループ分割が可能な候補の数が膨大になる場合は，この最大値MAX_MISSの初期値を任意の値ｕに設定して，処理X22による結果が最大値MAX_MISS＝ｕより大きな回数の場合の候補ｄとキャッシュミス回数Mdがループ分割の解の集合Aに入らないようにする。そして，任意の初期値ｕ未満のキャッシュミス回数で実行完了できるループ分割候補が少ないまたは存在しない場合は，初期値ｕを初期値より大きい値に変更して再度図９の処理を実行する。初期値ｕを適切に設定することで，ループ分割候補を適切に絞り込むことができ，より効率的にループ分割プログラムPjを検出することができる。
【００８１】
［変形例２：変数に対する一時配列の追加処理］
分割対象プログラム内の分割対象ループがスカラ変数を含む場合は，ループ分割した結果，第１の分割ループ内の変数を，別の第２の分割ループに引き渡す処理が必要になる。このような処理は，第１の分割ループ内にて変数を定義した後にその変数を一時配列に書き込む処理と，第２の分割ループ内にて一時配列を変数に読み出す処理を追加することにより可能になる。したがって，コンピュータは，ソースコードトランスレータTを実行することにより，スカラ変数に対して一時配列の書き込み文と読み込み文を追加する処理を行う。
【００８２】
図１６は，変形例２におけるソースコードトランスレータTによる処理のフローチャート図である。また，図１７は，図１６の処理X15のフローチャート図である。図１８は，変形例２を説明するための図である。図１９は，変形例２による一時配列の読み込み処理と書き込み処理を追加するプログラム例を示す図である。そして，図２０，図２１は，変形例２による一時配列が追加された試験プログラムの例を示す図である。
【００８３】
図１８のループ分割対象プログラム例５１は，実行文S1で変数tmpが次のように定義されている。
S1: tmp=A[i]+B[i]
そして，実行文S2，S3で次のように変数tmpを利用している。
S2: C[i]=tmp*D[i]
S3: E[i]=tmp-C[i]
したがって，実行文S1がループ番号０に，実行文S2,S3がループ番号１，２などに分割されると，ループ番号０で，実行文S1の後に実行文S1で定義した変数tmpを一時的に一時配列に書き込む処理を行い，ループ番号１，２で，実行文S2,S3の前に一時配列を変数tmpに読み込む処理を行うことが必要になる。
【００８４】
図１６に示した変形例２におけるソースコードトランスレータTによる処理のフローチャート図では，図４のフローチャートに処理X15が追加されている。処理X15以外の処理X11-X14は，図４と同じである。処理X15では，コンピュータは，実行文Siにスカラ変数ｖの一時配列Vの読み込み文と書き込み文を追加する。但し，追加が必要か否かは，後述するアルゴリズムにより行う。
【００８５】
図１７は，処理X15のフローチャート図である。コンピュータは，前処理として，スカラ変数ｖの定義が重複して存在する場合は，重複するスカラ変数ｖをユニークな変数名に変換する（X151)。例えば，図１８のプログラム５２のように変数名tmpが重複して使用される場合がある。つまり，実行文S1は変数tmpを定義し，実行文S2,S3がその変数tmpを利用している。更に，実行文S4は変数tmpを使用して新たな変数tmpを定義し，実行文S5がその変数tmpを利用している。したがって，実行文S1-S3の変数tmpと実行文S4,S5の変数tmpとは，異なる変数であることが理解できる。
【００８６】
このような場合，上記の重複するが異なる変数tmpはユニークな変数名に変換する必要がある。プログラム５３は，プログラム５２内の２つの変数tmpを，tmp1とtmp2に変換した例である。
【００８７】
次に，処理X15では，コンピュータは，ループ分割対象プログラムPの各文Siについて，スカラ変数ｖの値を使用する実行文Siの集合USEを，スカラ変数毎に求める（X152)。スカラ変数ｖの値を使用する実行文とは，スカラ変数ｖが右辺に位置する実行文である。
【００８８】
次に，処理X15では，コンピュータは，ループ分割対象プログラムPの各文Siについて，スカラ変数ｖの値を定義する実行文Siの集合DEFを，スカラ変数毎に求める（X153)。スカラ変数ｖの値を定義する実行文とは，スカラ変数ｖが左辺に位置する実行文である。
【００８９】
図１８のループ分割対象プログラムPの例では，集合USEと集合DEFは次の通りである。
USE＝｛S2,S3}
DEF＝｛S1｝
次に，処理X15では，コンピュータは，各スカラ変数ｖに対して，それぞれ一時配列Vを導入する。一時配列Vとは，ループが繰り返し実行される場合に，それぞれのループｉで生成されたスカラ変数ｖを配列する変数であり，ループが３回繰り返される場合は，３つのループで生成されたスカラ変数v1,v2,v3は，次のようになる。
v1＝V[1]
v2＝V[2]
v3＝V[3]
次に，処理X15では，コンピュータは，ループ分割対象プログラムPのループ分割対象ループ内の各実行文Siを，一時配列Vを読み込む処理コードと，実行文Siと，一時配列Vを書き込む処理コードとを有するコードに変換する（X155)。この処理X155は，具体的には以下のとおりである。
【００９０】
（１）処理X155では，コンピュータは，各実行文Siを一般形式のコードに変換する。図１９に一般形式のコード６０が示されている。すなわち，一般形式のコード６０は，図７のコード４２の実行文Siの前に一時配列V[i]の読み込み処理のコード（'V[i]の読み込み処理’）を追加し，実行文Siの後に一時配列V[i]の書き込み処理のコード（'V[i]の書き込み処理’）を追加したコードである。
【００９１】
（２）処理X155では，コンピュータは，'V[i]の読み込み処理’の部分のコードを作成する。コンピュータは，（ａ）もし文Siが変数ｖを使用していなければ，この部分のコードは空白になる。つまり，文Siが変数ｖを使用していないので，事前に変数ｖに一時配列V[i]を読み込む（v = V[i]）必要はないからである。更に，コンピュータは，（ｂ）もし文Siが変数ｖを使用していれば，図１９のコード６１を作成する。
【００９２】
この図１９のコード６１は，if文内の条件，「同じ分割ループ内に，文Siより前に変数ｖを使用する文が存在せず，且つ文Siより前にｖを定義する文が存在しない場合」に，読み込み文v=V[i];を実行するコードである。コンピュータは，if文内の上記の条件に対応するコードを，変数ｖを使用する文の集合USEと，変数ｖを定義する文の集合DEFを参照して，作成する。つまり，if文内の上記の条件は，図１９のコード６０内の実行文Siと同じ分割ループGSi内に，集合USEに存在する実行文Siより小さい番号の文が無く，且つ同じ分割ループGSi内に，集合DEFに存在する実行文Siより小さい番号の文が無い，である。
【００９３】
例えば，実行文S3が使用する変数ｖに対して，集合USEにS2,S4,S5が存在し，集合DEFにS1が存在する場合は，コンピュータは，上記の条件に対応するコードとして，「文S2の分割ループGS2が文S3の分割ループGS3と等しくなく，且つ文S1の分割ループGS1が文S3の分割ループGS3と等しくない」を示す次のコードを作成する。
GS3 != GS1 && GS3 != GS2
ここで，!=は等しくない，&&はANDを意味する。
つまり，「文S2の分割ループGS2が文S3の分割ループGS3と等しくなく，且つ文S1の分割ループGS1が文S3の分割ループGS3と等しくない」場合に，文S3が属する分割ループ内において文S3の前に変数ｖを使用する処理も定義する処理も存在しないので，文S3の直前で変数ｖを読み込む処理が必要になる。文S3が属する分割ループ内において文S3の前に変数ｖを使用する処理が存在すれば，変数ｖを使用する処理の直前で変数ｖを読み込む処理が追加されるので，文S3は変数ｖを使用することができる。また，文S3が属する分割ループ内において文S3の前に変数ｖを定義する処理が存在すれば，文S3は変数ｖを使用することが可能になる。
【００９４】
（３）処理X155では，コンピュータは，'V[i]の書き込み処理’の部分のコードを作成する。コンピュータは，（ａ）もし文Siが変数ｖを定義していなければ，この部分のコードは空白になる。つまり，文Siが変数ｖを定義していないので，直後に変数ｖを一時配列V[i]に書き込む（V[i] = v）必要はないからである。更に，コンピュータは，（ｂ）もし文Siが変数ｖを定義していれば，図１９のコード６２を作成する。
【００９５】
この図１９のコード６２は，if文内の条件，「後の分割ループ内に，文Siより後に変数ｖを使用する文のどれかが存在する場合」に，書き込み文V[i]=v;を実行するコードである。コンピュータは，if文内の上記の条件に対応するコードを，変数ｖを使用する文の集合USEを参照して，作成する。つまり，if文内の上記の条件は，図１９のコード６０内の実行文Siの分割ループGSiの後の分割ループ内に，集合USEに存在する実行文Siより大きい番号の文が存在する，である。
【００９６】
例えば，文S3に対して，集合USEにS4,S5が存在する場合は，コンピュータは，上記の条件に対応するコードとして，「文S3の分割ループGS3が文S4の分割ループGS4と等しくなく，または文S3の分割ループGS3が文S5の分割ループGS5と等しくない」を示す次のコードを作成する。
GS3 != GS4 || GS3 != GS5
ここで，!=は等しくない，||はORを意味する。
つまり，「文S3の分割ループGS3が文S4の分割ループGS4と等しくなく，または文S3の分割ループGS3が文S5の分割ループGS5と等しくない」場合には，文S4またはS5は，文S3の分割ループGS3より後の分割ループGS4またはGS5で変数ｖを使用するので，文S3の分割ループGS3内で変数ｖを書き込む処理が必要になる。
【００９７】
なお，トランスレータTによる試験プログラムQを生成する処理の後，ループ分割指定パラメータｄを変更しながら試験プログラムQを実行する処理で，実行文Siの実行順が前後反転する場合が起こりうる。したがって，文Siより前に実行される文と後に実行される文は，必ずしも文の番号によらない。しかし，データ依存解析（図９のX28)により，変数ｖを使用する文は必ず変数ｖを定義する文の後にしか存在しないことが保証される。したがって，上記の処理X155での（２）（３）の処理において，文Siより前に実行されるか後に実行されるかを考慮する必要はない。ただし，同じ分割ループ内であれば，文Siより前に実行される文の番号はSiより小さく，文Siより後に実行される文の番号はSiより大きいことは，ループ分割指定パラメータｄに係わらず真である。
【００９８】
次に，図１８の分割対象ループのコード５１を例にして，ソースコード変換された試験プログラムQ'について説明する。図２０がソースコード変換された試験プログラムQ'である。
【００９９】
コード５１の例では，集合USE，DEFは次の通りであった。
USE＝｛S2,S3}
DEF＝｛S1｝
したがって，図２０の試験プログラムQ'では，05-10行の文S1のコードには，文S1の分割ループGS1が，文S2，S3の分割ループGS2,GS3のいずれかと等しくない場合に（07行），変数tmpを一時配列TMP[i]に書き込む処理，TMP[i]=tmp;（08行）が実行されるコード（07-09行）が追加されている。
【０１００】
更に，図２０の試験プログラムQ'では，11-16行の文S2のコードには，文S2の分割ループGS2が，変数ｖを定義する文S1の分割ループGS1と等しくない場合に（12行），変数tmpに一時配列TMP[i]を読み込む処理，tmp=TMP[i];（13行）が実行されるコード（12-14行）が追加されている。
【０１０１】
また，図２０の試験プログラムQ'では，17-23行の文S3のコードには，文S3の分割ループGS3が，変数ｖを定義する文S1の分割ループGS1と等しくなく，且つ変数ｖを使用する文S2の分割ループGS2と等しくない場合に（18行），変数tmpに一時配列TMP[i]を読み込む処理，tmp=TMP[i];（19行）が実行されるコード（18-20行）が追加されている。
【０１０２】
図２１は，図２０の試験プログラムQ'にループ分割パラメータd10，d11を与えた場合の試験プログラムQ'を示す図である。d10={0, 0, 1}の場合は，文S1,S2が同じ分割ループ内に存在し，文S3は異なる分割ループ内に存在する。そして，文S1の後に変数tmpを一時配列TMP[i]に書き込む処理，TMP[i]=tmp;（02行）が追加され，文S3の前に変数tmpに一時配列TMP[i]を読み込む処理，tmp=TMP[i];（06行）が追加されている。
【０１０３】
一方，d10={0, 1, 1}の場合は，文S1が同じ分割ループ内に存在し，文S2,S3は異なる分割ループ内に存在する。そして，文S1の後に変数tmpを一時配列TMP[i]に書き込む処理，TMP[i]=tmp;（02行）が追加され，文S2の前に変数tmpに一時配列TMP[i]を読み込む処理，tmp=TMP[i];（05行）が追加されている。
【０１０４】
このように，図２０の試験プログラムQ'を作成することで，ループ分割パラメータｄに基づいて，ループ分割群検出プログラムEにより実行される試験プログラムQ'を自動的に生成することができる。
【０１０５】
以上説明したとおり，本実施の形態によれば，最初にキャッシュミスが少ないループ分割の解の集合を求め，次にコンパイラの最適化を行った解の実行時間を評価することで，より効率的に最小の実行時間を有するループ分割プログラムを検出することができる。
【０１０６】
また，本実施の形態によれば，キャッシュミスが少ないループ分割の解の集合を求める処理中に，キャッシュミス回数が基準値以上の分割パターンに基づいて，キャッシュミス回数が改善される見込みのないループ分割候補を，キャッシュミス回数を計測するために実行するループ分割候補から削除するので，無駄な候補の実行が削減され，効率的にキャッシュミスが少ないループ分割候補を絞り込むことができる。
【０１０７】
さらに，本実施の形態によれば，試験プログラムＱをコンパイルしたオブジェクトコードをループ分割指定パラメータｄを変更しながら実行すれば，全てのループ分割候補のキャッシュミス回数を計測できるので，試験プログラムＱのコンパイルが一回で良く，キャッシュミスが少ないループ分割候補の絞り込みを効率的に行うことができる。
【０１０８】
さらに，本実施の形態によれば，ループ分割が一時配列を利用する場合でも，その影響を考慮した試験プログラムＱ’を生成するので，キャッシュミスが少ないループ分割候補の絞り込みを適切に行うことができる。
【０１０９】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１１０】
（付記１）
ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに，変換する手順と，
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し，前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第１のループ分割候補群に抽出し，前記基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順と，
前記ループ分割指定パラメータのループ分割を，前記第１のループ分割候補群内のループ分割候補のループ分割と比較し，前記キャッシュミス回数が前記基準回数を超えるループ分割を，前記試験プログラムの実行対象候補から除外する手順と，
を有する処理をコンピュータに実行させるループ分割検出プログラム。
【０１１１】
（付記２）
更に，前記処理は，
前記第２のループ分割候補群内のループ分割候補から，前記キャッシュミス回数が少ない順に所望の候補数を残す手順と，
前記基準回数を，前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する付記１に記載されたループ分割検出プログラム。
【０１１２】
（付記３）
前記抽出する手順では，前記キャッシュミス回数が基準回数を超えた分割番号と，前記ループ分割とを前記第１のループ分割候補群に登録し，
前記除外する手順では，前記ループ分割指定パラメータのループ分割と，前記第１のループ分割候補群内のループ分割とが，最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に，前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する，
付記１に記載されたループ分割検出プログラム。
【０１１３】
（付記４）
更に，前記処理は，
前記ループ分割指定パラメータに基づいて分割される分割ループ内の命令文の数が，第１の命令文数より少ないか，前記第１の命令文数より多い第２の命令文数より多いか，または前記第１の命令文数より少なく且つ前記第２の命令文数より多いか，のいずれかに該当する場合は，前記ループ分割指定パラメータのループ分割候補を，前記試験プログラムの実行対象候補から除外する手順を有する付記１に記載されたループ分割検出プログラム。
【０１１４】
（付記５）
前記変換する手順では，前記ループ分割対象プログラム内の変数を使用する命令文の前に前記変数の一時配列変数を読み込む変数読み込み文を追加し，前記変数を定義する命令文の後に前記変数を一時配列変数に書き込む変数書き込み文を追加する，
付記１に記載されたループ分割検出プログラム。
【０１１５】
（付記６）
前記変数読み込み文の追加は，前記変数を使用する命令文が属する分割ループ内に，前記変数を使用するまたは定義する命令文が存在しない場合に行い，
前記変数書き込み文の追加は，前記変数を定義する命令文が属する分割ループとは異なる分割ループ内に，前記変数を使用する命令文が存在する場合に行う，
付記５に記載されたループ分割検出プログラム。
【０１１６】
（付記７）
ループ分割対象プログラムを，ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し，キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに変換する手順と，
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し，前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第１のループ分割候補群に抽出し，前記基準回数を超えないループ分割候補を第２のループ分割候補群に抽出する手順を実行させる手順と，
前記ループ分割指定パラメータのループ分割を，前記第１のループ分割候補群内のループ分割候補のループ分割と比較し，前記キャッシュミス回数が前記基準回数を超えるループ分割を，前記試験プログラムの実行対象候補から除外する手順と，
を有する処理を，プロセッサに実行させるループ分割検出方法。
【０１１７】
（付記８）
更に，前記処理は，
前記第２のループ分割候補群内のループ分割候補から，前記キャッシュミス回数が少ない順に所望の候補数を残す手順と，
前記基準回数を，前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する付記７に記載されたループ分割検出方法。
【０１１８】
（付記９）
前記抽出する手順では，前記キャッシュミス回数が基準回数を超えた分割番号と，前記ループ分割とを前記第１のループ分割候補群に登録し，
前記除外する手順では，前記ループ分割指定パラメータのループ分割と，前記第１のループ分割候補群内のループ分割とが，最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に，前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する，
付記７に記載されたループ分割検出方法。
【符号の説明】
【０１１９】
Ｐ：ループ分割対象プログラム
Ｑ：試験プログラム
Ａ：ループ分割の解の集合
ＰＳＥＴ：ループ分割プログラムの集合
Ｔ：ソースコードトランスレータ
Ｅ：ループ分割群検出プログラム
Ｆ：ループ分割プログラム生成プログラム
ＣＭＰ：最適化コンパイラ
ＯＳ：オペレーションシステム
【図１】
2015141543.tif 000003
【図２】
2015141543.tif 000004
【図３】
2015141543.tif 000005
【図４】
2015141543.tif 000006
【図５】
2015141543.tif 000007
【図６】
2015141543.tif 000008
【図７】
2015141543.tif 000009
【図８】
2015141543.tif 000010
【図９】
2015141543.tif 000011
【図１０】
2015141543.tif 000012
【図１１】
2015141543.tif 000013
【図１２】
2015141543.tif 000014
【図１３】
2015141543.tif 000015
【図１４】
2015141543.tif 000016
【図１５】
2015141543.tif 000017
【図１６】
2015141543.tif 000018
【図１７】
2015141543.tif 000019
【図１８】
2015141543.tif 000020
【図１９】
2015141543.tif 000021
【図２０】
2015141543.tif 000022
【図２１】
2015141543.tif 000023
【図２２】
2015141543.tif 000024