(57)【要約】      （修正有）【課題】プリフェッチ命令によりループ処理を高速化する。【解決手段】ソースコード９から機械語プログラム１４を出力させる変換プログラムは、コンピュータによって実行されたときに、当該コンピュータに、ソースコード９からプロファイル情報７を取得させ、プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定させ、最適位置にプリフェッチ命令を挿入させる。【選択図】図３
2014112327.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードから機械語コードを出力させる変換プログラムであって、前記変換プログラムは、コンピュータによって実行されたときに、該コンピュータに、
前記ソースコードからプロファイル情報を取得させ、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定させ、
前記最適位置に前記プリフェッチ命令を挿入させることを特徴とする変換プログラム。
【請求項２】
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記多重ループの最内ループの繰り返し回数と、該最内ループの１つ外側のループの繰り返し回数とから、前記最適位置を判定させることを特徴とする請求項１記載の変換プログラム。
【請求項３】
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記最内ループの繰り返し回数が該最内ループの１つ外側のループの繰り返し回数よりも小さい場合に、前記該最内ループの１つ外側のループ内を前記最適位置と判定させることを特徴とする請求項２記載の変換プログラム。
【請求項４】
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、前記多重ループの最内ループの繰り返し回数、該最内ループの１つ外側のループの繰り返し回数、レイテンシ、及び例外アクセス命令数から、前記最適位置を判定させることを特徴とする請求項１記載の変換プログラム。
【請求項５】
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、最内ループの実行回数が上位ループの実行回数よりも大きい場合、前記プロファイル情報を基に、前記レイテンシと前記例外アクセス命令数とのトレードオフを判断して前記最適位置を判定させることを特徴とする請求項４記載の変換プログラム。
【請求項６】
ソースコードから機械語コードを生成する変換装置であって、
前記ソースコードからプロファイル情報を取得する情報取得部と、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定する判定部と、
前記最適位置に前記プリフェッチ命令を挿入する挿入部と、をそなえることを特徴とする変換装置。
【請求項７】
ソースコードから機械語コードを生成する変換方法であって、
前記ソースコードからプロファイル情報を取得し、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定し、
前記最適位置に前記プリフェッチ命令を挿入することを特徴とする変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、変換プログラム、変換装置及び変換方法に関する。
【背景技術】
【０００２】
情報処理装置では、一般に、メインメモリ（主記憶）よりもデータアクセスが高速なキャッシュメモリをCentral Processing Unit（ＣＰＵ）に配置する。そして、このキャッシュメモリ上に、最近参照したデータを置くことによって、主記憶参照によるレイテンシの低減を図っている。
しかし、数値計算処理、データベースアクセス、さらにインターネットなどのネットワークを通じた映像や音声などのマルチメディアデータなど大規模データを使用する計算では、データの参照局所性が低いためキャッシュミスが多発し、主記憶参照によるレイテンシを十分に低減することができなかった。
【０００３】
このような大規模データに対するキャッシュミスに対処するため、例えば、データを実際に使用する前に、メインメモリからキャッシュメモリにデータを移動するプリフェッチ命令がＣＰＵに用意されている。そして、コンパイラによって、プログラムにプリフェッチ命令を挿入する手法が提案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第３５４６３４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ループの処理において、このようなプリフェッチを高速化するために、ループ分割などの各種手法が提案されている。しかし、このような手法を採用しても、ループ分割によりループが増えて分岐判定処理が増加したり、ループ手続き増加による命令キャッシュミス数が増加するなどにより、性能劣化が発生することがあった。
上記課題に鑑みて、１つの側面では、本発明は、プリフェッチ命令によりループ処理を高速化することを目的とする。
【０００６】
なお、前記目的に限らず、後述する発明を実施するための形態に示す各構成により導かれる作用効果であって、従来の技術によっては得られない作用効果を奏することも本発明の他の目的の１つとして位置付けることができる。
【課題を解決するための手段】
【０００７】
このため、ソースコードから機械語コードを出力させる変換プログラムは、コンピュータによって実行されたときに、該コンピュータに、前記ソースコードからプロファイル情報を取得させ、前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定させ、前記最適位置に前記プリフェッチ命令を挿入させる。
【０００８】
又、ソースコードから機械語コードを生成する変換装置は、前記ソースコードからプロファイル情報を取得する情報取得部と、前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定する判定部と、前記最適位置に前記プリフェッチ命令を挿入する挿入部と、をそなえる。
【０００９】
さらに、ソースコードから機械語コードを生成する変換方法は、前記ソースコードからプロファイル情報を取得し、前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定し、前記最適位置に前記プリフェッチ命令を挿入する。
【発明の効果】
【００１０】
本発明によれば、プリフェッチ命令によりループ処理を高速化することができる。
【図面の簡単な説明】
【００１１】
【図１】第１実施形態の一例としての情報処理装置のハードウェア構成を示す図である。
【図２】第１実施形態の一例としての情報処理装置において実行される開発システムの構成を示す図である。
【図３】第１実施形態の一例としてのコンパイラの構成を示す図である。
【図４】第１実施形態の一例としてのプリフェッチ命令挿入部の動作を示す図である。
【図５】第１実施形態の一例としてのプリフェッチ命令挿入部の動作例を示す図であり、（ａ）は元のループ、（ｂ）及び（ｃ）はプリフェッチ適用後のループを示す。
【図６】第１実施形態の一例としての挿入部の最内アクセス方式の動作を示す図である。
【図７】第１実施形態の一例としての挿入部の上位アクセス方式の動作を示す図である。
【図８】第１実施形態の一例としてのコンパイラによるプロファイル情報の採取処理を示すフローチャートである。
【図９】第１実施形態の一例としてのコンパイラによるプリフェッチ命令挿入処理を示すフローチャートである。
【図１０】第１実施形態の一例としてのプリフェッチ命令挿入部によるプリフェッチ命令挿入処理を示すフローチャートである。
【図１１】プログラムの例を示す図である。
【図１２】ｘ＜ｙの場合の最内アクセス方式によるメモリアクセス動作を示す図である。
【図１３】ｘ＜ｙの場合の上位アクセス方式によるメモリアクセス動作を示す図である。
【図１４】ｘ＞ｙの場合の最内アクセス方式によるメモリアクセス動作を示す図である。
【図１５】ｘ＞ｙの場合の上位アクセス方式によるメモリアクセス動作を示す図である。
【図１６】図１２〜図１５の結果をまとめて示す図である。
【図１７】第２実施形態の一例におけるプリフェッチ命令挿入部の動作を示す図である。
【図１８】第２実施形態の一例におけるプリフェッチ命令挿入処理を示すフローチャートである。
【図１９】第２実施形態の変形例におけるプリフェッチ命令挿入部の動作を示す図である。
【図２０】第２実施形態の変形例におけるプリフェッチ命令挿入処理を示すフローチャートである。
【発明を実施するための最良の形態】
【００１２】
以下、図面を参照して本発明の実施の形態を説明する。
（Ａ）第１実施形態
図１は、第１実施形態の一例としての情報処理装置２０のハードウェア構成を示す図である。
情報処理装置２０は、ＣＰＵ（プロセッサ）２１、メインメモリ（主記憶部）２２、ネットワークインタフェース２３、及び記憶装置２４をそなえる。
【００１３】
ＣＰＵ２１は、種々の制御や演算を行なう処理装置であり、後述する記憶装置２４に格納されているプログラムやOperating System（ＯＳ）等を読み出し、各種処理を実行する。ＣＰＵ２１は、例えば、公知のＣＰＵを使用して実装することができる。
メインメモリ２２は、ＣＰＵ２１が実行するプログラムや種々のデータや、ＣＰＵ２１の動作により得られたデータ等を格納する記憶装置であり、例えば、Random Access Memory（ＲＡＭ）である。
【００１４】
又、ＣＰＵ２１は、メインメモリ２２の主記憶参照によるレイテンシの低減を図るために、メインメモリ２２よりもデータアクセスが高速な記憶装置であるキャッシュメモリ２５をそなえる。ＣＰＵ２１は、例えば、ＣＰＵ２１が最近参照したデータをキャッシュメモリ２５に配置することで、レイテンシの低減を図っている。キャッシュメモリ２５は、例えば、公知のStatic RAM（ＳＲＡＭ）などを使用して実装することができる。
【００１５】
ネットワークインタフェース２３は、情報処理装置２０を、例えば、Local Area Network（ＬＡＮ）等の不図示の外部ネットワークに接続する通信アダプタであり、例えばＬＡＮカードである。
記憶装置２４は、種々のプログラムや、ＯＳ、データを格納し保存する記憶装置であり、情報処理装置２０の内蔵ディスクとして動作する。記憶装置２４は、例えばHard Disk Drive（ＨＤＤ）である。
【００１６】
図２は、第１実施形態の一例としての情報処理装置２０において実行される機械語プログラム（機械語コード）を開発する開発システム１の構成を示す図である。
開発システム１は、情報処理装置２０のＣＰＵ２１において実行される機械語プログラムを開発するシステムである。開発システム１は、デバッガ２と、シミュレータ３と、プロファイラ４と、コンパイラ（変換装置）５とをそなえる。
【００１７】
コンパイラ５は、ＦＯＲＴＲＡＮやＣ言語等の高級言語で記述されたソースコード９（図３参照）と、後述するプロファイラ４から出力されるプロファイル情報７とを読み込み、機械語プログラム１４（図３参照）に変換するプログラムである。コンパイラ５の構成については、図３を参照して後述する。
デバッガ２は、コンパイラ５におけるソースコード９（図３参照）のコンパイル時に発見されたバグの位置や原因を特定するためのプログラムである。
【００１８】
シミュレータ３は、機械語プログラム１４（図３参照）を仮想的に実行するプログラムである。シミュレータ３の実行結果は実行ログ８として出力される。
プロファイラ４は、実行ログ８を解析するとともに、コンパイラ５における最適化等のヒント情報となるプロファイル情報７を出力するプログラムである。
プロファイル情報７は、実行時に、ループ実行回数の変数や分岐判定での条件の成立回数等を保持した情報である。例えば、プロファイル情報７にはループレベルごと実行した回転数の情報を格納する。コンパイラ５はこの実行時のプロファイル情報７を参照して、最適なオブジェクトコード（機械語コード）を展開する。
【００１９】
なお、プロファイル情報７の取得処理については図８を参照して後述する。
図３は、第１実施形態の一例としてのコンパイラ５の構成を示す図である。
コンパイラ５は、前述のように、ソースコード９を、ＣＰＵ２１（図１参照）をターゲットプロセッサとする機械語プログラム１４に変換するプログラムである。コンパイラ５は、情報処理装置２０等の情報処理装置上で実行され、例えば、パーサー部１０と、中間コード変換部１１と、最適化部６と、コード生成部１３とをそなえる。
【００２０】
パーサー部１０は、コンパイルの対象となるソースコード９に対して、予約語（キーワード）等を抽出して字句解析する前置処理部である。
中間コード変換部１１は、パーサー部１０から渡されたソースコード９の各ステートメントを一定規則に基づいて中間コードに変換する処理部である。ここで、中間コードとは、一般に、関数呼び出しの形式で表現されるコードである。ただし、中間コードには、このような関数呼び出し形式のコードだけでなく、ＣＰＵ２１の機械語命令も含まれる。中間コード変換部１１は、中間コードを生成する際にプロファイル情報７を参照して、最適な中間コードを生成する。
【００２１】
最適化部６は、中間コード変換部１１より出力された中間コードについて、命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の処理を行なうことにより、実行速度の向上やコードサイズの削減等を行なう。最適化部６は、通常の最適化処理に加え、本コンパイラ５特有の最適化を行なうプリフェッチ命令挿入部１２を有する。
プリフェッチ命令挿入部１２は、プロファイル取得部（情報取得部）１２１、判定部１２２及び挿入部１２３をそなえる。
【００２２】
プロファイル取得部１２１は、プロファイル情報７から対象プログラムの各種情報を取得する。例えば、プロファイル取得部１２１は、対象プログラムのループ構造、及び配列アクセスがストライドであるかどうかなどの情報を取得する。例えば、プロファイル取得部１２１は、プログラム内のネストされたループについて、最も内側のループ（以下、「最内ループ」と呼ぶ）の実行回数（回転数）ｘと、最内ループの１つ外側のループ（以下、「上位ループ」、「外側ループ」と呼ぶ）の実行回数（回転数）ｙとを取得する。
【００２３】
判定部１２２は、プロファイル取得部１２１が取得した情報を比較する。例えば、判定部１２２は、多次元配列にアクセスする多重ループ構造が存在し、かつ当該多次元配列へのアクセスがストライドである場合、最内ループの実行回数ｘと、上位ループの実行回数ｙとを比較する。
挿入部１２３は、判定部１２２による比較の結果に基づいて、プリフェッチ命令を挿入する位置を自動で判定して、プリフェッチ命令を挿入する。
【００２４】
プロファイル取得部１２１、判定部１２２及び挿入部１２３の動作については後述する。
又、最適化部６は、上記以外に、キャッシュメモリ２５のキャッシュミスに関する情報など、ユーザがソースコード９を再作成する際のヒントとなるチューニング情報１５の出力も行なう。
【００２５】
コード生成部１３は、最適化部６から出力された中間コードに対して、内部に保持する不図示の変換テーブル等を参照し、全てのコードを機械語命令に置き換えることにより、機械語プログラム１４を生成する。
以下、図４，図５を参照して、最適化部６のプリフェッチ命令挿入部１２の動作を説明する。
【００２６】
図４は、第１実施形態の一例としてのプリフェッチ命令挿入部１２の動作を示す図である。図５は第１実施形態の一例としてのプリフェッチ命令挿入部１２の動作例を示す図であり、（ａ）は元のループ、（ｂ）及び（ｃ）はそれぞれ、プリフェッチ適用後のループを示す。
図４に示すように、プロファイル取得部１２１がプロファイル情報７を読み出す。そして、判定部１２２が、多次元配列にアクセスする多重ループ構造が存在し、かつ当該多次元配列へのアクセスがストライドである場合、最内ループの実行回数ｘが上位ループの実行回数ｙよりも小さいかどうかを判定する。なお、ハードウェアプリフェッチ機構が具備されているプロセッサでは、シーケンシャルに連続アクセスするとハードウェアが自動的にプリフェッチする。そのため、本実施形態の一例のソフトウェア命令の実行によるプリフェッチにより性能が劣化する可能性がある。またコンパイラ５の最適化により、連続域のアクセスと判断できる場合、配列次元数を内部的に削減する可能性がある。そこで、本実施形態の一例は、この影響の受けない飛び飛びのアクセスとなるストライドの場合に効果があるので、以降、配列アクセスがストライドである場合を説明する。
【００２７】
なお本実施形態の一例は、飛び飛びにアクセスするストライドに限定するものでなく、シーケンシャルに連続する領域へのアクセスであっても変わりなく適用できる。
そして、挿入部１２３が、最内ループの実行回数ｘが上位ループの実行回数ｙ以上のときには、最内ループにプリフェッチ命令を挿入する。つまり、挿入部１２３は、実行回数方向に対するデータアクセスのプリフェッチ命令を展開するオブジェクトコード（機械語コード）を出力する（以下、これを「最内アクセス方式」、「横プリフェッチ方式」と呼ぶ）。この結果、図５（ｂ）に示すような位置にプリフェッチ命令をオブジェクトコードを展開するオブジェクトコードが生成される。
【００２８】
なお、図４，図５においては説明の便宜上、ｏｃｌ文がコード中に記載されているが、実際に機械語コードにｏｃｌ文が挿入部１２３によって追加されるわけではない。実際には、ｏｃｌ文に相当するプリフェッチ命令を展開する機械語コードが出力される。
一方、最内ループの実行回数ｘが上位ループの実行回数ｙよりも小さいときには、挿入部１２３は、上位ループにプリフェッチ命令を挿入する。つまり、挿入部１２３は、次の上位ループのデータをプリフェッチする機械語を展開するオブジェクトコードを出力する（以下、これを「上位アクセス方式」、「縦プリフェッチ方式」と呼ぶ）。この結果、図５（ｃ）に示すような位置にプリフェッチ命令をオブジェクトコードを展開するオブジェクトコードが生成される。
【００２９】
このように、第１実施形態の一例としてのプリフェッチ命令挿入部１２は、ループ回数をプロファイル情報７から取得して、プリフェッチ命令を最適な位置に自動で展開することにより、メインメモリ２２からのレイテンシを短縮する。
なお、以降の記載では、２次元配列を採り上げるが、本実施形態の一例は２次元配列に限定されるものでなく、３次元以上の配列にも適用できる。
【００３０】
以下、図６，図７を参照して、この点について説明する。
図６は、第１実施形態の一例としての挿入部１２３の最内アクセス方式の動作を示す図である。対して、図７は、第１実施形態の一例としての挿入部１２３の上位アクセス方式の動作を示す図である。
図６，図７に示す例では、プログラムは、配列サイズが（ｘ，ｙ）の２次元配列Ａに対してアクセスを行なう。図中、Ｌは、プリフェッチの配列要素の距離、つまり、どれだけ先の配列要素のデータをプリフェッチするかを示す値である。又、黒丸は実際にアクセスされる配列要素、星印はプリフェッチされる配列要素を示す、
最内アクセス方式の場合、図６に示すように、プログラムは、アクセス方向（最内ループ変数jの進行方向、すなわち、ｊの方向；図６，図７中の右方向）にＬ分だけ先の配列要素をプリフェッチする。
【００３１】
図６において、２次元配列Ａの先頭域から添字（ｉ，ｊ）の配列要素の相対位置は一般に、要素サイズをｌとすると、
｛（ｉ−１）＋（ｊ−１）×ｘ｝×ｌ                            ………式（１）
で表現できる。
【００３２】
このとき、図５（ａ）に示すようなループ１０１に対して、メインメモリ２２からキャッシュメモリ２５へのプリフェッチに要するサイクル数とループの予測実行サイクル数とに基づいて、データをプリフェッチすべき要素間のオフセットＬを計算する。
次に、図５の（ｂ）のループ１０２のように、データを使用するループよりもオフセットＬだけ先行したループでデータをプリフェッチするようにプリフェッチ命令“Ｐｒｅｆｅｔｃｈ”を挿入する。
【００３３】
このため、最内アクセス方式による、ループと同じｊアクセス方向へのプリフェッチ先Ａ（ｉ，ｊ＋Ｌ）でのメモリ相対アドレスは、配列の先頭から、
｛（ｉ−１）＋（ｊ＋Ｌ−１）×ｘ｝×ｌ                        ………式（２）
となる。このとき、図６のストライド幅がＬ×ｘ×ｌとなる。
【００３４】
この例では、プリフェッチが適用されないロード（プリフェッチ非適用ロード）、すなわち、無効プリフェッチの回数は、Ｌ×ｘ回となる。
全アクセス回数はｘ×ｙであるので、全アクセス回数に対する無効プリフェッチ回数、すなわち、無効プリフェッチ率（プリフェッチ非適用ロード率）は、
Ｌ×ｘ／（ｘ×ｙ）＝Ｌ／ｙ                                      ………式（３）
となる。
【００３５】
しかし、式（３）においては、ｘよりもｙが小さい（ｘ＞ｙ）場合には、無効プリフェッチ率が上昇してしまい、プリフェッチ効率が低下してしまう。
そこで、図７に示すように、プリフェッチ命令挿入部１２は、ｘよりもｙが小さい（ｘ＞ｙ）場合に、上位アクセス方式として、アクセス方向（ｊの方向）とは異なる方向（本例ではアクセスの上位ループ方向、すなわちiの方向）に、次の要素Ａ（ｉ＋１，ｊ）、すなわちストライド幅ｘ×ｌ先をプリフェッチを行なう。
【００３６】
このときの無効プリフェッチ（プリフェッチ非適用ロード）の回数はｙとなる。
このため、無効プリフェッチ率（プリフェッチ非適用ロード率）は、
ｙ／（ｘ×ｙ）＝１／ｘ                                          ………式（４）
となる。
【００３７】
このため、実施形態の一例としてのプリフェッチ命令挿入部１２は、ｘ＞ｙの場合、すなわち最内ループの実行回数ｘが上位ループの実行回数ｙよりも小さい場合には、アクセス方向（ｊ）と異なる方向（ｉ）にプリフェッチするプリフェッチ命令を挿入する。これにより、ｘ＞ｙの場合、無効プリフェッチ率が最内アクセス方式よりも低下し、プリフェッチ効率が向上する。なぜならば、１／ｘ＜１／ｙ≦Ｌ／ｙが成り立つためである。なお、上位アクセス方式として、アクセス要素をＡ（ｉ＋１，ｊ）としたが、要素Ａ（ｉ＋１，ｊ）のメモリレイテンシと参照するまでの演算の必要サイクル数との関係から１次元のアクセス先をＡ（ｉ＋２，ｊ）など１次元要素をｉ＋ｎに変更してもよく、ｉ＋１に限定するものではない。
【００３８】
以下、図８を参照して、コンパイラ５によるプロファイル情報７の採取処理を説明する。
図８は、第１実施形態の一例としてのコンパイラ５によるプロファイル情報７の採取処理を示すフローチャートである。
ステップＳ１において、コンパイラ５は、プロファイル情報取得の翻訳オプションを指定して、対象プログラムを翻訳する。
【００３９】
次に、ステップＳ２において、コンパイラ５は、プログラムを実行することにより、プロファイル情報７を出力する。このプロファイル情報７にはループごとにループ回数、ループ属性などが格納される。
次に、プリフェッチ命令挿入処理を説明する。
図９は、第１実施形態の一例としてのコンパイラ５によるプリフェッチ命令処理を示すフローチャートである。
【００４０】
ステップＳ１１において、コンパイラ５は、ソースコード９を読み込み、多次元配列にアクセスする多重ループ構造が存在し、かつ、配列アクセスがストライドである場合、配列アクセスに対応してｐｒｅｆｅｔｃｈ命令を展開する。
次に、ステップＳ１２において、プリフェッチ命令挿入部１２が、後述するプリフェッチ命令処理を実行する。
【００４１】
次に、ステップＳ１３において、ユーザがプログラムを実行する。
次に、図１０を参照して、図９のステップＳ１２においてプリフェッチ命令挿入部１２が実行するプリフェッチ命令挿入処理について説明する。
図１０は、第１実施形態の一例としてのプリフェッチ命令挿入部１２によるプリフェッチ命令挿入処理を示すフローチャートである。
【００４２】
ステップＳ３１において、プロファイル取得部１２１は、プロファイル情報７を参照して、最内ループの実行回数ｙと上位ループの実行回数ｘとを取得する。
次に、ステップＳ３２において、判定部１２２は、ステップＳ３１においてプロファイル取得部１２１が取得した最内ループの実行回数ｙが上位ループの実行回数ｘよりも小さいかどうかを判定する。
【００４３】
ステップＳ３２でｙがｘよりも小さい場合（ステップＳ３２のＹＥＳルート参照）、ステップＳ３３において、挿入部１２３は、上位アクセス方式により、上位ループ（上位ループ）に対してプリフェッチ命令を挿入する。例えば、プリフェッチ命令挿入部１２は、上位ループに、ＯＣＬ指定のＰｒｅｆｅｔｃｈ  Ａ（ｉ＋１，ｊ）に相当のオブジェクトを挿入する。最終的に機械語プログラム１４において、コンパイラ５はユーザのＯＣＬ指定、Ｐｒｅｆｅｔｃｈ  Ａ（ｉ＋１，ｊ）と同等の機械語命令を展開する。
【００４４】
なお、「ＯＣＬ指定」とは、ＦＯＲＴＲＡＮソースコード中にユーザが任意に指定（配置）することができるコンパイラへの指示であり、！ｏｃｌで始まる文字列である。なお、言語Ｃでこれに相当する構文は「＃ｐｒａｇｍａ」で始まる文字列である。
又、「ＯＣＬ指定」をユーザが明示的にソースに指定しなくても、コンパイラに翻訳時に与えるパラメタオプション（−ｐｒｅｆｅｃｈ等）指定により、コンパイラが自動的に「ＯＣＬ指定」と同等の機械語命令を出力することができる  なお、ここではＦＯＲＴＲＡＮを例として用いているが、Ｃ言語などの他のプログラム言語も使用することもできる。
【００４５】
一方、ステップＳ３２でｙがｘ以上の場合（ステップＳ３２のＮＯルート参照）、ステップＳ３４において、挿入部１２３は、最内アクセス方式により、最内ループにプリフェッチ命令をｏｃｌで指定された位置に挿入する。例えば、プリフェッチ命令挿入部１２は、上位ループに、Ｐｒｅｆｅｔｃｈ  Ａ（ｉ，ｊ＋Ｌ）（Ｌはプリフェッチの距離）に相当のオブジェクトを挿入する。
【００４６】
次に、ステップＳ３５において、コンパイラ５がプリフェッチ命令を含む機械語プログラム１４を作成する。
以下、具体的な例を取り上げて、プリフェッチ命令挿入部１２の動作を説明する。
最初に、図１１に示すプログラムを実行した場合の、ｘ＞ｙの場合の最内アクセス方式による多次元配列Ａへのメモリアクセス動作を図１２に、上位アクセス方式による多次元配列Ａへのメモリアクセス動作を図１３にそれぞれ示す。図１２，図１３に示す例においては、ｘ＝１６、ｙ＝４であり、ｘ＞ｙが成立する。
【００４７】
この例において、例えば、各処理に、以下のサイクル数（時間）を要すると仮定する。
キャッシュミスの発生時に、メインメモリ２２からキャッシュメモリ２５へのデータ取出しに要する時間を９サイクルとする。
又、キャッシュヒット時のキャッシュメモリ２５からのデータの読み出し時間を１サイクルとする。
【００４８】
更に、プリフェッチ、及びデマンド（すなわち、ｌｏａｄ  Ａ（ｉ，ｊ））の処理時間をそれぞれ１サイクルとする。
なお、上記以外の処理サイクルはここでは無視する。
又、図１１に示すように、多次元配列Ａの要素長は８バイトである。
図１２，図１３中、（１，１）等は配列データを示す。又、配列の右横の白抜き（プリフェッチデータのレイテンシなしのサイクル数を示す）又は斜体（プリフェッチデータのレイテンシ待ち時間を含むサイクル数を示す）の数字は、処理が行なわれるサイクル時間を示す。
【００４９】
なお、図中では便宜上、一部の配列データのみにサイクル時間を示している。
図１２の最内アクセス方式では、プリフェッチによりデータＡ（２，２）が９サイクル目にアクセスされる（「プリフェッチ」の（２，２）の右隣の数字「９」参照）。しかし、プログラムにおけるＡ（２，２）へのデマンドアクセスは３サイクル後の１２サイクル（「デマンド」の（２，２）の右隣の数字「１２」参照）である。しかし、前述のように、データキャッシュミス時にはメインメモリ２２からキャッシュメモリ２５へのデータの取り出しに９サイクルを要するため、６サイクルの待ちが発生し、データは１８サイクル目にようやく参照できる。（２，２）アクセス時点でキャッシュミスが発生したとする。そのため、（２，３）へのデマンドアクセスでは６サイクルが加算され２０サイクル目となる。
【００５０】
以降、キャッシュメモリラインの先頭で同様にキャッシュミスによる待ちサイクル数が加算される（同一キャッシュメモリラインのデータアクセスでは、キャッシュメモリ２５ヒットするため１サイクルでキャッシュメモリ２５からデータを読込みができる）。さらに区域外の無駄なプリフェッチが１６回発生する。
これに対して、図１３の上位アクセス方式では、プリフェッチによりデータＡ（２，２）を３サイクル目にアクセスする（「プリフェッチ」の（２，２）の右隣の数字「３」参照）。しかし、プログラムにおけるＡ（２，２）へのデマンドアクセスは９サイクル後の１２サイクル（「デマンド」の（２，２）の右隣の数字「１２」参照）である。このタイミングでは、キャッシュミスとなったデータが、メインメモリ２２からキャッシュメモリ２５に既に格納されているので、キャッシュメモリ２５からデータにアクセスでき、レイテンシはゼロとなる。
【００５１】
以降、キャッシュメモリラインの先頭アクセスで同様にキャッシュミスの発生により、メインメモリ２２からキャッシュメモリ２５へのデータ取出しに９サイクル要するが、レイテンシは発生しない。又、使用されないデータの無駄なプリフェッチ（以下、区域外アクセスと呼ぶ）は４回で済む。
このように、最内ループの実行回数ｙと上位ループの実行回数ｘとの大小により、プリフェッチの効果に違いが発生する。
【００５２】
つまり、最内ループの実行回数ｙが上位ループの実行回数ｘよりも少ない場合には、上位アクセス方式が有効であり、ｙがｘ以上の場合には最内アクセス方式が有効となる。
比較のために、図１１に示すプログラムを実行した場合の、ｘ＜ｙの場合の最内アクセス方式によるメモリアクセス動作を図１４に、上位アクセス方式によるメモリアクセス動作を図１５にそれぞれ示す。図１４，図１５に示す例においては、ｘ＝４、ｙ＝１６であり、ｘ＜ｙが成立する。
【００５３】
このときの各処理の処理サイクル数も、上記の値を仮定する。
この場合、図１４，図１５に示すように、最内ループの実行回数ｙが上位ループの実行回数ｘよりも大きい場合には、最内アクセス方式ではレイテンシが６サイクルであるが、区域外アクセスが４回となる。これに対し、上位アクセス方式ではレイテンシが０となるが、区域外アクセスが１６回も発生してしまうため、最内アクセス方式のほうが効果的である。
【００５４】
図１６に、図１２〜図１５の結果をまとめる。
図１６に示すように、ｘ＝１６、ｙ＝４の場合には、プリフェッチ命令挿入部１２は、上位アクセス方式によりプリフェッチ命令を挿入する。このときのレイテンシは０、区域外アクセス命令数は４となり、最内アクセス方式を採用した場合よりもレイテンシ、区域外アクセス命令数ともに改善される。
【００５５】
一方、ｘ＝４、ｙ＝１６の場合には、プリフェッチ命令挿入部１２は、最内アクセス方式によりプリフェッチ命令を挿入する。前述のように、このときのレイテンシは６、区域外アクセス命令数は１６となり、上位アクセス方式を採用した場合よりもレイテンシは増大するが、区域外アクセス命令数が大幅に改善され、結果としてパフォーマンスが改善される。このケース（ｘ＜ｙ）では、最内アクセス方式のほうが有利である。しかし、プログラムの処理内容により、コンパイラ５がプロファイル情報７を基に、レイテンシと例外アクセス命令数とのトレードオフを判断して、ｘ＜ｙのケースにて最適な方式（最内アクセス方式、上位アクセス方式）で展開することもできる。
【００５６】
このように、第１実施形態の一例によれば、上位アクセス方式により最内ループ長が短く、外側ループのループ長が長い多重ループに対しても、プリフェッチを有効に適用することができる。
第１実施形態の一例は、２次元以上の配列において、配列の大きさに応じて、配列の要素にアクセスする添字の順番を、上位アクセス方式と、最内アクセス方式とで選択する。
【００５７】
上位アクセス方式においては、最内ループ長が短く、外側ループのループ長が長い多重ループに対して、プリフェッチ対象を変更することでプリフェッチの副作用、すなわち無効プリフェッチ率（プリフェッチ非適用ロード）の増大による性能低下を防止することができる。
又、プロファイル情報７を使用することでコンパイラ５が自動的に最適なプリフェッチの出力（最内アクセス方式、上位アクセス方式）を選択することができる。これは上位アクセス方式により最内ループ長が短く、外側ループのループ長が長い多重ループに対して適用できる手法である。それに限らず、コンパイラ５が、プロファイル情報７を基に、レイテンシと例外アクセス命令数とのトレードオフを最内ループ長が外側ループよりも長いケースでも、コンパイラ５は自動的に最適なプリフェッチの出力（最内アクセス方式、上位アクセス方式）を選択することができる。
【００５８】
さらに、プリフェッチ方式が自動で適用されるので、ユーザの作業工数を低減しつつ、効率的なプリフェッチが適用できる。
（Ｂ）第２実施形態
上記の第１実施形態の一例においては、プロファイル情報７を基にプリフェッチ命令挿入部１２が、プログラム内でプリフェッチ命令の使用を判定し、プリフェッチ命令の挿入位置として最内アクセス方式又は上位アクセス方式を自動的に選択する。しかし、これに限定されるものではなく、ユーザがプリフェッチ命令の使用／不使用を選択してもよい。
【００５９】
例えば、第２実施形態の一例においては、ユーザがＯＣＬ構文を使用して、プリフェッチ命令の使用を明示的に指定する。そして、コンパイル時に、プリフェッチ命令挿入部１２が、プロファイル情報７に基づいて、プリフェッチ命令の挿入場所として、最内アクセス方式又は上位アクセス方式を自動的に選択する。
図１７は、第２実施形態の一例におけるプリフェッチ命令挿入部１２の動作を示す図である。
【００６０】
図１７に示すように、ユーザが、例えば、「！ｏｃｌ  Ｐｒｅｆｅｔｃｈ＿ａｕｔｏ（Ａ）」文をプログラム中に記述した場合、プリフェッチ命令挿入部１２がプロファイル情報７を基に、最内アクセス方式又は上位アクセス方式を自動的に選択する。
図１８は、第２実施形態の一例におけるコンパイラ５によるプリフェッチ命令処理を示すフローチャートである。
【００６１】
ステップＳ２１において、多次元配列にアクセスする多重ループ構造が存在し、かつ、配列アクセスがストライドである場合、ユーザは、配列に対応するソースに、例えば、「！ｏｃｌ  Ｐｒｅｆｅｔｃｈ＿ａｕｔｏ（Ａ）」文を挿入する。
次に、ステップＳ１２において、プリフェッチ命令挿入部１２が図１０のプリフェッチ命令処理を実行する。図１０のプリフェッチ命令処理においては、前述のように、最内ループの実行回数ｙが上位ループの実行回数ｘよりも小さい場合、挿入部１２３が、上位アクセス方式により、上位ループ（上位ループ）に対してプリフェッチ命令をｏｃｌで指定された位置に挿入する。一方、ｙがｘ以上の場合、挿入部１２３は、最内アクセス方式により、最内ループにプリフェッチ命令をｏｃｌで指定された位置に挿入する。
【００６２】
次に、ステップＳ１３において、ユーザがプログラムを実行する。
このように、第２実施形態の一例によれば、上記第１実施形態の効果に加えて、ループ内の所望の場所において、最内アクセス方式又は上位アクセス方式のいずれを採用するかを、ユーザが柔軟に指定することができるという効果が得られる。
これにより、プログラム中でプリフェッチをより有効に適用することができるようになる。
（Ｃ）第２実施形態の変形例
上記の第１及び第２実施形態においては、プリフェッチ命令挿入部１２が、プロファイル情報７を基に最内アクセス方式又は上位アクセス方式を自動的に選択している。
【００６３】
上記の第２実施形態の変形例として、ユーザがＯＣＬを指定して、最内アクセス方式、上位アクセス方式のいずれを使用するかを明示的に指定してもよい。
この場合、ユーザは、例えば、ループ実行回数をデバッガ２又はｐｒｉｎｔ文を使用して調査し、ソース中に最適なｐｒｅｆｅｔｃｈのＯＣＬ文（最内アクセス方式又は上位アクセス方式）を明示的に挿入する。
【００６４】
図１９は、第２実施形態の変形例におけるプリフェッチ命令挿入部１２の動作を示す図である。
図１９に示すように、ユーザが、例えば、「！ｏｃｌ  Ｐｒｅｆｅｔｃｈ＿Ａ（ｉ＋１，ｊ）」文をプログラム中に記述した場合、コンパイラ５が上位アクセス方式を選択する。
【００６５】
この場合、上記の第２実施形態よりも、本方式の適用箇所を、ソース中により詳細に指定することができる。
図２０は、第２実施形態の変形例におけるコンパイラ５によるプリフェッチ命令処理を示すフローチャートである。
ステップＳ４１において、多次元配列にアクセスする多重ループ構造が存在し、かつ、配列アクセスがストライドである場合、ユーザが、最内ループの実行回数ｙと上位ループの実行回数ｘとを取得する。このとき、例えば、実行回数変数ｘとｙとを、例えばデバッガ２又はｐｒｉｎｔ文を使用して確認する。
【００６６】
次に、ステップＳ４２において、ユーザは、ステップＳ４１において求めた最内ループの実行回数ｙが上位ループの実行回数ｘよりも小さいかどうかを判定する。
ステップＳ４２でｙがｘよりも小さい場合（ステップＳ４２のＹＥＳルート参照）、ステップＳ４３において、ユーザは、ソースコードの上位ループ（上位ループ）にＯＣＬ指定文を挿入する。
【００６７】
一方、ステップＳ４２でｙがｘ以上の場合（ステップＳ４２のＮＯルート参照）、ステップＳ４４において、ユーザは、ソースコードの最内ループにＯＣＬ指定文を挿入する。
次に、ステップＳ４５において、コンパイラ５がプリフェッチ命令を含む機械語プログを作成する。
このように、第２実施形態の変形例によれば、上記第１実施形態の効果に加えて、ループ内の所望の場所において、最内アクセス方式又は上位アクセス方式のいずれを採用するかを、ユーザが柔軟に指定することができるという効果が得られる。
【００６８】
これにより、プログラム中でプリフェッチをより有効に適用することができるようになる。
（Ｄ）その他
本実施形態の例として、最内ループの実行回数ｘが上位ループの実行回数ｙよりも少ないときに上位アクセス方式を適用することを提示しているが、これに限定されない。
【００６９】
それに限らず、最内ループの実行回数ｘが上位ループの実行回数ｙよりも大きいケースにおいても、コンパイラ５がプロファイル情報７を基に、レイテンシと例外アクセス命令数とのトレードオフを判断して自動的に最適なプリフェッチの出力（最内アクセス方式、上位アクセス方式）を選択することができる。
又、本実施形態の例として、最内ループの実行回数ｘが上位ループの実行回数ｙよりも少ないときに上位アクセス方式を適用することを提示している。この場合にも、プリフェッチしたデータのキャッシュ滞在時間が長くなり副作用が発生するケースもある。その場合もキャッシュ滞在時間、レイテンシと例外アクセス命令数とのトレードオフを適切に判断することで、最適なプリフェッチの出力（最内アクセス方式、上位アクセス方式）を選択することもできる。
【００７０】
又、上記例ではループ内の演算処理や、データ間の依存関係などを無視している。そこでこれらのサイクル数をコンパイラ５で算出、又はシミュレータ等で求めた処理サイクル数を考慮して最適な展開（最内アクセス方式、上位アクセス方式）を出し分けるなどに拡張することもできる。さらにキャッシュイベントなどのパフォーマンスカウンタのイベントや翻訳時の静的構文情報を組み合わせても適用できる。
【００７１】
又、本実施形態は、２次元配列と同様に、実施形態３次元以上の配列にも適用できる。
例えば、３次元配列Ａ（ｉ，ｊ，ｋ）は、内部的に、配列ａ（ｉ，ｊ）をｋ要素持つＡ（ａ（ｉ，ｊ），ｋ）と表現でき、多次元配列を、二次元の配列の組合せに置き換えることができる。したがって、ｉ，ｊ，ｋ方向順にアクセスする配列Ａの配列サイズが（ｘ，ｙ，ｚ）、要素サイズがｌである３次元配列Ａ（ｉ，ｊ，ｋ）の場合、配列の先頭域からの配列添字ｉ，ｊ，ｋの相対位置は一般に、
｛（ｉ−１）＋（ｊ−１）×ｘ＋（ｋ−１）×（ｘ×ｙ）｝×ｌ
で表現できる。
【００７２】
この場合、ループにおけるｊ，ｋアクセス方向へのプリフェッチ先としてＡ（ｉ，ｊ＋Ｌ，ｋ）、Ａ（ｉ，ｊ，ｋ＋Ｌ）の２通りを考えた場合、それぞれのメモリ相対アドレスは、配列先頭からそれぞれ、
｛（ｉ−１）＋（ｊ＋Ｌ−１）×ｘ＋（ｋ−１）×（ｘ×ｙ）｝×ｌ、｛（ｉ−１）＋（ｊ−１）×ｘ＋（ｋ＋Ｌ−１）×（ｘ×ｙ）｝×ｌ
となる。
【００７３】
ストライド幅がｊ方向ではＬ×ｘ，ｋ方向ではＬ×ｘ×ｙで順次プリフェッチすることになる。
４次元の配列も同様に考え、ループアクセス方向に対して、“ストライド幅のアクセスとなる２次元配列”と同じとみなすことができる。
なお、ソフトウェアによりプリフェッチ命令を展開する実施形態を上記に開示したが、上記は単なる例示に過ぎずこれに限定するものではない。例えば、プロファイル情報７に基づくソフトウェアプリフェッチ命令だけでなく、キャッシュメモリ２５にプリフェッチする機能を有する同等なハードウェアプリフェッチ機構を用いるように、本実施形態を適用可能である。
【００７４】
又、開示した実施形態をハードウェア、ファームウェア、及び／又はソフトウェアの組み合わせで実行することもできる。ｏｃｌの記述名、記述形式、及び翻訳オプション名は任意であり、さらに本実施形態の趣旨及び範囲から逸脱することなく更なる変更も可能である。
又、上記実施形態では、最内ループの実行回数ｘが上位ループの実行回数ｙよりも少ないときに上位アクセス方式を適用することを提示しているが、これに限定されない。
【００７５】
又、上記実施形態ではループ内の演算処理や、データ間の依存関係などを無視している。そこでこれらのサイクル数をコンパイラ５で算出するか、又はシミュレータ等で求めた処理サイクル数を考慮して、プリフェッチ命令の最適な展開先（最内アクセス方式、上位アクセス方式）を選択してもよい。さらに、キャッシュイベントなどのパフォーマンスカウンタのイベントや翻訳時の静的構文情報によって判断を行なってもよい。
【００７６】
又、「多次元配列にアクセスする多重ループ構造が存在し、かつ、配列アクセスがストライドである場合」にＰｒｅｆｅｔｃｈの適用を説明したが、飛び飛びにアクセスするストライドに限定するものでなく、シーケンシャルに連続する領域へのアクセスであってもよい。
なお、コンパイラ５、プリフェッチ命令挿入部１２、プロファイル取得部１２１、判定部１２２及び挿入部１２３としての機能を実現するためのプログラム（変換プログラム）は、例えばフレキシブルディスク、ＣＤ（ＣＤ−ＲＯＭ，ＣＤ−Ｒ，ＣＤ−ＲＷ等）、ＤＶＤ（ＤＶＤ−ＲＯＭ，ＤＶＤ−ＲＡＭ，ＤＶＤ−Ｒ，ＤＶＤ＋Ｒ，ＤＶＤ−ＲＷ，ＤＶＤ＋ＲＷ，ＨＤ  ＤＶＤ等），ブルーレイディスク，磁気ディスク，光ディスク，光磁気ディスク等の、コンピュータ読取可能な記録媒体に記録された形態で提供される。そして、コンピュータはその記録媒体からプログラムを読み取って内部記憶装置又は外部記憶装置に転送し格納して用いる。又、そのプログラムを、例えば磁気ディスク，光ディスク，光磁気ディスク等の記憶装置（記録媒体）に記録しておき、その記憶装置から通信経路を介してコンピュータに提供するようにしてもよい。
【００７７】
又、コンパイラ５、プリフェッチ命令挿入部１２、プロファイル取得部１２１、判定部１２２及び挿入部１２３としての機能を実現する際には、内部記憶装置（本実施形態では情報処理装置２０の記憶装置２４）に格納されているプログラムがコンピュータのマイクロプロセッサ（本実施形態では情報処理装置２０のＣＰＵ２１）によって実行される。このとき、記録媒体に記録されたプログラムをコンピュータが読み取って実行するようにしてもよい。
【００７８】
なお、本実施形態において、コンピュータとは、ハードウェアとオペレーティングシステムとを含む概念であり、オペレーティングシステムの制御の下で動作するハードウェアを意味している。又、オペレーティングシステムが不要でアプリケーションプログラム単独でハードウェアを動作させるような場合には、そのハードウェア自体がコンピュータに相当する。ハードウェアは、少なくとも、ＣＰＵ等のマイクロプロセッサと、記録媒体に記録されたコンピュータプログラムを読み取るための手段とをそなえており、本実施形態においては、情報処理装置２０がコンピュータとしての機能を有しているのである。
（Ｅ）付記
上記の実施形態に関して、下記の付記を記載する。
【００７９】
（付記１）
ソースコードから機械語コードを出力させる変換プログラムであって、前記変換プログラムは、コンピュータによって実行されたときに、該コンピュータに、
前記ソースコードからプロファイル情報を取得させ、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定させ、
前記最適位置に前記プリフェッチ命令を挿入させることを特徴とする変換プログラム。
【００８０】
（付記２）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記多重ループの最内ループの繰り返し回数と、該最内ループの１つ外側のループの繰り返し回数とから、前記最適位置を判定させることを特徴とする付記１記載の変換プログラム。
【００８１】
（付記３）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記最内ループの繰り返し回数が該最内ループの１つ外側のループの繰り返し回数よりも小さい場合に、前記該最内ループの１つ外側のループ内を前記最適位置と判定させることを特徴とする付記２記載の変換プログラム。
【００８２】
（付記４）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、前記多重ループの最内ループの繰り返し回数、該最内ループの１つ外側のループの繰り返し回数、レイテンシ、及び例外アクセス命令数から、前記最適位置を判定させることを特徴とする付記１記載の変換プログラム。
【００８３】
（付記５）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、最内ループの実行回数が上位ループの実行回数よりも大きい場合、前記プロファイル情報を基に、前記レイテンシと前記例外アクセス命令数とのトレードオフを判断して前記最適位置を判定させることを特徴とする付記４記載の変換プログラム。
【００８４】
（付記６）
ソースコードから機械語コードを生成する変換装置であって、
前記ソースコードからプロファイル情報を取得する情報取得部と、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定する判定部と、
前記最適位置に前記プリフェッチ命令を挿入する挿入部と、をそなえることを特徴とする変換装置。
【００８５】
（付記７）
前記判定部は、前記多重ループの最内ループの繰り返し回数と、該最内ループの１つ外側のループの繰り返し回数とから、前記最適位置を判定することを特徴とする付記６記載の変換装置。
（付記８）
前記判定部は、前記最内ループの繰り返し回数が該最内ループの１つ外側のループの繰り返し回数よりも小さい場合に、前記該最内ループの１つ外側のループ内を前記最適位置と判定することを特徴とする付記７記載の変換装置。
【００８６】
（付記９）
ソースコードから機械語コードを生成する変換方法であって、
前記ソースコードからプロファイル情報を取得し、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定し、
前記最適位置に前記プリフェッチ命令を挿入することを特徴とする変換方法。
【００８７】
（付記１０）
前記多重ループの最内ループの繰り返し回数と、該最内ループの１つ外側のループの繰り返し回数とから、前記最適位置を判定することを特徴とする付記９記載の変換方法。
（付記１１）
前記最内ループの繰り返し回数が該最内ループの１つ外側のループの繰り返し回数よりも小さい場合に、前記該最内ループの１つ外側のループ内を前記最適位置と判定することを特徴とする付記１０記載の変換方法。
【００８８】
（付記１２）
ソースコードから機械語コードを出力させる変換プログラムを記録しているコンピュータ可読記憶媒体であって、前記変換プログラムは、コンピュータによって実行されたときに、該コンピュータに、
前記ソースコードからプロファイル情報を取得させ、
前記プロファイル情報に基づいて、ネストレベルが２以上の多重ループの多次元配列へのアクセスについて、プリフェッチ命令の最適位置を判定させ、
前記最適位置に前記プリフェッチ命令を挿入させることを特徴とするコンピュータ可読記憶媒体。
【００８９】
（付記１３）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記多重ループの最内ループの繰り返し回数と、該最内ループの１つ外側のループの繰り返し回数とから、前記最適位置を判定させることを特徴とする付記１２記載のコンピュータ可読記憶媒体。
【００９０】
（付記１４）
前記変換プログラムは、前記コンピュータによって実行されたときに、該コンピュータに、
前記最内ループの繰り返し回数が該最内ループの１つ外側のループの繰り返し回数よりも小さい場合に、前記該最内ループの１つ外側のループ内を前記最適位置と判定させることを特徴とする付記１３記載のコンピュータ可読記憶媒体。
【符号の説明】
【００９１】
１      開発システム
１２    プリフェッチ命令挿入部
１２１  プロファイル取得部（情報取得部）
１２２  判定部
１２３  挿入部
１４    機械語プログラム（機械語コード）
２０    情報処理装置
２１    ＣＰＵ
２２    メインメモリ
２５    キャッシュメモリ
４      プロファイラ
５      コンパイラ（変換装置）
６      最適化部
７      プロファイル情報
９      ソースコード
【図１】
2014112327.tif 000003
【図２】
2014112327.tif 000004
【図３】
2014112327.tif 000005
【図４】
2014112327.tif 000006
【図５】
2014112327.tif 000007
【図６】
2014112327.tif 000008
【図７】
2014112327.tif 000009
【図８】
2014112327.tif 000010
【図９】
2014112327.tif 000011
【図１０】
2014112327.tif 000012
【図１１】
2014112327.tif 000013
【図１２】
2014112327.tif 000014
【図１３】
2014112327.tif 000015
【図１４】
2014112327.tif 000016
【図１５】
2014112327.tif 000017
【図１６】
2014112327.tif 000018
【図１７】
2014112327.tif 000019
【図１８】
2014112327.tif 000020
【図１９】
2014112327.tif 000021
【図２０】
2014112327.tif 000022