(57)【要約】【課題】ＸＦＩＬＬ命令の実行に伴う性能の向上を可能とするコンパイラ、情報処理装置及びコンパイル方法を提供する。【解決手段】  ソースコードに含まれる多重ループ毎に、第１の値と第２の値とを比較し、ソースコードに含まれる多重ループのうち、第１の値が第２の値よりも大きい多重ループを第１変換コードに変換し、ソースコードに含まれる多重ループのうち、第２の値が第１の値よりも大きい多重ループを第２変換コードに変換する。【選択図】図１１
2018206175.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換するコンパイラであって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較し、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換する、
処理をコンピュータに実行させることを特徴するコンパイラ。
【請求項２】
請求項１において、
前記変換する処理では、前記ソースコードに含まれる多重ループのうち、前記第１の値と前記第２の値とが等しい多重ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴するコンパイラ。
【請求項３】
請求項１において、
前記変換する処理では、前記ソースコードに含まれる多重ループのうち、前記第１の値及び前記第２の値が所定の閾値よりも小さい多重ループの変換を行わない、
ことを特徴するコンパイラ。
【請求項４】
請求項１において、 
前記第１変換コードに含まれる前記第２の命令は、前記最内ループによる前記第１の命令の現在までの繰返し回数よりも第１の回数後の前記第１の命令に対応するキャッシュラインが書き込まれる前記対象領域に対し、前記所定のデータを書き込む命令であり、
前記第１の値を算出する処理では、前記第１の回数を前記最内ループによるループ回数で除算することにより、前記第１の値を算出する、
ことを特徴するコンパイラ。
【請求項５】
請求項１において、 
前記第２変換コードに含まれる前記第２の命令は、前記外側ループによる前記第１の命令の現在までの繰返し回数よりも第２の回数後の前記第１の命令に対応するキャッシュラインが書き込まれる前記対象領域に対し、前記所定のデータを書き込む命令であり、
前記第１の値を算出する処理では、前記第１の回数を前記最内ループによるループ回数で除算することにより、前記第１の値を算出する、
ことを特徴するコンパイラ。
【請求項６】
請求項１において、 
前記第１の値を算出する処理では、前記第１の値の算出に要する情報の全てが取得可能である場合に、前記第１の値の算出を行い、
前記第２の値を算出する処理では、前記第２の値の算出に要する情報の全てが取得可能である場合に、前記第２の値の算出を行い、
前記変換する処理では、前記第１の値または前記第２の値の算出が行われていない場合、前記ソースコードに含まれる多重ループ毎に、前記第１変換コードと、前記第２変換コードと、前記第１の値及び前記第２の値の算出を行う命令を含む情報算出コードと、を生成する、
ことを特徴するコンパイラ。
【請求項７】
請求項１において、
前記変換する処理では、
前記ソースコードに含まれる多重ループ毎に、前記多重ループの書き込み領域サイズと、前記キャッシュラインのサイズとを比較し、
前記ソースコードに含まれる多重ループ毎のうち、書き込み領域サイズが前記キャッシュラインのサイズより大きい第１ループを、前記第１ループの書き込み領域サイズが１以上の前記キャッシュラインのサイズに収まる第２ループと、前記第２ループ以外の第３ループとに分割し、
前記第２ループの書き込み領域サイズに対して前記第２の命令を実行するように、前記第１ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴するコンパイラ。
【請求項８】
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換する情報処理装置であって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出する第１情報算出部と、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出する第２情報算出部と、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較する情報判定部と、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換するコード変換部と、を有する、
ことを特徴する情報処理装置。
【請求項９】
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換するコンパイル方法であって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較し、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換する、
ことを特徴するコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、情報処理装置及びコンパイル方法に関する。
【背景技術】
【０００２】
例えば、キャッシュメモリを搭載した計算機（以下、情報処理装置とも呼ぶ）上において、レジスタの値をメインメモリに書き込む場合、情報処理装置のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）は、書き込み先のアドレスを含むキャッシュラインがキャッシュメモリ上に存在するか否かの判定を行う。そして、書き込み先のアドレスを含むキャッシュラインがキャッシュメモリ上に存在しないと判定した場合、ＣＰＵは、書き込み動作を行う前に、書き込み先のアドレスを含むキャッシュラインをメインメモリから読み出し、読み出したキャッシュラインをキャッシュメモリ上に配置する。その後、ＣＰＵは、キャッシュメモリに配置されたキャッシュラインに対して書き込み動作を行う。
【０００３】
ここで、メインメモリに対するアクセスに要する時間は、計算機に搭載されるＣＰＵの性能向上に伴い、ＣＰＵにおける処理時間に対して相対的に長い。そのため、ＣＰＵは、上記の場合、データの書き込みを行うまでに長時間待機することになり、ＣＰＵそのものの性能を十分に発揮することができない場合がある。
【０００４】
この点、書き込み先のアドレスを含むキャッシュラインがキャッシュメモリ上に予め存在する場合、すなわち、キャッシュヒットする場合、ＣＰＵは、書き込み先のアドレスを含むキャッシュラインに対して書き込み動作をすぐに開始することができる。そのため、ＣＰＵが書き込み動作を行う前に書き込み先のアドレスを含むキャッシュラインをメインメモリから読み出し、キャッシュメモリ上に予め配置する技術（プリフェッチ技術）の研究が継続的に行われている（例えば、特許文献１乃至３参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特表２００５−５３５０５５号公報
【特許文献２】特開平１０−２０７７７２号公報
【特許文献３】特開２０１１−１３８２１３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ここで、連続する配列要素の書き込み動作のように、キャッシュライン上の全データの上書きが行われる場合、メインメモリからキャッシュメモリへのキャッシュラインの転送に不要である。そして、一般的にメインメモリとキャッシュメモリ間の帯域幅は狭いことから、ＣＰＵは、このような不要なキャッシュラインの転送を行わないことが好ましい。
【０００７】
そこで、近年の情報処理装置には、キャッシュライン充填命令（以下、ＸＦＩＬＬ命令とも呼ぶ）を使用することによって、要求メモリスループットを削減する機能が搭載されている場合がある。ＸＦＩＬＬ命令は、キャッシュラインをメインメモリから読み出す代わりに、キャッシュメモリ上に確保した領域に不定値を埋める動作を行う命令である。この命令を使用することによって、ＣＰＵは、データの書き込み動作の際に、メインメモリからキャッシュメモリへキャッシュラインを読み出すことなく、キャッシュメモリ上にキャッシュラインを確保することが可能になる。そして、ＣＰＵは、このように確保したキャッシュラインに対し、データ書き込み命令を実行することで、キャッシュヒットした場合と同様に、キャッシュラインに対する書き込み動作を大幅な待ち時間なく開始することが可能になる。そのため、ＣＰＵは、キャッシュラインに対する書き込み動作に要する処理時間を短縮することが可能になる。さらに、メインメモリからキャッシュメモリへのキャッシュラインの転送が発生しないため、ＣＰＵは、要求メモリスループットを下げることによる性能向上を実現することが可能になる。
【０００８】
しかしながら、ＸＦＩＬＬ命令は、キャッシュメモリ上におけるキャッシュラインの確保に一定のレイテンシを要する。そのため、ＣＰＵは、現在アクセスしているキャッシュラインよりも数個先のキャッシュラインをＸＦＩＬＬ命令の対象とする必要がある。したがって、ＣＰＵは、ＸＦＩＬＬ命令を含むループのイタレーション数によっては、ＸＦＩＬＬ命令を実行することによる効果が十分に得られない場合がある。
【０００９】
そこで、一つの側面では、ＸＦＩＬＬ命令の実行に伴う性能の向上を可能とするコンパイラ、情報処理装置及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
実施の形態の一つの態様によれば、ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換するコンパイラであって、前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出し、前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出し、前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較し、前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換する、処理をコンピュータに実行させる。
【発明の効果】
【００１１】
一つの側面によれば、ＸＦＩＬＬ命令の実行に伴う性能の向上を可能とする。
【図面の簡単な説明】
【００１２】
【図１】図１は、情報処理システム１０の全体構成を示す図である。
【図２】図２は、情報処理装置１が行うコンパイル処理を説明するフローチャートである。
【図３】図３は、情報処理装置１が行うコード実行処理を説明するフローチャートである。
【図４】図４は、ソースコード１３４の具体例について説明する図である。
【図５】図５は、ソースコード１３４から生成される変換コードの具体例について説明を行う。
【図６】図６は、変換コードの具体例について説明する図である。
【図７】図７は、変換コードの具体例について説明する図である。
【図８】図８は、情報処理装置１のハードウエア構成を説明する図である。
【図９】図９は、情報処理装置１の機能のブロック図である。
【図１０】図１０は、情報格納領域１３０に記憶された情報のブロック図である。
【図１１】図１１は、Ｓ３及びＳ４の処理の概略について説明するフローチャートである。
【図１２】図１２は、第１の実施の形態におけるコンパイル処理及びコード実行処理の詳細を説明するフローチャートである。
【図１３】図１３は、第１の実施の形態におけるコンパイル処理及びコード実行処理の詳細を説明するフローチャートである。
【図１４】図１４は、第１の実施の形態におけるコンパイル処理及びコード実行処理の詳細を説明するフローチャートである。
【図１５】図１５は、第１の実施の形態におけるコンパイル処理及びコード実行処理の詳細を説明するフローチャートである。
【図１６】図１６は、図３で説明したＳ１２の処理の詳細について説明するフローチャートである。
【図１７】図１７は、図３で説明したＳ１２の処理の詳細について説明するフローチャートである。
【図１８】図１８は、図３で説明したＳ１２の処理の詳細について説明するフローチャートである。
【図１９】図１９は、第２の実施の形態におけるコンパイル処理を説明するフローチャートである。
【発明を実施するための形態】
【００１３】
［情報処理システムの構成］
図１は、情報処理システム１０の全体構成を示す図である。図１に示す情報処理システム１０は、情報処理装置１と、記憶装置２と、操作端末３とを含む。図１に示す操作端末３は、操作端末３ａ、３ｂ及び３ｃが含まれている。
【００１４】
情報処理装置１（情報処理装置１のＣＰＵ）は、コンパイルを開始するタイミング（以下、コンパイル開始タイミングとも呼ぶ）になった場合、例えば、記憶装置２に記憶されたソースコード１３４を取得し、取得したソースコード１３４のコンパイルを行う処理（以下、コンパイル処理とも呼ぶ）を行うことにより、オブジェクトコードを生成する。コンパイル開始タイミングは、例えば、操作端末３からコンパイルを行う旨の指示を受け付けたタイミングであってよい。
【００１５】
また、情報処理装置１は、オブジェクトコードを実行するタイミング（以下、コード実行タイミングとも呼ぶ）になった場合、コンパイル処理によって生成されたオブジェクトコードを実行する処理（以下、コード実行処理とも呼ぶ）を行う。以下、情報処理装置１が行うコンパイル処理及びコード実行処理について説明を行う。
【００１６】
［情報処理装置によるコンパイル処理］
初めに、情報処理装置１が行うコンパイル処理について説明を行う。図２は、情報処理装置１が行うコンパイル処理を説明するフローチャートである。
【００１７】
情報処理装置１は、図２に示すように、コンパイル開始タイミングまで待機する（Ｓ１のＮＯ）。そして、コンパイル開始タイミングになった場合（Ｓ１のＹＥＳ）、情報処理装置１は、ソースコード１３４の字句解析及び構文解析を行う（Ｓ２）。具体的に、情報処理装置１は、例えば、ソースコード１３４の内容をループ単位の表現に変換する。
【００１８】
その後、情報処理装置１は、Ｓ２の処理における解析結果に基づいて、ソースコード１３４の最適化を行う（Ｓ３）。具体的に、情報処理装置１は、ソースコード１３４に含まれるループの変形等を行うことにより、ソースコード１３４を変換したコード（以下、変換コードとも呼ぶ）の生成を行う。さらに、情報処理装置１は、Ｓ３の処理で最適化を行ったソースコード１３４（変換コード）をマシン語に変換し、オブジェクトコードの生成を行う（Ｓ４）。そして、情報処理装置１は、例えば、生成したオブジェクトコードを記憶装置２に記憶する。
【００１９】
これにより、情報処理装置１は、オブジェクトコードの実行時における性能の最適化を図ることが可能になる。
【００２０】
［情報処理装置によるコード実行処理］
次に、情報処理装置１が行うコード実行処理について説明を行う。図３は、情報処理装置１が行うコード実行処理を説明するフローチャートである。
【００２１】
情報処理装置１は、図３に示すように、コード実行タイミングまで待機する（Ｓ１１のＮＯ）。そして、コード実行タイミングになった場合（Ｓ１１のＹＥＳ）、情報処理装置１は、コンパイル処理によって生成されたオブジェクトコードの実行を行う（Ｓ１２）。具体的に、情報処理装置１は、例えば、記憶装置２に記憶されたオブジェクトコード（コンパイル処理によって生成されたオブジェクトコード）を取得して実行する。
【００２２】
［ソースコードの具体例］
続いて、ソースコード１３４の具体例について説明を行う。図４は、ソースコード１３４の具体例について説明する図である。図４に示すソースコード１３４は、Ｆｏｒｔｒａｎプログラムによって記述されたプログラムである。
【００２３】
なお、以下、ソースコード１３４から生成したオブジェクトコードが、富士通株式会社製のスーパーコンピュータである京コンピュータやＰＲＩＭＥＨＰＣ  ＦＸ１０、ＦＸ１００（以下、単にスーパーコンピュータとも呼ぶ）によって実行される場合について説明を行う。また、キャッシュラインサイズが１２８バイトであり、倍精度実数型の配列ａが１つのキャッシュライン上に１６要素を配置されるものとして説明を行う。また、配列ａの先頭アドレスが１２８バイトの境界にアラインされ、かつ、現在アクセスしているキャッシュラインよりも４ライン先（６４イタレーション先）のキャッシュラインをＸＦＩＬＬ命令の対象とするものとして説明を行う。さらに、ｎが１６の倍数であって６４以上の数であるものとして説明を行う。
【００２４】
具体的に、図４に示すソースコード１３４には、配列ａ（ｉ，ｊ）のそれぞれに、配列ｂ（ｉ，ｊ）のそれぞれに設定された値を順次設定する処理が記述されている。
【００２５】
［変換コードの具体例］
次に、図４で説明したソースコード１３４から生成される変換コードの具体例について説明を行う。図５は、ソースコード１３４から生成される変換コードの具体例について説明を行う。
【００２６】
図５に示す変換コードには、データの書き込み動作が行われる際に、メインメモリからキャッシュメモリへキャッシュラインへの読出し動作が行われる頻度を抑制するため、ＸＦＩＬＬ命令が記述されている。具体的に、図５に示す変換コードにおけるＸＦＩＬＬ（ａ（ｉ＋６４，ｊ））では、配列ａ（ｉ＋６４，ｊ）のアドレスを含むキャッシュラインに対してＸＦＩＬＬ命令を実行することにより、キャッシュメモリ上において配列ａ（ｉ＋６４，ｊ）のアドレスを含むキャッシュラインを確保する処理を行う。
【００２７】
なお、図５に示す変換コードでは、ＸＦＩＬＬ命令が１ラインについて１回のみ実行されるように、１６アンロールが行われている。
【００２８】
また、図５に示す変換コードでは、図４で説明したソースコード１３４に含まれるループを、ｉが１からｎ−６４までのイタレーションに対応するループと、ｉがｎ−６４＋１からｎまでのイタレーションに対応するループとに分割されている。これにより、ＣＰＵは、例えば、図５に示すように、配列ａの１次元目の要素数がｎ＋ｐ（ｐ＞０、かつ、ｐは１６の倍数)となっている場合、配列ａ（ｎ＋ｉ）（ｉ＞０）の領域のデータがＸＦＩＬＬ命令の実行によって破壊されることを防止することが可能になる。また、ＣＰＵは、例えば、配列ａの１次元目の要素数がｎである場合においても、配列ａの次の領域（例えば、他の配列の領域）のデータがＸＦＩＬＬ命令の実行によって破壊されることを防止することが可能になる。
【００２９】
ここで、図５に示す変換コードにおいて、ｎを３８４と仮定すると、ｉが１から６４までの処理においては、配列ａをキャッシュメモリから一旦読み出す必要があるが、ｉが６５から３８４までの処理においては、ＸＦＩＬＬ命令の実行に伴って配列ａのアドレスを含むキャッシュラインがキャッシュメモリ上に確保されるため、メインメモリからのキャッシュラインの読出しを省くことが可能になる。具体的に、この場合、メインメモリからの読出しを省くことが可能になるキャッシュラインの割合は約８３（％）になる。そのため、ＣＰＵは、図５で説明した変換コードから生成されたオブジェクトコードを実行した場合、処理時間を大幅に短縮することが可能になる。
【００３０】
しかしながら、図５に示す変換コードにおいて、ｎが６４である場合、ＣＰＵは、配列ａのアドレスを含むキャッシュラインのすべてをメインメモリに読み出す必要がある。そのため、ＣＰＵは、この場合、ＸＦＩＬＬ命令を実行することによる効果を得ることができない。
【００３１】
さらに、近年、スーパーコンピュータでは、１つの命令で複数のデータを処理可能なＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）命令のデータパス幅拡大に伴い、キャッシュラインサイズが２倍の２５６バイトに大型化している。そのため、ＣＰＵでは、ループのイタレーション数が数百回程度と比較的長い場合であっても、ＸＦＩＬＬ命令の実行に伴う効果を十分に得られない状況が発生するようになっている。以下、キャッシュラインサイズが２５６バイトである場合に生成される変換コードの具体例について説明を行う。
【００３２】
［キャッシュラインサイズが２５６バイトである場合の変換コードの具体例］
図６は、変換コードの具体例について説明する図である。具体的に、キャッシュラインサイズが２５６バイトである場合に生成される変換コードの具体例について説明する図である。以下、キャッシュラインサイズが２５６バイトであり、倍精度実数型の配列ａが１つのキャッシュライン上に３２要素を配置されるものとして説明を行う。また、配列ａの先頭アドレスが２５６バイトの境界にアラインされ、かつ、現在アクセスしているキャッシュラインよりも６ライン先（９６イタレーション先）のキャッシュラインをＸＦＩＬＬ命令の対象とするものとして説明を行う。
【００３３】
図６に示す変換コードにおいて、ｎを３８４と仮定すると、ｉが１９３から３８４までの処理においては、ＸＦＩＬＬ命令の実行に伴って配列ａのアドレスを含むキャッシュラインがキャッシュメモリ上に確保されるが、ｉが１から１９２までの処理においては、配列ａのアドレスを含むキャッシュラインをメインメモリから一旦読み出す必要がある。そのため、この場合、配列ａの５０（％）にあたるキャッシュラインをメインメモリから読み出す必要があり、ＸＦＩＬＬ命令の実行による効果が少なくなる。
【００３４】
そこで、情報処理装置１は、例えば、最内ループの１つ外側のループ（以下、外側ループとも呼ぶ）のイタレーションを対象としてＸＦＩＬＬ命令を生成する。以下、外側ループのイタレーションを対象としてＸＦＩＬＬ命令を生成した変換コードの具体例について説明を行う。
【００３５】
［外側ループのイタレーションが対象のＸＦＩＬＬ命令を生成した変換コードの具体例］
図７は、変換コードの具体例について説明する図である。具体的に、図７は、外側ループのイタレーションを対象としてＸＦＩＬＬ命令を生成した変換コードの具体例を説明する図である。
【００３６】
図７に示すように、最内ループのイタレーション数が１９２イタレーション(６ライン相当)であれば、ｊ＋１以降のイタレーションで書き込まれる配列ａのアドレスを含むキャッシュラインをキャッシュメモリ上に確保することが可能になる。そして、例えば、ｊが２である場合、ＣＰＵは、配列ａの５０（％）にあたるキャッシュラインの読み出し動作を削減することが可能になる。さらに、ｊがより大きい値であれば、ＣＰＵは、メインメモリからのキャッシュラインの読出し動作の削減割合をより大きくすることが可能になる。
【００３７】
また、例えば、最内ループのイタレーション数が９６イタレーションと少ない場合であっても、ＸＦＩＬＬ対象とするｊのイタレーションをｊ＋１からｊ＋３に伸ばすことで６ライン確保できる。そのため、ＣＰＵは、この場合、ＸＦＩＬＬ命令のレイテンシを隠蔽することが可能になる。
【００３８】
ここで、例えば、最内ループのイタレーション数が比較的多い場合等、図６で説明した変換コードから生成したオブジェクトコードを実行した方が、図７で説明した変換コードから生成したオブジェクトコードを実行するよりも処理性能を向上させることができる場合も存在する。そのため、ソースコード１３４の記述されたループ等の処理の内容に応じて、図６で説明した変換コードから生成したオブジェクトコードと、図７で説明した変換コードから生成したオブジェクトコードとを使い分けることが好ましい。
【００３９】
そこで、本実施の形態における情報処理装置１（情報処理装置１のＣＰＵ）は、ＸＦＩＬＬ命令の対象のキャッシュラインの特定を、ソースコード１３４に含まれる多重ループにおける最内ループの現在までのイタレーション数（繰返し回数）に基づいて行うＸＦＩＬＬ命令を含む変換コード（以下、第１変換コードとも呼ぶ）が実行された場合に、メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す値（以下、第１の値とも呼ぶ）を、ソースコード１３４に含まれる多重ループ毎に算出する。
【００４０】
具体的に、ＣＰＵは、図６で説明した変換方法によってソースコード１３４に含まれる多重ループを変換した第１変換コードを実行した場合における、メインメモリからのキャッシュラインの読み出し回数の削減割合を、第１の値として算出する。
【００４１】
また、本実施の形態におけるＣＰＵは、ＸＦＩＬＬ命令の対象のキャッシュラインの特定を、ソースコード１３４に含まれる多重ループにおける最内ループの外側ループの現在までのイタレーション数に基づいて行うＸＦＩＬＬ命令を含む変換コード（以下、第２変換コードとも呼ぶ）が実行された場合に、メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す値（以下、第２の値とも呼ぶ）を、ソースコード１３４に含まれる多重ループ毎に算出する。
【００４２】
具体的に、ＣＰＵは、図７で説明した変換方法によってソースコード１３４に含まれる多重ループを変換した第２変換コードを実行した場合における、メインメモリからのキャッシュラインの読み出し回数の削減割合を、第２の値として算出する。
【００４３】
さらに、本実施の形態におけるＣＰＵは、ソースコード１３４に含まれる多重ループ毎に、第１の値と第２の値とを比較する。そして、ＣＰＵは、ソースコード１３４に含まれる多重ループのうち、第１の値が第２の値よりも大きい多重ループを第１変換コードに変換し、ソースコードに含まれる多重ループのうち、第２の値が第１の値よりも大きい多重ループを第２変換コードに変換する。
【００４４】
これにより、本実施の形態におけるＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数に応じて、各多重ループの変換方法を選択することが可能になる。そのため、ＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数によらず、メインメモリからのキャッシュラインの読出し頻度を抑えることが可能になる。したがって、ＣＰＵは、キャッシュラインに対する書き込み動作に要する処理時間を短縮することが可能になる。また、ＣＰＵは、要求メモリスループットを下げることに伴う性能向上を実現することが可能になる。
【００４５】
［情報処理装置のハードウエア構成］
次に、情報処理装置１のハードウエア構成について説明する。図８は、情報処理装置１のハードウエア構成を説明する図である。
【００４６】
情報処理装置１は、図８に示すように、プロセッサであるＣＰＵ１０１と、メインメモリ１０２（以下、単にメモリ１０２とも呼ぶ）と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体（ストレージ）１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００４７】
記憶媒体１０４は、記憶媒体１０４内のプログラム格納領域（図示しない）に、コンパイル処理及びコード実行処理を行うプログラム１１０を記憶する。
【００４８】
ＣＰＵ１０１は、図８に示すように、プログラム１１０の実行時に、プログラム１１０を記憶媒体１０４からメモリ１０２にロードし、プログラム１１０と協働することによってコンパイル処理を行う。
【００４９】
記憶媒体１０４は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）やＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等であり、コンパイル処理等を行う際に用いられる情報を記憶する情報格納領域１３０（以下、記憶部１３０とも呼ぶ）を有する。
【００５０】
また、外部インターフェース１０３は、ネットワークを介して操作端末３と通信を行う。
【００５１】
［情報処理装置のソフトウエア構成］
次に、情報処理装置１のソフトウエア構成について説明する。図９は、情報処理装置１の機能のブロック図である。図１０は、情報格納領域１３０に記憶された情報のブロック図である。
【００５２】
ＣＰＵ１０１は、図９に示すように、プログラム１１０と協働することにより、第１情報算出部１１１と、第２情報算出部１１２と、情報判定部１１３と、コード変換部１１４と、情報管理部１１５と、コード生成部１１６と、コード実行部１１７として動作する。また、情報格納領域１３０には、図１０に示すように、第１の値１３１と、第２の値１３２と、ループ情報１３３と、ソースコード１３４と、オブジェクトコード１３５が記憶されている。
【００５３】
なお、以下、第１情報算出部１１１、第２情報算出部１１２、情報判定部１１３、コード変換部１１４及び情報管理部１１５が、図２で説明したＳ３の処理の少なくとも一部を行うものとして説明を行う。また、コード生成部１１６が、図２で説明したＳ４の処理の少なくとも一部を行うものとして説明を行う。さらに、コード実行部１１７が、図３で説明したＳ１２の処理の少なくとも一部を行うものとして説明を行う。
【００５４】
第１情報算出部１１１は、ＸＦＩＬＬ命令の対象のキャッシュラインの特定を、ソースコード１３４に含まれる多重ループにおける最内ループの現在までのイタレーション数に基づいて行うＸＦＩＬＬ命令を含む変換コード（以下、第１変換コード１３４ａとも呼ぶ）が実行された場合に、メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値１３１を、ソースコード１３４に含まれる多重ループ毎に算出する。
【００５５】
第２情報算出部１１２は、ＸＦＩＬＬ命令の対象のキャッシュラインの特定を、ソースコード１３４に含まれる多重ループにおける最内ループの外側ループの現在までのイタレーション数に基づいて行うＸＦＩＬＬ命令を含む変換コード（以下、第２変換コード１３４ｂとも呼ぶ）が実行された場合に、メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値１３２を、ソースコード１３４に含まれる多重ループ毎に算出する。なお、最内ループの外側ループは、例えば、最内ループよりも１つ外側のループである。
【００５６】
情報判定部１１３は、ソースコード１３４に含まれる多重ループ毎に、第１情報算出部１１１が算出した第１の値１３１と、第２情報算出部１１２が算出した第２の値１３２との比較を行う。また、情報判定部１１３は、ソースコード１３４に含まれる多重ループ毎に、第１の値１３１及び第２の値１３２のそれぞれが所定の閾値よりも小さいか否かの判定を行う。
【００５７】
コード変換部１１４は、ソースコード１３４に含まれる多重ループのうち、情報判定部１１３が第２の値１３２よりも第１の値１３１の方が大きいと判定した多重ループのそれぞれを変換することによって、第２の値１３２よりも第１の値１３１の方が大きいと判定した多重ループ毎の第１変換コード１３４ａを生成する。また、コード変換部１１４は、ソースコード１３４に含まれる多重ループのうち、情報判定部１１３が第１の値１３１よりも第２の値１３２の方が大きいと判定した多重ループのそれぞれを変換することによって、第１の値１３１よりも第２の値１３２の方が大きいと判定した多重ループ毎の第２変換コード１３４ｂを生成する。なお、コード変換部１１４は、ソースコード１３４に含まれる多重ループのうち、情報判定部１１３が第１の値１３１及び第２の値１３２のそれぞれが所定の閾値よりも小さいと判定した多重ループについては変換を行わない。
【００５８】
また、コード変換部１１４は、ソースコード１３４に含まれる多重ループに、第１の値１３１または第２の値１３２の算出に必要な全ての情報がソースコード１３４のコンパイル時（翻訳時）に取得できない多重ループが存在する場合、存在した多重ループ毎に、第１変換コード１３４ａと、第２変換コード１３４ｂと、第１の値１３１及び第２の値１３２の算出を行う命令を含むコード（以下、情報算出コード１３４ｃとも呼ぶ）とを生成する。
【００５９】
情報管理部１１５は、例えば、情報格納領域１３０に記憶された各種情報の読み出し等を行う。
【００６０】
コード生成部１１６は、第１変換コード１３４ａが生成されている場合、生成された第１変換コード１３４ａのそれぞれからオブジェクトコード（以下、第１オブジェクトコード１３５ａとも呼ぶ）を生成する。また、コード生成部１１６は、第２変換コード１３４ｂが生成されている場合、生成された第２変換コード１３４ｂのそれぞれからオブジェクトコード（以下、第２オブジェクトコード１３５ｂとも呼ぶ）を生成する。また、コード生成部１１６は、ソースコード１３４に含まれる多重ループのうち、必要な多重ループのそれぞれからオブジェクトコード（以下、第３オブジェクトコード１３５ｃとも呼ぶ）を生成する。さらに、コード生成部１１６は、情報算出コード１３４ｃが生成されている場合、生成された情報算出コード１３４ｃのそれぞれからオブジェクトコード１３５（以下、第４オブジェクトコード１３５ｄとも呼ぶ）を生成する。そして、コード生成部１１６は、例えば、生成した各オブジェクトコード１３５を情報格納領域１３０に記憶する。
【００６１】
コード実行部１１７は、例えば、コード実行タイミングになった場合、情報格納領域１３０に記憶された各オブジェクトコード１３５を実行する。なお、ループ情報１３３については後述する。
【００６２】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明する。具体的に、図２で説明したＳ３及びＳ４の処理の概略について説明する。図１１は、Ｓ３及びＳ４の処理の概略について説明するフローチャートである。
【００６３】
情報処理装置１のＣＰＵ１０１は、対象領域（ＸＦＩＬＬ命令の対象領域）の特定を、最内ループによる第１の命令（最内ループに含まれる命令）の現在までのイタレーション数に基づいて行う第２の命令（ＸＦＩＬＬ命令）を含む第１変換コード１３４ａが実行された場合における第１の値１３１を、ソースコード１３４に含まれる多重ループ毎に算出する（Ｓ２１）。
【００６４】
そして、ＣＰＵ１０１は、対象領域の特定を、最内ループの外側ループに含まれる第１の命令の現在までのイタレーション数に基づいて行う第２の命令を含む第２変換コード１３４ｂが実行された場合における第２の値１３２を、ソースコード１３４に含まれる多重ループ毎に算出する（Ｓ２２）。
【００６５】
その後、情報処理装置１は、ソースコード１３４に含まれる多重ループ毎に、Ｓ１１の処理で算出した第１の値１３１が、Ｓ１２の処理で算出した第２の値１３２よりも大きいか否かの判定を行う（Ｓ２３）。
【００６６】
そして、ＣＰＵ１０１は、ソースコード１３４に含まれる多重ループのうち、第１の値１３１が第２の値１３２よりも大きい多重ループのそれぞれを第１変換コード１３４ａに変換し、ソースコード１３４に含まれる多重ループのうち、第２の値１３２が第１の値１３１よりも大きい多重ループのそれぞれを第２変換コード１３４ｂに変換する（Ｓ２４）。
【００６７】
これにより、本実施の形態におけるＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数に応じて、各多重ループの変換方法を選択することが可能になる。そのため、ＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数によらず、メモリ１０２からのキャッシュラインの読出し頻度を抑えることが可能になる。したがって、ＣＰＵは、キャッシュラインに対する書き込み動作に要する処理時間を短縮することが可能になる。また、ＣＰＵは、要求メモリスループットを下げることに伴う性能向上を実現することが可能になる。
【００６８】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１２から図１５は、第１の実施の形態におけるコンパイル処理及びコード実行処理の詳細を説明するフローチャートである。
【００６９】
［コンパイル処理（Ｓ３の処理）の詳細］
初めに、コンパイル処理の詳細について説明を行う。具体的に、図１２から図１４は、図２で説明したＳ３の処理の詳細について説明するフローチャートである。
【００７０】
情報処理装置１の情報管理部１１５は、図１２に示すように、情報格納領域１３０に記憶されたループ情報１３３を参照し、ソースコード１３４に含まれるループを１つ特定する（Ｓ３１）。ループ情報１３３は、ソースコード１３４に含まれるループのそれぞれを示す情報である。なお、ループ情報１３３は、例えば、ソースコード１３４から自動的に生成されて情報格納領域１３０に記憶されるものであってよい。
【００７１】
そして、情報管理部１１５は、Ｓ３１の処理で特定したループのイタレーション数の特定が可能であるか否かの判定を行う（Ｓ３２）。具体的に、情報管理部１１５は、例えば、Ｓ３１の処理で特定したループのイタレーション数が定数である場合、Ｓ３１の処理で特定したループのイタレーション数の特定が可能であると判定するものであってよい。
【００７２】
その結果、ループのイタレーション数の特定が可能でない場合（Ｓ３２のＮＯ）、情報管理部１１５は、ループ情報１３３に含まれる全ループの特定が行われたか否かの判定を行う（Ｓ３５）。そして、ループ情報１３３に含まれる全ループの特定が行われていると判定した場合（Ｓ３５のＹＥＳ）、情報処理装置１は、Ｓ３の処理を終了する。
【００７３】
一方、ループ情報１３３に含まれる全ループの特定がまだ行われていないと判定した場合（Ｓ３５のＮＯ）、情報管理部１１５は、Ｓ３１以降の処理を再度行う。すなわち、コード変換部１１４は、Ｓ３１の処理で特定したループがイタレーション数を特定することができないループである場合、Ｓ３１の処理で特定したループの変形を行わない旨の判定を行う。
【００７４】
また、Ｓ３２の処理において、ループのイタレーション数の特定が可能である場合（Ｓ３２のＹＥＳ）、情報管理部１１５は、Ｓ３１の処理で特定したループが多重ループであるか否かの判定を行う（Ｓ３３）。
【００７５】
そして、Ｓ３１の処理で特定したループが多重ループでないループ（１重ループ）であると判定した場合（Ｓ３３のＮＯ）、コード変換部１１４は、Ｓ３１の処理で特定した多重ループから第１変換コード１３４ａを生成し、情報格納領域１３０に記憶する（Ｓ３４）。具体的に、コード変換部１１４は、例えば、図６で説明した変換方法に従って、ＸＦＩＬＬ命令の生成及び多重ループの分割を行う。
【００７６】
一方、Ｓ３１の処理で特定したループが多重ループである場合（Ｓ３３のＹＥＳ）、コード変換部１１４は、図１３に示すように、Ｓ３１の処理で特定したループがコンパイル時にイタレーション数を特定することが可能なループであるか否かを判定する（Ｓ４１）。具体的に、コード変換部１１４は、例えば、Ｓ３１の処理で特定したループのイタレーション数がソースコード１３４に含まれる他の命令の実行に伴って決定する場合、Ｓ３１の処理で特定したループがコンパイル時にイタレーション数を特定することが可能でないループであると判定するものであってよい。
【００７７】
その結果、Ｓ３１の処理で特定したループがコンパイル時にイタレーション数を特定することが可能なループであると判定した場合（Ｓ４１のＹＥＳ）、第１情報算出部１１１は、第１の値１３１を算出する（Ｓ４２）。以下、第１の値１３１の算出方法の具体例について説明を行う。
【００７８】
［第１の値の算出方法の具体例］
第１情報算出部１１１は、Ｓ４２の処理において、例えば、以下の式（１）を用いることによって第１の値１３１の算出を行う。なお、式（１）において、ｈは、ＸＦＩＬＬ命令の実行に伴うレイテンシを隠蔽するために必要なイタレーション数を示す。さらに、ｎは、最内ループのイタレーション数を示す。
【００７９】
第１の値  ＝  （ｎ−ｈ＞０）？（ｎ−ｈ）／ｎ：０  ・・・  （１）
【００８０】
具体的に、例えば、ｎが９６であり、ｈが１９２である場合、第１情報算出部１１１は、第１の値１３１として０を算出する。
【００８１】
図１３に戻り、第２情報算出部１１２は、第２の値１３２を算出する（Ｓ４３）。以下、第２の値１３２の算出方法の具体例について説明を行う。
【００８２】
［第２の値の算出方法の具体例］
第２情報算出部１１２は、Ｓ４３の処理において、例えば、以下の式（２）を用いることによって第２の値１３２の算出を行う。なお、式（２）において、ｈは、ＸＦＩＬＬ命令の実行に伴うレイテンシを隠蔽するために必要なイタレーション数を示す。また、ｎは、最内ループのイタレーション数を示す。また、ｍは、外側ループのイタレーション数を示す。さらに、ｃｅｉｌ（ｘ）は、ｘ以上の最小の整数を算出する関数である。
【００８３】
第２の値  ＝  （ｍ−ｃｅｉｌ（ｈ／ｎ））／ｍ  ・・・  （２）
【００８４】
具体的に、例えば、ｎが９６であり、ｍが９６であり、ｈが１９２である場合、第２情報算出部１１２は、第２の値１３２として０．９６９（有効数字小数点以下３桁）を算出する。
【００８５】
図１３に戻り、情報判定部１１３は、Ｓ４２の処理で算出した第１の値１３１と、Ｓ４３の処理で算出した第２の値１３２とが所定の閾値以上であるか否かを判定する（Ｓ４４）。
【００８６】
その結果、Ｓ４２の処理で算出した第１の値１３１と、Ｓ４３の処理で算出した第２の値１３２とが所定の閾値以上でないと判定した場合（Ｓ４４のＮＯ）、情報管理部１１５は、Ｓ３５以降の処理を行う。すなわち、コード変換部１１４は、この場合、ループの変形を行うことによる効果が少ないと判定し、Ｓ３１の処理で特定されたループの変換を行わない旨の判定を行う。
【００８７】
一方、Ｓ４２の処理で算出した第１の値１３１と、Ｓ４３の処理で算出した第２の値１３２とが所定の閾値以上であると判定した場合（Ｓ４４のＹＥＳ）、情報判定部１１３は、Ｓ４３の処理で算出した第２の値１３２が、Ｓ４２の処理で算出した第１の値１３１を上回っているか否かを判定する（Ｓ４５）。
【００８８】
そして、Ｓ４３の処理で算出した第２の値１３２が、Ｓ４２の処理で算出した第１の値１３１を上回っていると判定した場合（Ｓ４５のＹＥＳ）、コード変換部１１４は、Ｓ３１の処理で特定した多重ループから第２変換コード１３４ｂを生成し、情報格納領域１３０に記憶する（Ｓ４６）。具体的に、コード変換部１１４は、例えば、図７で説明した変換方法に従って、ＸＦＩＬＬ命令の生成及び多重ループの分割を行う。その後、情報管理部１１５は、Ｓ３５以降の処理を行う。
【００８９】
一方、Ｓ４３の処理で算出した第２の値１３２が、Ｓ４２の処理で算出した第１の値１３１を上回っていないと判定した場合（Ｓ４５のＮＯ）、コード変換部１１４は、Ｓ３４以降の処理を行う。
【００９０】
すなわち、コード変換部１１４は、ソースコード１３４に含まれる多重ループ毎に、第１変換コード１３４ａと第２変換コード１３４ｂとのうち、コードの変換による効果がより大きいと予測される変換コードの生成を行う。以下、Ｓ４６の処理において行われるＸＦＩＬＬ命令の生成の具体例について説明を行う。
【００９１】
［ＸＦＩＬＬ命令の生成の具体例］
コード変換部１１４は、Ｓ４６の処理において、例えば、以下の式（３）及び（４）を用いることによって、ＸＦＩＬＬ命令の生成を行う。なお、式（３）及び（４）において、ｓは、キャッシュラインのサイズを示し、ｅは、ｓを多重ループに含まれる変数型サイズの最大値によって除算した値を示す。また、ｉは、最内ループのイタレーション数のカウンタ変数を示し、ｊは、外側ループのイタレーション数のカウンタ変数を示す。また、ｎは、最内ループのイタレーション数を示し、ｍは、外側ループのイタレーション数を示し、ａ（ｉ，ｊ）は、配列ａのｉ，ｊ要素のアドレスを示す。また、Ｄは、現在のイタレーションの配列先頭アドレスのｓバイトアラインメントと、次のイタレーションの配列先頭アドレスのｓバイトアラインメントとのずれの差分を示す。さらに、Ｍは、配列先頭アドレスのｓバイトアラインメントとのずれを示す。
【００９２】
Ｄ＝（ｍｏｄ（ａ（１，ｊ＋１），ｓ）−ｍｏｄ（ａ（１，ｊ），ｓ））／多重ループに含まれる変数型サイズの最大値  ・・・  （３）
【００９３】
Ｍ＝ｍｏｄ（ａ（１，１），ｓ）／多重ループに含まれる変数型サイズの最大値  ・・・  （４）
【００９４】
そして、Ｄ＝０であってＭ＝０である場合、毎回先頭アラインメントがｓバイトであるため、ｉ＝ｅ＊（ｋ−１）＋１、ｋ＝１，２，・・・，ｎ／ｅの要素に対し、ｊ＋１に対応するアドレスを指定してＸＦＩＬＬ命令を実行する。
【００９５】
また、Ｄ＝０であってＭ！＝０である場合、先頭ではないがアラインメントが毎回同じなので、ｉ＝（ｅ−Ｍ）＋ｅ＊（ｋ−１）＋１、ｋ＝１，２，・・・，（ｎ−Ｍ）／ｅの要素に対し、ｊ＋１に対応するアドレスを指定してＸＦＩＬＬ命令を実行する。
【００９６】
さらに、Ｄ！＝０である場合、先頭アドレスにおいてｓバイトアラインメントが保証されないので、ｉ＝（ｅ−Ｍ）＋ｍｏｄ（Ｄ＊（ｊ−１），ｅ）＋ｅ＊（ｋ−１）＋１、ｋ＝１，２，・・・，（ｎ−Ｍ＋ｍｏｄ（Ｄ＊（ｍ−１），ｅ）−ｅ）／ｅの要素に対し、ｊ＋１に対応するアドレスを指定してＸＦＩＬＬ命令を実行する。
【００９７】
具体的に、ｓ＝２５６、ｅ＝３２、ｎ＝９６、ｍ＝９６、Ｄ＝０、かつ、Ｍ＝０である場合、図７で説明した例のように、ｉ＝１，３３，６５、かつ、ｊ＋１となるａ（ｉ，ｊ＋１）に対してＸＦＩＬＬ命令を実行する。
【００９８】
また、ｓ＝２５６、ｅ＝３２、ｎ＝９６、Ｄ＝０、かつ、Ｍ＝１６である場合、ｉ＝１７，４９、かつ、ｊ＋１となるａ（ｉ，ｊ＋１）に対してＸＦＩＬＬ命令を実行する。
【００９９】
さらに、ｓ＝２５６、ｅ＝３２、ｎ＝９６、Ｄ＝３、かつ、Ｍ＝１６である場合、ｉ＝｛１７，４９｝＋ｍｏｄ（３（ｊ−１），３２）、かつ、ｊ＋１となるａ（ｉ，ｊ＋１）に対してＸＦＩＬＬ命令を実行する。
【０１００】
図１３に戻り、Ｓ３１の処理で特定したループがコンパイル時にイタレーション数を特定することが可能でないループである場合（Ｓ４１のＮＯ）、コード変換部１１４は、図１４に示すように、第１の値１３１及び第２の値１３２を生成する命令からなる情報算出コード１３４ｃを生成し、情報格納領域１３０に記憶する（Ｓ５１）。また、コード変換部１１４は、第１変換コード１３４ａを生成し、情報格納領域１３０に記憶する（Ｓ５２）。さらに、コード変換部１１４は、第２変換コード１３４ｂを生成し、情報格納領域１３０に記憶する（Ｓ５３）。
【０１０１】
すなわち、この場合、情報処理装置１は、オブジェクトコード１３５の実行時においてソースコード１３４の変換方法を決定する必要がある。そのため、コード変換部１１４は、第１変換コード１３４ａ及び第２変換コード１３４ｂのそれぞれを予め生成する。また、コード変換部１１４は、第１の値１３１及び第２の値１３２を算出するために用いられる情報算出コード１３４ｃを予め生成する。
【０１０２】
これにより、情報処理装置１は、コンパイル時においてソースコード１３４の変換方法を決定することができない場合であっても、メモリ１０２からのキャッシュラインの読出し頻度を抑えることが可能になる。
【０１０３】
［コンパイル処理（Ｓ４の処理）の詳細］
次に、コンパイル処理の詳細について説明を行う。具体的に、図１５は、図２で説明したＳ４の処理の詳細について説明するフローチャートである。
【０１０４】
コード生成部１１６は、図１５に示すように、情報格納領域１３０に記憶された第１変換コード１３４ａ、第２変換コード１３４ｂ及び情報算出コード１３４ｃのそれぞれから、第１オブジェクトコード１３５ａ、第２オブジェクトコード１３５ｂ及び第４オブジェクトコード１３５ｄを生成し、情報格納領域１３０に記憶する（Ｓ６１）。
【０１０５】
そして、コード生成部１１６は、例えば、情報格納領域１３０に記憶されたソースコード１３４に含まれるループのうち、コンパイル時にイタレーション数が特定できないループと、第１の値１３１及び第２の値１３２が閾値以上でないループとから、第３オブジェクトコード１３５ｃを生成し、情報格納領域１３０に記憶する（Ｓ６２）。
【０１０６】
これにより、コード生成部１１６は、第１オブジェクトコード１３５ａ、第２オブジェクトコード１３５ｂ及び第４オブジェクトコード１３５ｄだけでなく、ソースコード１３４に含まれる多重ループ（コード変換部１１４によって変換されていない多重ループ）から生成される第３オブジェクトコード１３５ｃについても併せて生成することが可能になる。
【０１０７】
［コード実行処理の詳細］
次に、コード実行処理の詳細について説明を行う。具体的に、図１６から図１８は、図３で説明したＳ１２の処理の詳細について説明するフローチャートである。
【０１０８】
コード実行部１１７は、図１６に示すように、情報格納領域１３０に記憶されたループ情報１３３を参照し、ソースコード１３４に含まれるループを１つ特定する（Ｓ７１）。
【０１０９】
そして、Ｓ７１の処理で特定したループのイタレーション数がコンパイル時に特定されているか否かを判定する（Ｓ７２）。
【０１１０】
その結果、Ｓ７１の処理で特定したループのイタレーション数がコンパイル時に特定されていると判定した場合（Ｓ７２のＹＥＳ）、コード実行部１１７は、Ｓ６１及びＳ６２の処理で生成されたオブジェクトコード１３５のうち、Ｓ７１の処理で特定したループに対応するオブジェクトコード１３５を実行する（Ｓ７３）。
【０１１１】
すなわち、Ｓ７１の処理で特定したループのイタレーション数がコンパイル時に特定されている場合、情報格納領域１３０には、Ｓ７１の処理で特定したループに対応するオブジェクトコード１３５として、第１オブジェクトコード１３５ａ、第２オブジェクトコード１３５ｂ及び第３オブジェクトコード１３５ｃのうちのいずれか１つが記憶されている。そのため、コード実行部１１７は、この場合、第１オブジェクトコード１３５ａ、第２オブジェクトコード１３５ｂ及び第３オブジェクトコード１３５ｃのうちのいずれか１つを実行する。
【０１１２】
その後、コード実行部１１７は、Ｓ７１の処理において、ループ情報１３３に含まれる全ループの特定が行われたか否かの判定を行う（Ｓ７４）。
【０１１３】
その結果、ループ情報１３３に含まれる全ループの特定が行われたと判定した場合（Ｓ７４のＹＥＳ）、情報処理装置１は、Ｓ１２の処理を終了する。一方、ループ情報１３３に含まれる全ループの特定がまだ行われていないと判定した場合（Ｓ７４のＮＯ）、コード実行部１１７は、Ｓ７１以降の処理を再度行う。
【０１１４】
また、Ｓ７２の処理において、Ｓ７１の処理で特定したループのイタレーション数がコンパイル時に特定されていないと判定した場合（Ｓ７２のＮＯ）、コード実行部１１７は、図１７に示すように、Ｓ６１の処理において情報算出コード１３４ｃから生成された第４オブジェクトコード１３５ｄのうち、Ｓ７１の処理で特定したループに対応するオブジェクトコード１３５を実行する（Ｓ８１）。
【０１１５】
すなわち、Ｓ７１の処理で特定したループのイタレーション数がコンパイル時に特定されていない場合、情報格納領域１３０には、Ｓ７１の処理で特定したループに対応するオブジェクトコード１３５として、第１オブジェクトコード１３５ａ、第２オブジェクトコード１３５ｂ、第３オブジェクトコード１３５ｃ及び第４オブジェクトコード１３５ｄが記憶されている。そのため、コード実行部１１７は、コード実行処理における他のオブジェクトコードの実行等に伴って、第１の値１３１及び第２の値１３２を算出するために必要な全ての情報が特定された場合、Ｓ７１の処理で特定したループに対応する第４オブジェクトコード１３５ｄの実行を行う。
【０１１６】
これにより、コード実行部１１７は、コンパイル時においては算出することができなかった第１の値１３１及び第２の値１３２の算出を行うことが可能になる。
【０１１７】
その後、コード実行部１１７は、Ｓ８１の処理で算出した第１の値１３１と第２の値１３２とが所定の閾値以上であるか否かを判定する（Ｓ８２）。
【０１１８】
その結果、算出した第１の値１３１と第２の値１３２とが所定の閾値以上でないと判定した場合（Ｓ８２のＮＯ）、コード実行部１１７は、Ｓ６２の処理で生成した第３オブジェクトコード１３５ｃのうち、Ｓ７１の処理で特定したループに対応する第３オブジェクトコード１３５ｃを実行する（Ｓ８３）。
【０１１９】
一方、Ｓ８１の処理で算出した第１の値１３１と第２の値１３２とが所定の閾値以上であると判定した場合（Ｓ８２のＹＥＳ）、コード実行部１１７は、図１８に示すように、Ｓ８１の処理で算出した第２の値１３２が第１の値１３１を上回っているか否かを判定する（Ｓ９１）。
【０１２０】
そして、第２の値１３２が第１の値１３１を上回っていないと判定した場合（Ｓ９１のＮＯ）、コード実行部１１７は、Ｓ６１の処理において第１変換コード１３４ａから生成された第１オブジェクトコード１３５ａのうち、Ｓ７１の処理で特定したループに対応する第１オブジェクトコード１３５ａを実行する（Ｓ９２）。
【０１２１】
一方、第２の値１３２が第１の値１３１を上回っていると判定した場合（Ｓ９１のＹＥＳ）、コード実行部１１７は、Ｓ６１の処理において第２変換コード１３４ｂから生成された第２オブジェクトコード１３５ｂのうち、Ｓ７１の処理で特定したループに対応する第２オブジェクトコード１３５ｂを実行する（Ｓ９３）。
【０１２２】
これにより、本実施の形態におけるＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数に応じて、各多重ループの変換方法を選択することが可能になる。そのため、ＣＰＵは、ソースコード１３４に含まれる多重ループのイタレーション数によらず、メモリ１０２からのキャッシュラインの読出し頻度を抑えることが可能になる。したがって、ＣＰＵは、キャッシュラインに対する書き込み動作に要する処理時間を短縮することが可能になる。また、ＣＰＵは、要求メモリスループットを下げることに伴う性能向上を実現することが可能になる。
【０１２３】
［第２の実施の形態］
次に、第２の実施の形態におけるコンパイル処理について説明を行う。図１９は、第２の実施の形態におけるコンパイル処理を説明するフローチャートである。
【０１２４】
第２の実施の形態における情報処理装置１のＣＰＵ１０１は、多重ループ（以下、第１ループとも呼ぶ）における書き込み領域サイズがキャッシュラインサイズよりも大きい場合、第１ループにおける書き込み領域サイズがキャッシュラインに収まるループ（以下、第２ループとも呼ぶ）と、第２ループ以外のループ（以下、第３ループとも呼ぶ）とに分割する。そして、ＣＰＵ１０１は、この場合、第２ループの書き込み領域サイズに対してのみ、ＸＦＩＬＬ命令の生成を行う。
【０１２５】
これにより、ＣＰＵ１０１は、ＸＦＩＬＬ命令の実行に伴って、メモリ１０２に記憶されたデータが破壊されることを防止することが可能になる。
【０１２６】
以下、第２の実施の形態におけるコンパイラ処理について説明を行う。なお、第１の実施の形態におけるコンパイラ処理と第２の実施の形態におけるコンパイラ処理とは、例えば、図１３で説明したＳ４６の処理のみが異なる。そのため、以下、第２の実施の形態におけるＳ４６の処理についてのみ説明を行う。
【０１２７】
［第２の実施の形態におけるＳ４６の処理］
コード変換部１１４は、図１９に示すように、Ｓ３１の処理で特定した第１ループにおける書き込み領域サイズを特定する（Ｓ１０１）。
【０１２８】
そして、Ｓ１０１の処理で特定した書き込み領域サイズがキャッシュラインよりも大きい場合（Ｓ１０２のＹＥＳ）、コード変換部１１４は、Ｓ３１の処理で特定した第１ループを、Ｓ１０１の処理で特定した書き込み領域サイズが１以上のキャッシュラインサイズで収まる第２ループと、第２ループ以外の第３ループとに分割する（Ｓ１０３）。その後、コード変換部１１４は、Ｓ１０３の処理で分割した第２ループに対して実行されるＸＦＩＬＬ命令を含む第２変換コード１３４ｂを生成し、情報格納領域１３０に記憶する（Ｓ１０４）。
【０１２９】
一方、Ｓ１０１の処理で特定した書き込み領域サイズがキャッシュラインよりも大きくない場合（Ｓ１０２のＮＯ）、コード変換部１１４は、Ｓ１０３及びＳ１０４の処理を行わない。
【０１３０】
具体的に、キャッシュラインサイズが２５６バイトである場合、第１ループに含まれる倍精度実数型の配列ａの要素は、１つのキャッシュライン上に３２要素配置される。そのため、例えば、配列ａの１次元目の要素数が１２６である場合、コード変換部１１４は、１つのキャッシュライン上に配置される３２要素の整数倍の要素である９６要素に対応する第２ループと、１つのキャッシュライン上に配置される３２要素未満の要素である３０要素に対応する第３ループとに分割する。そして、コード変換部１１４は、第２ループに対してのみＸＦＩＬＬ命令を生成する。
【０１３１】
これにより、ＣＰＵ１０１は、ＸＦＩＬＬ命令の実行に伴って、メモリ１０２に記憶されたデータ（配列ａ以外のデータ）が破壊されることを防止することが可能になる。
【０１３２】
以上の実施の形態をまとめると、以下の付記の通りである。
【０１３３】
（付記１）
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換するコンパイラであって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較し、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換する、
処理をコンピュータに実行させることを特徴するコンパイラ。
【０１３４】
（付記２）
付記１において、
前記変換する処理では、前記ソースコードに含まれる多重ループのうち、前記第１の値と前記第２の値とが等しい多重ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴するコンパイラ。
【０１３５】
（付記３）
付記１において、
前記変換する処理では、前記ソースコードに含まれる多重ループのうち、前記第１の値及び前記第２の値が所定の閾値よりも小さい多重ループの変換を行わない、
ことを特徴するコンパイラ。
【０１３６】
（付記４）
付記１において、 
前記第１変換コードに含まれる前記第２の命令は、前記最内ループによる前記第１の命令の現在までの繰返し回数よりも第１の回数後の前記第１の命令に対応するキャッシュラインが書き込まれる前記対象領域に対し、前記所定のデータを書き込む命令であり、
前記第１の値を算出する処理では、前記第１の回数を前記最内ループによるループ回数で除算することにより、前記第１の値を算出する、
ことを特徴するコンパイラ。
【０１３７】
（付記５）
付記１において、 
前記第２変換コードに含まれる前記第２の命令は、前記外側ループによる前記第１の命令の現在までの繰返し回数よりも第２の回数後の前記第１の命令に対応するキャッシュラインが書き込まれる前記対象領域に対し、前記所定のデータを書き込む命令であり、
前記第１の値を算出する処理では、前記第１の回数を前記最内ループによるループ回数で除算することにより、前記第１の値を算出する、
ことを特徴するコンパイラ。
【０１３８】
（付記６）
付記１において、 
前記第１の値を算出する処理では、前記第１の値の算出に要する情報の全てが取得可能である場合に、前記第１の値の算出を行い、
前記第２の値を算出する処理では、前記第２の値の算出に要する情報の全てが取得可能である場合に、前記第２の値の算出を行い、
前記変換する処理では、前記第１の値または前記第２の値の算出が行われていない場合、前記ソースコードに含まれる多重ループ毎に、前記第１変換コードと、前記第２変換コードと、前記第１の値及び前記第２の値の算出を行う命令を含む情報算出コードと、を生成する、
ことを特徴するコンパイラ。
【０１３９】
（付記７）
付記１において、
前記変換する処理では、
前記ソースコードに含まれる多重ループ毎に、前記多重ループの書き込み領域サイズと、前記キャッシュラインのサイズとを比較し、
前記ソースコードに含まれる多重ループ毎のうち、書き込み領域サイズが前記キャッシュラインのサイズより大きい第１ループを、前記第１ループの書き込み領域サイズが１以上の前記キャッシュラインのサイズに収まる第２ループと、前記第２ループ以外の第３ループとに分割し、
前記第２ループの書き込み領域サイズに対して前記第２の命令を実行するように、前記第１ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴するコンパイラ。
【０１４０】
（付記８）
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換する情報処理装置であって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出する第１情報算出部と、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出する第２情報算出部と、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較する情報判定部と、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換するコード変換部と、を有する、
ことを特徴する情報処理装置。
【０１４１】
（付記９）
付記８において、
前記コード変換部は、
前記ソースコードに含まれる多重ループ毎に、前記多重ループの書き込み領域サイズと、前記キャッシュラインのサイズとを比較し、
前記ソースコードに含まれる多重ループ毎のうち、書き込み領域サイズが前記キャッシュラインのサイズより大きい第１ループを、前記第１ループの書き込み領域サイズが１以上の前記キャッシュラインのサイズに収まる第２ループと、前記第２ループ以外の第３ループとに分割し、
前記第２ループの書き込み領域サイズに対して前記第２の命令を実行するように、前記第１ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴する情報処理装置。
【０１４２】
（付記１０）
ソースコードに含まれる多重ループのうちの最内ループに含まれる第１の命令が実行される際に、前記最内ループによる所定回数先の前記第１の命令の実行に伴ってメインメモリから読み出されるキャッシュラインが書き込まれるキャッシュメモリ内の対象領域に対し、所定のデータを書き込む第２の命令が実行されるように、前記ソースコードを変換するコンパイル方法であって、
前記対象領域の特定を、前記最内ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第１変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第１の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記対象領域の特定を、前記最内ループの外側ループによる前記第１の命令の現在までの繰返し回数に基づいて行う前記第２の命令を含む第２変換コードが実行された場合に、前記メインメモリからのキャッシュラインの読み出し回数が削減される割合を示す第２の値を、前記ソースコードに含まれる多重ループ毎に算出し、
前記ソースコードに含まれる多重ループ毎に、前記第１の値と前記第２の値とを比較し、
前記ソースコードに含まれる多重ループのうち、前記第１の値が前記第２の値よりも大きい多重ループを前記第１変換コードに変換し、前記ソースコードに含まれる多重ループのうち、前記第２の値が前記第１の値よりも大きい多重ループを前記第２変換コードに変換する、
ことを特徴するコンパイル方法。
【０１４３】
（付記１１）
付記１０において、
前記変換する工程では、
前記ソースコードに含まれる多重ループ毎に、前記多重ループの書き込み領域サイズと、前記キャッシュラインのサイズとを比較し、
前記ソースコードに含まれる多重ループ毎のうち、書き込み領域サイズが前記キャッシュラインのサイズより大きい第１ループを、前記第１ループの書き込み領域サイズが１以上の前記キャッシュラインのサイズに収まる第２ループと、前記第２ループ以外の第３ループとに分割し、
前記第２ループの書き込み領域サイズに対して前記第２の命令を実行するように、前記第１ループを前記第１変換コードまたは前記第２変換コードに変換する、
ことを特徴するコンパイル方法。
【符号の説明】
【０１４４】
１：情報処理装置          ２：記憶装置
３：操作端末              １０１：ＣＰＵ
１０２：メモリ            １０３：Ｉ／Ｏユニット
１０４：記憶媒体          １３０：情報格納領域
【図１】
2018206175.tif 000003
【図２】
2018206175.tif 000004
【図３】
2018206175.tif 000005
【図４】
2018206175.tif 000006
【図５】
2018206175.tif 000007
【図６】
2018206175.tif 000008
【図７】
2018206175.tif 000009
【図８】
2018206175.tif 000010
【図９】
2018206175.tif 000011
【図１０】
2018206175.tif 000012
【図１１】
2018206175.tif 000013
【図１２】
2018206175.tif 000014
【図１３】
2018206175.tif 000015
【図１４】
2018206175.tif 000016
【図１５】
2018206175.tif 000017
【図１６】
2018206175.tif 000018
【図１７】
2018206175.tif 000019
【図１８】
2018206175.tif 000020
【図１９】
2018206175.tif 000021