(57)【特許請求の範囲】
【請求項１】
兄弟ループの関係にある２以上の最内側ループをもつ多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数と最内側ループの予測実行サイクル数とに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数のループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次に実行する兄弟ループの関係にある最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法。
【請求項２】
密多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数と最内側ループの予測実行サイクル数とに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数だけループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次の外側ループ繰り返しにおける最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法。
【請求項３】
与えられた入力プログラムを解析し、請求項１または請求項２に記載の多重ループ向けデータプリフェッチ方法を適用し、プリフェッチ命令を挿入した出力プログラムを生成することを特徴とするプログラム生成方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、多重ループ向けデータプリフェッチ方法およびプログラム生成方法に関し、さらに詳しくは、最内側ループ長が短く、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る多重ループ向けデータプリフェッチ方法およびプログラム生成方法に関する。
【０００２】
【従来の技術】
コンピュータでは、主記憶よりも高速なキャッシュメモリをプロセッサと主記憶の間に配置し、最近参照したデータをキャッシュメモリ上に置くことによって、主記憶参照による待ち時間を減少させている。
ところが、数値計算処理など大規模データを使用する計算では、データの参照局所性が低いためキャッシュミスが多発し、主記憶参照による待ち時間を十分に減少することが出来ない問題点があった。
【０００３】
このような大規模データに対するキャッシュミスに対処するため、例えば、文献「Ｔ．Ｃ．Ｍｏｗｒｙ  他，  Ｄｅｓｉｇｎ  ａｎｄ  Ｅｖａｌｕａｔｉｏｎ  ｏｆ  ａ  Ｃｏｍｐｉｌｅｒ  Ａｌｇｏｒｉｔｈｍｆｏｒ  Ｐｒｅｆｅｔｃｈｉｎｇ，  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ５ｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  ＡｒｃｈｉｔｅｃｔｕｒａｌＳｕｐｐｏｒｔ  ｆｏｒ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ，ｐｐ．６２−７３，１９９２」に示されているように、データを使用する時より先行して主記憶からキャッシュメモリへデータを移動するプリフェッチ命令をプロセッサに用意し、コンパイラによってプログラム中にプリフェッチ命令を挿入するプリフェッチ方法が提案されている。
具体的には、図１３の（ａ）に示すようなループ２０１に対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数とループの予測実行サイクル数に基づいてデータをプリフェッチすべき要素間のオフセットαを計算し、まず、図１３の（ｂ）のループ２０２のように、データを使用するループよりもオフセットαだけ先行したループでデータをプリフェッチするようにプリフェッチ命令“ＰＲＥＦＥＴＣＨ”を挿入する。しかし、これだけでは、１〜α回の繰り返しで使用するデータはプリフェッチされない。また、最後の（Ｎ−α＋１）〜Ｎ回の繰り返しでは、演算に使用されないデータをプリフェッチすることになる。そこで、次に、図１３の（ｃ）に示すように、１〜α回の繰り返しで使用するデータのプリフェッチだけを行なうα回のループ２０３をループ開始前に挿入する。また、インデックス集合分割を適用して元のループ２０１を１〜（Ｎ−α）回の繰り返しを実行する前半部分ループ２０４と残りの繰り返しを実行する後半部分ループ２０５に分割し、後半部分ループ２０５にはプリフェッチ命令を挿入しないようにする。
【０００４】
【発明が解決しようとする課題】
上記のようなプリフェッチ方法によれば、キャッシュミスが減り、主記憶参照による待ち時間を減少することが出来る。
ところで、プリフェッチの本質は主記憶からキャッシュメモリへのデータの移動と演算がオーバラップして行なわれる図１３のループ２０４にあるが、ループ長Ｎに対してオフセットαの値が比較的大きな場合には、この本質的なループ２０４の比率が小さくなり、本質的でないループ２０３，２０５の比率が大きくなってしまう。このため、全体として主記憶参照による待ち時間を十分に減少することが出来なくなる問題点がある。
すなわち、従来は最内側ループのみをプリフェッチ方法の適用対象としていたため、最内側ループ長が短く、外側ループのループ長が長い多重ループに対しては、主記憶参照による待ち時間を十分に減少することが出来ない問題点があった。
そこで、本発明の目的は、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る多重ループ向けデータプリフェッチ方法およびプログラム生成方法を提供することにある。
【０００５】
【課題を解決するための手段】
本発明では、次に示す手順によりプリフェッチ命令を挿入する。
（手順１）．ディレクティブやオプションによるユーザからの指定や、上記論文に示されているようなデータの再利用性を考慮したコンパイラの解析によって、多重ループの最内側ループの中からプリフェッチを適用するループＬＯＯＰｏ，…，ＬＯＯＰｍ−１を選択する。
（手順２）．ループＬＯＯＰｉ（０≦ｉ≦ｍ−１）の繰り返し実行回数をＬｅｎｇｔｈ（ｉ）とし、主記憶からキャッシュメモリへのデータ転送に要するサイクル数をＣｙｃｌｅ（ＭＥＭ）とし、ループＬＯＯＰｉの１回の繰り返しの予測実行サイクル数をＣｙｃｌｅ（ｉ）  とするとき、分割すべき繰り返し回数αをα＝Ｃｙｃｌｅ（ＭＥＭ）／Ｃｙｃｌｅ（ｉ）  により求める。そして、ループＬＯＯＰｉに対してインデックス集合分割を適用し、１〜（Ｌｅｎｇｔｈ（ｉ）−α）回の繰り返しを実行する前半部分ループＬＯＯＰｉ．０と、残りの（Ｌｅｎｇｔｈ（ｉ）−α＋１）〜Ｌｅｎｇｔｈ（ｉ）回の繰り返しを実行する後半部分ループＬＯＯＰｉ．１とに分割する。
（手順３）．前半部分ループＬＯＯＰｉ．０でキャッシュミスを生じるメモリ参照“Ｘ［ｊ］”に対して、プリフェッチ命令“ＰＲＥＦＥＴＣＨ  Ｘ［ｊ＋Ｓｔｅｐ（ｉ）＊α］”を挿入する。ここで、Ｓｔｅｐ（ｉ）は、ＬＯＯＰｉのループインデックスの増分値である。
また、後半部分ループＬＯＯＰｉ．１のループインデックスをｋとし、その初期値をＩｎｉｔ（ｉ．１）  とするとき、ループＬＯＯＰｉの次のプリフェッチ対象ループＬＯＯＰ（（ｉ＋１）  ｍｏｄ  ｍ）  でキャッシュミスを生じるメモリ参照“Ｙ［ｊ］”に対して、その初期参照インデックスをＳｔａｒｔ（Ｙ）とすると、プリフェッチ命令“ＰＲＥＦＥＴＣＨ  Ｙ［Ｓｔａｒｔ（Ｙ）＋（ｋ−Ｉｎｉｔ（ｉ．１））＊（Ｓｔｅｐ（ＬＯＯＰ（（（ｉ＋１）  ｍｏｄ  ｍ）））／Ｓｔｅｐ（ｉ））］”を挿入する。但し、（（ｉ＋１）  ｍｏｄ  ｍ）＝０  ならば、外側ループインデックスを１回分進めたアドレスをプリフェッチ対象アドレスとする。
なお、（Ａ  ｍｏｄ  Ｂ）  は、ＡをＢで割った余りを表すものとする。
【０００６】
さて、第１の観点では、本発明は、兄弟ループの関係にある２以上の最内側ループをもつ多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクルと最内側ループの予測実行サイクルとに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数の繰り返しを実行する前半部分と、残りの繰り返し回数だけ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次に実行する兄弟ループの関係にある最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法を提供する。
上記第１の観点による多重ループ向けデータプリフェッチ方法は、先述の（手順３）で、（（ｉ＋１）  ｍｏｄ  ｍ）≠０  の場合に相当し、後半部分ループにおいても、主記憶からキャッシュメモリへのデータ（＝次に実行する兄弟ループの関係にある最内側ループで使用するデータ）の移動と演算がオーバラップして行なわれることとなり、プリフェッチの本質的な作用により、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る。
【０００７】
第２の観点では、本発明は、密多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクルと最内側ループの予測実行サイクルとに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数だけループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次の外側ループ繰り返しにおける最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法を提供する。
上記第２の観点による多重ループ向けデータプリフェッチ方法は、先述の（手順３）で、（（ｉ＋１）  ｍｏｄ  ｍ）＝０  の場合に相当し、後半部分ループにおいても、主記憶からキャッシュメモリへのデータ（＝次の外側ループ繰り返しにおける最内側ループで使用するデータ）の移動と演算がオーバラップして行なわれることとなり、プリフェッチの本質的な作用により、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る。
【０００８】
第３の観点では、本発明は、プリフェッチ命令を持つプロセッサにおいて、汎用レジスタとは別に、プリフェッチ命令のベース，オフセットなどのオペランドとして指定することが可能なプリフェッチ用拡張レジスタを備えたことを特徴とするプロセッサを提供する。
プリフェッチでは、プリフェッチのオフセットやプリフェッチ対象アドレスを生成するのにレジスタを使用する。このため、多数の汎用レジスタを使用するプログラムではレジスタ不足を生じ、メモリへのスピル処理により、性能が低下するおそれがある。そこで、上記第３の観点によるプロセッサでは、プリフェッチ用拡張レジスタを備えた。これにより、上記第１の観点または第２の観点による多重ループ向けデータプリフェッチ方法を実施する際にレジスタ不足が生じることを防止できる。
なお、上記プリフェッチ用拡張レジスタは、その参照に要するサイクル数がメモリ参照の場合と異なり常に一定であり、プリフェッチだけでなく、汎用レジスタ不足時の一時的なデータ保存のためにも使用できる。
【０００９】
第４の観点では、本発明は、上記構成のプロセッサにおいて、オペランドで指定されたプリフェッチ用拡張レジスタの値をプリフェッチ対象アドレスの計算のためのベースあるいはオフセットとし、別オペランドで指定された汎用レジスタの値と組み合わせてプリフェッチ対象アドレスを計算するプリフェッチ命令を備えたことを特徴とするプロセッサを提供する。
上記第４の観点によるプロセッサでは、プリフェッチ対象アドレスを計算するのに使用するプリフェッチ用拡張レジスタと汎用レジスタをオペランドで指定できるプリフェッチ命令を備えたため、上記第１の観点または第２の観点による多重ループ向けデータプリフェッチ方法を効率よく実行できる。
【００１０】
第５の観点では、本発明は、上記構成のプロセッサにおいて、プリフェッチ用拡張レジスタと、汎用レジスタあるいは主記憶との間でデータの転送を行なうデータ転送命令を備えたことを特徴とするプロセッサを提供する。
上記第５の観点によるプロセッサでは、プリフェッチ用拡張レジスタに値を設定したり、プリフェッチ用拡張レジスタの値を取り出したりすることを、上記データ転送命令により実行できる。このため、上記第１の観点または第２の観点による多重ループ向けデータプリフェッチ方法を効率よく実行できる。
【００１１】
第６の観点では、本発明は、与えられた入力プログラムを解析し、請求項１または請求項２に記載の多重ループ向けデータプリフェッチ方法を適用し、プリフェッチ命令を挿入した出力プログラムを生成することを特徴とするプログラム生成方法を提供する。
上記第６の観点によるプログラム生成方法をコンピュータに実施させるコンパイラ・プログラムを記録した記録媒体をコンピュータに読み取らせて、入力プログラムに対して上記第１の観点または第２の観点による多重ループ向けデータプリフェッチ方法を適用することをコンピュータに実施させれば、実行効率の高い出力プログラムを得ることが出来る。
【００１２】
【発明の実施の形態】
以下、図面を参照しながら、本発明の実施形態を説明する。なお、これにより本発明が限定されるものではない。
【００１３】
図１は、本発明を実施するコンピュータシステムの一例である。
このコンピュータシステム１００は、マイクロプロセッサ１０１と、そのマイクロプロセッサ１０１に内蔵されたキャッシュメモリ１０２と、主記憶１０３と、ディスク装置１０４とを具備してなる。磁気ディスク装置１０４には、記録媒体から読み込まれたコンパイラ・プログラムが格納されている。
マイクロプロセッサ１０１は、ディスク装置１０４に格納されたコンパイラ・プログラムを読み出し、与えられたソースプログラムに対してコンパイル処理を行い、コンパイル結果のオブジェクトプログラムを出力する。
【００１４】
マイクロプロセッサ１０１は、通常のメモリ参照命令の実行を行なう場合には、まずキャッシュメモリ１０２に参照対象データがあるかどうかを調べ、キャッシュメモリ１０２に当該データが存在すればそのデータを参照し、キャッシュメモリ１０２に参照対象データが存在しなければ主記憶１０３上の当該データを参照すると共に当該データの属するキャッシュブロックをキャッシュメモリ１０２にコピーする。もし、主記憶１０３からキャッシュメモリ１０２へキャッシュブロックを移動するのに十分なサイクル数だけ前に参照対象データに対するプリフェッチ命令が発行されておれば、参照対象データが必ずキャッシュメモリ１０２に存在し、当該データを主記憶１０３から参照するための待ち時間が無くなり、プログラムの実行性能が向上する。
【００１５】
図２は、従来のプリフェッチ方法（ａ）と本発明の多重ループ向けプリフェッチ方法（ｂ）とを比較した説明図である。これについては、後で詳述する。
【００１６】
図３は、兄弟ループの関係にある２つの最内側ループ３０１，３０２をもつ多重ループに対して、本発明の多重ループ向けプリフェッチ方法を適用した結果の説明図である。これについては、後で詳述する。
【００１７】
図４は、密多重ループに対して、本発明の多重ループ向けプリフェッチ方法を適用した結果の説明図である。これについては、後で詳述する。
【００１８】
図５は、コンパイラ・プログラムの要部である多重ループ向けプリフェッチ命令挿入処理部５０１の構成図である。なお、実線の矢印は制御の流れを表し、破線の矢印はデータの流れを表している。
この多重ループ向けプリフェッチ命令挿入処理部５０１は、本発明の多重ループ向けプリフェッチ方法を実施する要部であり、ソースプログラムから変換した中間語５０６を入力とし、多重ループ向けプリフェッチを行なうように変換した中間語５１１を出力とする。
多重ループ向けプリフェッチ命令挿入処理部５０１は、ループ構造認識部５０２と、プリフェッチインデックス生成部５０３と、インデックス集合分割部５０４と、プリフェッチ命令挿入部５０５とを具備してなる。
【００１９】
図６は、前記ループ構造認識部５０２の処理動作を示すフローチャートである。
処理６０１では、処理を開始する。
処理６０２では、Ｌ１に最内側ループの外側ループ集合を求める。ループ集合を求める処理は、例えば「Ａｈｏ他、Ｃｏｍｐｉｌｅｒｓ  −  Ｐｒｉｎｃｉｐｌｅｓ，  Ｔｅｃｈｎｉｑｕｅｓ，  ａｎｄ  Ｔｏｏｌｓ，  Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ，  １９８６」に述べられているような既知の制御フロー解析技術を適用することにより実現できる。
処理６０３では、求めたループ集合Ｌ１が空集合か否かをチェックし、空集合であれば処理６１０へ制御を移し、処理を終了する。Ｌ１が空集合でなければ、処理６０４へ制御を移す。
処理６０４では、Ｌ１より要素を１つ取り出し、ｌ１に格納する。また、ｌ１の子ループ集合をＬ０に格納する。さらに、Ｌ１のプリフェッチ対象ループを求める集合Ｓを空集合に初期化する。
処理６０５では、ｌ１の子ループ集合Ｌ０が空集合かどうか確かめ、空集合であれば処理６０９へ進み、空集合でなければ処理６０６へ制御を移す。
処理６０６では、子ループ集合Ｌ０より要素を１つ取り出し、そのループをｌ０とする。
処理６０７では、ループｌ０にプリフェッチを適用するか否かを判定する。この判定は、ユーザからのオプションやディレクティブによる指定や、前記Ｔ．Ｃ．Ｍｏｗｒｙ  他による論文に示されている既知技術によって行えばよい。そして、プリフェッチを適用する場合は処理６０８へ制御を移し、適用しない場合は前記処理６０５に制御を移し、次の最内側ループを処理する。
処理６０８では、ループｌ０をプリフェッチ対象ループとして集合Ｓに追加し、前記処理６０５へ制御を移し、次の最内側ループの処理を行なう。
処理６０９では、ループ表のｌ１の欄にプリフェッチ対象ループの集合Ｓを登録し、前記処理６０３に制御を移し、次の多重ループを処理する。
【００２０】
図７は、前記プリフェッチインデックス生成部５０３の処理動作を示すフローチャートである。
処理７０１では、処理を開始する。
処理７０２では、集合Ｌ１に最内側ループの外側ループ集合を求める。
処理７０３では、求めたループ集合Ｌ１が空集合か否かをチェックし、空集合であれば処理７０７へ制御を移し、処理を終了する。Ｌ１が空集合でなければ、処理７０４へ制御を移す。
処理７０４では、Ｌ１より要素を１つ取り出し、ｌ１に格納する。また、ループ構造認識部５０２が求めたプリフェッチ対象ループ集合ｌ１をｌ０に格納する。また、変数ｉを“１”に初期化する。さらに、変数Ｑをｌ０の要素数に初期化する。
処理７０５では、変数ｉがＱ以上になったか否かを判定し、なった場合は前記処理７０３に制御を移し、次の多重ループの処理を行なう。変数ｉがＱより小さい場合は処理７０６へ制御を移す。
処理７０６では、ｌ０にＬ０のｉ番目のループを格納する。また、ｌ０’にＬ０の（（ｉ  ｍｏｄ  Ｑ）＋１）番目のループを格納する。ここで、（ｉ  ｍｏｄ  Ｑ）は、ｉをＱで割った余りを表す。また、ｌ０’で参照するデータの初期アドレスの計算式をｌ０の前に生成する。さらに、ｉの値を“１”増加し、前記処理７０５に制御を移して、次の最内側ループの処理を行なう。
【００２１】
図８は、前記インデックス集合分割部５０４の処理動作を示すフローチャートである。
処理８０１では、処理を開始する。
処理８０２では、集合Ｌ１に最内側ループの外側ループ集合を求める。
処理８０３では、求めたループ集合Ｌ１が空集合か否かをチェックし、空集合であれば処理８０７へ制御を移し、処理を終了する。Ｌ１が空集合でなければ、処理８０４へ制御を移す。
処理８０４では、Ｌ１より要素を１つ取り出し、ｌ１に格納する。また、ループ構造認識部５０２が求めたプリフェッチ対象ループ集合ｌ１をｌ０に格納する。また、変数ｉを“１”に初期化する。さらに、変数Ｑをｌ０の要素数に初期化する。
処理８０５では、変数ｉがＱ以上になったか否かを判定し、なった場合は前記処理８０３に制御を移し、次の多重ループの処理を行なう。変数ｉがＱより小さい場合は処理８０６へ制御を移す。
処理８０６では、ｌ０にＬ０のｉ番目のループを格納する。また、αに主記憶１０３からキャッシュメモリ１０２へのプリフェッチに要するサイクル数をループｌ０の１回当たりの予測実行サイクル数で割った値、すなわち、分割すべき繰り返し回数を格納する。また、ループｌ０にインデックス集合分割を適用して、１〜（Ｎ−α）回の繰り返しを実行するループと（Ｎ−α＋１）〜Ｎ回の繰り返しを実行するループとに分割する。このインデックス集合分割は、例えば「Ｍ．Ｗｏｌｆｅ、Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｉｌｅｒｓ  Ｆｏｒ  Ｐａｒａｌｌｅｌ  Ｃｏｍｐｕｔｉｎｇ、Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ，  １９９６」に述べられている既知のループ最適化技法を適用すればよい。さらに、ｉの値を“１”増加し、前記処理８０５に制御を移して、次の最内側ループの処理を行なう。
【００２２】
図９は、前記プリフェッチ命令挿入部５０５の処理動作を示すフローチャートである。
処理９０１では、処理を開始する。
処理９０２では、集合Ｌ１に最内側ループの外側ループ集合を求める。
処理９０３では、求めたループ集合Ｌ１が空集合か否かをチェックし、空集合であれば処理９０７へ制御を移し、処理を終了する。Ｌ１が空集合でなければ、処理９０４へ制御を移す。
処理９０４では、Ｌ１より要素を１つ取り出し、ｌ１に格納する。また、ループ構造認識部５０２が求めたプリフェッチ対象ループ集合ｌ１をｌ０に格納する。また、変数ｉを“１”に初期化する。さらに、変数Ｑをｌ０の要素数に初期化する。
処理９０５では、変数ｉがＱ以上になったか否かを判定し、なった場合は前記処理９０３に制御を移し、次の多重ループの処理を行なう。変数ｉがＱより小さい場合は処理９０６へ制御を移す。
処理９０６では、ｌ０にＬ０のｉ番目のループを格納する。また、ｌ０’にＬ０の（(ｉ mod Q)＋１）番目のループを格納する。また、ｌ０．０にインデックス集合分割部５０４がｌ０をインデックス集合分割してできた前半部分ループを格納し、ｌ０．１に後半部分ループを格納する。また、αに主記憶１０３からキャッシュメモリ１０２へのプリフェッチに要するサイクル数をループｌ０の１回当たりの予測実行サイクル数で割った値、すなわち、分割すべき繰り返し回数を格納する。また、ループｌ０のプリフェッチ対象メモリ参照Ｘ［ｊ］に対して、インデックス集合分割によって生成した前半部分ループｌ０．０には、Ｘ［ｊ＋Step（ｉ）＊α］に対するプリフェッチ命令を挿入する。ここで、Step（ｉ）は、LOOPｉのループインデックスｊの増分値である。また、ｌ０’のプリフェッチ対象メモリ参照Ｙ［ｋ］に対して、ｌ０．１のループインデックスをｊとし、βをｌ０．１開始時のループインデックスの値とし、Ｄをループｌ０とループｌ０’のループ増分値の比とすると、後半部分ループｌ０．１にＹ［Start(Y)＋（ｊ−β）Ｄ］に対するプリフェッチ命令を挿入する。ここで、メモリ参照Ｙ［ｋ］に対して、その初期参照インデックスをStart(Y)とする。さらに、ｉの値を“１”増加し、前記処理９０５に制御を移して、次の最内側ループの処理を行なう。
【００２３】
プリフェッチ命令のアドレス計算式中のαやβなどはループ中で不変な値であり、ループ外へ移動することでループ中の演算数を削減することができる。ただし、これらの式をループ外へ移動すると、その値を保持するための汎用レジスタが別途必要となるため、汎用レジスタ使用数の多いプログラムでは汎用レジスタ不足を生じるおそれがある。そこで、マイクロプロセッサ１０１にプリフェッチ用拡張レジスタを設け、そのプリフェッチ用拡張レジスタに前記αやβの値を格納し、このプリフェッチ用拡張レジスタを使用するプリフェッチ命令を生成すれば、汎用レジスタの不足を生じさせずに済む。
図１０に、プリフェッチ用拡張レジスタを使用するプリフェッチ命令の一例を示す。
ＧＲｎは、汎用レジスタを表している。また、ＰＦＲｎは、プリフェッチ用拡張レジスタを表している。このプリフェッチ命令を使用し、ループ実行中に不変なオフセットについてはプリフェッチ用拡張レジスタＰＦＲｎを指定し、ループ実行時に可変なベース値については汎用レジスタＧＲｎを指定するようにすれば、プログラム実行に必要な汎用レジスタ数を増すことなく、プリフェッチを行なうプログラムを生成することができる。
図１１は、汎用レジスタＧＲｎに格納された値をプリフェッチ用拡張レジスタＰＦＲｎへ設定する命令の一例である。
また、図１２は、プリフェッチ用拡張レジスタＰＦＲｎより汎用レジスタＧＲｎへ値をコピーする命令である。
【００２４】
次に、本発明のプリフェッチ方法の適用例を説明する。
図３は、兄弟ループの関係にある２つの最内側ループ３０１，３０２をもつ多重ループに対して本発明のプリフェッチ方法を適用した例である。
図３の（ａ）はプリフェッチ命令挿入前のプログラムであり、図３の（ｂ）はプリフェッチ命令挿入後のプログラムである。
次のステップ１〜ステップ５により、図３の（ａ）のプログラムから図３の（ｂ）のプログラムが得られる。
ステップ１：
プリフェッチ対象の最内側ループとしてループ３０１とループ３０２を選択する。
ステップ２：
プリフェッチ対象の最内側ループ３０１と３０２に対して、インデックス集合分割を適用する。
ステップ３：
ループ３０１を分割して生成した前半部分ループに、ループ３０１に対するプリフェッチ命令を挿入する。同様に、ループ３０２を分割して生成した前半部分ループに、ループ３０２に対するプリフェッチ命令を挿入する。
ステップ４：
ループ３０１を分割して生成した後半部分ループに、ループ３０２に対するプリフェッチ命令を挿入する。同様に、ループ３０２を分割して生成した後半部分ループに、外側ループの次回の繰り返しでのループ３０１に対するプリフェッチ命令を挿入する。
ステップ５：
外側ループの直前に、外側ループの最初の繰り返しでループ３０１が最初のα回のループ繰り返しで参照するデータのプリフェッチを挿入する。
【００２５】
ループ３０３は、最初の外側ループ繰り返しで元のループ３０１の１〜α回の演算で使用するデータのプリフェッチを行なうループであり、上記ステップ５で挿入される。
ループ３０４は、元のループ３０１の１〜（Ｎ−α）回の演算と同時に（α＋１）〜Ｎ回の演算で使用するデータをプリフェッチするループであり、上記ステップ３で挿入される。
ループ３０５は、元のループ３０１の（Ｎ−α＋１）〜Ｎ回の演算と同時に、元のループ３０２の最初の１〜α回の演算で使用するデータをプリフェッチするループであり、上記ステップ４で挿入される。
ループ３０６は、元のループ３０１のループ長がαより短い場合にループ３０２で使用するデータのプリフェッチとループ３０１の演算を同時に行なうループであり、上記ステップ４で挿入される（この場合、前半部分ループがなく、後半部分ループだけがある）。
ループ３０７は、元のループ３０２の最初の１〜（Ｎ−α）回の演算と同時に（α＋１）〜Ｎ回の実行で使用するデータをプリフェッチするループであり、上記ステップ３で挿入される。
ループ３０８は、元のループ３０２の（Ｎ−α＋１）〜Ｎ回の演算の実行と同時に外側ループの次回の繰り返しでのループ３０１の１〜α回の演算で使用するデータをプリフェッチするループであり、上記ステップ４で挿入される。
ループ３０９は、元のループ３０２のループ長がαより短い場合にループ３０１で使用するデータのプリフェッチとループ３０２の演算を同時に行なうループであり、上記ステップ４で挿入される（この場合、前半部分ループがなく、後半部分ループだけがある）。
【００２６】
図４は、多重ループの特殊な形態である密多重ループに本発明のプリフェッチ方法を適用した例である。
図４の（ａ）はプリフェッチ命令挿入前のプログラムであり、図４の（ｂ）はプリフェッチ命令挿入後のプログラムである。
密多重ループの場合、最内側には１つのループしかないため、最内側ループの実行と次外側ループ繰り返しの最内側ループで使用するデータのプリフェッチを同時に行なう。
ループ４０２は、最初の外側ループ繰り返しで元のループ４０１の最初の１〜α回の演算で使用するデータのプリフェッチを行なうループである。
ループ４０３は、元のループ４０１の１〜（Ｎ−α）回の演算と同時に（α＋１）〜Ｎ回の演算で使用するデータをプリフェッチするループである。
ループ４０４は、元のループ４０１の（Ｎ−α＋１）〜Ｎ回の演算と同時に次外側ループ繰り返しのループ４０１の最初の１〜α回の演算で使用するデータのプリフェッチを行なうループである。
ループ４０５は、ループ４０１のループ長がαより短い場合にループ４０１の演算と同時に次外側ループ繰り返しでループ４０１が使用するデータのプリフェッチを行なうループである。
【００２７】
以上の結果、図２の（ａ）に示すように、従来のプリフェッチ方法では次外側ループ開始時にプリフェッチだけを行い演算を行わない空きサイクルを生じていたのに対して、図２の（ｂ）に示すように、本発明の多重ループ向けデータプリフェッチ方法では、インデックス集合分割を適用してできた後半部分ループで次外側ループ繰り返しで参照するデータのプリフェッチを行なっているため、空きサイクルを生じない（開始時点を除く）。
【００２８】
【発明の効果】
本発明の多重ループ向けデータプリフェッチ方法およびプログラム生成方法によれば、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、プリフェッチを有効に行うようにプログラムを変換できるため、主記憶参照による待ち時間を十分に減少することができ、これによりコンピュータプログラムの実行を高速化できる。
【図面の簡単な説明】
【図１】本発明の多重ループ向けデータプリフェッチ方法を実施するコンピュータシステムの構成図である。
【図２】従来のプリフェッチ方法と本発明の多重ループ向けデータプリフェッチ方法の比較説明図である。
【図３】兄弟ループの関係にある複数の最内側ループをもつ多重ループに対して本発明のプリフェッチ方法を適用した例の説明図である。
【図４】密多重ループに対して本発明のプリフェッチ方法を適用した例の説明図である。
【図５】コンパイラ・プログラムの要部である多重ループ向けプリフェッチ命令挿入処理部５０１の構成図である。
【図６】ループ構造認識部の処理動作を示すフローチャートである。
【図７】プリフェッチインデックス生成部の処理動作を示すフローチャートである。
【図８】インデックス集合分割部の処理動作を示すフローチャートである。
【図９】プリフェッチ命令挿入部の処理動作を示すフローチャートである。
【図１０】プリフェッチ命令の説明図である。
【図１１】プリフェッチ用拡張レジスタへのデータ転送命令の説明図である。
【図１２】プリフェッチ用拡張レジスタからのデータ転送命令の説明図である。
【図１３】従来のプリフェッチ方法の適用例の説明図である。
【符号の説明】
１００            コンピュータシステム
１０１            マイクロプロセッサ
１０２            キャッシュメモリ
１０３            主記憶
１０４            ディスク装置
３０１，３０２                    兄弟ループの関係にある最内側ループ
３０４，３０７                    前半部分ループ
３０５，３０６，３０８，３０９    後半部分ループ
４０１                            密多重ループ
４０３                            前半部分ループ
４０４，４０５                    後半部分ループ
５０１            多重ループ向けプリフェッチ命令挿入処理部
５０２            ループ構造認識部
５０３            プリフェッチインデックス生成部
５０４            インデックス集合分割部
５０５            プリフェッチ命令挿入部
【図１】
0003546341.tif 000002
【図２】
0003546341.tif 000003
【図３】
0003546341.tif 000004
【図４】
0003546341.tif 000005
【図５】
0003546341.tif 000006
【図６】
0003546341.tif 000007
【図７】
0003546341.tif 000008
【図８】
0003546341.tif 000009
【図９】
0003546341.tif 000010
【図１０】
0003546341.tif 000011
【図１１】
0003546341.tif 000012
【図１２】
0003546341.tif 000013
【図１３】
0003546341.tif 000014