JP3546341B2 - 多重ループ向けデータプリフェッチ方法およびプログラム生成方法 - Google Patents

多重ループ向けデータプリフェッチ方法およびプログラム生成方法 Download PDF

Info

Publication number
JP3546341B2
JP3546341B2 JP10042997A JP10042997A JP3546341B2 JP 3546341 B2 JP3546341 B2 JP 3546341B2 JP 10042997 A JP10042997 A JP 10042997A JP 10042997 A JP10042997 A JP 10042997A JP 3546341 B2 JP3546341 B2 JP 3546341B2
Authority
JP
Japan
Prior art keywords
loop
prefetch
data
innermost
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP10042997A
Other languages
English (en)
Other versions
JPH10293692A (ja
Inventor
博泰 西山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP10042997A priority Critical patent/JP3546341B2/ja
Priority to US09/060,377 priority patent/US6148439A/en
Publication of JPH10293692A publication Critical patent/JPH10293692A/ja
Application granted granted Critical
Publication of JP3546341B2 publication Critical patent/JP3546341B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30138Extension of register space, e.g. register cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching

Description

【0001】
【発明の属する技術分野】
本発明は、多重ループ向けデータプリフェッチ方法およびプログラム生成方法に関し、さらに詳しくは、最内側ループ長が短く、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る多重ループ向けデータプリフェッチ方法およびプログラム生成方法に関する。
【0002】
【従来の技術】
コンピュータでは、主記憶よりも高速なキャッシュメモリをプロセッサと主記憶の間に配置し、最近参照したデータをキャッシュメモリ上に置くことによって、主記憶参照による待ち時間を減少させている。
ところが、数値計算処理など大規模データを使用する計算では、データの参照局所性が低いためキャッシュミスが多発し、主記憶参照による待ち時間を十分に減少することが出来ない問題点があった。
【0003】
このような大規模データに対するキャッシュミスに対処するため、例えば、文献「T.C.Mowry 他, Design and Evaluation of a Compiler Algorithmfor Prefetching, Proceedings of the 5th International Conference on ArchitecturalSupport for Programming Languages and Operating Systems,pp.62−73,1992」に示されているように、データを使用する時より先行して主記憶からキャッシュメモリへデータを移動するプリフェッチ命令をプロセッサに用意し、コンパイラによってプログラム中にプリフェッチ命令を挿入するプリフェッチ方法が提案されている。
具体的には、図13の(a)に示すようなループ201に対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数とループの予測実行サイクル数に基づいてデータをプリフェッチすべき要素間のオフセットαを計算し、まず、図13の(b)のループ202のように、データを使用するループよりもオフセットαだけ先行したループでデータをプリフェッチするようにプリフェッチ命令“PREFETCH”を挿入する。しかし、これだけでは、1〜α回の繰り返しで使用するデータはプリフェッチされない。また、最後の(N−α+1)〜N回の繰り返しでは、演算に使用されないデータをプリフェッチすることになる。そこで、次に、図13の(c)に示すように、1〜α回の繰り返しで使用するデータのプリフェッチだけを行なうα回のループ203をループ開始前に挿入する。また、インデックス集合分割を適用して元のループ201を1〜(N−α)回の繰り返しを実行する前半部分ループ204と残りの繰り返しを実行する後半部分ループ205に分割し、後半部分ループ205にはプリフェッチ命令を挿入しないようにする。
【0004】
【発明が解決しようとする課題】
上記のようなプリフェッチ方法によれば、キャッシュミスが減り、主記憶参照による待ち時間を減少することが出来る。
ところで、プリフェッチの本質は主記憶からキャッシュメモリへのデータの移動と演算がオーバラップして行なわれる図13のループ204にあるが、ループ長Nに対してオフセットαの値が比較的大きな場合には、この本質的なループ204の比率が小さくなり、本質的でないループ203,205の比率が大きくなってしまう。このため、全体として主記憶参照による待ち時間を十分に減少することが出来なくなる問題点がある。
すなわち、従来は最内側ループのみをプリフェッチ方法の適用対象としていたため、最内側ループ長が短く、外側ループのループ長が長い多重ループに対しては、主記憶参照による待ち時間を十分に減少することが出来ない問題点があった。
そこで、本発明の目的は、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る多重ループ向けデータプリフェッチ方法およびプログラム生成方法を提供することにある。
【0005】
【課題を解決するための手段】
本発明では、次に示す手順によりプリフェッチ命令を挿入する。
(手順1).ディレクティブやオプションによるユーザからの指定や、上記論文に示されているようなデータの再利用性を考慮したコンパイラの解析によって、多重ループの最内側ループの中からプリフェッチを適用するループLOOPo,…,LOOPm−1を選択する。
(手順2).ループLOOPi(0≦i≦m−1)の繰り返し実行回数をLength(i)とし、主記憶からキャッシュメモリへのデータ転送に要するサイクル数をCycle(MEM)とし、ループLOOPiの1回の繰り返しの予測実行サイクル数をCycle(i) とするとき、分割すべき繰り返し回数αをα=Cycle(MEM)/Cycle(i) により求める。そして、ループLOOPiに対してインデックス集合分割を適用し、1〜(Length(i)−α)回の繰り返しを実行する前半部分ループLOOPi.0と、残りの(Length(i)−α+1)〜Length(i)回の繰り返しを実行する後半部分ループLOOPi.1とに分割する。
(手順3).前半部分ループLOOPi.0でキャッシュミスを生じるメモリ参照“X[j]”に対して、プリフェッチ命令“PREFETCH X[j+Step(i)*α]”を挿入する。ここで、Step(i)は、LOOPiのループインデックスの増分値である。
また、後半部分ループLOOPi.1のループインデックスをkとし、その初期値をInit(i.1) とするとき、ループLOOPiの次のプリフェッチ対象ループLOOP((i+1) mod m) でキャッシュミスを生じるメモリ参照“Y[j]”に対して、その初期参照インデックスをStart(Y)とすると、プリフェッチ命令“PREFETCH Y[Start(Y)+(k−Init(i.1))*(Step(LOOP(((i+1) mod m)))/Step(i))]”を挿入する。但し、((i+1) mod m)=0 ならば、外側ループインデックスを1回分進めたアドレスをプリフェッチ対象アドレスとする。
なお、(A mod B) は、AをBで割った余りを表すものとする。
【0006】
さて、第1の観点では、本発明は、兄弟ループの関係にある2以上の最内側ループをもつ多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクルと最内側ループの予測実行サイクルとに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数の繰り返しを実行する前半部分と、残りの繰り返し回数だけ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次に実行する兄弟ループの関係にある最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法を提供する。
上記第1の観点による多重ループ向けデータプリフェッチ方法は、先述の(手順3)で、((i+1) mod m)≠0 の場合に相当し、後半部分ループにおいても、主記憶からキャッシュメモリへのデータ(=次に実行する兄弟ループの関係にある最内側ループで使用するデータ)の移動と演算がオーバラップして行なわれることとなり、プリフェッチの本質的な作用により、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る。
【0007】
第2の観点では、本発明は、密多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクルと最内側ループの予測実行サイクルとに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数だけループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次の外側ループ繰り返しにおける最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法を提供する。
上記第2の観点による多重ループ向けデータプリフェッチ方法は、先述の(手順3)で、((i+1) mod m)=0 の場合に相当し、後半部分ループにおいても、主記憶からキャッシュメモリへのデータ(=次の外側ループ繰り返しにおける最内側ループで使用するデータ)の移動と演算がオーバラップして行なわれることとなり、プリフェッチの本質的な作用により、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、主記憶参照による待ち時間を十分に減少することが出来る。
【0008】
第3の観点では、本発明は、プリフェッチ命令を持つプロセッサにおいて、汎用レジスタとは別に、プリフェッチ命令のベース,オフセットなどのオペランドとして指定することが可能なプリフェッチ用拡張レジスタを備えたことを特徴とするプロセッサを提供する。
プリフェッチでは、プリフェッチのオフセットやプリフェッチ対象アドレスを生成するのにレジスタを使用する。このため、多数の汎用レジスタを使用するプログラムではレジスタ不足を生じ、メモリへのスピル処理により、性能が低下するおそれがある。そこで、上記第3の観点によるプロセッサでは、プリフェッチ用拡張レジスタを備えた。これにより、上記第1の観点または第2の観点による多重ループ向けデータプリフェッチ方法を実施する際にレジスタ不足が生じることを防止できる。
なお、上記プリフェッチ用拡張レジスタは、その参照に要するサイクル数がメモリ参照の場合と異なり常に一定であり、プリフェッチだけでなく、汎用レジスタ不足時の一時的なデータ保存のためにも使用できる。
【0009】
第4の観点では、本発明は、上記構成のプロセッサにおいて、オペランドで指定されたプリフェッチ用拡張レジスタの値をプリフェッチ対象アドレスの計算のためのベースあるいはオフセットとし、別オペランドで指定された汎用レジスタの値と組み合わせてプリフェッチ対象アドレスを計算するプリフェッチ命令を備えたことを特徴とするプロセッサを提供する。
上記第4の観点によるプロセッサでは、プリフェッチ対象アドレスを計算するのに使用するプリフェッチ用拡張レジスタと汎用レジスタをオペランドで指定できるプリフェッチ命令を備えたため、上記第1の観点または第2の観点による多重ループ向けデータプリフェッチ方法を効率よく実行できる。
【0010】
第5の観点では、本発明は、上記構成のプロセッサにおいて、プリフェッチ用拡張レジスタと、汎用レジスタあるいは主記憶との間でデータの転送を行なうデータ転送命令を備えたことを特徴とするプロセッサを提供する。
上記第5の観点によるプロセッサでは、プリフェッチ用拡張レジスタに値を設定したり、プリフェッチ用拡張レジスタの値を取り出したりすることを、上記データ転送命令により実行できる。このため、上記第1の観点または第2の観点による多重ループ向けデータプリフェッチ方法を効率よく実行できる。
【0011】
第6の観点では、本発明は、与えられた入力プログラムを解析し、請求項1または請求項2に記載の多重ループ向けデータプリフェッチ方法を適用し、プリフェッチ命令を挿入した出力プログラムを生成することを特徴とするプログラム生成方法を提供する。
上記第6の観点によるプログラム生成方法をコンピュータに実施させるコンパイラ・プログラムを記録した記録媒体をコンピュータに読み取らせて、入力プログラムに対して上記第1の観点または第2の観点による多重ループ向けデータプリフェッチ方法を適用することをコンピュータに実施させれば、実行効率の高い出力プログラムを得ることが出来る。
【0012】
【発明の実施の形態】
以下、図面を参照しながら、本発明の実施形態を説明する。なお、これにより本発明が限定されるものではない。
【0013】
図1は、本発明を実施するコンピュータシステムの一例である。
このコンピュータシステム100は、マイクロプロセッサ101と、そのマイクロプロセッサ101に内蔵されたキャッシュメモリ102と、主記憶103と、ディスク装置104とを具備してなる。磁気ディスク装置104には、記録媒体から読み込まれたコンパイラ・プログラムが格納されている。
マイクロプロセッサ101は、ディスク装置104に格納されたコンパイラ・プログラムを読み出し、与えられたソースプログラムに対してコンパイル処理を行い、コンパイル結果のオブジェクトプログラムを出力する。
【0014】
マイクロプロセッサ101は、通常のメモリ参照命令の実行を行なう場合には、まずキャッシュメモリ102に参照対象データがあるかどうかを調べ、キャッシュメモリ102に当該データが存在すればそのデータを参照し、キャッシュメモリ102に参照対象データが存在しなければ主記憶103上の当該データを参照すると共に当該データの属するキャッシュブロックをキャッシュメモリ102にコピーする。もし、主記憶103からキャッシュメモリ102へキャッシュブロックを移動するのに十分なサイクル数だけ前に参照対象データに対するプリフェッチ命令が発行されておれば、参照対象データが必ずキャッシュメモリ102に存在し、当該データを主記憶103から参照するための待ち時間が無くなり、プログラムの実行性能が向上する。
【0015】
図2は、従来のプリフェッチ方法(a)と本発明の多重ループ向けプリフェッチ方法(b)とを比較した説明図である。これについては、後で詳述する。
【0016】
図3は、兄弟ループの関係にある2つの最内側ループ301,302をもつ多重ループに対して、本発明の多重ループ向けプリフェッチ方法を適用した結果の説明図である。これについては、後で詳述する。
【0017】
図4は、密多重ループに対して、本発明の多重ループ向けプリフェッチ方法を適用した結果の説明図である。これについては、後で詳述する。
【0018】
図5は、コンパイラ・プログラムの要部である多重ループ向けプリフェッチ命令挿入処理部501の構成図である。なお、実線の矢印は制御の流れを表し、破線の矢印はデータの流れを表している。
この多重ループ向けプリフェッチ命令挿入処理部501は、本発明の多重ループ向けプリフェッチ方法を実施する要部であり、ソースプログラムから変換した中間語506を入力とし、多重ループ向けプリフェッチを行なうように変換した中間語511を出力とする。
多重ループ向けプリフェッチ命令挿入処理部501は、ループ構造認識部502と、プリフェッチインデックス生成部503と、インデックス集合分割部504と、プリフェッチ命令挿入部505とを具備してなる。
【0019】
図6は、前記ループ構造認識部502の処理動作を示すフローチャートである。
処理601では、処理を開始する。
処理602では、L1に最内側ループの外側ループ集合を求める。ループ集合を求める処理は、例えば「Aho他、Compilers − Principles, Techniques, and Tools, Addison−Wesley, 1986」に述べられているような既知の制御フロー解析技術を適用することにより実現できる。
処理603では、求めたループ集合L1が空集合か否かをチェックし、空集合であれば処理610へ制御を移し、処理を終了する。L1が空集合でなければ、処理604へ制御を移す。
処理604では、L1より要素を1つ取り出し、l1に格納する。また、l1の子ループ集合をL0に格納する。さらに、L1のプリフェッチ対象ループを求める集合Sを空集合に初期化する。
処理605では、l1の子ループ集合L0が空集合かどうか確かめ、空集合であれば処理609へ進み、空集合でなければ処理606へ制御を移す。
処理606では、子ループ集合L0より要素を1つ取り出し、そのループをl0とする。
処理607では、ループl0にプリフェッチを適用するか否かを判定する。この判定は、ユーザからのオプションやディレクティブによる指定や、前記T.C.Mowry 他による論文に示されている既知技術によって行えばよい。そして、プリフェッチを適用する場合は処理608へ制御を移し、適用しない場合は前記処理605に制御を移し、次の最内側ループを処理する。
処理608では、ループl0をプリフェッチ対象ループとして集合Sに追加し、前記処理605へ制御を移し、次の最内側ループの処理を行なう。
処理609では、ループ表のl1の欄にプリフェッチ対象ループの集合Sを登録し、前記処理603に制御を移し、次の多重ループを処理する。
【0020】
図7は、前記プリフェッチインデックス生成部503の処理動作を示すフローチャートである。
処理701では、処理を開始する。
処理702では、集合L1に最内側ループの外側ループ集合を求める。
処理703では、求めたループ集合L1が空集合か否かをチェックし、空集合であれば処理707へ制御を移し、処理を終了する。L1が空集合でなければ、処理704へ制御を移す。
処理704では、L1より要素を1つ取り出し、l1に格納する。また、ループ構造認識部502が求めたプリフェッチ対象ループ集合l1をl0に格納する。また、変数iを“1”に初期化する。さらに、変数Qをl0の要素数に初期化する。
処理705では、変数iがQ以上になったか否かを判定し、なった場合は前記処理703に制御を移し、次の多重ループの処理を行なう。変数iがQより小さい場合は処理706へ制御を移す。
処理706では、l0にL0のi番目のループを格納する。また、l0’にL0の((i mod Q)+1)番目のループを格納する。ここで、(i mod Q)は、iをQで割った余りを表す。また、l0’で参照するデータの初期アドレスの計算式をl0の前に生成する。さらに、iの値を“1”増加し、前記処理705に制御を移して、次の最内側ループの処理を行なう。
【0021】
図8は、前記インデックス集合分割部504の処理動作を示すフローチャートである。
処理801では、処理を開始する。
処理802では、集合L1に最内側ループの外側ループ集合を求める。
処理803では、求めたループ集合L1が空集合か否かをチェックし、空集合であれば処理807へ制御を移し、処理を終了する。L1が空集合でなければ、処理804へ制御を移す。
処理804では、L1より要素を1つ取り出し、l1に格納する。また、ループ構造認識部502が求めたプリフェッチ対象ループ集合l1をl0に格納する。また、変数iを“1”に初期化する。さらに、変数Qをl0の要素数に初期化する。
処理805では、変数iがQ以上になったか否かを判定し、なった場合は前記処理803に制御を移し、次の多重ループの処理を行なう。変数iがQより小さい場合は処理806へ制御を移す。
処理806では、l0にL0のi番目のループを格納する。また、αに主記憶103からキャッシュメモリ102へのプリフェッチに要するサイクル数をループl0の1回当たりの予測実行サイクル数で割った値、すなわち、分割すべき繰り返し回数を格納する。また、ループl0にインデックス集合分割を適用して、1〜(N−α)回の繰り返しを実行するループと(N−α+1)〜N回の繰り返しを実行するループとに分割する。このインデックス集合分割は、例えば「M.Wolfe、High Performance Compilers For Parallel Computing、Addison−Wesley, 1996」に述べられている既知のループ最適化技法を適用すればよい。さらに、iの値を“1”増加し、前記処理805に制御を移して、次の最内側ループの処理を行なう。
【0022】
図9は、前記プリフェッチ命令挿入部505の処理動作を示すフローチャートである。
処理901では、処理を開始する。
処理902では、集合L1に最内側ループの外側ループ集合を求める。
処理903では、求めたループ集合L1が空集合か否かをチェックし、空集合であれば処理907へ制御を移し、処理を終了する。L1が空集合でなければ、処理904へ制御を移す。
処理904では、L1より要素を1つ取り出し、l1に格納する。また、ループ構造認識部502が求めたプリフェッチ対象ループ集合l1をl0に格納する。また、変数iを“1”に初期化する。さらに、変数Qをl0の要素数に初期化する。
処理905では、変数iがQ以上になったか否かを判定し、なった場合は前記処理903に制御を移し、次の多重ループの処理を行なう。変数iがQより小さい場合は処理906へ制御を移す。
処理906では、l0にL0のi番目のループを格納する。また、l0’にL0の((i mod Q)+1)番目のループを格納する。また、l0.0にインデックス集合分割部504がl0をインデックス集合分割してできた前半部分ループを格納し、l0.1に後半部分ループを格納する。また、αに主記憶103からキャッシュメモリ102へのプリフェッチに要するサイクル数をループl0の1回当たりの予測実行サイクル数で割った値、すなわち、分割すべき繰り返し回数を格納する。また、ループl0のプリフェッチ対象メモリ参照X[]に対して、インデックス集合分割によって生成した前半部分ループl0.0には、X[+Step(i)*α]に対するプリフェッチ命令を挿入する。ここで、 Step (i)は、 LOOP iのループインデックスjの増分値である。また、l0’のプリフェッチ対象メモリ参照Y[]に対して、l0.1のループインデックスをとし、βをl0.1開始時のループインデックスの値とし、Dをループl0とループl0’のループ増分値の比とすると、後半部分ループl0.1にY[Start(Y)+(−β)D]に対するプリフェッチ命令を挿入する。ここで、メモリ参照Y[k]に対して、その初期参照インデックスを Start(Y) とする。さらに、iの値を“1”増加し、前記処理905に制御を移して、次の最内側ループの処理を行なう。
【0023】
プリフェッチ命令のアドレス計算式中のαやβなどはループ中で不変な値であり、ループ外へ移動することでループ中の演算数を削減することができる。ただし、これらの式をループ外へ移動すると、その値を保持するための汎用レジスタが別途必要となるため、汎用レジスタ使用数の多いプログラムでは汎用レジスタ不足を生じるおそれがある。そこで、マイクロプロセッサ101にプリフェッチ用拡張レジスタを設け、そのプリフェッチ用拡張レジスタに前記αやβの値を格納し、このプリフェッチ用拡張レジスタを使用するプリフェッチ命令を生成すれば、汎用レジスタの不足を生じさせずに済む。
図10に、プリフェッチ用拡張レジスタを使用するプリフェッチ命令の一例を示す。
GRnは、汎用レジスタを表している。また、PFRnは、プリフェッチ用拡張レジスタを表している。このプリフェッチ命令を使用し、ループ実行中に不変なオフセットについてはプリフェッチ用拡張レジスタPFRnを指定し、ループ実行時に可変なベース値については汎用レジスタGRnを指定するようにすれば、プログラム実行に必要な汎用レジスタ数を増すことなく、プリフェッチを行なうプログラムを生成することができる。
図11は、汎用レジスタGRnに格納された値をプリフェッチ用拡張レジスタPFRnへ設定する命令の一例である。
また、図12は、プリフェッチ用拡張レジスタPFRnより汎用レジスタGRnへ値をコピーする命令である。
【0024】
次に、本発明のプリフェッチ方法の適用例を説明する。
図3は、兄弟ループの関係にある2つの最内側ループ301,302をもつ多重ループに対して本発明のプリフェッチ方法を適用した例である。
図3の(a)はプリフェッチ命令挿入前のプログラムであり、図3の(b)はプリフェッチ命令挿入後のプログラムである。
次のステップ1〜ステップ5により、図3の(a)のプログラムから図3の(b)のプログラムが得られる。
ステップ1:
プリフェッチ対象の最内側ループとしてループ301とループ302を選択する。
ステップ2:
プリフェッチ対象の最内側ループ301と302に対して、インデックス集合分割を適用する。
ステップ3:
ループ301を分割して生成した前半部分ループに、ループ301に対するプリフェッチ命令を挿入する。同様に、ループ302を分割して生成した前半部分ループに、ループ302に対するプリフェッチ命令を挿入する。
ステップ4:
ループ301を分割して生成した後半部分ループに、ループ302に対するプリフェッチ命令を挿入する。同様に、ループ302を分割して生成した後半部分ループに、外側ループの次回の繰り返しでのループ301に対するプリフェッチ命令を挿入する。
ステップ5:
外側ループの直前に、外側ループの最初の繰り返しでループ301が最初のα回のループ繰り返しで参照するデータのプリフェッチを挿入する。
【0025】
ループ303は、最初の外側ループ繰り返しで元のループ301の1〜α回の演算で使用するデータのプリフェッチを行なうループであり、上記ステップ5で挿入される。
ループ304は、元のループ301の1〜(N−α)回の演算と同時に(α+1)〜N回の演算で使用するデータをプリフェッチするループであり、上記ステップ3で挿入される。
ループ305は、元のループ301の(N−α+1)〜N回の演算と同時に、元のループ302の最初の1〜α回の演算で使用するデータをプリフェッチするループであり、上記ステップ4で挿入される。
ループ306は、元のループ301のループ長がαより短い場合にループ302で使用するデータのプリフェッチとループ301の演算を同時に行なうループであり、上記ステップ4で挿入される(この場合、前半部分ループがなく、後半部分ループだけがある)。
ループ307は、元のループ302の最初の1〜(N−α)回の演算と同時に(α+1)〜N回の実行で使用するデータをプリフェッチするループであり、上記ステップ3で挿入される。
ループ308は、元のループ302の(N−α+1)〜N回の演算の実行と同時に外側ループの次回の繰り返しでのループ301の1〜α回の演算で使用するデータをプリフェッチするループであり、上記ステップ4で挿入される。
ループ309は、元のループ302のループ長がαより短い場合にループ301で使用するデータのプリフェッチとループ302の演算を同時に行なうループであり、上記ステップ4で挿入される(この場合、前半部分ループがなく、後半部分ループだけがある)。
【0026】
図4は、多重ループの特殊な形態である密多重ループに本発明のプリフェッチ方法を適用した例である。
図4の(a)はプリフェッチ命令挿入前のプログラムであり、図4の(b)はプリフェッチ命令挿入後のプログラムである。
密多重ループの場合、最内側には1つのループしかないため、最内側ループの実行と次外側ループ繰り返しの最内側ループで使用するデータのプリフェッチを同時に行なう。
ループ402は、最初の外側ループ繰り返しで元のループ401の最初の1〜α回の演算で使用するデータのプリフェッチを行なうループである。
ループ403は、元のループ401の1〜(N−α)回の演算と同時に(α+1)〜N回の演算で使用するデータをプリフェッチするループである。
ループ404は、元のループ401の(N−α+1)〜N回の演算と同時に次外側ループ繰り返しのループ401の最初の1〜α回の演算で使用するデータのプリフェッチを行なうループである。
ループ405は、ループ401のループ長がαより短い場合にループ401の演算と同時に次外側ループ繰り返しでループ401が使用するデータのプリフェッチを行なうループである。
【0027】
以上の結果、図2の(a)に示すように、従来のプリフェッチ方法では次外側ループ開始時にプリフェッチだけを行い演算を行わない空きサイクルを生じていたのに対して、図2の(b)に示すように、本発明の多重ループ向けデータプリフェッチ方法では、インデックス集合分割を適用してできた後半部分ループで次外側ループ繰り返しで参照するデータのプリフェッチを行なっているため、空きサイクルを生じない(開始時点を除く)。
【0028】
【発明の効果】
本発明の多重ループ向けデータプリフェッチ方法およびプログラム生成方法によれば、最内側ループ長が短かく、外側ループのループ長が長い多重ループに対しても、プリフェッチを有効に行うようにプログラムを変換できるため、主記憶参照による待ち時間を十分に減少することができ、これによりコンピュータプログラムの実行を高速化できる。
【図面の簡単な説明】
【図1】本発明の多重ループ向けデータプリフェッチ方法を実施するコンピュータシステムの構成図である。
【図2】従来のプリフェッチ方法と本発明の多重ループ向けデータプリフェッチ方法の比較説明図である。
【図3】兄弟ループの関係にある複数の最内側ループをもつ多重ループに対して本発明のプリフェッチ方法を適用した例の説明図である。
【図4】密多重ループに対して本発明のプリフェッチ方法を適用した例の説明図である。
【図5】コンパイラ・プログラムの要部である多重ループ向けプリフェッチ命令挿入処理部501の構成図である。
【図6】ループ構造認識部の処理動作を示すフローチャートである。
【図7】プリフェッチインデックス生成部の処理動作を示すフローチャートである。
【図8】インデックス集合分割部の処理動作を示すフローチャートである。
【図9】プリフェッチ命令挿入部の処理動作を示すフローチャートである。
【図10】プリフェッチ命令の説明図である。
【図11】プリフェッチ用拡張レジスタへのデータ転送命令の説明図である。
【図12】プリフェッチ用拡張レジスタからのデータ転送命令の説明図である。
【図13】従来のプリフェッチ方法の適用例の説明図である。
【符号の説明】
100 コンピュータシステム
101 マイクロプロセッサ
102 キャッシュメモリ
103 主記憶
104 ディスク装置
301,302 兄弟ループの関係にある最内側ループ
304,307 前半部分ループ
305,306,308,309 後半部分ループ
401 密多重ループ
403 前半部分ループ
404,405 後半部分ループ
501 多重ループ向けプリフェッチ命令挿入処理部
502 ループ構造認識部
503 プリフェッチインデックス生成部
504 インデックス集合分割部
505 プリフェッチ命令挿入部

Claims (3)

  1. 兄弟ループの関係にある2以上の最内側ループをもつ多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数と最内側ループの予測実行サイクル数とに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数のループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次に実行する兄弟ループの関係にある最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法。
  2. 密多重ループに対して、主記憶からキャッシュメモリへのプリフェッチに要するサイクル数と最内側ループの予測実行サイクル数とに基づいて分割すべき繰り返し回数を求め、当該最内側ループを、前記分割すべき繰り返し回数に基づく回数だけループ繰り返しを実行する前半部分と、残りの繰り返し回数だけループ繰り返しを実行する後半部分とに分割し、当該最内側ループ自身で使用するデータに対するプリフェッチ命令を前記前半部分に挿入し、次の外側ループ繰り返しにおける最内側ループで使用するデータに対するプリフェッチ命令を前記後半部分に挿入することを特徴とする多重ループ向けデータプリフェッチ方法。
  3. 与えられた入力プログラムを解析し、請求項1または請求項2に記載の多重ループ向けデータプリフェッチ方法を適用し、プリフェッチ命令を挿入した出力プログラムを生成することを特徴とするプログラム生成方法
JP10042997A 1997-04-17 1997-04-17 多重ループ向けデータプリフェッチ方法およびプログラム生成方法 Expired - Lifetime JP3546341B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP10042997A JP3546341B2 (ja) 1997-04-17 1997-04-17 多重ループ向けデータプリフェッチ方法およびプログラム生成方法
US09/060,377 US6148439A (en) 1997-04-17 1998-04-15 Nested loop data prefetching using inner loop splitting and next outer loop referencing

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP10042997A JP3546341B2 (ja) 1997-04-17 1997-04-17 多重ループ向けデータプリフェッチ方法およびプログラム生成方法

Publications (2)

Publication Number Publication Date
JPH10293692A JPH10293692A (ja) 1998-11-04
JP3546341B2 true JP3546341B2 (ja) 2004-07-28

Family

ID=14273721

Family Applications (1)

Application Number Title Priority Date Filing Date
JP10042997A Expired - Lifetime JP3546341B2 (ja) 1997-04-17 1997-04-17 多重ループ向けデータプリフェッチ方法およびプログラム生成方法

Country Status (2)

Country Link
US (1) US6148439A (ja)
JP (1) JP3546341B2 (ja)

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR19990049284A (ko) * 1997-12-12 1999-07-05 구본준 데이터 프로그램 장치
US6301706B1 (en) * 1997-12-31 2001-10-09 Elbrus International Limited Compiler method and apparatus for elimination of redundant speculative computations from innermost loops
US6321330B1 (en) * 1999-05-28 2001-11-20 Intel Corporation Each iteration array selective loop data prefetch in multiple data width prefetch system using rotating register and parameterization to avoid redundant prefetch
US6539543B1 (en) * 1999-11-29 2003-03-25 Adelante Technologies, Nv Method and apparatus for compiling source code by flattening hierarchies
JP3849379B2 (ja) * 1999-11-30 2006-11-22 株式会社デンソー エンジン制御装置およびエンジン制御方法
US6775765B1 (en) * 2000-02-07 2004-08-10 Freescale Semiconductor, Inc. Data processing system having instruction folding and method thereof
US7369665B1 (en) 2000-08-23 2008-05-06 Nintendo Co., Ltd. Method and apparatus for mixing sound signals
US6643744B1 (en) 2000-08-23 2003-11-04 Nintendo Co., Ltd. Method and apparatus for pre-fetching audio data
CA2453685A1 (en) * 2003-12-17 2005-06-17 Ibm Canada Limited - Ibm Canada Limitee Method and system for code modification based on cache structure
CA2453777A1 (en) * 2003-12-19 2005-06-19 Ibm Canada Limited-Ibm Canada Limitee Generalized index set splitting in software loops
US20060248520A1 (en) * 2004-02-12 2006-11-02 Teruo Kawabata Program conversion device and program conversion method
US7168070B2 (en) * 2004-05-25 2007-01-23 International Business Machines Corporation Aggregate bandwidth through management using insertion of reset instructions for cache-to-cache data transfer
US8209488B2 (en) * 2008-02-01 2012-06-26 International Business Machines Corporation Techniques for prediction-based indirect data prefetching
US8161264B2 (en) * 2008-02-01 2012-04-17 International Business Machines Corporation Techniques for data prefetching using indirect addressing with offset
US8239841B2 (en) 2008-04-04 2012-08-07 International Business Machines Corporation Prefetching irregular data references for software controlled caches
US8055849B2 (en) * 2008-04-04 2011-11-08 International Business Machines Corporation Reducing cache pollution of a software controlled cache
US8146064B2 (en) * 2008-04-04 2012-03-27 International Business Machines Corporation Dynamically controlling a prefetching range of a software controlled cache
JP5428476B2 (ja) * 2009-04-02 2014-02-26 富士通株式会社 プリフェッチ生成プログラムおよびコンパイラ装置
JP2014112327A (ja) * 2012-12-05 2014-06-19 Fujitsu Ltd 変換プログラム、変換装置及び変換方法
US9760356B2 (en) * 2014-09-23 2017-09-12 Intel Corporation Loop nest parallelization without loop linearization
US10180829B2 (en) * 2015-12-15 2019-01-15 Nxp Usa, Inc. System and method for modulo addressing vectorization with invariant code motion

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5357618A (en) * 1991-04-15 1994-10-18 International Business Machines Corporation Cache prefetch and bypass using stride registers
US5704053A (en) * 1995-05-18 1997-12-30 Hewlett-Packard Company Efficient explicit data prefetching analysis and code generation in a low-level optimizer for inserting prefetch instructions into loops of applications
US5752037A (en) * 1996-04-26 1998-05-12 Hewlett-Packard Company Method of prefetching data for references with multiple stride directions
US5854934A (en) * 1996-08-23 1998-12-29 Hewlett-Packard Company Optimizing compiler having data cache prefetch spreading

Also Published As

Publication number Publication date
US6148439A (en) 2000-11-14
JPH10293692A (ja) 1998-11-04

Similar Documents

Publication Publication Date Title
JP3546341B2 (ja) 多重ループ向けデータプリフェッチ方法およびプログラム生成方法
US6675374B2 (en) Insertion of prefetch instructions into computer program code
JP3218932B2 (ja) データプリフェッチコード生成方法
JP4844971B2 (ja) インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置
EP1459169B1 (en) Aggressive prefetch of dependency chains
US20040093591A1 (en) Method and apparatus prefetching indexed array references
JP4751510B2 (ja) メモリアクセス最適化方法
JPH01108638A (ja) 並列化コンパイル方式
JPWO2005078579A1 (ja) プログラム変換装置およびプログラム変換方法
US20100250854A1 (en) Method and system for data prefetching for loops based on linear induction expressions
US6993756B2 (en) Optimization apparatus that decreases delays in pipeline processing of loop and computer-readable storage medium storing optimization program
JP2003108386A (ja) 間接参照データプリフェッチ方法
Falk et al. Control flow driven splitting of loop nests at the source code level
JP6665720B2 (ja) 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法
US7313787B2 (en) Compiler and method for optimizing object codes for hierarchical memories
JPH10333916A (ja) ノンブロッキングキャッシュ対応のコードスケジューリング方式及びそのプログラムを記録した記憶媒体
JPH10320212A (ja) キャッシュ向け最適化方法
Hoogerbrugge et al. Pipelined Java virtual machine interpreters
JP2000207224A (ja) ソフトウェアプリフェッチ方法
US20020144097A1 (en) Computer program conversion and compilation
JP3918274B2 (ja) コンパイル装置、コンパイル方法およびコンパイラプログラムを記録した記録媒体
Khare et al. High-level synthesis with SDRAMs and RAMBUS DRAMs
JP2006330813A (ja) プリフェッチ起動命令挿入機能を備えたコンパイラ装置
JP3551352B2 (ja) ループ分割方法
JPH1196015A (ja) キャッシュ最適化による言語処理方法およびその言語処理を記録した記録媒体

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040116

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040330

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040331

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090423

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090423

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100423

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110423

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120423

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120423

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130423

Year of fee payment: 9

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140423

Year of fee payment: 10

EXPY Cancellation because of completion of term