(57)【特許請求の範囲】
【請求項１】
情報処理装置が有する解析部に、前記情報処理装置が主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、ソースプログラムの解析により、複数階層のループ処理に含まれる配列構造をハードウェアプリフェッチの対象として特定させ、
前記情報処理装置が有する生成部に、前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を含むループ処理の上位階層となるループ処理の制御変数を追加次元の要素とする多次元配列に前記配列構造を変更させた機械語プログラムを、前記ソースプログラムから生成させる、
ための情報処理プログラム。
【請求項２】
前記解析部に、
前記機械語プログラムの実行により取得される、プログラムの性能に関するプロファイル情報に基づいて前記配列構造を特定させる、
請求項１に記載の情報処理プログラム。
【請求項３】
前記プロファイル情報は、前記配列構造へのアクセス回数、前記配列構造を記憶する領域の長さ、及び前記配列構造を記憶するキャッシュメモリ上の領域への他の変数からのアクセス状況の少なくとも１つを含む、
請求項２に記載の情報処理プログラム。
【請求項４】
前記解析部に、
前記ソースプログラム中の命令による指示に基づいて、又は、前記機械語プログラム実行時のオプションによる指示に基づいて、前記配列構造を特定させることができる、
請求項１から３のいずれか一項に記載の情報処理プログラム。
【請求項５】
前記解析部に、前記情報処理装置が前記主記憶装置上の一定間隔のストライド幅が開いた領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記一定間隔のスト
ライド幅が開いた領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、前記ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定させる、
請求項１から４のいずれか一項に記載の情報処理プログラム。
【請求項６】
主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する情報処理装置において、
ソースプログラムの解析により、複数階層のループ処理に含まれる配列構造をハードウェアプリフェッチの対象として特定する解析部と、
前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を含むループ処理の上位階層となるループ処理の制御変数を追加次元の要素とする多次元配列に前記配列構造を変更した機械語プログラムを、前記ソースプログラムから生成する生成部と、
を備える情報処理装置。
【請求項７】
情報処理装置が有する解析部が、前記情報処理装置が主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、ソースプログラムの解析により、複数階層のループ処理に含まれる配列構造をハードウェアプリフェッチの対象として特定し、
前記情報処理装置が有する生成部が、前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を含むループ処理の上位階層となるループ処理の制御変数を追加次元の要素とする多次元配列に前記配列構造を変更した機械語プログラムを、前記ソースプログラムから生成する、
情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理プログラム、情報処理装置、情報処理方法に関する。
【背景技術】
【０００２】
コンピュータは、主記憶よりも高速なキャッシュメモリを、プロセッサと主記憶との間に配置し、主記憶から読み出したデータをキャッシュメモリ上に保持することで、主記憶参照による待ち時間を減少させている。
【０００３】
ところが、大規模データを使用する数値計算処理等は、データ参照の局所性が低いためにキャッシュミスが多発し、主記憶参照による待ち時間を十分に減らせない場合がある。このようなキャッシュミスに対処するため、使用に先行して、データを主記憶からキャッシュメモリへ移動するプリフェッチと呼ばれる技術が知られている。
【０００４】
プリフェッチ技術は、ソフトウェアプリフェッチとハードウェアプリフェッチの２種類に大別される。ソフトウェアプリフェッチは、プリフェッチ命令をプロセッサに用意し、プログラム中にプリフェッチ命令を挿入する方法である。一方、ハードウェアプリフェッチは、ハードウェアが動的にデータアクセスパターンを検知し、次にアクセスするデータを予測して自動的にプリフェッチする方法である。
【０００５】
ハードウェアプリフェッチに関して、アドレスに連続性を持つデータ転送を自動検出することで、プリフェッチ対象となるデータ領域を決定する技術が知られている。また、一定の間隔（以下、ストライド幅ともいう）が開いたデータアクセスを検出するストライドプリフェッチと呼ばれる技術が知られている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−１１２９０１号公報
【特許文献２】特開平０８−２１２０８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、連続領域へのアクセスに対し、キャッシュミスの発生回数が閾値ｎになると、ハードウェアプリフェッチが開始される方式の場合、閾値ｎが小さいと、不要なプリフェッチが、連続領域へのアクセス終了後も実行される。このため、メモリバンド幅が圧迫されるおそれがある。一方、閾値ｎが大きいと、ハードウェアプリェッチが起動されるまでのウォームアップ時間が増え、キャッシュミスによる読出し遅延が隠蔽されなくなる。
【０００８】
適切な閾値ｎは、プログラムからアクセスされる連続領域の平均的な長さに依存するが、連続領域長によっては、ウォームアップ時間の間に連続領域へのアクセスが終了し、ハードウェアプリェッチの効果が得られない。
【０００９】
また、同じ領域を繰り返しアクセスする場合に、ハードウェアプリフェッチが停止するという問題が生じる。例えば、配列を含むループ処理において、処理がループの先頭に戻ると、配列へのアクセスも先頭に戻り、連続領域へのアクセスではなくなるため、ハードウェアプリフェッチは停止する。他の変数のデータへのアクセスにより配列のデータがキャッシュメモリから追い出されるとキャッシュミスが発生する。キャッシュミスの発生は
、性能低下の要因となる。
【００１０】
さらに、繰り返し処理の中で参照される複数のデータが、同じキャッシュラインに割り当てられることにより、キャッシュライン競合の問題が生じる。例えば、３つの配列Ａ、Ｂ、Ｃは、キャッシュメモリのウェイ数を２として、同一のキャッシュラインに割り当てられるものとする。ウェイ数は、同一のキャッシュラインに複数のメモリブロックが割り当てられた場合に、並列して保持することができるメモリブロックの数である。
【００１１】
配列Ａの参照後に、配列Ｂ及び配列Ｃが参照されると、ウェイ数が２であるため、配列Ｂ及び配列Ｃのデータは配列Ａのデータと競合する。参照されていない時間が他の配列より長い配列Ａのデータは、キャッシュラインから追い出される。次に配列Ａのデータにアクセスすると、キャッシュミスが発生する。これが交互に繰り返されると、配列Ａの先頭にアクセスするたびにキャッシュミスが発生する。データが頻繁にキャッシュから追い出される動作は、キャッシュスラッシングと呼ばれ、性能低下の要因となる。
【００１２】
本発明の一態様は、ハードウェアプリフェッチの適用範囲を拡大し、キャッシュミスによる読出し遅延を隠蔽して性能向上を図る情報処理プログラム、情報処理装置、情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明の態様の一つは、
情報処理装置が有する解析部に、前記情報処理装置が主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定させ、
前記情報処理装置が有する生成部に、前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を変更させた機械語プログラムを、前記ソースプログラムから生成させる、ための情報処理プログラム
である。
【発明の効果】
【００１４】
開示の情報処理プログラム、情報処理装置、情報処理方法によれば、ハードウェアプリフェッチの適用範囲を拡大し、キャッシュミスによる読出し遅延を隠蔽して性能向上を図ることができる。
【図面の簡単な説明】
【００１５】
【図１】ハードウェアプリフェッチ起動の例を示す図である。
【図２】ハードウェアプリフェッチ起動の具体例を示す図である。
【図３】ハードウェアプリフェッチ停止の具体例を示す図である。
【図４】ハードウェアプリフェッチの停止によりキャッシュミスが発生する例を示す図である。
【図５】キャッシュラインの競合によりキャッシュミスが発生する例を示す図である。
【図６】図５の具体例を示す図である。
【図７】キャッシュブロッキング適用前後のソースコードの例を示す図である。
【図８】図７の配列Ｂによるメモリアクセスイメージの例を示す図である。
【図９】配列の多次元化により、ハードウェアプリフェッチが継続される例を示す図である。
【図１０Ａ】キャッシュラインの競合が生じるソースコードの例を示す図である。
【図１０Ｂ】キャッシュラインの競合が生じた場合のメモリアクセスイメージの例を示す図である。
【図１１Ａ】配列の多次元化により、キャッシュラインの競合を回避するソースコードの例を示す図である。
【図１１Ｂ】キャッシュラインの競合が回避された場合のメモリアクセスイメージの例を示す図である。
【図１２】情報処理装置の装置構成の一例を示す図である。
【図１３】情報処理装置の処理構成の一例を示す図である。
【図１４】コンパイラにおける解析部の処理構成の一例を示す図である。
【図１５Ａ】解析対象のループ処理のソースコードの例を示す図である。
【図１５Ｂ】配列管理テーブルのデータ構造の一例を示す図である。
【図１５Ｃ】ＤＯ管理テーブルのデータ構造の一例を示す図である。
【図１６】コンパイラが特定した配列を多次元化するソースコードの例を示す図である。
【図１７】２次元配列を３次元配列に多次元化するソースコードの例を示す図である。
【図１８Ａ】配列に、定義及び参照の依存関係がある場合の例を示す図である。
【図１８Ｂ】図１８Ａの場合に、配列の多次元化を適用した例を示す図である。
【図１９】配列に、定義及び参照の依存関係がない場合の例を示す図である。
【図２０】同一の配列を含み構成が異なるループが複数存在するソースコードの例を示す図である。
【図２１】同一の配列を含み構成が同じループが複数存在するソースコードの例を示す図である。
【図２２】所定の配列を多次元化したオブジェクトを生成する処理のフローチャートの一例である。
【図２３】多次元化対象の配列を特定する処理のフローチャートの一例である。
【図２４】多次元化対象の配列の具体例を示す図である。
【図２５】第２実施形態における解析部の処理構成の一例を示す図である。
【図２６】コンパイラがプロファイル情報に基づいて特定した配列を多次元化するソースコードの例を示す図である。
【図２７Ａ】キャッシュラインの競合が生じる例を示す図である。
【図２７Ｂ】キャッシュラインの競合が生じない例を示す図である。
【図２８】キャッシュミスが発生する例を示す図である。
【図２９】性能向上の効果を評価するための属性のデータ構造の一例を示す図である。
【図３０】プロファイル情報を取得する処理のフローチャートの一例である。
【図３１】プロファイル情報に基づいて配列を多次元化する処理のフローチャートの一例である。
【図３２】ユーザが翻訳指示行により指定した配列を多次元化するソースコードの例を示す図である。
【図３３】コンパイラが、翻訳指示行により指定された配列を展開する処理のフローチャートの一例である。
【発明を実施するための形態】
【００１６】
以下、図面に基づいて、本発明の実施の形態を説明する。以下の実施形態の構成は例示であり、本発明は実施形態の構成に限定されない。
【００１７】
＜ハードウェアプリフェッチ機構＞
図１から図３は、ハードウェアプリフェッチ機構を説明するための図である。図１は、
ハードウェアプリフェッチ起動の例を示す図である。図１のｓ１で示すプログラムソースコード（以下、ソースコードともいう）には、ＤＯで始まるｊについてのループ処理が記載されている。ｊのループ処理は、更に、ｉのループ処理を含む。ｉのループ処理は、配列Ａ（ｉ，ｊ）を参照する処理を含む。配列Ａ（ｉ，ｊ）の参照により、主記憶装置上の連続領域がアクセスされる。
【００１８】
図１は、更に、ソースコードに対応するキャッシュメモリ（以下、メモリともいう）のアクセスイメージを示す。ハードウェアプリフェッチは、連続領域へのアクセスにより、一定時間後、自動的に起動される。例えば、図１において星印で示されるキャッシュミスが、連続するキャッシュラインで検出されると、次回も連続領域へのアクセスであるとみなして、次のキャッシュラインデータがプリフェッチされる。
【００１９】
図２は、ハードウェアプリフェッチ起動の具体例を示す図である。図２には、図１と同様のソースコードが記載されている。ただし、内側のループ処理における制御変数ｉは、１から１８までの値をとる。配列Ａ（ｉ，ｊ）の１要素は８バイトとする。また、１キャッシュラインの長さは１２８バイトとする。この場合、１キャッシュラインは１６要素を含む。
【００２０】
配列Ａ（ｉ，ｊ）の参照により、８バイト単位で連続領域にアクセスする場合、ｉが１の場合のアクセスで１回目のキャッシュミスが発生する。キャッシュメモリはキャッシュライン単位でメモリ内容の入替えを管理するため、ｉが２から１６の場合のアクセスは、アクセスするデータが同じキャッシュラインに存在し、キャッシュヒットする。ｉが１７の場合のアクセスでは、アクセスするデータが次のキャッシュラインに割り当てられるため、２回目のキャッシュミスが発生する。
【００２１】
連続領域へのアクセスに対するキャッシュミスか否かは、例えば、キャッシュライン番号によって判断される。連続するキャッシュライン番号に対し、キャッシュミスが複数回発生すると、ハードウェアプリフェッチが起動される。本実施形態は、キャッシュミスが２回発生すると、ハードウェアプリフェッチが起動されるものとして説明される。
【００２２】
図２において、２回目のキャッシュミスが発生することにより、ハードウェアプリフェッチが起動される。ハードウェアプリフェッチの起動により、点線で囲まれたプリフェッチ対象のキャッシュラインが、プリフェッチされる。しかしながら、内側のループ処理は、ｉが１８までで終了し、次のｊのループに処理が進む。このため、プリフェッチされたデータは参照されない。
【００２３】
図３は、ハードウェアプリフェッチ停止の具体例を示す図である。図３のｓ２で示すソースコードには、ｊのループ処理が記載されている。ｊが４の倍数でない場合は、ｉのループ処理が実行される。ｉのループ処理は、配列Ａ（ｉ，ｊ）を参照する処理を含む。ｉは１から１６までの値をとる。配列Ａ（ｉ，ｊ）の１要素は８バイトとし、１キャッシュラインの長さは１２８バイトとする。
【００２４】
ｊが１の場合、４の倍数ではないため、ｉのループ処理が実行される。ｉが１の場合のアクセスでキャッシュミスが発生する。ｉが２から１６の場合のアクセスは、アクセスするデータが同じキャッシュラインに存在するため、キャッシュヒットする。
【００２５】
ｊが２の場合も、ｉのループ処理が実行される。ｉが１の場合のアクセスで、２回目のキャッシュミスが発生する。２回のキャッシュミスの発生により、ハードウェアプリフェッチが起動され、次のキャッシュラインのデータがプリフェッチされる。ｊが３の場合も、ｉのループ処理が実行される。アクセスするデータがメモリ上にプリフェッチされてい
るため、キャッシュミスは発生しない。
【００２６】
ｊが４の場合、４の倍数であるため、ｉのループ処理は実行されない。これにより、連続領域へのアクセスは終了し、アクセスするデータを含むキャッシュラインのキャッシュライン番号は、昇順（又は降順）ではなくなる。この時点でハードウェアプリフェッチは停止する。ハードウェアプリフェッチは、ｊが５及び６の場合に連続してキャッシュミスが発生するまで起動されない。
【００２７】
なお、図面において、配列の要素は８バイト、１キャッシュラインの長さは１２８バイトとして説明するが、各サイズに限定はない。また、キャッシュライン番号が連続する複数のキャッシュラインにおいて、２回連続してキャッシュミスが発生した場合に、ハードウェアプリフェッチが起動されるものとして説明したが、キャッシュミスの発生回数は、２回に限定されるわけではない。ハードウェアプリフェッチの起動条件としてのキャッシュミス発生回数の閾値ｎは、任意であってもよい。
【００２８】
連続領域に対するハードウェアプリフェッチの起動条件において、適切な閾値ｎは、プログラム内でアクセスされる連続領域の平均的なサイズに依存する。閾値ｎが適切な値より小さいと、連続領域へのアクセスが終了した後も不要なプリフェッチが実行され、メモリバンド幅が圧迫される場合がある。一方、閾値ｎが適切な値より大きいと、ハードウェアプリェッチが起動されるまでのウォームアップ時間が延びて、キャッシュミスによる読出し遅延が隠蔽されなくなる。
【００２９】
一定の閾値ｎを設定してハードウェアプリフェッチを動作させる場合、プログラム内でアクセスされる連続領域のサイズによっては、ウォームアップ時間が経過する前に連続領域へのアクセスが終了し、ハードウェアプリフェッチによる効果が得られない場合がある。例えば、図３において、配列Ａ（ｉ，ｊ）の参照でアクセスされる連続領域のサイズ（１８×８バイト）は、キャッシュラインサイズ×２（１２８バイト×２）より小さい。このため、３番目のキャッシュラインがプリフェッチされるが、次のｊの値でのループ処理に進み、別領域へのアクセスとなるため、プリフェッチしたデータはアクセスされず、ハードウェアプリフェッチは無駄となる。
【００３０】
このように、不要なハードウェアプリフェッチの発行によってメモリバンド幅が浪費されたり、連続領域へのアクセスが発生しないためにハードウェアプリフェッチが停止したりすることで、ハードウェアプリフェッチによる効果が得られない場合もある。
【００３１】
なお、本実施形態における図面において、ソースコードの例はＦＯＲＴＲＡＮ言語により記載されるが、他のプログラミング言語であってもよく、各図面の説明は言語に依存しない。また、ハードウェアプリフェッチの起動条件となる連続領域へアクセスは、アドレスの昇順方向に連続する領域へのアクセスであっても、アドレスの降順方向に連続する領域へのアクセスであっても良い。
【００３２】
＜キャッシュミスの発生＞
図４から図６は、キャッシュミスが発生する例を説明するための図である。図４は、ハードウェアプリフェッチの停止によりキャッシュミスが発生する例を示す図である。図４に示すソースコードには、ｉのループ処理が記載されている。ｉのループ処理は、更に、ｊのループ処理を含む。ｊのループ処理は、配列Ａ（ｊ）を参照する処理を含む。
【００３３】
配列Ａ（ｊ）は、ｉについてのループごとに、配列Ａ（ｊ）のデータを含む同じ領域を繰返しアクセスする。図４において、ａは、配列Ａ（ｊ）のデータを含む領域である。ｉが１のとき、配列Ａ（ｊ）のデータへの１回目のアクセスにより、キャッシュミスが複数
回発生すると、ハードウェアプリフェッチが起動される。配列Ａ（ｊ）のデータは、最後までプリフェッチされる。
【００３４】
ｉが１の場合の処理が終了し、ｉが２に切り替わると、配列Ａ（ｊ）のデータへのアクセスは先頭に戻り、アクセスする領域が連続でなくなるため、ハードウェアプリフェッチは停止する。また、１回目のアクセスでキャッシュメモリに配置された配列Ａ（ｊ）のデータは、他の変数のデータへのアクセスにより、キャッシュメモリから追い出される場合がある。このため、配列Ａ（ｊ）のデータへの２回目のアクセスの際、配列Ａ（ｊ）のデータがキャッシュメモリから追い出されている場合には、キャッシュミスが発生する。
【００３５】
即ち、配列Ａ（ｊ）のデータへの２回目以降のアクセスの際、ハードウェアプリフェッチは停止し、他の変数のデータへのアクセスにより配列Ａ（ｊ）のデータがキャッシュメモリから追い出されている場合には、キャッシュミスが発生する。
【００３６】
図５は、キャッシュラインの競合によりキャッシュミスが発生する例を示す図である。図５には、図４と同様のソースコードが記載されている。ただし、ｉのループ処理は、ｊのループ処理の後、配列Ｂ（ｊ）及び配列Ｃ（ｊ）を参照する処理を含む。図５において、ａは、配列Ａ（ｊ）がアクセスする連続領域である。
【００３７】
ここで、３つの配列Ａ、Ｂ、Ｃは、キャッシュメモリのウェイ数を２として、同一のキャッシュラインに割り当てられているものとする。ｉがｎのとき、配列Ａ（ｊ）のデータへのｎ回目のアクセスにより、キャッシュミスが複数回発生すると、ハードウェアプリフェッチが起動される。配列Ａ（ｊ）のデータは、最後までプリフェッチされる。
【００３８】
その後、配列Ｂ（ｊ）及び配列Ｃ（ｊ）のデータがアクセスされると、同一のキャッシュラインに配置されていた配列Ａ（ｊ）のデータは、キャッシュラインから追い出される。このため、ｉがｎ＋１に切り替わった後、配列Ａ（ｊ）のデータへのｎ＋１回目のアクセスの際、キャッシュミスが発生する。これが交互に繰り返されるため、配列Ａ（ｊ）の先頭にアクセスするたびにキャッシュミスが発生する。
【００３９】
図６は、図５の具体例を示す図である。図６に示すソースコードには、ｉのループ処理が記載されている。ｉのループ処理は、更に、ｊのループ処理を２つ含む。１つめのｊのループ処理は、配列Ａ（ｊ）を参照する処理を含み、ｊは１から１７までの値をとる。２つめのｊのループ処理は、配列Ｂ（ｊ）及び配列Ｃ（ｊ）を参照する処理を含み、ｊは１から１０００までの値をとる。
【００４０】
なお、配列Ａ（ｊ）、Ｂ（ｊ）及び配列Ｃ（ｊ）は、要素数が16*1024/8の倍精度実数
型の配列である。プロセッサのデータキャッシュのウェイのサイズを１６Ｋバイトとすると、配列Ａ、Ｂ、Ｃはウェイのサイズと一致するため、各領域の先頭アドレスは、同じキャッシュライン番号が割り当てられる。
【００４１】
２つめのｊのループ処理における配列Ｂ（ｊ）及び配列Ｃ（ｊ）への参照により、配列Ｂ（ｊ）及び配列Ｃ（ｊ）のデータは、既にキャッシュライン上に配置されている配列Ａ（ｊ）のデータと競合する。このとき、配列Ａ（ｊ）のデータはキャッシュラインから追い出されるため、１つめのｊのループ処理において、配列Ａ（ｊ）の先頭にアクセスするたびにキャッシュミスが発生する。
【００４２】
配列Ａ（ｊ）の先頭へのアクセスによりキャッシュミスが発生すると、ｊが１から１６までのデータを含む１つめのキャッシュラインのデータが、キャッシュメモリに配置される。さらに、ｊが１７のとき、２つめのキャッシュラインのデータへのアクセスにより、
２回目のキャッシュミスが発生する。これにより、ハードウェアプリフェッチが起動され、３つめ以降のキャッシュラインのデータがプリフェッチされる。しかしながら、ｊについてのループは１７回で終了するため、３つめ以降のキャッシュラインのデータは活用されない。
【００４３】
このように、ループの回転数によっては、ハードウェアプリフェッチが起動されるまでの間に、連続領域へのアクセスが終了し、キャッシュミスの発生は低減されない。さらに、ハードウェアプリフェッチにより取得したデータは、プログラムでは使用されず、ハードウェアプリフェッチ自体が無駄となる。即ち、図６の例では、キャッシュラインの競合によるキャッシュスラッシングの発生に加えて、無駄なハードウェアプリフェッチが行われることになる。
【００４４】
＜キャッシュブロッキング＞
図７及び図８は、キャッシュブロッキングを説明するための図である。図７は、キャッシュブロッキング適用前後のソースコードの例を示す図である。キャッシュブロッキングは、ソフトウェアによる一般的な最適化手法であり、所定の間隔をあけてアクセスする領域に対し、「部分的に連続領域へのアクセス」となるようにアクセス方法を変更する。アクセス方法の変更により、アクセスしたデータをキャッシュメモリに残すことで、キャッシュミスが削減される。以下、キャッシュブロッキングは、ブロッキングとも称される。
【００４５】
具体的には、アクセスする領域がキャッシュメモリに収まるようにデータ構造をブロック化し、ブロックごとにアクセスすることで、キャッシュミスの発生が低減される。ループネスト構造の変更により、ブロック単位にアクセスするように、アクセス手法が変更される。キャッシュメモリに配置されたデータブロックが利用又は再利用されることで、メモリアクセス及びメモリ帯域幅への負担が軽減される。
【００４６】
図７のブロッキング適用前のソースコードの例では、最内ループ処理の制御変数が、配列Ｂ（ｊ，ｋ）の２次元目の変数ｋであるため、配列Ｂ（ｊ，ｋ）へのアクセスは、連続領域へのアクセスとはならず、キャッシュラインを超えたアクセスとなる。
【００４７】
図７のブロッキング適用後のソースコードの例では、各制御変数のループ処理が細分化される。これにより、アクセスする単位がブロック化され、配列Ｂ（ｊ，ｋ）のデータのうち、同一キャッシュラインに取得されたデータはキャッシュメモリに残る。
【００４８】
図８は、図７の配列Ｂによるメモリアクセスイメージの例を示す図である。図８のメモリアクセスイメージにおいて、メモリは横方向に配置される。ブロッキング適用前は、配列Ｂへのアクセスは、キャッシュラインを超えた縦方向のアクセスとなる。ブロッキング適用後は、配列Ｂへのアクセスは、ブロック化された領域へのアクセスとなる。ウェイ数が２の場合、同一キャッシュラインに割り当てられた２組のデータがキャッシュメモリに残るため、ブロッキング適用後の配列Ｂへのアクセスは、キャッシュヒットする。
【００４９】
しかし、キャッシュメモリ上の配列Ｂのデータは、他の変数へのアクセス等によりキャッシュから追い出される場合がある。この場合、キャッシュミスの発生は低減されず、ループ追加による分岐処理の増加により性能が劣化する。
【００５０】
また、ブロック長がキャッシュサイズよりも大きい場合、ブロッキングしたデータがキャッシュから溢れるため、キャッシュミスの発生は低減されない。さらに、キャッシュサイズの異なるシステムにプログラムを移行する場合には、ブロック長をキャッシュサイズ以下に修正しなければ、キャッシュミスの発生は低減されない。キャッシュミスの発生が低減されない場合、性能向上は図れない。
【００５１】
＜第１実施形態＞
第１実施形態では、コンパイラは、複数階層のループ処理において、所定の条件を満たす配列を特定し、特定した配列を多次元化する。配列の多次元化により、外側のループ処理の繰り返しごとに配列の先頭へのアクセスが繰り返されるのではなく、外側のループ処理全体を通じて、連続したアドレスを持つ領域がアクセスされる。これにより、ハードウェアプリフェッチは継続され、キャッシュミスの発生は低減される。
【００５２】
また、配列の多次元化により、外側のループ処理全体を通じて、連続したアドレスを持つ領域がアクセスされるため、配列のデータは別のキャッシュラインに割り当てられ、他の変数とのキャッシュラインの競合が回避される。これにより、キャッシュミスの発生は低減される。
【００５３】
図９から図１１Ｂは、配列の多次元化により、キャッシュミスの発生が低減されることを説明するための図である。図９は、ハードウェアプリフェッチの継続に関する。図１０Ａから図１１Ｂは、キャッシュラインの競合回避に関する。
【００５４】
図９は、配列の多次元化により、ハードウェアプリフェッチが継続される例を示す図である。図９のｓ３で示すソースコードには、ｉのループ処理が記載されている。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、配列Ａ（ｊ，ｉ）を参照する処理を含む。配列Ａ（ｊ，ｉ）は、外側のループ処理の制御変数ｉを追加次元の要素とする多次元配列として、配列Ａ（ｊ）を再定義したものである。
【００５５】
図９のソースコードは、Ｆｏｒｔｒａｎ言語で示されるが、Ｃ言語の場合、１次元配列Ａ[ｊ]は、２次元配列Ａ[ｊ，ｉ]として再定義される。また、ここでは１次元配列が２次元配列に多次元化される例を示すが、次元に限定はなく、多次元化対象の配列は、２次元以上であってもよい。
【００５６】
図９のｍ１示すメモリアクセスイメージにおいて、配列Ａの多次元化により、ｉが２からｘまでの間、外側のループ処理でアクセスされる配列Ａのデータが、連続領域として用意される。
【００５７】
配列Ａのデータへの１回目のアクセスにより、星印で示されるキャッシュミスが発生する。配列Ａのデータへの２回目のアクセスにより、連続領域に対する２回目のキャッシュミスが発生し、ハードウェアプリフェッチが起動される。外側のループ処理の間、連続領域のアクセスとなるため、配列Ａのデータへの２回目以降のアクセスにおいてもハードウェアプリフェッチは継続される。
【００５８】
ハードウェアプリフェッチが継続されるため、配列Ａのデータは、他の変数へのアクセスによってキャッシュメモリから追い出されても、プリフェッチにより再度キャッシュメモリに配置される。配列Ａのデータがキャッシュメモリ上に残るため、キャッシュミスの発生は低減される。
【００５９】
図１０Ａから図１１Ｂは、キャッシュラインの競合について説明するための図である。図１０Ａは、キャッシュラインの競合が生じるソースコードの例を示す図である。図１０Ａは、図６とほぼ同様のソースコードであるため、共通する部分についての説明は省略される。内側のループ処理のうち、１つめのｊのループ処理は、配列Ａ（ｊ）を参照する処理を含み、ｊは１から３３までの値をとる。
【００６０】
図１０Ｂは、キャッシュラインの競合が生じた場合のメモリアクセスイメージの例を示
す図である。外側のループ処理においてｉがｎのとき、配列Ａのデータへのアクセスにより、矢印で示されるキャッシュミスが２回発生する。
【００６１】
図１０Ｂのｆ１で示す図において、横軸は配置アドレスを示し、縦軸はキャッシュライン番号Ｌを示す。キャッシュミスにより主記憶装置から取得される配列Ａのデータは、下から２番目のキャッシュラインに配置される。次に、配置アドレスが、配列Ａと所定の間隔で離れている配列Ｂが参照される。配列Ｂのデータは、配列Ａと同じく下から２番目のキャッシュラインに配置される。次に、配置アドレスが、配列Ｂと所定の間隔で離れている配列Ｃが参照される。配列Ｃのデータも、配列Ａと同じく下から２番目のキャッシュラインに配置されるが、ウェイ数が２の場合、配列Ａ及び配列Ｂが２つのウェイを使用しているため、キャッシュラインの競合が発生する。キャッシュスラッシングにより、配列Ａのデータは、キャッシュメモリから追い出される。
【００６２】
外側のループ処理において、ｉがｎ＋１の場合の処理が実行される。配列Ａのデータへのアクセスにおいて、配列Ａのデータはキャッシュメモリから追い出されているため、矢印で示されるキャッシュミスが２回発生する。その後、ｉがｎのときと同様に処理が進み、キャッシュラインの競合が発生する。キャッシュスラッシングにより、配列Ａのデータがキャッシュメモリから追い出される。ｉがｎ＋２以降の処理においても、同様に、キャッシュラインの競合が発生し、配列Ａのデータにアクセスする毎に、キャッシュミスが発生する。
【００６３】
図１１Ａは、配列の多次元化により、キャッシュラインの競合を回避するソースコードの例を示す図である。図１１Ａは、図１０Ａとほぼ同様のソースコードであるため、共通する部分については説明を省略する。内側のループ処理のうち、１つめのｊのループ処理は、配列Ａ（ｊ，ｉ）を参照する処理を含む。配列Ａ（ｊ，ｉ）は、配列Ａ（ｊ）を、外側のループ処理の制御変数ｉにより多次元化したものである。
【００６４】
図１１Ｂは、キャッシュラインの競合が回避された場合のメモリアクセスイメージの例を示す図である。外側のループ処理においてｉが１のとき、配列Ａのデータへの１回目のアクセスにより、矢印で示されるキャッシュミスが２回発生する。
【００６５】
図１１Ｂのｆ２で示す図において、横軸は配置アドレスを示し、縦軸はキャッシュライン番号Ｌを示す。キャッシュミスにより主記憶装置から取得される配列Ａのデータは、下から２番目のキャッシュラインに配置される。次に、配置アドレスが、配列Ａと所定の間隔で離れている配列Ｂが参照される。配列Ｂのデータは、下から２番目のキャッシュラインに配置される。次に、配置アドレスが、配列Ｂと所定の間隔で離れている配列Ｃが参照される。配列Ｃのデータは、下から２番目のキャッシュラインに配置される。
【００６６】
なお、配列Ａの多次元化により、配列Ａ（ｊ，ｉ）のデータを含む領域は、外側ループ処理の制御変数ｉについても連続領域となる。即ち、配列Ａ（ｊ，ｉ）のデータは、異なるキャッシュライン番号を持つキャッシュラインにも配置される。このため、ｊのループ処理が繰り返されるごとに同じキャッシュラインがアクセスされるわけではなく、２回目以降のアクセスでは、異なるキャッシュライン番号のキャッシュラインがアクセスされる。
【００６７】
例えば、外側のループ処理においてｉが２のとき、配列Ａ（ｊ，ｉ）のデータへの２回目のアクセスは、下から３番目のキャッシュラインへのアクセスとなり、配列Ｂ及び配列Ｃとのキャッシュラインの競合は発生しない。ｉが３以降の場合も、配列Ｂ及び配列Ｃと同じキャッシュラインへのアクセスにはならず、配列Ｂ及び配列Ｃとのキャッシュラインの競合は発生しない。
【００６８】
即ち、配列の多次元化により、特定のキャッシュラインにアクセスが集中せず、他の変数のデータへのアクセスとのキャッシュラインの競合を減らすことができる。キャッシュラインの競合が減ることで、キャッシュミスの発生が低減される。
【００６９】
＜装置構成＞
図１２は、情報処理装置１の装置構成の一例を示す図である。情報処理装置１は、プロセッサ１０１、主記憶装置１０２、補助記憶装置１０３、入力装置１０４、出力装置１０５、ネットワークインタフェース１０６、可搬記録媒体駆動装置１０７を備える。また、これらはバス１０９により互いに接続されている。
【００７０】
プロセッサ１０１は、例えば、Central Processing Unit（ＣＰＵ）である。プロセッ
サ１０１は、補助記憶装置１０３又は可搬記録媒体１１０に保持されたＯＳや様々なアプリケーションプログラムを主記憶装置１０２にロードして実行することによって、様々な処理を実行する。プロセッサ１０１は、１つに限られず、複数備えられてもよい。
【００７１】
主記憶装置１０２は、プロセッサ１０１に、補助記憶装置１０３に格納されているプログラムをロードするための記憶領域、及びプログラムを実行するための作業領域を提供する。また、主記憶装置１０２は、データを保持するためのバッファとして用いられる。主記憶装置１０２は、例えば、Read Only Memory（ＲＯＭ）、Random Access Memory（ＲＡＭ）等の半導体メモリである。
【００７２】
補助記憶装置１０３は、様々なプログラムや、各プログラムの実行に際してプロセッサ１０１が使用するデータを格納する。補助記憶装置１０３は、例えば、Erasable Programmable ROM（ＥＰＲＯＭ）、又はハードディスクドライブ（Hard Disk Drive）等の不揮発性のメモリである。補助記憶装置１０３は、例えば、オペレーティングシステム（Operating System、ＯＳ）、コンパイラプログラム、その他様々なアプリケーションプログラムを保持する。
【００７３】
入力装置１０４は、例えば、キーボード、マウス等のポインティングデバイス等である。入力装置１０４から入力されたデータは、プロセッサ１０１に出力される。出力装置１０５は、プロセッサ１０１の処理の結果を出力する。出力装置１０５は、例えば、ディスプレイ、プリンタ、スピーカ等の音声出力装置である。
【００７４】
ネットワークインタフェース１０６は、ネットワークとの情報の入出力を行うインタフェースである。ネットワークインタフェース１０６は、有線のネットワークと接続するインタフェース、無線のネットワークと接続するインタフェースを含む。ネットワークインタフェース１０６は、例えば、Network Interface Card（ＮＩＣ）、無線Local Area Network（ＬＡＮ）カード等である。ネットワークインタフェース１０６で受信されたデータ等は、プロセッサ１０１に出力される。
【００７５】
可搬記録媒体駆動装置１０７は、可搬記録媒体１１０に記録されるプログラムや各種データを読出し、プロセッサ１０１に出力する。可搬記録媒体１１０は、例えば、ＳＤカード、ｍｉｎｉＳＤカード、ｍｉｃｒｏＳＤカード、Universal Serial Bus（ＵＳＢ）フラッシュメモリ、Compact Disc（ＣＤ）、Digital Versatile Disc(ＤＶＤ)、フラッシュメモリカード等の記録媒体である。
【００７６】
例えば、情報処理装置１では、プロセッサ１０１が、補助記憶装置１０３に保持されるコンパイラプログラムを主記憶装置１０２にロードして実行する。なお、情報処理装置１の装置構成は一例であり、上記に限られず、実施の形態に応じて適宜構成要素の省略や置
換、追加が可能である。コンパイラプログラムは、例えば、可搬記録媒体１１０に記録されていてもよい。
【００７７】
＜処理構成＞
図１３から図１５Ｃは、情報処理装置１の処理構成を説明するための図である。図１３は、情報処理装置の処理構成の一例を示す図である。情報処理装置１は、コンパイラ２、ソースプログラム１１、機械語プログラム１２、チューニング情報１３を含む。
【００７８】
コンパイラ２は、Ｆｏｒｔｒａｎ等の高級言語で記述されたソースプログラム１１を翻訳し、機械語プログラム１２及びチューニング情報１３を出力する。機械語プログラム１２は、プロセッサ１０１が直接実行することができる一連の命令である。機械語プログラム１２は、以下、オブジェクトとも称される。チューニング情報１３は、コンパイラ２の翻訳結果に関する情報である。
【００７９】
コンパイラ２は、パーサー部２０、中間コード変換部２１、解析部２２、最適化部２３、コード生成部２４を含む。プロセッサ１０１は、パーサー部２０、中間コード変換部２１、解析部２２、最適化部２３、コード生成部２４として、主記憶装置１０２に実行可能に展開されたコンピュータプログラムを実行する。ただし、パーサー部２０、中間コード変換部２１、解析部２２、最適化部２３、コード生成部２４のいずれか、またはその処理の一部がハードウェア回路により実行されてもよい。
【００８０】
パーサー部２０は、ソースプログラム１１を解析する。中間コード変換部２１は、パーサー部２０による解析結果に基づいて、ソースプログラム１１を中間コードに変換する。解析部２２は、中間コードを解析し、所定の条件を満たす配列を特定する。最適化部２３は、解析部２２が特定した配列を多次元化し、中間コードを最適化する。コード生成部２４は、最適化部２３により最適化された中間コードを機械語プログラム１２に変換する。最適化部２３及びコード生成部２４は、生成部の一例である。
【００８１】
図１４は、コンパイラにおける解析部２２の処理構成の一例を示す図である。解析部２２は、ループデータ記憶部３０、配列データ記憶部３１、ループ構造解析部３２、配列解析部３３、依存関係解析部３４を含む。プロセッサ１０１は、ループデータ記憶部３０、配列データ記憶部３１、ループ構造解析部３２、配列解析部３３、依存関係解析部３４として、主記憶装置１０２に実行可能に展開されたコンピュータプログラムを実行する。ただし、ループデータ記憶部３０、配列データ記憶部３１、ループ構造解析部３２、配列解析部３３、依存関係解析部３４のいずれか、またはその処理の一部がハードウェア回路により実行されてもよい。
【００８２】
ループデータ記憶部３０は、ＤＯ管理テーブル３０１を有する。ＤＯ管理テーブル３０１は、ループ構造解析部３２、配列解析部３３、依存関係解析部３４によって作成される。ＤＯ管理テーブル３０１は、行番号、ネストレベル、制御変数、初期値、終値、増分、変数名等のループに関する情報を格納する。
【００８３】
配列データ記憶部３１は、配列管理テーブル３１１を有する。配列管理テーブル３１１は、配列解析部３３、依存関係解析部３４によって作成される。配列管理テーブル３１１は、配列名、添字数、次元ごとの添字名、ループ内の定義及び参照等の配列に関する情報を格納する。
【００８４】
ループ構造解析部３２は、中間コードにおいてループ構造を解析し、解析結果をＤＯ管理テーブル３０１に格納する。配列解析部３３は、中間コードにおいて配列構造を解析し、解析結果をＤＯ管理テーブル３０１及び配列管理テーブル３１１に格納する。依存関係
解析部３４は、中間コードにおいて配列に定義と参照の依存関係があるか否かを解析し、解析結果をＤＯ管理テーブル３０１及び配列管理テーブル３１１に格納する。
【００８５】
解析部２２は、ループ構造解析部３２、配列解析部３３、依存関係解析部３４による解析結果から、多次元化対象の配列を特定することができる。解析部２２は、配列管理テーブル３１１において、多次元化対象の配列であるか否かを示す属性を定義して、特定された配列が処理対象の配列である旨を記憶してもよい。
【００８６】
図１５Ａは、解析対象のループ処理のソースコードの例を示す図である。図１５Ａにおいて、ＤＯで始まるｋのループ処理が、１００行目から記載されている。ｋのループ処理は、ｉのループ処理を含む。ｉのループ処理は、１１０行目から記載されている。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、１２０行目から記載されている。ｊのループ処理は、配列Ａ（ｊ，ｉ）を定義する処理を含む。
【００８７】
図１５Ｂは、配列管理テーブル３１１のデータ構造の一例を示す図である。配列管理テーブル３１１は、中間コードに含まれる配列ごとに、配列名、添字数、次元ごとの添字名、ループ内の定義及び参照等の属性の値を記憶する。
【００８８】
図１５Ｂにおいて、配列管理テーブル３１１は、図１５Ａの配列Ａ（ｊ，ｉ）に対応する属性の値を示す。「配列名」は、配列の変数名であり、“Ａ”を示す。「添字数」は、ｊ、ｉ等の配列の添字の数であり、“２”を示す。次元ごとの添字名は、各次元の添字の変数名であり、「１次元」の添字名は“ｊ”を示し、「２次元」の添字名は“ｉ”を示す。ループ内の定義及び参照は、配列に対し、定義がされているか否か、又は参照がされているか否かを記憶する。図１５Ａの配列Ａ（ｊ，ｉ）は、定義がされているが参照はされていない。このため、「定義」は“ＯＮ”を示し、「参照」は“ＯＦＦ”を示す。
【００８９】
図１５Ｃは、ＤＯ管理テーブル３０１のデータ構造の一例を示す図である。ＤＯ管理テーブル３０１は、中間コードに含まれるループ処理ごとに、行番号、ネストレベル、制御変数、初期値、終値、増分、変数名等の属性の値を記憶する。
【００９０】
図１５Ｃにおいて、ＤＯ管理テーブル３０１は、図１５Ａのｋ、ｉ、ｊについての３階層のループ処理における各階層でのループ処理の属性の値を示す。「行番号」は、ソースコード中の行番号であり、“１００”を示す。「ネストレベル」は、当該ループ処理の階層である。「制御変数」は、当該ループ処理における繰返しを制御する変数である。「初期値」は、制御変数が採り得る値の初期値である。「終値」は、制御変数が採り得る値の終値である。「増分」は、ループ処理が先頭に戻るときの制御変数の増分である。「変数名」は、当該ループ処理内に含まれる配列の変数名である。「変数名」は、ループ処理に含まれる配列の変数名である。「次ネスト管理」は、１階層下のループ処理のレコードへの参照である。
【００９１】
図１５Ｃのｔ１の表は、ｋのループ処理のレコードであり、ｋのループ処理の各属性の値を示す。「行番号」は“１００”を示す。「ネストレベル」は“３”を示す。「制御変数」は“ｋ”を示す。「初期値」は“１”を示す。「終値」は“ｚ”を示す。「増分」は“１”を示す。図１５Ａのソースコードでは、ｋのループ処理は配列を含まないため、「変数名」は空欄である。「次ネスト管理」は、ｉのループ処理のレコードを指す。
【００９２】
図１５Ｃのｔ２の表は、ｉのループ処理のレコードであり、ｉのループ処理の各属性の値を示す。「行番号」は“１１０”を示す。「ネストレベル」は“２”を示す。「制御変数」は“ｉ”を示す。「初期値」は“１”を示す。「終値」は“ｘ”を示す。「増分」は“１”を示す。図１５Ａのソースコードでは、ｉのループ処理は配列を含まないため、「
変数名」は空欄である。「次ネスト管理」は、jのループ処理のレコードを指す。
【００９３】
図１５Ｃのｔ３の表は、ｊのループ処理のレコードであり、ｊのループ処理の各属性の値を示す。「行番号」は“１２０”を示す。「ネストレベル」は“１”を示す。「制御変数」は“ｊ”を示す。「初期値」は“１”を示す。「終値」は“ｙ”を示す。「増分」は“１”を示す。「変数名」は“Ａ”を示す。
【００９４】
＜配列の多次元化＞
第１実施形態では、コンパイラ２は、ソースコードの解析により多次元化する配列を特定する。図１６から図２１は、配列の多次元化、及び多次元化対象の配列について説明するための図である。
【００９５】
図１６は、コンパイラ２が特定した配列を多次元化するソースコードの例を示す図である。図１６のｓ４で示すソースコードは、配列が多次元化される前のプログラムを示す。ｉのループ処理は、ｉが１からｘまでの値をとり、回転数がｘのループ処理である。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、ｊが１からｙまでの値をとり、回転数がｙのループ処理である。ｊのループ処理は、配列Ａ（ｊ）を参照する処理を含む。配列Ａ（ｊ）は、要素数１００の整数型１次元配列である。
【００９６】
図１６のｓ５で示すソースコードは、配列を多次元化した後のプログラムを示す。コンパイラ２は、配列Ａ（ｊ）を多次元化対象の配列として特定すると、配列Ａ（ｊ）を配列ＡＡ（ｊ，ｉ）に多次元化する。配列ＡＡ（ｊ，ｉ）は、１００×ｎの整数型２次元配列である。なお、ｎは、外側のｉのループ処理の回転数ｘと内側のｊのループ処理の回転数ｙのいずれか大きいほうの値をとる。コンパイラ２は、多次元化前のプログラムを、多次元化後のプログラムとみなして翻訳する。
【００９７】
多次元化対象の配列は、翻訳時において要素数が定数である割付け配列、又は上下限が定数式で示される形状明示配列であると想定される。例えば、「INTEGER, DIMENTION(100)::Ａ」のように要素数が定数１００である配列が想定される。
【００９８】
また、多次元化対象の配列は、作業領域に割り当てられる局所的な配列、共通ブロック実体及び仮引数等である場合のほうが、初期値を持つグローバルな領域での変数等である場合よりも、多次元化による性能向上の効果が大きい。
【００９９】
さらに、多次元化対象の配列は、内側のループ処理で定義又は参照される配列であって、外側のループ処理で更新されない配列が想定される。なお、定義は、配列等の変数に何等かの値を代入する処理であり、例えば、「Ａ（ｊ）＝・・・」のような式で例示される。一方、参照は、配列等の値を何等かの変数に代入する処理であり、例えば、「＝・・・Ａ（ｊ）」のような式で例示される。
【０１００】
図１６では、１次元配列を２次元配列に多次元化する例を示したが、多次元化対象の配列の次元数に限定はない。多次元化対象の配列の次元数は、２以上であってもよい。例えば、図１７は、２次元配列を３次元配列に多次元化するソースコードの例を示す図である。
【０１０１】
図１７のｓ６で示すソースコードは、配列が多次元化される前のプログラムを示す。ｋのループ処理は、ｉのループ処理を含む。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、２次元配列ＡＡ（ｊ，ｉ）を参照する処理を含む。
【０１０２】
図１７のｓ７で示すソースコードは、配列を多次元化した後のプログラムを示す。コン
パイラ２は、配列ＡＡ（ｊ，ｉ）を多次元化対象の配列として特定すると、配列ＡＡ（ｊ，ｉ）を３次元配列ＡＡＡ（ｊ，ｉ，ｋ）に多次元化する。
【０１０３】
図１８Ａから図１９は、定義及び参照の依存関係の有無により、配列を多次元化の対象とするか否かを判断する例を説明するための図である。図１８Ａは、配列に、定義及び参照の依存関係がある場合の例を示す図である。図１８Ａのソースコードにおいて、ｉのループ処理は、ｉが１から３までの値をとり、ｊのループ処理を含む。ｊのループ処理は、ｊが１から５までの値をとり、配列Ａ（ｊ）にＡ（ｊ）＋１の値を代入する処理を含む。即ち、内側のｊのループ処理において、配列Ａ（ｊ）に参照及び定義の依存関係が存在する。配列Ａ（ｊ）の各要素の初期値を０とすると、ｉが１のとき、配列Ａ（ｊ）の各要素の値は１となる。また、ｉが２のとき、配列Ａ（ｊ）の各要素の値は２となる。さらに、ｉが３のとき、配列Ａ（ｊ）の各要素の値は３となる。
【０１０４】
図１８Ｂは、図１８Ａの場合に、配列の多次元化を適用した例を示す図である。図１８Ｂのソースコードは、図１８Ａのソースコードにおいて、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）に多次元化したものである。配列Ａ（ｊ，ｉ）の各要素の初期値を０とすると、各ｉに対して配列Ａ（ｊ，ｉ）の各要素の値は１となり、図１８Ａの場合とは結果が異なる。
【０１０５】
図１８Ａの場合は、外側ループの制御変数ｉの値が変わっても、同じ配列Ａ（ｊ）の領域が参照される。一方、図１８Ｂの場合は、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）に多次元化することにより、ｉの値ごとに領域が確保され、初期値が０に設定される。このため、図１８Ｂでは、図１８Ａの場合と結果が異なる。したがって、定義及び参照の依存関係がある配列は、多次元化により結果が異なる場合があるため、多次元化の対象としない。
【０１０６】
図１９は、配列に、定義及び参照の依存関係がない場合の例を示す図である。図１９のｓ８で示すソースコードは、図１８Ａと同じｉ及びｊのループ処理を含む。ｊのループ処理は、配列Ａ（ｊ）にＸ（ｉ）の値を代入する処理、即ち、配列Ａ（ｊ）を定義する処理を含む。配列Ａ（ｊ）の各要素の初期値を０とすると、ｉが１のとき、配列Ａ（ｊ）の各要素の値はＸ（１）となる。また、ｉが２のとき、配列Ａ（ｊ）の各要素の値はＸ（２）となる。さらに、ｉが３のとき、配列Ａ（ｊ）の各要素の値はＸ（３）となる。
【０１０７】
図１９のｓ９で示すソースコードは、図１９のｓ８のソースコードにおいて、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）に多次元化したものである。配列Ａ（ｊ，ｉ）の各要素の初期値を０とすると、ｉが１のとき、配列Ａ（ｊ，１）の各要素の値はＸ（１）となる。また、ｉが２のとき、配列Ａ（ｊ，２）の各要素の値はＸ（２）となる。さらに、ｉが３のとき、配列Ａ（ｊ，３）の各要素の値はＸ（３）となる。即ち、配列を多次元化する前と同じ結果が得られる。したがって、定義及び参照の依存関係がない配列は、多次元化前と多次元化後で同じ結果が得られるため、多次元化の対象とする。
【０１０８】
図２０及び図２１は、配列が、ループ構成が異なる複数のループ処理に含まれる否かにより、配列を多次元化の対象とするか否かを判断する例を説明する。図２０は、同一の配列を含み構成が異なるループが複数存在するソースコードの例を示す図である。図２０のｄ１で示すループ処理では、ｉのループ処理は、ｉが１から５の値をとり、ｊのループ処理を含む。ｊのループ処理は、ｊが１から５の値をとり、配列Ａ（ｊ）にＸ（ｉ）を含む式を代入する処理を含む。一方、図２０のｄ２で示すループ処理では、ｋのループ処理は、ｋが１から１００の値をとり、ｊのループ処理を含む。ｊのループ処理は、ｊが１から７までの奇数の値をとり、配列Ａ（ｊ）にＸ（ｋ）を含む式を代入する処理を含む。
【０１０９】
ｄ１とｄ２では、ループの回転数、増分、上位ループの制御変数名が一致しない。このように、ループの回転数、初期値、増分、終値、上位ループの制御変数名等のループ構成
が一致しない場合は、多次元化により結果が異なる場合があるため、多次元化の対象としない。
【０１１０】
図２１は、同一の配列を含み構成が同じループが複数存在するソースコードの例を示す図である。図２１のｄ３で示すループ処理は、図２０のｄ１で示すループ処理と同一であるため、その説明は省略する。図２１のｄ４で示すループ処理では、ｌのループ処理は、ｌが１から１０の値をとり、ｄ３と同一のｉ及びｊのループ処理を含む。ｊのループ処理は、配列Ａ（ｊ）にＹ（ｌ）を含む式を代入する処理を含む。
【０１１１】
ｄ３とｄ４では、ループ処理全体の階層数及び配列Ａ（ｊ）に代入する値が異なるが、ｄ４に含まれるｉのループ処理は、ｄ３のループ処理とループ構成が同じである。この場合、配列の多次元化前と多次元化後で同じ結果が得られるため、多次元化の対象とする。
【０１１２】
＜処理の流れ＞
図２２及び図２３は、第１実施形態の処理の流れを説明するための図である。図２２は、所定の配列を多次元化したオブジェクトを生成する処理のフローチャートの一例である。図２２に示される処理は、例えば、コンパイラ２の起動により開始される。
【０１１３】
ＯＰ１では、コンパイラ２は、解析部２２により、多次元化対象の配列を特定する。なお、多次元化対象の配列を含むループ処理は、上位のループ処理に含まれる。また、多次元化対象の配列は、現ループ処理内で不変である。さらに、多次元化対象の配列は、ハードウェアプリフェッチの対象となる連続領域へアクセスする配列である。ＯＰ１の処理は、解析部２２が、ソースプログラム１１の解析により、ループ処理において、連続領域にアクセスする配列構造を特定する処理の一例である。次に処理がＯＰ２に進む。
【０１１４】
ＯＰ２では、コンパイラ２は、多次元化対象の配列について、ループ間で定義及び参照の依存関係があるか否かを判定する。依存関係がある場合には（ＯＰ２：Ｙｅｓ）、図２２に示される処理が終了する。依存関係がない場合には（ＯＰ２：Ｎｏ）、処理がＯＰ３に進む。
【０１１５】
ＯＰ３では、コンパイラ２は、多次元化対象の配列を定義する領域を、上位ループの回転数に応じて多次元化された配列サイズ分確保する。例えば、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）に多次元化した場合、コンパイラ２は、配列Ａ（ｊ）の領域を上位ループの回転数分拡張する。配列Ａ（ｊ）が静的領域の変数である場合、拡張される領域は、データ・スタックセクションに確保される。配列Ａ（ｊ）が動的領域の変数である場合、拡張される領域は、ヒープ領域等で動的に確保される。また、配列Ａ（ｊ）の初期値が定数の場合、コンパイラ２は、拡張した配列にも同じ初期値を設定する。次に処理がＯＰ４に進む。
【０１１６】
ＯＰ４では、コンパイラ２は、上位ループで不変な配列Ａ（ｊ）を上位ループの制御変数iに合わせて多次元化する。即ち、コンパイラ２は、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）
に置き換える。次に処理がＯＰ５に進む。
【０１１７】
ＯＰ５では、コンパイラ２は、配列Ａ（ｊ）を配列Ａ（ｊ，ｉ）に内部で置き換えて、オブジェクトを展開する。ＯＰ３からＯＰ５の処理は、最適化部２３及びコード生成部２４が、配列構造が拡張された機械語プログラム１２を、ソースプログラム１１から生成する処理の一例である。オブジェクトが生成されることにより、図２２に示される処理が終了する。
【０１１８】
図２３は、多次元化対象の配列を特定する処理のフローチャートの一例である。図２３に示される処理は、図２２のＯＰ１の詳細な処理を示す。図２３に示される処理は、例え
ば、コンパイラ２の起動後、解析部２２に処理が進むことにより開始される。
【０１１９】
ＯＰ１１では、解析部２２は、プログラム中の各ループ処理に対してＤＯ管理テーブル３０１を作成する。次に処理がＯＰ１２に進む。ＯＰ１２では、解析部２２は、プログラム中の各配列に対して配列管理テーブル３１１を作成する。次に処理がＯＰ１３に進む。ＯＰ１３では、解析部２２は、処理対象の配列を取得する。次に処理がＯＰ１４に進む。
【０１２０】
ＯＰ１４では、解析部２２は、配列管理テーブル３１１を検索し、処理対象の配列の「添字数」の値を取得する。また、解析部２２は、ＤＯ管理テーブル３０１を検索し、処理対象の配列を含むループ処理の階層数、即ち、処理対象の配列を含むループ処理の最上位ループの「ネストレベル」の値を取得する。
【０１２１】
解析部２２は、添字数がループ処理の階層数より小さいか否かを判定する。添字数がループ処理の階層数より小さい場合には（ＯＰ１４：Ｙｅｓ）、処理がＯＰ１５に進む。添字数がループ処理の階層数より小さくない場合には（ＯＰ１４：Ｎｏ）、処理がＯＰ１９に進む。
【０１２２】
ＯＰ１５では、解析部２２は、配列管理テーブル３１１を検索し、処理対象の配列の１次元目の添字、即ち、処理対象の配列の「１次元」の値を取得する。また、解析部２２は、ＤＯ管理テーブル３０１を検索し、処理対象の配列を含む最内ループの「制御変数」の値を取得する。
【０１２３】
解析部２２は、１次元目の添字（以下、１次元添字ともいう）が最内ループの制御変数と等しいか否かを判定する。なお、１次元添字が最内ループの制御変数と等しくない場合でも、当該制御変数から伝播された変数であれば、１次元添字は、最内ループの制御変数と等しいとみなすことができる。１次元添字が最内ループの制御変数と等しい場合には（ＯＰ１５：Ｙｅｓ）、処理がＯＰ１６に進む。１次元添字が最内ループの制御変数と等しくない場合には（ＯＰ１５：Ｎｏ）、処理がＯＰ１９に進む。
【０１２４】
ＯＰ１６では、解析部２２は、処理対象の配列へのアクセスが、ハードウェアプリフェッチの対象となる連続領域へのアクセスとなるか否かを調べる。ハードウェアプリフェッチはキャッシュライン単位で適用されるため、配列のデータを格納する領域のサイズが、キャッシュラインサイズより大きくなければ、配列へのアクセスは、ハードウェアプリフェッチの対象となる連続領域へのアクセスとならない。配列のデータを格納する領域のサイズは、例えば、１次元添字についての増分×配列要素数により求めることができる。
【０１２５】
解析部２２は、１次元添字の増分×配列要素数がキャッシュラインサイズより大きいか否かを判定する。１次元添字の増分×配列要素数がキャッシュラインサイズより大きい場合には（ＯＰ１６：Ｙｅｓ）、処理がＯＰ１７に進む。１次元添字の増分×配列要素数がキャッシュラインサイズより大きくない場合には（ＯＰ１６：Ｎｏ）、処理がＯＰ１９に進む。
【０１２６】
ＯＰ１７では、解析部２２は、ｎ次元添字（ｎ＞１）が、ネストレベルｎ以上のループ処理の制御変数と等しいか否かを調べる。具体的には、解析部２２は、配列管理テーブル３１１を検索し、ｎ次元添字を取得する。更に、解析部２２は、ＤＯ管理テーブル３０１を検索し、「ネストレベル」がｎのループの制御変数とｎ次元添字が等しいか否かを調べる。等しくない場合は、解析部２２は、「ネストレベル」がｎ＋１のループの制御変数とｎ次元添字が等しいか否かを調べる。等しくない場合は、解析部２２は、更に外側のループの制御変数とｎ次元添字とを比較する処理を最外ループまで繰り返し、ｎ次元添字（ｎ＞１）が、ネストレベルｎ以上のループ処理の制御変数と等しいか否かを判定する。
【０１２７】
ｎ次元添字がネストレベルｎ以上のループ処理の制御変数と等しい場合には（ＯＰ１７：Ｙｅｓ）、処理がＯＰ１８に進む。ｎ次元添字がネストレベルｎ以上のループ処理の制御変数と等しくない場合には（ＯＰ１７：Ｎｏ）、処理がＯＰ１９に進む。
【０１２８】
ＯＰ１８では、解析部２２は、処理対象の配列を多次元化対象の配列として特定する。特定された配列は、多次元化対象の配列リストとして、例えば、補助記憶装置１０３等に記憶してもよい。また、配列管理テーブル３１１において、多次元化対象の配列であるか否かを示す属性を定義して、処理対象の配列が多次元化対象の配列であるか否かを記憶してもよい。
【０１２９】
ＯＰ１９では、解析部２２は、次の処理対象の配列があるか否かを判定する。次の処理対象の配列がある場合には（ＯＰ１９：Ｙｅｓ）、処理がＯＰ１３に戻る。次の処理対象の配列がない場合には（ＯＰ１９：Ｎｏ）、図２３に示される処理が終了する。
【０１３０】
図２４は、多次元化対象の配列の具体例を示す図である。図２３のソースコードには、Ｚのループ処理が記載されている。Ｚのループ処理は、Ｋのループ処理を含む。Ｋのループ処理は、Ｉのループ処理及び配列Ｃ（Ｋ）についての処理を含む。Ｉのループ処理は、Ｊのループ処理及び配列Ｂ（Ｉ）についての処理を含む。Ｊのループ処理は、配列Ａ（Ｊ，Ｉ，Ｋ）、Ａ（Ｊ，Ｋ，Ｉ）、Ａ（Ｊ，Ｋ）、Ａ（Ｉ，Ｊ，Ｋ）についての処理を含む。
【０１３１】
図２４のｔ４の表は、配列Ａ（Ｊ，Ｉ，Ｋ）に対応する配列管理テーブル３１１のレコードを示す。「配列名」は“Ａ”、「添字数」は“３”である、また、各次元の制御変数は、「１次元」では“Ｊ”、「２次元」では“Ｉ”、「３次元」では“Ｋ”である。
【０１３２】
図２３のＯＰ１４からＯＰ１７の処理を配列Ａ（Ｊ，Ｉ，Ｋ）に適用すると、添字数は３、ループ処理の階層数は４であるため、ＯＰ１４の条件を満たす。１次元の添字はＪ、最内ループの制御変数もＪであるため、ＯＰ１５の条件を満たす。ここでは、配列Ａ（Ｊ，Ｉ，Ｋ）は、ＯＰ１６の条件を満たすものとする。２次元の添字Ｉは、ネストレベルが２であるループの制御変数Ｉと等しい。３次元の添え字Ｋは、ネストレベルが３であるループの制御変数Ｋと等しい。したがって、配列Ａ（Ｊ，Ｉ，Ｋ）は、ＯＰ１７の条件を満たし、多次元化対象の配列として特定される。配列Ａ（Ｊ，Ｉ，Ｋ）は、配列Ａ（Ｊ，Ｉ，Ｋ，Ｚ）に多次元化される。
【０１３３】
図２３のＯＰ１４からＯＰ１７の処理を配列Ａ（Ｊ，Ｋ，Ｉ）に適用すると、添字数は３、ループ処理の階層数は４であるため、ＯＰ１４の条件を満たす。１次元の添字はＪ、最内ループの制御変数もＪであるため、ＯＰ１５の条件を満たす。ここでは、配列Ａ（Ｊ，Ｋ，Ｉ）は、ＯＰ１６の条件を満たすものとする。２次元の添字Ｋは、ネストレベルが３であるループの制御変数Ｋと等しい。３次元の添え字Ｉは、ネストレベルが２であるループの制御変数Ｉと等しい。したがって、配列Ａ（Ｊ，Ｋ，Ｉ）はＯＰ１７の条件を満たさず、多次元化の対象とならない。
【０１３４】
同様に、図２３のＯＰ１４からＯＰ１７の処理を配列Ａ（Ｊ，Ｋ）及びＡ（Ｉ，Ｊ，Ｋ）に適用すると、配列Ａ（Ｊ，Ｋ）は多次元化対象の配列であるが、配列Ａ（Ｉ，Ｊ，Ｋ）は多次元化の対象とならない。
【０１３５】
＜第１実施形態の作用効果＞
連続領域にアクセスする配列へのアクセスでは、外側のループごとに、先頭から同じ領域が繰り返しアクセスされる。即ち、ループネストの切り替えタイミングで、配列へのア
クセスは、同じ領域の先頭に戻る。このため、連続領域へのアクセスとならないため、ハードウェアプリフェッチは停止し、性能劣化が発生する。
【０１３６】
第１実施形態では、コンパイラ２は、配列を多次元化し、外側のループごとに先頭から同じ領域をアクセスするのではなく、外側のループ処理を通じて連続領域へのアクセスとなるようにアクセス方法を変更する。これにより、ハードウェアプリフェッチは停止することなく継続的に起動されるため、持続的にキャッシュメモリにアクセスするデータは、事前に供給される。このため、データの取出しから参照までのアクセスコストは軽減され、性能向上が図られる。
【０１３７】
また、コンパイラ２は、配列の多次元化により、特定のキャッシュラインへのアクセス集中を軽減し、他の変数へのアクセスとの間でキャッシュラインの競合を防ぐことができる。これにより、キャッシュミスの発生は低減され、性能向上が図られる。
【０１３８】
なお、配列を多次元化することで、ループごとに配列要素のアドレスを算出する命令が展開されることになる。しかし、これらの命令による性能劣化よりも、ハードウェアプリフェッチが継続適用され、読出し遅延が隠蔽されることによる性能向上の効果のほうが大きい。
【０１３９】
＜第２実施形態＞
第２実施形態では、コンパイラ２は、多次元化対象の配列を、プログラムの実行により得られるプロファイル情報に基づいて特定する。
【０１４０】
連続領域にアクセスする配列と他の変数とがキャッシュライン競合しない場合、配列を再アクセスしたときには、キャッシュメモリ上に前回アクセスしたデータが残っている。このとき、ハードウェアプリフェッチによる効果は得られない。一方、配列を再アクセスするまでに、他の変数によりキャッシュライン上のデータが追い出されている場合には、ハードウェアプリフェッチによる効果が得られる。このように、再アクセス時までの他の変数の処理状況、キャッシュ状況等の実行時のプロファイル情報を活用することで、コンパイラ２は、多次元化対象の配列を適切に特定することができる。
【０１４１】
第２実施形態における装置構成は、第１実施形態と同一である。図２５は、第２実施形態における解析部２２の処理構成の一例を示す図である。図２５において、解析部２２は、プロファイル情報１０及びプロファイル情報解析部３５を含む。第２実施形態における他の処理構成は、図１３及び図１４と同一である。第２実施形態では、第１実施形態と重複する説明は省略される。
【０１４２】
プロファイル情報１０は、コンパイラ２にプロファイル情報取得の翻訳オプションを指定してソースプログラム１１を翻訳し、生成された機械語プログラム１２を実行することにより出力される。生成された機械語プログラム１２は、情報処理装置１で実行することができる。また、生成された機械語プログラム１２は、他の情報処理装置で実行してもよい。このとき、プロファイル情報１０は、例えば、可搬記録媒体１１０に記憶されてもよい。プロファイル情報解析部３５は、可搬記録媒体１１０に記憶されたプロファイル情報１０に基づいて、多次元化対象の配列を特定することができる。
【０１４３】
プロファイル情報１０は、例えば、配列が連続してアクセスする領域の長さ（以下、連続アクセス長ともいう）、配列へのアクセス回数を含む。また、プロファイル情報１０は、配列と同一のキャッシュラインへの他の変数のアクセス回数、配列が連続してアクセスする領域におけるストライド幅等の情報も含む。
【０１４４】
プロファイル情報解析部３５は、プロファイル情報１０を解析し、性能向上の効果を評価する。性能向上の効果は、所定の評価関数により算出される。プロファイル情報解析部３５は、評価関数の値を所定の閾値と比較することで、多次元化対象の配列を特定する。
【０１４５】
＜配列の多次元化＞
第２実施形態では、コンパイラ２は、プロファイル情報１０に基づいて、多次元化する配列を特定する。図２６から図２９は、配列の多次元化、及び多次元化対象の配列について説明するための図である。
【０１４６】
図２６は、コンパイラ２がプロファイル情報１０に基づいて特定した配列を多次元化するソースコードの例を示す図である。図２６のｓ１０で示すソースコードは、配列が多次元化される前のプログラムを示す。ｉのループ処理は、ｉが１からｘまでの値をとり、回転数がｘのループ処理である。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、ｊが１からｙまでの値をとり、回転数がｙのループ処理である。ｊのループ処理は、配列Ａ（ｊ）を参照する処理を含む。配列Ａ（ｊ）は、要素数１００の整数型１次元配列である。ｓ１０のプログラムの実行により、プロファイル情報１０が出力される。
【０１４７】
図２６のｓ１１で示すソースコードは、プロファイル情報１０に基づいて特定された配列を多次元化した後のプログラムを示す。コンパイラ２は、配列Ａ（ｊ）を多次元化対象の配列として特定すると、配列Ａ（ｊ）を配列ＡＡ（ｊ，ｉ）に多次元化する。配列ＡＡ（ｊ，ｉ）は、１００×ｎの整数型２次元配列である。なお、ｎは、外側のｉのループ処理の回転数ｘと内側のｊのループ処理の回転数ｙのいずれか大きいほうの値をとる。コンパイラ２は、多次元化前のプログラムを、多次元化後のプログラムとみなして翻訳する。
【０１４８】
図２７Ａから図２９は、プロファイル情報１０に基づいて、多次元化対象の配列を特定する具体例を説明するための図である。多次元化対象の配列は、例えば、キャッシュラインの競合密度及びキャッシュミスの回数を考慮して特定される。キャッシュラインの競合密度及びキャッシュミスの回数は、プロファイル情報１０から算出又は取得することができる。
【０１４９】
図２７Ａは、キャッシュラインの競合が生じる例を示す図である。図２７Ａにおいて、横軸は配置アドレスを示し、縦軸はキャッシュライン番号Ｌを示す。丸印で示されるデータは、下から２番目のキャッシュラインに配置される。次に、三角印で示されるデータが、下から２番目のキャッシュラインに配置される。さらに、四角印で示されるデータが、下から２番目のキャッシュラインに配置される。このとき、ウェイ数が２であるとすると、キャッシュラインの競合が生じ、丸印で示されるデータはキャッシュラインから追い出される。
【０１５０】
図２７Ｂは、キャッシュラインの競合が生じない例を示す図である。図２７Ｂにおいて、縦軸及び横軸は、図２７Ａと同一である。また、丸印のデータ及び三角印のデータは、図２７Ａと同様に配置される。その後、下から２番目のキャッシュラインに配置されるデータはないため、ウェイ数が２であるとすると、キャッシュラインの競合は生じない。
【０１５１】
キャッシュラインの競合密度は、多次元化対象の配列と他の変数が割り当てられるキャッシュラインが競合する頻度である。競合密度は、例えば、配列のデータにアクセスした後、再度アクセスするまでの間に、同一のキャッシュラインを少なくとも１回アクセスした他の変数の数とすることができる。他の変数によるアクセス回数は、プロファイル情報１０から取得可能である。
【０１５２】
図２７Ａのように、キャッシュラインの競合が生じる回数が増えるほど、競合密度は大
きくなる。図２７Ｂのように、キャッシュラインの競合が生じなければ、競合密度は図２７Ａの場合よりも小さくなる。競合密度に比例して、性能向上の効果は増加する。
【０１５３】
図２８は、キャッシュミスが発生する例を示す図である。配列領域へのアクセス回数が増えるとともに、キャッシュミスが発生する割合は増加する。キャッシュミスが発生すると、コンパイラ２は、主記憶装置１０２から直接データを取り出す。
【０１５４】
キャッシュミスの回数は、ハードウェアプリフェッチの停止により、主記憶装置１０２から直接データを取り出す回数である。配列の多次元化によってハードウェアプリフェッチは継続して起動されるため、ハードウェアプリフェッチが停止することで発生するキャッシュミスにより、主記憶装置１０２から直接データを取り出す回数が減少した場合に、性能向上の効果が期待される。即ち、キャッシュミスの回数に比例して、性能向上の効果は増加する。
【０１５５】
また、キャッシュミスの回数は、連続アクセス長が長いほど減少するため、連続アクセス長に反比例する。さらに、キャッシュミスの回数は、配列へのアクセス回数が多いほど増えるため、配列へのアクセス回数に比例する。即ち、性能向上の効果は、連続アクセス長に反比例し、アクセス回数に比例する。
【０１５６】
ここで、競合密度をＲ、キャッシュミスの回数をＭ、連続アクセス長をＳ、配列へのアクセス回数をＬとすると、性能向上の効果Ｅは、以下の式で表すことができる。
Ｅ＝Ｒ×Ｍ
＝Ｒ×１／Ｓ×Ｌ
【０１５７】
競合密度Ｒは、配列のデータにアクセスした後、再度アクセスするまでの間に、同一のキャッシュラインを少なくとも１回アクセスした他の変数の数とする。連続アクセス長Ｓ及び配列へのアクセス回数Ｌは、プロファイル情報から取得される。
【０１５８】
図２９は、性能向上の効果を評価するための属性のデータ構造の一例を示す図である。コンパイラ２は、これらの属性データをプロファイル情報１０から取得し、例えば、補助記憶装置１０３等に記憶してもよい。図２９では、多次元化対象の配列ごとに、アクセス回数（Ｌ）、連続アクセス長（Ｓ）、キャッシュ競合密度（Ｒ）の属性値が記憶される。図２９において、配列“ａｒｒａｙ１”のアクセス回数（Ｌ）は“１０００”、連続アクセス長（Ｓ）は“８０”、キャッシュ競合密度（Ｒ）は“１０”である。また、配列“ａｒｒａｙ２”のアクセス回数（Ｌ）は“２０００”、連続アクセス長（Ｓ）は“４０”、キャッシュ競合密度（Ｒ）は“２０”である。
【０１５９】
コンパイラ２は、多次元化対象の配列の属性データを用いて、性能向上の効果を、以下の評価関数により算出することができる。
評価関数  ＝Σ（Ｌ（ｉ）＊ｌ（ｉ）＋1/Ｓ（ｉ）＊ｓ（ｉ）＋Ｒ（ｉ）＊ｒ（ｉ））
【０１６０】
ｌ（ｉ）、ｓ（ｉ）、ｒ（ｉ）は、各属性に対する重み係数であり、配列ごとに任意の値が設定される。コンパイラ２は、配列の多次元化を適用する前の評価関数の値を閾値とし、適用後の値と比較する。コンパイラ２は、評価関数の値が閾値以上となる配列の組合せを多次元化対象とすることができる。また、コンパイラ２は、多次元化対象の配列の組合せをプロファイル情報に基づいて変更し、性能向上の効果が増加する配列の組合せを特定することができる。
【０１６１】
なお、上記評価関数は一例であり、限定はない。また、評価関数に用いる属性は、アクセス回数（Ｌ）、連続アクセス長（Ｓ）、キャッシュ競合密度（Ｒ）に限られず、適宜追
加し、組み合わせてもよい。さらに閾値は、プロセッサ１０１が取得した実測値（経験値）又は論理値でもよく、限定はない。
【０１６２】
＜処理の流れ＞
図３０及び図３１は、プロファイル情報１０に基づいて配列を多次元化する処理を説明するための図である。図３０は、プロファイル情報を取得する処理のフローチャートの一例である。図３０に示される処理は、例えば、プロファイル情報１０の取得を指示する翻訳オプションが指定されて、コンパイラ２が起動されることにより開始される。
【０１６３】
ＯＰ２１では、コンパイラ２は、プロファイル情報取得の翻訳オプションの指定により、対象プログラムを翻訳する。次に処理がＯＰ２２に進む。ＯＰ２２では、コンパイラ２は、プログラム実行により、プロファイル情報を出力する。プロファイル情報は、例えば、多次元化対象の配列のアクセス回数、連続アクセス長、キャッシュ競合密度、ストライド幅等を含む。多次元化対象の配列は、例えば、連続領域にアクセスする配列で、外側ループごとに同じ領域の先頭からのアクセスを繰り返す配列である。
【０１６４】
図３１は、プロファイル情報に基づいて配列を多次元化する処理のフローチャートの一例である。図３１に示される処理は、例えば、コンパイラ２が起動されることにより開始される。
【０１６５】
ＯＰ３１では、コンパイラ２は、多次元化対象の配列に対して、実行時のプロファイル情報を取得する。次に処理がＯＰ３２に進む。ＯＰ３２では、コンパイラ２は、プロファイル情報のアクセス回数、連続アクセス長、キャッシュ競合密度、ストライド幅等の情報に基づいて、多次元化対象の配列を特定する。次に処理がＯＰ３３に進む。ＯＰ３３では、コンパイラ２は、多次元化対象の配列に対する命令を展開し、処理が終了する。
【０１６６】
＜第２実施形態の作用効果＞
第２実施形態では、コンパイラ２は、多次元化対象の配列を、プログラムの実行により得られるプロファイル情報に基づいて特定する。これにより、コンパイラ２は、配列が再アクセスされるまでの他の変数の処理状況、キャッシュメモリの使用状況等に応じて、性能向上の効果が期待できる配列を多次元化対象として特定し、性能向上を図ることができる。
【０１６７】
また、コンパイラ２は、配列のアクセス回数、連続アクセス長、キャッシュ競合密度等の属性値を用いた評価関数により、性能向上の効果を算出し、より効果が期待できる配列の組合せを、多次元化対象として特定し、性能向上を図ることができる。
【０１６８】
＜第３実施形態＞
第３実施形態では、コンパイラ２は、ユーザが指定した配列を多次元化の対象とすることができる。ユーザは、コンパイラ２により出力されたチューニング情報１３に基づいて、多次元化対象の配列を選択することができる。ユーザは、コンパイラ２に対し、ソースコード中に翻訳指示行を追加することにより多次元化対象の配列を指定することができる。また、ユーザは、コンパイラ２に対し、オプションにより多次元化対象の配列を指定することがきる。
【０１６９】
第３実施形態における装置構成は、第１実施形態と同一である。第３実施形態における他の処理構成は、第２実施形態と同一である。第２実施形態では、第１実施形態及び第２実施形態と重複する説明は省略される。
【０１７０】
＜配列の多次元化＞
第３実施形態では、ユーザは、コンパイラ２に対し、ソースコード中に翻訳指示行を追加することにより多次元化対象の配列を指定することができる。
【０１７１】
図３２は、ユーザが翻訳指示行により指定した配列を多次元化するソースコードの例を示す図である。図３２のｓ１２で示すソースコードは、配列が多次元化される前のプログラムを示す。ｉのループ処理は、ｉが１からｘまでの値をとり、回転数がｘのループ処理である。ｉのループ処理は、ｊのループ処理を含む。ｊのループ処理は、ｊが１からｙまでの値をとり、回転数がｙのループ処理である。ｊのループ処理は、翻訳指示行“！ｏｃｌ  ａｒｒａｙ＿ｅｘｐａｎｓｉｏｎ（Ａ（１００，ｎ）)”を含む。この翻訳指示行は
、配列Ａ（ｊ）を、１００×ｎの整数型２次元配列に多次元化することを指定する。また、ｊのループ処理は、配列Ａ（ｊ）を参照する処理を含む。配列Ａ（ｊ）は、要素数１００の整数型１次元配列である。
【０１７２】
図３２のｓ１３で示すソースコードは、配列を多次元化した後のプログラムを示す。コンパイラ２は、配列Ａ（ｊ）を多次元化対象の配列として特定すると、配列Ａ（ｊ）を１００×ｎの整数型２次元配列のＡＡ（ｊ，ｉ）に多次元化する。コンパイラ２は、多次元化前のプログラムを、多次元化後のプログラムとみなして翻訳する。
【０１７３】
図３２では、１次元配列Ａ（ｊ）を２次元配列ＡＡ（ｊ，ｉ）に多次元化する例を示したが、コンパイラ２は、２次元以上の配列も同様に多次元化できる。例えば、配列Ａ（ｉ，ｊ，ｋ，…）は、配列ＡＡ（Ａ（ｉ，ｊ，ｋ，…），ｎ）に置き換えられる。
【０１７４】
なお、翻訳指示行の“！ｏｃｌ”は、ＦＯＲＴＲＡＮソースコード中に、ユーザが任意に指定することができるコンパイラへの指示であり、ＯＣＬ指定と称される。Ｃ言語においてＯＣＬ指定に相当する構文は、「＃ｐｒａｇｍａ」で始まる文字列である。
【０１７５】
また、ユーザは、ＯＣＬ指定をソースコード中に指定しなくても、コンパイラ２に対し、所定の翻訳オプション（例えば、−Ｋａｒｒａｙ＿ｅｘｐａｎｓｉｏｎ）を指定することにより、ＯＣＬ指定と同等の機械語プログラムを出力させることができる。ここではＦＯＲＴＲＡＮを例として説明するが、使用する言語は、Ｃ言語などの他のプログラム言語であってもよい。また、翻訳オプションのキーワード、ＯＣＬ等の制御指示名などは任意であり、上記に限定するものではない。
【０１７６】
＜処理の流れ＞
図３３は、コンパイラが、翻訳指示行により指定された配列を展開する処理のフローチャートの一例である。図３３に示される処理は、例えば、コンパイラ２の起動により開始される。
【０１７７】
ＯＰ４１では、コンパイラ２は、プログラム中にｏｃｌ等の翻訳指示行で指定された多次元化対象の配列を特定する。次に処理がＯＰ４２に進む。ＯＰ４２では、コンパイラ２は、多次元化対象の配列について、現ループと上位ループ間で、定義及び参照の依存関係があるか否かを判定する。依存関係がある場合には（ＯＰ４２：Ｙｅｓ）、図３３に示される処理が終了する。依存関係がない場合には（ＯＰ４２：Ｎｏ）、処理がＯＰ４３に進む。
【０１７８】
ＯＰ４３では、コンパイラ２は、対象配列を指定された次元の配列に置き換えて、オブジェクトを展開する。例えば、配列Ａ（ｊ）がＡＡ（ｊ，ｉ）に置き換えられる。次に処理が終了する。
【０１７９】
＜第３実施形態の作用効果＞
第３実施形態では、コンパイラ２は、ユーザが指定した配列を多次元化の対象とすることができる。これにより、多次元化の要素数及び次元数等も任意に指定することができ、多次元化対象の配列を柔軟に変更することができる。
【０１８０】
＜変形例＞
多次元化対象の配列は、第１実施形態から第３実施形態による方法を適宜組み合わせて特定してもよい。これにより、コンパイラ２による自動抽出では対応できない場合でも、ユーザが個別に指定することで、多次元化対象の配列を柔軟に特定することができる。
【０１８１】
また、各実施形態は、連続領域へのアクセスを検知してハードウェアプリフェッチを開始する情報処理装置１において、配列を多次元化する例を説明する。これに対し、一定間隔のストライド幅が開いた領域へのアクセスを検知してハードウェアプリフェッチを開始する情報処理装置１においても、各実施形態による配列の多次元化は適用可能である。配列の多次元化により、一定間隔のストライド幅が開いた領域へのアクセスに対しても、ハードウェアプリフェッチは継続して起動される。
【０１８２】
＜記録媒体＞
コンピュータその他の機械、装置（以下、コンピュータ等）に上記いずれかの機能を実現させるプログラムをコンピュータ等が読み取り可能な記録媒体に記録することができる。そして、コンピュータ等に、この記録媒体のプログラムを読み込ませて実行させることにより、その機能を提供させることができる。
【０１８３】
ここで、コンピュータ等が読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、コンピュータ等から読み取ることができる記録媒体をいう。このような記録媒体のうちコンピュータ等から取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ／Ｗ、ＤＶＤ、ブルーレイディスク、ＤＡＴ、８ｍｍテープ、フラッシュメモリなどのメモリカード等がある。また、コンピュータ等に固定された記録媒体としてハードディスクやＲＯＭ（リードオンリーメモリ）等がある。さらに、Solid State Drive（ＳＳＤ）はコンピュータ等から取り外し可能な記録媒体としても、コンピュータ等
に固定された記録媒体としても利用可能である。
【０１８４】
＜その他＞
上述した実施形態は、以下の付記を開示する。以下の付記は適宜組み合わせることが可能である。
【０１８５】
（付記１）
情報処理装置が有する解析部に、前記情報処理装置が主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定させ、
前記情報処理装置が有する生成部に、前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を変更させた機械語プログラムを、前記ソースプログラムから生成させる、ための情報処理プログラム。
【０１８６】
（付記２）
前記解析部に、
前記機械語プログラムの実行により取得される、プログラムの性能に関するプロファイ
ル情報に基づいて前記配列構造を特定させる、
付記１に記載の情報処理プログラム。
【０１８７】
（付記３）
前記プロファイル情報は、前記配列構造へのアクセス回数、前記配列構造を記憶する領域の長さ、及び前記配列構造を記憶するキャッシュメモリ上の領域への他の変数からのアクセス状況の少なくとも１つを含む、
付記２に記載の情報処理プログラム。
【０１８８】
（付記４）
前記解析部に、
前記ソースプログラム中の命令による指示に基づいて、又は、前記機械語プログラム実行時のオプションによる指示に基づいて、前記配列構造を特定させることができる、
付記１から３のいずれか一項に記載の情報処理プログラム。
【０１８９】
（付記５）
前記解析部に、前記情報処理装置が前記主記憶装置上の一定間隔のストライド幅が開いた領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記一定間隔のストライド幅が開いた領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、前記ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定させる、
付記１から４のいずれか一項に記載の情報処理プログラム。
【０１９０】
（付記６）
主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する情報処理装置において、
ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定する解析部と、
前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を変更した機械語プログラムを、前記ソースプログラムから生成する生成部と、
を備える情報処理装置。
【０１９１】
（付記７）
前記解析部は、
前記機械語プログラムの実行により取得される、プログラムの性能に関するプロファイル情報に基づいて前記配列構造を特定する、
付記６に記載の情報処理装置。
【０１９２】
（付記８）
前記プロファイル情報は、前記配列構造へのアクセス回数、前記配列構造を記憶する領域の長さ、及び前記配列構造を記憶するキャッシュメモリ上の領域への他の変数からのアクセス状況の少なくとも１つを含む、
付記７に記載の情報処理装置。
【０１９３】
（付記９）
前記解析部は、
前記ソースプログラム中の命令による指示に基づいて、又は、前記機械語プログラム実行時のオプションによる指示に基づいて、前記配列構造を特定することができる、
付記６から８のいずれか一項に記載の情報処理装置。
【０１９４】
（付記１０）
前記解析部は、前記情報処理装置が前記主記憶装置上の一定間隔のストライド幅が開いた領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記一定間隔のストライド幅が開いた領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、前記ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定する、
付記６から９のいずれか一項に記載の情報処理装置。
【０１９５】
（付記１１）
情報処理装置が有する解析部が、前記情報処理装置が主記憶装置上の連続する領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記連続する領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定し、
前記情報処理装置が有する生成部が、前記配列構造への第１のアクセスの次に生じる第２のアクセスが、前記第１のアクセスで参照される領域と連続する領域を参照するように前記配列構造を変更した機械語プログラムを、前記ソースプログラムから生成する、
情報処理方法。
【０１９６】
（付記１２）
前記解析部は、
前記機械語プログラムの実行により取得される、プログラムの性能に関するプロファイル情報に基づいて前記配列構造を特定する、
付記１１に記載の情報処理方法。
【０１９７】
（付記１３）
前記プロファイル情報は、前記配列構造へのアクセス回数、前記配列構造を記憶する領域の長さ、及び前記配列構造を記憶するキャッシュメモリ上の領域への他の変数からのアクセス状況の少なくとも１つを含む、
付記１２に記載の情報処理方法。
【０１９８】
（付記１４）
前記解析部は、
前記ソースプログラム中の命令による指示に基づいて、又は、前記機械語プログラム実行時のオプションによる指示に基づいて、前記配列構造を特定することができる、
付記１１から１３のいずれか一項に記載の情報処理方法。
【０１９９】
（付記１５）
前記解析部は、前記情報処理装置が前記主記憶装置上の一定間隔のストライド幅が開いた領域へのアクセスを検知してハードウェアプリフェッチを開始し、前記一定間隔のストライド幅が開いた領域へのアクセス終了を検知してハードウェアプリフェッチを停止する場合に、前記ソースプログラムの解析により、ループ処理において、ハードウェアプリフェッチの対象となる配列構造を特定する、
付記１１から１４のいずれか一項に記載の情報処理方法。
【符号の説明】
【０２００】
１        情報処理装置
１０      プロファイル情報
１１      ソースプログラム
１２      機械語プログラム
１３      チューニング情報
２        コンパイラ
２０      パーサー部
２１      中間コード変換部
２２      解析部
２３      最適化部
２４      コード生成部
３０      ループデータ記憶部
３０１    ＤＯ管理テーブル
３１      配列データ記憶部
３１１    配列管理テーブル
３２      ループ構造解析部
３３      配列解析部
３４      依存関係解析部
３５      プロファイル情報解析部
１０１    プロセッサ
１０２    主記憶装置
１０３    補助記憶装置
１０４    入力装置
１０５    出力装置
１０６    ネットワークインタフェース
１０７    可搬記録媒体駆動装置
１０９    バス
１１０    可搬記録媒体
【図１】
0006442967.tif 000002
【図２】
0006442967.tif 000003
【図３】
0006442967.tif 000004
【図４】
0006442967.tif 000005
【図５】
0006442967.tif 000006
【図６】
0006442967.tif 000007
【図７】
0006442967.tif 000008
【図８】
0006442967.tif 000009
【図９】
0006442967.tif 000010
【図１０Ａ】
0006442967.tif 000011
【図１０Ｂ】
0006442967.tif 000012
【図１１Ａ】
0006442967.tif 000013
【図１１Ｂ】
0006442967.tif 000014
【図１２】
0006442967.tif 000015
【図１３】
0006442967.tif 000016
【図１４】
0006442967.tif 000017
【図１５Ａ】
0006442967.tif 000018
【図１５Ｂ】
0006442967.tif 000019
【図１５Ｃ】
0006442967.tif 000020
【図１６】
0006442967.tif 000021
【図１７】
0006442967.tif 000022
【図１８Ａ】
0006442967.tif 000023
【図１８Ｂ】
0006442967.tif 000024
【図１９】
0006442967.tif 000025
【図２０】
0006442967.tif 000026
【図２１】
0006442967.tif 000027
【図２２】
0006442967.tif 000028
【図２３】
0006442967.tif 000029
【図２４】
0006442967.tif 000030
【図２５】
0006442967.tif 000031
【図２６】
0006442967.tif 000032
【図２７Ａ】
0006442967.tif 000033
【図２７Ｂ】
0006442967.tif 000034
【図２８】
0006442967.tif 000035
【図２９】
0006442967.tif 000036
【図３０】
0006442967.tif 000037
【図３１】
0006442967.tif 000038
【図３２】
0006442967.tif 000039
【図３３】
0006442967.tif 000040