JP2000207224A - ソフトウェアプリフェッチ方法 - Google Patents
ソフトウェアプリフェッチ方法Info
- Publication number
- JP2000207224A JP2000207224A JP11008234A JP823499A JP2000207224A JP 2000207224 A JP2000207224 A JP 2000207224A JP 11008234 A JP11008234 A JP 11008234A JP 823499 A JP823499 A JP 823499A JP 2000207224 A JP2000207224 A JP 2000207224A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- prefetch
- memory
- prefetch instruction
- iteration
- 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.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
(57)【要約】
【課題】 最内側ループ中にないデータの参照に対し
て、プリフェッチしたデータが使用される前にキャッシ
ュから追い出されるのを防止する。 【解決手段】 配列参照A(i)の直前にあるループ
(605〜607)を取り出し、ループ(605〜60
7)全体の予測実行サイクル数dがデータをプリフェッ
チするのに必要なサイクル数(メモリレイテンシ)kよ
り大きければ、ループ(605〜607)のループ1回
あたりの予測実行サイクル数eを求め、メモリレイテン
シに相当するループ回数β=[k/e]を計算する。そ
して、ループ(605〜607)を、1〜(M−β)回
の繰り返しを実行する前半ループ(624〜627)
と、(M−β+1)〜M回の繰り返しを実行する後半ル
ープ(628〜630)の2つのループに分割し、前半
ループ(624〜627)と後半ループ(628〜63
0)の間に、プリフェッチ命令(627)を挿入する。
て、プリフェッチしたデータが使用される前にキャッシ
ュから追い出されるのを防止する。 【解決手段】 配列参照A(i)の直前にあるループ
(605〜607)を取り出し、ループ(605〜60
7)全体の予測実行サイクル数dがデータをプリフェッ
チするのに必要なサイクル数(メモリレイテンシ)kよ
り大きければ、ループ(605〜607)のループ1回
あたりの予測実行サイクル数eを求め、メモリレイテン
シに相当するループ回数β=[k/e]を計算する。そ
して、ループ(605〜607)を、1〜(M−β)回
の繰り返しを実行する前半ループ(624〜627)
と、(M−β+1)〜M回の繰り返しを実行する後半ル
ープ(628〜630)の2つのループに分割し、前半
ループ(624〜627)と後半ループ(628〜63
0)の間に、プリフェッチ命令(627)を挿入する。
Description
【0001】
【発明の属する技術分野】本発明は、計算機利用技術に
おけるコンパイル方法に関し、特に、プリフェッチ命令
をコードに挿入することによりキャッシュミスの削減を
図るソフトウェアプリフェッチ方法に関する。
おけるコンパイル方法に関し、特に、プリフェッチ命令
をコードに挿入することによりキャッシュミスの削減を
図るソフトウェアプリフェッチ方法に関する。
【0002】
【従来の技術】近年、命令レベルの並列度や動作周波数
の向上によってマイクロプロセッサの性能は飛躍的に向
上している。これに対して、計算機の主記憶を構成する
DRAMの性能向上はプロセッサ性能の向上に比べて低
いレベルに留まっている。この結果、主記憶参照に要す
るサイクル数(メモリレイテンシ)は増加する傾向にあ
る。
の向上によってマイクロプロセッサの性能は飛躍的に向
上している。これに対して、計算機の主記憶を構成する
DRAMの性能向上はプロセッサ性能の向上に比べて低
いレベルに留まっている。この結果、主記憶参照に要す
るサイクル数(メモリレイテンシ)は増加する傾向にあ
る。
【0003】これに対して、従来のシステムでは、デー
タ参照の局所性に着目して、主記憶と比較して高速な少
容量のメモリ(キャッシュ)をプロセッサと主記憶の間
に配置し、最近参照したデータをキャッシュ上に置くこ
とによって、主記憶参照の回数を減らし、全体として主
記憶参照に要する時間を短縮するという方式をとってい
た。ところが、数値計算処理などの大規模なデータを使
用する計算では、データ参照の局所性が低いためキャッ
シュミスが多発し、主記憶参照によって生じる待ち時間
によってプログラムの性能が大幅に低下してしまうとい
う問題があった。
タ参照の局所性に着目して、主記憶と比較して高速な少
容量のメモリ(キャッシュ)をプロセッサと主記憶の間
に配置し、最近参照したデータをキャッシュ上に置くこ
とによって、主記憶参照の回数を減らし、全体として主
記憶参照に要する時間を短縮するという方式をとってい
た。ところが、数値計算処理などの大規模なデータを使
用する計算では、データ参照の局所性が低いためキャッ
シュミスが多発し、主記憶参照によって生じる待ち時間
によってプログラムの性能が大幅に低下してしまうとい
う問題があった。
【0004】このような大規模データに対するキャッシ
ュミスの増加に対処するため、例えば、文献「T.C.Mowr
y 他,"Design and Evaluation of a Compiler Algorith
ms for Prefetching", Proceedings of the 5th Intern
ational Conference on Architectural Support for Pr
ogramming Languages and Operating Systems, pp.62-7
3, 1992」に記載されているように、主記憶からキャッ
シュへデータを先行的に読み出す特別な命令(プリフェ
ッチ命令)をプロセッサの命令セットに用意し、コンパ
イラによってプログラム中にプリフェッチ命令を挿入す
る方式(ソフトウェアプリフェッチ)が検討されてい
る。このプリフェッチ命令を利用すれば、後続のループ
繰り返し等で使用するデータを予め主記憶からキャッシ
ュへ読み込みながら、同時に別の演算を行うことがで
き、これによって主記憶参照による待ち時間を隠蔽する
ことができる。
ュミスの増加に対処するため、例えば、文献「T.C.Mowr
y 他,"Design and Evaluation of a Compiler Algorith
ms for Prefetching", Proceedings of the 5th Intern
ational Conference on Architectural Support for Pr
ogramming Languages and Operating Systems, pp.62-7
3, 1992」に記載されているように、主記憶からキャッ
シュへデータを先行的に読み出す特別な命令(プリフェ
ッチ命令)をプロセッサの命令セットに用意し、コンパ
イラによってプログラム中にプリフェッチ命令を挿入す
る方式(ソフトウェアプリフェッチ)が検討されてい
る。このプリフェッチ命令を利用すれば、後続のループ
繰り返し等で使用するデータを予め主記憶からキャッシ
ュへ読み込みながら、同時に別の演算を行うことがで
き、これによって主記憶参照による待ち時間を隠蔽する
ことができる。
【0005】図11は、従来のソフトウェアプリフェッ
チ方法の例を示す図である。同図(a)は、コンパイル
処理の対象となるFORTRANで記述されたソースプ
ログラムを表す。
チ方法の例を示す図である。同図(a)は、コンパイル
処理の対象となるFORTRANで記述されたソースプ
ログラムを表す。
【0006】ここでは、同図(a)に示すプログラムに
おいて、配列要素A(i)の参照(504)について、
プリフェッチ命令を挿入する場合を考える。同図(a)
に示すように、i番めのループ繰り返しで配列要素A
(i)を参照するようなループ(503〜505)があ
った場合、まず、ループの1回の繰り返しにかかる実行
サイクル数cを見積もり、データをメモリからキャッシ
ュに移動するのに要するサイクル数(メモリレイテン
シ)Lをcで割った値α=[L/c](ここで、[]
は、小数点以下切り上げを表す記号)を計算する。そし
て、i回目の繰り返しで配列要素A(i+α)をプリフ
ェッチする命令を配列要素A(i)の直前に挿入する。
おいて、配列要素A(i)の参照(504)について、
プリフェッチ命令を挿入する場合を考える。同図(a)
に示すように、i番めのループ繰り返しで配列要素A
(i)を参照するようなループ(503〜505)があ
った場合、まず、ループの1回の繰り返しにかかる実行
サイクル数cを見積もり、データをメモリからキャッシ
ュに移動するのに要するサイクル数(メモリレイテン
シ)Lをcで割った値α=[L/c](ここで、[]
は、小数点以下切り上げを表す記号)を計算する。そし
て、i回目の繰り返しで配列要素A(i+α)をプリフ
ェッチする命令を配列要素A(i)の直前に挿入する。
【0007】同図(b)は、プリフェッチ命令(50
9)を挿入した後のプログラムをソースコードイメージ
で表したものである。このようにα回後の繰り返しで参
照するデータに対して予めプリフェッチ命令を発行して
おくことにより、L(=c*α)サイクル後にそのデー
タを参照するときは当該データが既にキャッシュに到着
しているので、キャッシュヒットとなる。これによりキ
ャッシュミスによるプログラム実行性能の低下が防止で
きる。
9)を挿入した後のプログラムをソースコードイメージ
で表したものである。このようにα回後の繰り返しで参
照するデータに対して予めプリフェッチ命令を発行して
おくことにより、L(=c*α)サイクル後にそのデー
タを参照するときは当該データが既にキャッシュに到着
しているので、キャッシュヒットとなる。これによりキ
ャッシュミスによるプログラム実行性能の低下が防止で
きる。
【0008】
【発明が解決しようとする課題】上記文献に示されてい
るソフトウェアプリフェッチ方法では、プリフェッチし
ようとする配列の参照が最内側ループ(すなわち、その
内側に他のループを含まないループ)にあるような単純
な場合のみを仮定している。
るソフトウェアプリフェッチ方法では、プリフェッチし
ようとする配列の参照が最内側ループ(すなわち、その
内側に他のループを含まないループ)にあるような単純
な場合のみを仮定している。
【0009】前述したソフトウェアプリフェッチ方法
を、プリフェッチの対象とする配列参照を有するループ
の内側にさらに別のループがある場合に適用すると、プ
リフェッチしたデータが、内側ループの実行によりキャ
ッシュから追い出されてしまう恐れがある。
を、プリフェッチの対象とする配列参照を有するループ
の内側にさらに別のループがある場合に適用すると、プ
リフェッチしたデータが、内側ループの実行によりキャ
ッシュから追い出されてしまう恐れがある。
【0010】図12は、このような場合のソフトウェア
プリフェッチ方法の例を示す図である。同図(a)は、
コンパイル処理の対象となるFORTRANで記述され
たソースプログラムを示す。同図(a)に示したプログ
ラムにおいて、配列参照A(i)(608)をプリフェ
ッチの対象とした場合、同図(b)のようにプリフェッ
チ命令(617)が挿入される。つまり、ループのi番
めの繰り返しで配列要素A(i+α)をプリフェッチし
ている。しかし、このプリフェッチ命令の発行の後、次
以降のiの繰り返しで、内側ループ(614〜616)
の実行がされるので、そこで参照されるデータB(j,
i)と、データA(i+α)との間でキャッシュライン
の競合が発生すると、プリフェッチによってキャッシュ
にロードされたデータA(i+α)がキャッシュから追
い出されてしまい、実際に値を使用するときはキャッシ
ュミスを起こすことになり、プリフェッチの効果がなく
なることになる。
プリフェッチ方法の例を示す図である。同図(a)は、
コンパイル処理の対象となるFORTRANで記述され
たソースプログラムを示す。同図(a)に示したプログ
ラムにおいて、配列参照A(i)(608)をプリフェ
ッチの対象とした場合、同図(b)のようにプリフェッ
チ命令(617)が挿入される。つまり、ループのi番
めの繰り返しで配列要素A(i+α)をプリフェッチし
ている。しかし、このプリフェッチ命令の発行の後、次
以降のiの繰り返しで、内側ループ(614〜616)
の実行がされるので、そこで参照されるデータB(j,
i)と、データA(i+α)との間でキャッシュライン
の競合が発生すると、プリフェッチによってキャッシュ
にロードされたデータA(i+α)がキャッシュから追
い出されてしまい、実際に値を使用するときはキャッシ
ュミスを起こすことになり、プリフェッチの効果がなく
なることになる。
【0011】本発明の目的は、最内側ループ中にないデ
ータの参照に対して、プリフェッチの効果を得ることが
できるソフトウェアプリフェッチ方法を提供することに
ある。
ータの参照に対して、プリフェッチの効果を得ることが
できるソフトウェアプリフェッチ方法を提供することに
ある。
【0012】
【課題を解決するための手段】本発明に係るソフトウェ
アプリフェッチ方法は、プリフェッチ命令を持つプロセ
ッサに対するオブジェクトコードを生成するコンパイラ
におけるソフトウェアプリフェッチ方法である。そし
て、プリフェッチの対象とするメモリ参照を含む第1の
ループがその内側に第2のループを有する場合に、当該
第2のループのループ繰り返し1回あたりの実行サイク
ル数と、データをプリフェッチするのに要するサイクル
数であるメモリレイテンシとに基づいて、当該メモリレ
イテンシに相当する第2のループの繰り返し回数βを求
め、前記第2のループを、終わりのβ回を実行する後半
ループと、その前までの繰り返しを実行する前半ループ
とに分割し、前半ループと後半ループの間にプリフェッ
チ命令を挿入することを特徴とする。
アプリフェッチ方法は、プリフェッチ命令を持つプロセ
ッサに対するオブジェクトコードを生成するコンパイラ
におけるソフトウェアプリフェッチ方法である。そし
て、プリフェッチの対象とするメモリ参照を含む第1の
ループがその内側に第2のループを有する場合に、当該
第2のループのループ繰り返し1回あたりの実行サイク
ル数と、データをプリフェッチするのに要するサイクル
数であるメモリレイテンシとに基づいて、当該メモリレ
イテンシに相当する第2のループの繰り返し回数βを求
め、前記第2のループを、終わりのβ回を実行する後半
ループと、その前までの繰り返しを実行する前半ループ
とに分割し、前半ループと後半ループの間にプリフェッ
チ命令を挿入することを特徴とする。
【0013】この場合、プリフェッチ命令とメモリ参照
との間に実行される第2のループは、β回しか回らず、
βは一般に分割前の元のループ繰り返し回数に比べて小
さいので、その間に参照されるデータは一般に小さく、
プリフェッチしたデータがキャッシュから追い出される
可能性は少なくなる。また、ループのβ回の実行サイク
ル数は、メモリレイテンシ、すなわち、データをメモリ
からプリフェッチをするのに要するサイクル数に相当す
るので、データを参照するときにプリフェッチデータの
到着が間に合っていないということがない。
との間に実行される第2のループは、β回しか回らず、
βは一般に分割前の元のループ繰り返し回数に比べて小
さいので、その間に参照されるデータは一般に小さく、
プリフェッチしたデータがキャッシュから追い出される
可能性は少なくなる。また、ループのβ回の実行サイク
ル数は、メモリレイテンシ、すなわち、データをメモリ
からプリフェッチをするのに要するサイクル数に相当す
るので、データを参照するときにプリフェッチデータの
到着が間に合っていないということがない。
【0014】なお、第2のループが多重ループになって
いる場合には、第2のループを分割してできた後半ルー
プの内側ループをさらに分割することにより、より適当
な位置にプリフェッチ命令を挿入するようにしてもよ
い。
いる場合には、第2のループを分割してできた後半ルー
プの内側ループをさらに分割することにより、より適当
な位置にプリフェッチ命令を挿入するようにしてもよ
い。
【0015】また、本発明に係る第2のソフトウェアプ
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を含む第1のループがその内側に第2のループを有す
る場合に、当該第2のループのループ繰り返し1回あた
りの実行サイクル数と、データをプリフェッチするのに
要するサイクル数であるメモリレイテンシとに基づい
て、当該メモリレイテンシに相当する第2のループの繰
り返し回数βを求め、前記第2のループの最後からβ回
目の繰り返しのときにプリフェッチ命令を実行する、条
件付きのプリフェッチ命令実行コードを挿入することを
特徴とする。
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を含む第1のループがその内側に第2のループを有す
る場合に、当該第2のループのループ繰り返し1回あた
りの実行サイクル数と、データをプリフェッチするのに
要するサイクル数であるメモリレイテンシとに基づい
て、当該メモリレイテンシに相当する第2のループの繰
り返し回数βを求め、前記第2のループの最後からβ回
目の繰り返しのときにプリフェッチ命令を実行する、条
件付きのプリフェッチ命令実行コードを挿入することを
特徴とする。
【0016】また、本発明に係る第3のソフトウェアプ
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を含むプログラム手続き内にループがある場合に、当
該ループのループ繰り返し1回あたりの実行サイクル数
と、データをプリフェッチするのに要するサイクル数で
あるメモリレイテンシとに基づいて、当該メモリレイテ
ンシに相当する前記ループの繰り返し回数βを求め、前
記ループを、終わりのβ回を実行する後半ループと、そ
の前までの繰り返しを実行する前半ループとに分割し、
前半ループと後半ループの間にプリフェッチ命令を挿入
することを特徴とする。
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を含むプログラム手続き内にループがある場合に、当
該ループのループ繰り返し1回あたりの実行サイクル数
と、データをプリフェッチするのに要するサイクル数で
あるメモリレイテンシとに基づいて、当該メモリレイテ
ンシに相当する前記ループの繰り返し回数βを求め、前
記ループを、終わりのβ回を実行する後半ループと、そ
の前までの繰り返しを実行する前半ループとに分割し、
前半ループと後半ループの間にプリフェッチ命令を挿入
することを特徴とする。
【0017】また、本発明に係る第4のソフトウェアプ
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を有するプログラム手続き内にループが含まれる場合
に、当該ループのループ繰り返し1回あたりの実行サイ
クル数と、データをプリフェッチするのに要するサイク
ル数であるメモリレイテンシとに基づいて、当該メモリ
レイテンシに相当する前記ループの繰り返し回数βを求
め、前記ループの最後からβ回目の繰り返しのときにプ
リフェッチ命令を実行する、条件付きのプリフェッチ命
令実行コードを挿入することを特徴とする。
リフェッチ方法は、プリフェッチの対象とするメモリ参
照を有するプログラム手続き内にループが含まれる場合
に、当該ループのループ繰り返し1回あたりの実行サイ
クル数と、データをプリフェッチするのに要するサイク
ル数であるメモリレイテンシとに基づいて、当該メモリ
レイテンシに相当する前記ループの繰り返し回数βを求
め、前記ループの最後からβ回目の繰り返しのときにプ
リフェッチ命令を実行する、条件付きのプリフェッチ命
令実行コードを挿入することを特徴とする。
【0018】本発明に係るコンパイル装置は、プリフェ
ッチ命令を持つプロセッサに対するオブジェクトコード
を生成する装置である。そして、プリフェッチの対象と
するメモリ参照を含む第1のループがその内側に第2の
ループを有する場合に、当該第2のループのループ繰り
返し1回あたりの実行サイクル数と、データをプリフェ
ッチするのに要するサイクル数であるメモリレイテンシ
とに基づいて、当該メモリレイテンシに相当する第2の
ループの繰り返し回数βを求める手段と、前記第2のル
ープを、終わりのβ回を実行する後半ループと、その前
までの繰り返しを実行する前半ループとに分割する手段
と、前半ループと後半ループの間にプリフェッチ命令を
挿入する手段とを備えることを特徴とする。
ッチ命令を持つプロセッサに対するオブジェクトコード
を生成する装置である。そして、プリフェッチの対象と
するメモリ参照を含む第1のループがその内側に第2の
ループを有する場合に、当該第2のループのループ繰り
返し1回あたりの実行サイクル数と、データをプリフェ
ッチするのに要するサイクル数であるメモリレイテンシ
とに基づいて、当該メモリレイテンシに相当する第2の
ループの繰り返し回数βを求める手段と、前記第2のル
ープを、終わりのβ回を実行する後半ループと、その前
までの繰り返しを実行する前半ループとに分割する手段
と、前半ループと後半ループの間にプリフェッチ命令を
挿入する手段とを備えることを特徴とする。
【0019】また、本発明に係る第2のコンパイル装置
は、プリフェッチの対象とするメモリ参照を含む第1の
ループがその内側に第2のループを有する場合に、当該
第2のループのループ繰り返し1回あたりの実行サイク
ル数と、データをプリフェッチするのに要するサイクル
数であるメモリレイテンシとに基づいて、当該メモリレ
イテンシに相当する第2のループの繰り返し回数βを求
める手段と、前記第2のループの最後からβ回目の繰り
返しのときにプリフェッチ命令を実行する、条件付きの
プリフェッチ命令実行コードを挿入する手段とを備える
ことを特徴とする。
は、プリフェッチの対象とするメモリ参照を含む第1の
ループがその内側に第2のループを有する場合に、当該
第2のループのループ繰り返し1回あたりの実行サイク
ル数と、データをプリフェッチするのに要するサイクル
数であるメモリレイテンシとに基づいて、当該メモリレ
イテンシに相当する第2のループの繰り返し回数βを求
める手段と、前記第2のループの最後からβ回目の繰り
返しのときにプリフェッチ命令を実行する、条件付きの
プリフェッチ命令実行コードを挿入する手段とを備える
ことを特徴とする。
【0020】また、本発明に係る第3のコンパイル装置
は、プリフェッチの対象とするメモリ参照を含むプログ
ラム手続き内にループがある場合に、当該ループのルー
プ繰り返し1回あたりの実行サイクル数と、データをプ
リフェッチするのに要するサイクル数であるメモリレイ
テンシとに基づいて、当該メモリレイテンシに相当する
前記ループの繰り返し回数βを求める手段と、前記ルー
プを、終わりのβ回を実行する後半ループと、その前ま
での繰り返しを実行する前半ループとに分割する手段
と、前半ループと後半ループの間にプリフェッチ命令を
挿入する手段とを備えることを特徴とする。
は、プリフェッチの対象とするメモリ参照を含むプログ
ラム手続き内にループがある場合に、当該ループのルー
プ繰り返し1回あたりの実行サイクル数と、データをプ
リフェッチするのに要するサイクル数であるメモリレイ
テンシとに基づいて、当該メモリレイテンシに相当する
前記ループの繰り返し回数βを求める手段と、前記ルー
プを、終わりのβ回を実行する後半ループと、その前ま
での繰り返しを実行する前半ループとに分割する手段
と、前半ループと後半ループの間にプリフェッチ命令を
挿入する手段とを備えることを特徴とする。
【0021】また、本発明に係る第4のコンパイル装置
は、プリフェッチの対象とするメモリ参照を有するプロ
グラム手続き内にループが含まれる場合に、当該ループ
のループ繰り返し1回あたりの実行サイクル数と、デー
タをプリフェッチするのに要するサイクル数であるメモ
リレイテンシとに基づいて、当該メモリレイテンシに相
当する前記ループの繰り返し回数βを求める手段と、前
記ループの最後からβ回目の繰り返しのときにプリフェ
ッチ命令を実行する、条件付きのプリフェッチ命令実行
コードを挿入する手段とを備えることを特徴とする。
は、プリフェッチの対象とするメモリ参照を有するプロ
グラム手続き内にループが含まれる場合に、当該ループ
のループ繰り返し1回あたりの実行サイクル数と、デー
タをプリフェッチするのに要するサイクル数であるメモ
リレイテンシとに基づいて、当該メモリレイテンシに相
当する前記ループの繰り返し回数βを求める手段と、前
記ループの最後からβ回目の繰り返しのときにプリフェ
ッチ命令を実行する、条件付きのプリフェッチ命令実行
コードを挿入する手段とを備えることを特徴とする。
【0022】本発明に係る第5のコンパイル装置は、ソ
ースコードが、第1のループを有し、更に、当該第1の
ループの内側に、プリフェッチの対象とされるメモリ参
照及び第2のループを有する場合、前記第2のループに
対応する前半ループ及び後半ループと、前半ループと後
半ループの間にプリフェッチ命令とを有し、前記後半ル
ープの繰り返し回数は、データをプリフェッチするのに
要するサイクル数に相当する回数であるオブジェクトコ
ードを生成することを特徴とする。
ースコードが、第1のループを有し、更に、当該第1の
ループの内側に、プリフェッチの対象とされるメモリ参
照及び第2のループを有する場合、前記第2のループに
対応する前半ループ及び後半ループと、前半ループと後
半ループの間にプリフェッチ命令とを有し、前記後半ル
ープの繰り返し回数は、データをプリフェッチするのに
要するサイクル数に相当する回数であるオブジェクトコ
ードを生成することを特徴とする。
【0023】また、本発明に係る第6のコンパイル装置
は、ソースコードが、第1のループを有し、更に、当該
第1のループの内側に、プリフェッチの対象とされるメ
モリ参照及び第2のループを有する場合、前記第2のル
ープの最後からβ回の繰り返しのときにプリフェッチ命
令を実行するコードを有し、前記βは、データをプリフ
ェッチするのに要するサイクル数に相当する第2のルー
プの繰り返し回数であるオブジェクトコードを生成する
ことを特徴とする。
は、ソースコードが、第1のループを有し、更に、当該
第1のループの内側に、プリフェッチの対象とされるメ
モリ参照及び第2のループを有する場合、前記第2のル
ープの最後からβ回の繰り返しのときにプリフェッチ命
令を実行するコードを有し、前記βは、データをプリフ
ェッチするのに要するサイクル数に相当する第2のルー
プの繰り返し回数であるオブジェクトコードを生成する
ことを特徴とする。
【0024】また、本発明に係る第7のコンパイル装置
は、ソースコードが、プログラム手続きを有し、更に、
当該プログラム手続き内に、プリフェッチの対象とする
メモリ参照及びループを有する場合、前記ループに対応
する前半ループ及び後半ループと、前半ループと後半ル
ープの間にプリフェッチ命令とを有し、前記後半ループ
の繰り返し回数は、データをプリフェッチするのに要す
るサイクル数に相当する回数であるオブジェクトコード
を生成することを特徴とする。
は、ソースコードが、プログラム手続きを有し、更に、
当該プログラム手続き内に、プリフェッチの対象とする
メモリ参照及びループを有する場合、前記ループに対応
する前半ループ及び後半ループと、前半ループと後半ル
ープの間にプリフェッチ命令とを有し、前記後半ループ
の繰り返し回数は、データをプリフェッチするのに要す
るサイクル数に相当する回数であるオブジェクトコード
を生成することを特徴とする。
【0025】また、本発明に係る第8のコンパイル装置
は、ソースコードが、プログラム手続きを有し、更に、
当該プログラム手続き内に、プリフェッチの対象とする
メモリ参照及びループを有する場合、前記ループの最後
からβ回目の繰り返しのときに、プリフェッチ命令を実
行するコードを有し、前記βは、データをプリフェッチ
するのに要するサイクル数に相当する前記ループの繰り
返し回数であるオブジェクトコードを生成することを特
徴とする。
は、ソースコードが、プログラム手続きを有し、更に、
当該プログラム手続き内に、プリフェッチの対象とする
メモリ参照及びループを有する場合、前記ループの最後
からβ回目の繰り返しのときに、プリフェッチ命令を実
行するコードを有し、前記βは、データをプリフェッチ
するのに要するサイクル数に相当する前記ループの繰り
返し回数であるオブジェクトコードを生成することを特
徴とする。
【0026】本発明に係る第1の記録媒体は、プリフェ
ッチ命令を持つプロセッサに対するオブジェクトコード
を生成するコンパイラを記録した記録媒体である。そし
て、当該コンパイラは、プリフェッチの対象とするメモ
リ参照を含む第1のループがその内側に第2のループを
有する場合に、当該第2のループのループ繰り返し1回
あたりの実行サイクル数と、データをプリフェッチする
のに要するサイクル数であるメモリレイテンシとに基づ
いて、当該メモリレイテンシに相当する第2のループの
繰り返し回数βを求めるステップと、前記第2のループ
を、終わりのβ回を実行する後半ループと、その前まで
の繰り返しを実行する前半ループとに分割するステップ
と、前半ループと後半ループの間にプリフェッチ命令を
挿入するステップとを備えることを特徴とする。
ッチ命令を持つプロセッサに対するオブジェクトコード
を生成するコンパイラを記録した記録媒体である。そし
て、当該コンパイラは、プリフェッチの対象とするメモ
リ参照を含む第1のループがその内側に第2のループを
有する場合に、当該第2のループのループ繰り返し1回
あたりの実行サイクル数と、データをプリフェッチする
のに要するサイクル数であるメモリレイテンシとに基づ
いて、当該メモリレイテンシに相当する第2のループの
繰り返し回数βを求めるステップと、前記第2のループ
を、終わりのβ回を実行する後半ループと、その前まで
の繰り返しを実行する前半ループとに分割するステップ
と、前半ループと後半ループの間にプリフェッチ命令を
挿入するステップとを備えることを特徴とする。
【0027】また、本発明に係る第2の記録媒体は、第
2のコンパイラを記録した記録媒体である。この第2の
コンパイラは、プリフェッチの対象とするメモリ参照を
含む第1のループがその内側に第2のループを有する場
合に、当該第2のループのループ繰り返し1回あたりの
実行サイクル数と、データをプリフェッチするのに要す
るサイクル数であるメモリレイテンシとに基づいて、当
該メモリレイテンシに相当する第2のループの繰り返し
回数βを求めるステップと、前記第2のループの最後か
らβ回目の繰り返しのときにプリフェッチ命令を実行す
る、条件付きのプリフェッチ命令実行コードを挿入する
ステップとを備えることを特徴とする。
2のコンパイラを記録した記録媒体である。この第2の
コンパイラは、プリフェッチの対象とするメモリ参照を
含む第1のループがその内側に第2のループを有する場
合に、当該第2のループのループ繰り返し1回あたりの
実行サイクル数と、データをプリフェッチするのに要す
るサイクル数であるメモリレイテンシとに基づいて、当
該メモリレイテンシに相当する第2のループの繰り返し
回数βを求めるステップと、前記第2のループの最後か
らβ回目の繰り返しのときにプリフェッチ命令を実行す
る、条件付きのプリフェッチ命令実行コードを挿入する
ステップとを備えることを特徴とする。
【0028】また、本発明に係る第3の記録媒体は、第
3のコンパイラを記録した記録媒体である。この第3の
コンパイラは、プリフェッチの対象とするメモリ参照を
含むプログラム手続き内にループがある場合に、当該ル
ープのループ繰り返し1回あたりの実行サイクル数と、
データをプリフェッチするのに要するサイクル数である
メモリレイテンシとに基づいて、当該メモリレイテンシ
に相当する前記ループの繰り返し回数βを求めるステッ
プと、前記ループを、終わりのβ回を実行する後半ルー
プと、その前までの繰り返しを実行する前半ループとに
分割するステップと、前半ループと後半ループの間にプ
リフェッチ命令を挿入するステップとを備えることを特
徴とする。
3のコンパイラを記録した記録媒体である。この第3の
コンパイラは、プリフェッチの対象とするメモリ参照を
含むプログラム手続き内にループがある場合に、当該ル
ープのループ繰り返し1回あたりの実行サイクル数と、
データをプリフェッチするのに要するサイクル数である
メモリレイテンシとに基づいて、当該メモリレイテンシ
に相当する前記ループの繰り返し回数βを求めるステッ
プと、前記ループを、終わりのβ回を実行する後半ルー
プと、その前までの繰り返しを実行する前半ループとに
分割するステップと、前半ループと後半ループの間にプ
リフェッチ命令を挿入するステップとを備えることを特
徴とする。
【0029】また、本発明に係る第4の記録媒体は、第
4のコンパイラを記録した記録媒体である。この第4の
コンパイラは、プリフェッチの対象とするメモリ参照を
有するプログラム手続き内にループが含まれる場合に、
当該ループのループ繰り返し1回あたりの実行サイクル
数と、データをプリフェッチするのに要するサイクル数
であるメモリレイテンシとに基づいて、当該メモリレイ
テンシに相当する前記ループの繰り返し回数βを求める
ステップと、前記ループの最後からβ回目の繰り返しの
ときにプリフェッチ命令を実行する、条件付きのプリフ
ェッチ命令実行コードを挿入するステップとを備えるこ
とを特徴とする。
4のコンパイラを記録した記録媒体である。この第4の
コンパイラは、プリフェッチの対象とするメモリ参照を
有するプログラム手続き内にループが含まれる場合に、
当該ループのループ繰り返し1回あたりの実行サイクル
数と、データをプリフェッチするのに要するサイクル数
であるメモリレイテンシとに基づいて、当該メモリレイ
テンシに相当する前記ループの繰り返し回数βを求める
ステップと、前記ループの最後からβ回目の繰り返しの
ときにプリフェッチ命令を実行する、条件付きのプリフ
ェッチ命令実行コードを挿入するステップとを備えるこ
とを特徴とする。
【0030】本発明に係る第5及び第6の記録媒体は、
オブジェクトコードを記録した記録媒体である。そし
て、第5の記録媒体において、前記オブジェクトコード
は、1つのループ処理に相当する前半ループ及び後半ル
ープと、後半ループのうしろにメモリ参照をする命令
と、前半ループと後半ループの間に、前記メモリ参照に
ついてのプリフェッチ命令とを有し、前記後半ループの
繰り返し回数は、前記オブジェクトコードを実行可能な
コンピュータにおいて、データをプリフェッチするのに
要するサイクル数に相当する回数であることを特徴とす
る。
オブジェクトコードを記録した記録媒体である。そし
て、第5の記録媒体において、前記オブジェクトコード
は、1つのループ処理に相当する前半ループ及び後半ル
ープと、後半ループのうしろにメモリ参照をする命令
と、前半ループと後半ループの間に、前記メモリ参照に
ついてのプリフェッチ命令とを有し、前記後半ループの
繰り返し回数は、前記オブジェクトコードを実行可能な
コンピュータにおいて、データをプリフェッチするのに
要するサイクル数に相当する回数であることを特徴とす
る。
【0031】また、第6の記録媒体において、前記オブ
ジェクトコードは、ループと、当該ループのうしろに、
メモリ参照をする命令と、前記ループの最後からβ回目
の繰り返しのときに、前記メモリ参照についてのプリフ
ェッチ命令を実行するコードとを有し、前記βは、前記
オブジェクトコードを実行可能なコンピュータにおい
て、データをプリフェッチするのに要するサイクル数に
相当する前記ループの繰り返し回数であることを特徴と
する。
ジェクトコードは、ループと、当該ループのうしろに、
メモリ参照をする命令と、前記ループの最後からβ回目
の繰り返しのときに、前記メモリ参照についてのプリフ
ェッチ命令を実行するコードとを有し、前記βは、前記
オブジェクトコードを実行可能なコンピュータにおい
て、データをプリフェッチするのに要するサイクル数に
相当する前記ループの繰り返し回数であることを特徴と
する。
【0032】なお、前記記録媒体は、コンピュータが読
みとり可能な任意の記録媒体であり、例えば、半導体メ
モリ、フロッピーディスク、CD−ROM、磁気ディス
ク、光磁気ディスク等が該当する。
みとり可能な任意の記録媒体であり、例えば、半導体メ
モリ、フロッピーディスク、CD−ROM、磁気ディス
ク、光磁気ディスク等が該当する。
【0033】
【発明の実施の形態】以下、本発明の実施の形態につい
て図面を参照して詳細に説明する。
て図面を参照して詳細に説明する。
【0034】図1は、本発明によるコンパイラが稼動す
る計算機システムの構成を示す図である。同図に示すよ
うに、本計算機システムは、CPU101、ディスプレ
イ装置102、キーボード103、主記憶装置104、
及び外部記憶装置105を備える。
る計算機システムの構成を示す図である。同図に示すよ
うに、本計算機システムは、CPU101、ディスプレ
イ装置102、キーボード103、主記憶装置104、
及び外部記憶装置105を備える。
【0035】CPU101は、主記憶装置104にロー
ドされたコンパイラ108を実行することにより、コン
パイル処理を行う。
ドされたコンパイラ108を実行することにより、コン
パイル処理を行う。
【0036】ディスプレイ装置102は、例えば、CR
T表示装置や液晶表示装置等で構成され、コンパイルの
終了やエラー等をユーザに知らせる各種メッセージ等を
表示する。
T表示装置や液晶表示装置等で構成され、コンパイルの
終了やエラー等をユーザに知らせる各種メッセージ等を
表示する。
【0037】キーボード103は、ユーザが、ソースプ
ログラム106のコーディングを行ったり、コンパイラ
108を起動するコマンドを入力する際等に使われる入
力装置である。
ログラム106のコーディングを行ったり、コンパイラ
108を起動するコマンドを入力する際等に使われる入
力装置である。
【0038】主記憶装置104は、例えば、DRAM等
の半導体メモリで構成され、コンパイラ108や、コン
パイル処理過程で必要となる中間コード109およびル
ープ表110等を格納する。
の半導体メモリで構成され、コンパイラ108や、コン
パイル処理過程で必要となる中間コード109およびル
ープ表110等を格納する。
【0039】外部記憶装置105は、例えば、磁気ディ
スク等で構成され、ソースプログラム106、オブジェ
クトプログラム107等を格納する。
スク等で構成され、ソースプログラム106、オブジェ
クトプログラム107等を格納する。
【0040】図1に示したような計算機システムにおい
て、ユーザがキーボード103等を使ってコンパイル処
理の実行を指示すると、コンパイラ108は、ソースプ
ログラム106を読み込んで、コンパイル処理を行い、
対応するオブジェクトプログラム107を生成する。
て、ユーザがキーボード103等を使ってコンパイル処
理の実行を指示すると、コンパイラ108は、ソースプ
ログラム106を読み込んで、コンパイル処理を行い、
対応するオブジェクトプログラム107を生成する。
【0041】図2は、コンパイラ108のコンパイル処
理の流れを示すフローチャートである。コンパイラ10
8は、まず、構文解析処理を行う(S201)。ここで
は、ソースプログラム106を読み込み、字句解析、構
文解析、意味解析等を行って、コンパイラ内部で処理可
能な中間コード109を作成する。構文解析処理の詳細
については、例えば、「エイホ、セシィ、ウルマン著:
コンパイラI(サイエンス社、1990年)」の30頁
〜74頁に記載されている。
理の流れを示すフローチャートである。コンパイラ10
8は、まず、構文解析処理を行う(S201)。ここで
は、ソースプログラム106を読み込み、字句解析、構
文解析、意味解析等を行って、コンパイラ内部で処理可
能な中間コード109を作成する。構文解析処理の詳細
については、例えば、「エイホ、セシィ、ウルマン著:
コンパイラI(サイエンス社、1990年)」の30頁
〜74頁に記載されている。
【0042】次に、コンパイラ108はループ解析処理
を行う(S202)。ここでは、プログラムに含まれる
ループの集合や各ループの間の関係等が求められ、ルー
プ表110に記録される。ループ表110に記録された
情報は、後のコンパイル処理において適宜参照される。
ループ解析処理の詳細については、例えば、「エイホ、
セシィ、ウルマン著:コンパイラII(サイエンス社、1
990年)」の734頁〜737頁に記載されている。
を行う(S202)。ここでは、プログラムに含まれる
ループの集合や各ループの間の関係等が求められ、ルー
プ表110に記録される。ループ表110に記録された
情報は、後のコンパイル処理において適宜参照される。
ループ解析処理の詳細については、例えば、「エイホ、
セシィ、ウルマン著:コンパイラII(サイエンス社、1
990年)」の734頁〜737頁に記載されている。
【0043】次に、コンパイラ108は、各ループに対
して、ソフトウェアプリフェッチ処理を行う(S203
〜S205)。そのため、まず、未処理のループがある
か否かを調べ(S203)、未処理のループがあれば
(S203:yes)、未処理のループを1つ取り出し
て、処理対象ループnとする(S204)。そして、処
理対象ループn中の配列参照に対してソフトウェアプリ
フェッチ処理を行う(S205)。このソフトウェアプ
リフェッチ処理の詳細については後述する。ソフトウェ
アプリフェッチ処理が終了すると、他の未処理ループに
ついての処理に進む(S203)。
して、ソフトウェアプリフェッチ処理を行う(S203
〜S205)。そのため、まず、未処理のループがある
か否かを調べ(S203)、未処理のループがあれば
(S203:yes)、未処理のループを1つ取り出し
て、処理対象ループnとする(S204)。そして、処
理対象ループn中の配列参照に対してソフトウェアプリ
フェッチ処理を行う(S205)。このソフトウェアプ
リフェッチ処理の詳細については後述する。ソフトウェ
アプリフェッチ処理が終了すると、他の未処理ループに
ついての処理に進む(S203)。
【0044】そして、すべてのループについて処理を終
了すると(S203:no)、オブジェクトコードを生
成し(S206)、コンパイル処理を終了する。オブジ
ェクトコード生成処理の詳細については、例えば、前記
「コンパイラII」の624頁〜707頁に記載されてい
る。
了すると(S203:no)、オブジェクトコードを生
成し(S206)、コンパイル処理を終了する。オブジ
ェクトコード生成処理の詳細については、例えば、前記
「コンパイラII」の624頁〜707頁に記載されてい
る。
【0045】図3は、前述したステップS205におけ
るソフトウェアプリフェッチ処理の流れを示す図であ
る。ここでは、処理対象ループnの中の配列参照に対し
て、適切な位置にプリフェッチ命令を挿入する処理を行
う。
るソフトウェアプリフェッチ処理の流れを示す図であ
る。ここでは、処理対象ループnの中の配列参照に対し
て、適切な位置にプリフェッチ命令を挿入する処理を行
う。
【0046】まず、処理対象ループn中に未処理かつプ
リフェッチの対象とすべき配列参照があるか否かを調べ
る(S301)。ある配列参照をプリフェッチの対象と
すべきか否かは、例えば、その配列参照のメモリアドレ
スを予め求めることができるか否か、配列の添字がルー
プ制御変数の線形関数となっているか否か、配列データ
が既にキャッシュにあるか否か、等に基づいて判断す
る。
リフェッチの対象とすべき配列参照があるか否かを調べ
る(S301)。ある配列参照をプリフェッチの対象と
すべきか否かは、例えば、その配列参照のメモリアドレ
スを予め求めることができるか否か、配列の添字がルー
プ制御変数の線形関数となっているか否か、配列データ
が既にキャッシュにあるか否か、等に基づいて判断す
る。
【0047】その結果、未処理かつプリフェッチの対象
とすべき配列参照があれば(S301:yes)、その
配列参照を1つ取り出して、処理対象配列参照sとする
(S302)。次に、変数Lに、メモリレイテンシ(プ
リフェッチに要するサイクル数)を代入する(S30
3)。Lに代入する値は、ターゲットマシンによって、
適当な値がコンパイラに予め与えられるが、コンパイラ
起動時等に、ユーザがパラメータとして与えるようにし
てもよい。
とすべき配列参照があれば(S301:yes)、その
配列参照を1つ取り出して、処理対象配列参照sとする
(S302)。次に、変数Lに、メモリレイテンシ(プ
リフェッチに要するサイクル数)を代入する(S30
3)。Lに代入する値は、ターゲットマシンによって、
適当な値がコンパイラに予め与えられるが、コンパイラ
起動時等に、ユーザがパラメータとして与えるようにし
てもよい。
【0048】次に、処理対象ループnが最内側ループで
あるか否かを調べる(S304)。処理対象ループnが
最内側ループであるか否かは、例えば、ループ表110
を参照して調べる。その結果、処理対象ループnが最内
側ループであれば(S304:yes)、従来と同様の
方法で、プリフェッチ命令の挿入を行う(S305、S
306)。すなわち、まず、処理対象ループnのループ
1回あたりの予測実行サイクル数cを求め、データをプ
リフェッチするのに必要なサイクル数(メモリレイテン
シ)Lに相当するループ回数α=[L/c]を計算する
(S305)。そして、処理対象配列参照sの添字式中
のループ繰り返し変数iをi+αに置き換えた配列要素
をプリフェッチする命令を生成し、処理対象配列参照s
の直前に挿入する(S306)。
あるか否かを調べる(S304)。処理対象ループnが
最内側ループであるか否かは、例えば、ループ表110
を参照して調べる。その結果、処理対象ループnが最内
側ループであれば(S304:yes)、従来と同様の
方法で、プリフェッチ命令の挿入を行う(S305、S
306)。すなわち、まず、処理対象ループnのループ
1回あたりの予測実行サイクル数cを求め、データをプ
リフェッチするのに必要なサイクル数(メモリレイテン
シ)Lに相当するループ回数α=[L/c]を計算する
(S305)。そして、処理対象配列参照sの添字式中
のループ繰り返し変数iをi+αに置き換えた配列要素
をプリフェッチする命令を生成し、処理対象配列参照s
の直前に挿入する(S306)。
【0049】一方、処理対象ループnが最内側ループで
ない場合は(S304:no)、従来とは異なる方法
で、処理対象配列参照sのプリフェッチ命令を挿入すべ
き位置を求める処理を行う(S307)。このステップ
S307における処理の詳細については、後述する。プ
リフェッチ命令を挿入すべき位置が求まると、その位置
に、処理対象配列参照sをプリフェッチする命令を挿入
する(S308)。
ない場合は(S304:no)、従来とは異なる方法
で、処理対象配列参照sのプリフェッチ命令を挿入すべ
き位置を求める処理を行う(S307)。このステップ
S307における処理の詳細については、後述する。プ
リフェッチ命令を挿入すべき位置が求まると、その位置
に、処理対象配列参照sをプリフェッチする命令を挿入
する(S308)。
【0050】以上の処理S301〜S308を繰り返し
て、すべてのプリフェッチ対象となる配列参照について
処理を終了すると(S301:no)、ソフトウェアプ
リフェッチ処理を終了する。
て、すべてのプリフェッチ対象となる配列参照について
処理を終了すると(S301:no)、ソフトウェアプ
リフェッチ処理を終了する。
【0051】次に、ステップS307におけるプリフェ
ッチ命令を挿入すべき位置を求める処理について詳細に
説明する。図4は、ステップS307における処理の流
れを示す図である。ここでは、処理対象配列参照sのL
サイクル前に実行される位置を求める。その際、必要に
応じてループの分割を行う。
ッチ命令を挿入すべき位置を求める処理について詳細に
説明する。図4は、ステップS307における処理の流
れを示す図である。ここでは、処理対象配列参照sのL
サイクル前に実行される位置を求める。その際、必要に
応じてループの分割を行う。
【0052】まず、処理対象ループn中の処理対象配列
参照sの直前にあるループを分割対象ループmとして取
り出す(S401)。ここで、処理対象配列参照sの前
にループが存在しない場合は、処理対象ループn中の最
後のループを分割対象ループmとして取り出す。なお、
ここでの処理対象ループnは、最内側ループではないの
で、処理対象nループ中には、必ずループが存在する。
参照sの直前にあるループを分割対象ループmとして取
り出す(S401)。ここで、処理対象配列参照sの前
にループが存在しない場合は、処理対象ループn中の最
後のループを分割対象ループmとして取り出す。なお、
ここでの処理対象ループnは、最内側ループではないの
で、処理対象nループ中には、必ずループが存在する。
【0053】次に、変数kの初期値として、Lの値を代
入する(S402)。そして、分割対象ループmの全体
(全繰り返し)の予測実行サイクル数を求め、それをd
とする(S403)。分割対象ループmの繰り返し数が
コンパイル時に不明で、全体の予測実行サイクル数が求
まらないときは、d←∞(例えば、dとしてとりえない
特定の値)としておく。
入する(S402)。そして、分割対象ループmの全体
(全繰り返し)の予測実行サイクル数を求め、それをd
とする(S403)。分割対象ループmの繰り返し数が
コンパイル時に不明で、全体の予測実行サイクル数が求
まらないときは、d←∞(例えば、dとしてとりえない
特定の値)としておく。
【0054】次に、dがkより大きいか否かを調べる
(S404)。その結果、dがk以下の場合は(S40
4:no)、現在の分割対象ループmの分割は行わず、
分割対象ループmを、現在の分割対象ループmの直前の
ループに変更し、また、kから現在の分割対象ループm
の全体の予測実行サイクル数dを減算する(S41
0)。なお、分割対象ループmの前にループがない場合
は、処理対象ループn中の最後のループを新たな分割対
象ループmとして選択する。そして、ステップS403
〜S404の処理を再度行う。
(S404)。その結果、dがk以下の場合は(S40
4:no)、現在の分割対象ループmの分割は行わず、
分割対象ループmを、現在の分割対象ループmの直前の
ループに変更し、また、kから現在の分割対象ループm
の全体の予測実行サイクル数dを減算する(S41
0)。なお、分割対象ループmの前にループがない場合
は、処理対象ループn中の最後のループを新たな分割対
象ループmとして選択する。そして、ステップS403
〜S404の処理を再度行う。
【0055】一方、dがkより大きければ(S404:
yes)、分割対象ループmの分割を行うため、まず、
分割対象ループmのループ1回分の予測実行サイクル数
eを求め、kに相当する分割対象ループmのループ回数
β=[k/e]を計算する(S405)。
yes)、分割対象ループmの分割を行うため、まず、
分割対象ループmのループ1回分の予測実行サイクル数
eを求め、kに相当する分割対象ループmのループ回数
β=[k/e]を計算する(S405)。
【0056】そして、分割対象ループmを、最後のβ回
のみを実行する後半ループm2と、その前までの繰り返
しを実行する前半ループとに分割する(S406)。す
なわち、分割対象ループmの繰り返し回数をNとしたと
き、1〜(N−β)回の繰り返しを実行する前半ループ
m1と、(N−β+1)〜N回の繰り返しを実行する後
半ループm2の2つのループに分割する。なお、β=1
の場合は、後半ループm2は1回しか実行されないので
ループにしなくてもよい。また、ループの分割にあわせ
て、ループ表110の更新を行う。
のみを実行する後半ループm2と、その前までの繰り返
しを実行する前半ループとに分割する(S406)。す
なわち、分割対象ループmの繰り返し回数をNとしたと
き、1〜(N−β)回の繰り返しを実行する前半ループ
m1と、(N−β+1)〜N回の繰り返しを実行する後
半ループm2の2つのループに分割する。なお、β=1
の場合は、後半ループm2は1回しか実行されないので
ループにしなくてもよい。また、ループの分割にあわせ
て、ループ表110の更新を行う。
【0057】次に、後半ループm2が多重ループである
か否か、すなわち、その内側に他のループを含むループ
であるかを否かを調べる(S407)。その結果、後半
ループm2が多重ループである場合は(S407:ye
s)、更なるループ分割を行うため、後半ループm2の
内側ループを、分割対象ループmとして、ステップS4
03〜S407の処理を再度行う。なお、後半ループm
2が複数の(同階層の)内側ループを有する場合は、一
番最後のループを分割対象ループmとする。
か否か、すなわち、その内側に他のループを含むループ
であるかを否かを調べる(S407)。その結果、後半
ループm2が多重ループである場合は(S407:ye
s)、更なるループ分割を行うため、後半ループm2の
内側ループを、分割対象ループmとして、ステップS4
03〜S407の処理を再度行う。なお、後半ループm
2が複数の(同階層の)内側ループを有する場合は、一
番最後のループを分割対象ループmとする。
【0058】一方、後半ループm2が多重ループでなけ
れば(S407:no)、これ以上、ループ分割をする
ことはできないので、その時点での前半ループm1と後
半ループm2の間を、プリフェッチ命令を挿入する位置
とし(S409)、処理を終了する。
れば(S407:no)、これ以上、ループ分割をする
ことはできないので、その時点での前半ループm1と後
半ループm2の間を、プリフェッチ命令を挿入する位置
とし(S409)、処理を終了する。
【0059】次に、上述したコンパイラ108の処理
を、具体例に基づいて説明する。まず、図5(a)に示
したソースプログラム(図12(a)と同じソースプロ
グラム)をコンパイルする場合について説明する。
を、具体例に基づいて説明する。まず、図5(a)に示
したソースプログラム(図12(a)と同じソースプロ
グラム)をコンパイルする場合について説明する。
【0060】図5(a)に示したプログラムのコンパイ
ルが指示されると、コンパイラ108は、ソースプログ
ラムを読み込み、構文解析処理S201を行った後、ル
ープ解析処理S202を行う。
ルが指示されると、コンパイラ108は、ソースプログ
ラムを読み込み、構文解析処理S201を行った後、ル
ープ解析処理S202を行う。
【0061】図5(b)は、このループ解析処理S20
2によって作成されるループ表110の構成例を示す図
である。同図に示すように、ループ表110は、各ルー
プに対して、ループ番号701、ループ繰り返し変数7
02、繰り返し回数703、内側ループ704、直前ル
ープ705、直後ループ706、予測実行サイクル70
7等の情報を格納する。
2によって作成されるループ表110の構成例を示す図
である。同図に示すように、ループ表110は、各ルー
プに対して、ループ番号701、ループ繰り返し変数7
02、繰り返し回数703、内側ループ704、直前ル
ープ705、直後ループ706、予測実行サイクル70
7等の情報を格納する。
【0062】図5(a)のプログラムには、ループが2
つあり、外側ループ(603〜609)には、「1」、
内側ループ(605〜607)には、「2」というルー
プ番号が付けられている。なお、以下では、ループ番号
が「1」のループをループ1、ループ番号が「2」のル
ープをループ2、等と呼ぶ。
つあり、外側ループ(603〜609)には、「1」、
内側ループ(605〜607)には、「2」というルー
プ番号が付けられている。なお、以下では、ループ番号
が「1」のループをループ1、ループ番号が「2」のル
ープをループ2、等と呼ぶ。
【0063】ループ1のループ繰り返し変数は「i」、
繰り返し回数は「N」、内側ループは、ループ「2」、
直前ループ、直後ループは、「なし」である。また、ル
ープ2のループ繰り返し変数は「j」、繰り返し回数は
「M」、内側ループ、直前ループ、直後ループはいずれ
も「なし」である。
繰り返し回数は「N」、内側ループは、ループ「2」、
直前ループ、直後ループは、「なし」である。また、ル
ープ2のループ繰り返し変数は「j」、繰り返し回数は
「M」、内側ループ、直前ループ、直後ループはいずれ
も「なし」である。
【0064】予測実行サイクル数707には、各ループ
のループ1回あたりの予測実行サイクル数が格納され
る。この予測実行サイクル数は、ループ内の命令数と各
命令の実行サイクル数、内側ループの繰り返し回数等か
ら計算される。図5の例では、ループ2のループ1回あ
たりの予測実行サイクルを「c」と見積り、ループ1の
ループ1回あたりの予測実行サイクルは、ループ2以外
の部分の実行サイクル数を無視して、「c*M」と計算
している。
のループ1回あたりの予測実行サイクル数が格納され
る。この予測実行サイクル数は、ループ内の命令数と各
命令の実行サイクル数、内側ループの繰り返し回数等か
ら計算される。図5の例では、ループ2のループ1回あ
たりの予測実行サイクルを「c」と見積り、ループ1の
ループ1回あたりの予測実行サイクルは、ループ2以外
の部分の実行サイクル数を無視して、「c*M」と計算
している。
【0065】以上のようなループ表の作成を終了する
と、続いて、コンパイラ108は、まず、ループ1を処
理対象ループnとして取り出し(S204)、ループ1
に対してソフトウェアプリフェッチ処理を行う(S20
5)。
と、続いて、コンパイラ108は、まず、ループ1を処
理対象ループnとして取り出し(S204)、ループ1
に対してソフトウェアプリフェッチ処理を行う(S20
5)。
【0066】そのため、まず、処理対象ループnである
ループ1内の未処理の配列参照A(i)を処理対象配列
参照sとして取り出す(S302)。また、変数Lに、
ターゲットマシンのメモリレイテンシを代入する(S3
03)。
ループ1内の未処理の配列参照A(i)を処理対象配列
参照sとして取り出す(S302)。また、変数Lに、
ターゲットマシンのメモリレイテンシを代入する(S3
03)。
【0067】次に、ループ1が最内側ループか否かを調
べる(S304)。ループ1は、内側ループとして、ル
ープ2を有し、最内側ループではないので(S304:
no)、次に、プリフェッチ命令を挿入すべき位置を求
める(S307)。
べる(S304)。ループ1は、内側ループとして、ル
ープ2を有し、最内側ループではないので(S304:
no)、次に、プリフェッチ命令を挿入すべき位置を求
める(S307)。
【0068】そのため、まず、処理対象配列参照sであ
るA(i)の直前のループであるループ2を分割対象ル
ープmとする(S401)。また、kにLを代入する
(S402)。そして、分割対象ループmであるループ
2の全体予測実行サイクル数を求める(S403)。こ
の場合、ループ2の繰り返し回数Mは、コンパイル時に
は不明なので、d←∞とする。
るA(i)の直前のループであるループ2を分割対象ル
ープmとする(S401)。また、kにLを代入する
(S402)。そして、分割対象ループmであるループ
2の全体予測実行サイクル数を求める(S403)。こ
の場合、ループ2の繰り返し回数Mは、コンパイル時に
は不明なので、d←∞とする。
【0069】そして、dがkより大きいか否かを調べる
(S404)。この場合、d(=∞)はk(=L)より
大きいので(S404:yes)、現時点の分割対象ル
ープmであるループ2の分割を行うため、ループ2のル
ープ1回分の予測実行サイクル数cを求め、β=[L/
c]を計算する(S405)。そして、ループ2を、1
〜(M−β)回を実行する前半ループm1と(M−β+
1)〜M回を実行する後半ループm2とに分割する(S
406)。
(S404)。この場合、d(=∞)はk(=L)より
大きいので(S404:yes)、現時点の分割対象ル
ープmであるループ2の分割を行うため、ループ2のル
ープ1回分の予測実行サイクル数cを求め、β=[L/
c]を計算する(S405)。そして、ループ2を、1
〜(M−β)回を実行する前半ループm1と(M−β+
1)〜M回を実行する後半ループm2とに分割する(S
406)。
【0070】そして、後半ループm2が多重ループであ
るか否かを調べる(S407)。この場合、後半ループ
m2は多重ループではないので(S407:no)、現
時点での前半ループm1と後半ループm2の間をプリフ
ェッチ命令を挿入すべき位置とする(S409)。そし
て、その位置にプリフェッチ命令「prefetch(A
(i))」を挿入する(S308)。
るか否かを調べる(S407)。この場合、後半ループ
m2は多重ループではないので(S407:no)、現
時点での前半ループm1と後半ループm2の間をプリフ
ェッチ命令を挿入すべき位置とする(S409)。そし
て、その位置にプリフェッチ命令「prefetch(A
(i))」を挿入する(S308)。
【0071】図5(c)は、プリフェッチ命令を挿入し
た後のプログラムをソースコードイメージで示したもの
である。同図(c)に示すように、同図(a)のループ
(605〜607)が、始めの(M−β)回を実行する
前半ループ(624〜626)と終わりのβ回を実行す
る後半ループ(628〜630)の2つに分割されて、
その間に、配列参照A(i)のプリフェッチ命令(62
7)が挿入されている。
た後のプログラムをソースコードイメージで示したもの
である。同図(c)に示すように、同図(a)のループ
(605〜607)が、始めの(M−β)回を実行する
前半ループ(624〜626)と終わりのβ回を実行す
る後半ループ(628〜630)の2つに分割されて、
その間に、配列参照A(i)のプリフェッチ命令(62
7)が挿入されている。
【0072】このようにすると、プリフェッチ命令(6
27)とデータ参照(631)の間に実行されるループ
は、β回しか回らず、βは一般に元のループ回数Mに比
べて小さいので、その間に参照されるデータ量は一般に
小さく、プリフェッチしたデータがキャッシュから追い
出される可能性は低くなる。また、ループのβ回の実行
には、Lサイクル、すなわち、データをメモリからプリ
フェッチをするのに要するのと等しいサイクル数が必要
となるので、データを参照するときにプリフェッチデー
タの到着が間に合っていないということがない。
27)とデータ参照(631)の間に実行されるループ
は、β回しか回らず、βは一般に元のループ回数Mに比
べて小さいので、その間に参照されるデータ量は一般に
小さく、プリフェッチしたデータがキャッシュから追い
出される可能性は低くなる。また、ループのβ回の実行
には、Lサイクル、すなわち、データをメモリからプリ
フェッチをするのに要するのと等しいサイクル数が必要
となるので、データを参照するときにプリフェッチデー
タの到着が間に合っていないということがない。
【0073】次に、コンパイラ108のコンパイル処理
を、別の具体例に基づいて説明する。図6(a)は、コ
ンパイル処理の対象とされる別のソースプログラムを示
す図である。ここでは、配列参照A(i1)(811)
に対してプリフェッチを行う場合を考える。
を、別の具体例に基づいて説明する。図6(a)は、コ
ンパイル処理の対象とされる別のソースプログラムを示
す図である。ここでは、配列参照A(i1)(811)
に対してプリフェッチを行う場合を考える。
【0074】図6(b)は、同図(a)のプログラムに
対して、コンパイラ108が作成するループ表110の
構成例を示す図である。同図(a)のプログラムにはル
ープが4つあり、ループ(802〜812)がループ
1、ループ(803〜807)がループ2、ループ(8
04〜806)がループ3、ループ(808〜810)
がループ4とされる。
対して、コンパイラ108が作成するループ表110の
構成例を示す図である。同図(a)のプログラムにはル
ープが4つあり、ループ(802〜812)がループ
1、ループ(803〜807)がループ2、ループ(8
04〜806)がループ3、ループ(808〜810)
がループ4とされる。
【0075】また、ループ1のループ繰り返し変数は
「i1」、繰り返し回数は「10」、内側ループは、ル
ープ「2」、「4」、直前ループ、直後ループは、「な
し」である。ループ2のループ繰り返し変数は「i
2」、繰り返し回数は「20」、内側ループは、ループ
「3」、直前ループは「なし」、直後ループは、ループ
「4」である。ループ3のループ繰り返し変数は「i
3」、繰り返し回数は「30」、内側ループ、直前ルー
プ、直後ループは、いずれも「なし」である。ループ4
のループ繰り返し変数は「i4」、繰り返し回数は「4
0」、内側ループ、直後ループはいずれも「なし」、直
前ループは、ループ「2」である。
「i1」、繰り返し回数は「10」、内側ループは、ル
ープ「2」、「4」、直前ループ、直後ループは、「な
し」である。ループ2のループ繰り返し変数は「i
2」、繰り返し回数は「20」、内側ループは、ループ
「3」、直前ループは「なし」、直後ループは、ループ
「4」である。ループ3のループ繰り返し変数は「i
3」、繰り返し回数は「30」、内側ループ、直前ルー
プ、直後ループは、いずれも「なし」である。ループ4
のループ繰り返し変数は「i4」、繰り返し回数は「4
0」、内側ループ、直後ループはいずれも「なし」、直
前ループは、ループ「2」である。
【0076】また、ループ3及びループ4のループ1回
あたりの予測実行サイクルを、それぞれ、「5」及び
「1」と見積り、ループ2のループ1回あたりの予測実
行サイクルを「150」(=5*30)、ループ1のル
ープ1回あたりの予測実行サイクルを、「3040」
(=150*20+1*40)と算出している。
あたりの予測実行サイクルを、それぞれ、「5」及び
「1」と見積り、ループ2のループ1回あたりの予測実
行サイクルを「150」(=5*30)、ループ1のル
ープ1回あたりの予測実行サイクルを、「3040」
(=150*20+1*40)と算出している。
【0077】このようなループ表110の作成を終了す
ると、コンパイラ108は、まず、処理対象ループnと
して、ループ1を取り出し(S204)、ループ1に対
してソフトウェアプリフェッチ処理を行う(S20
5)。
ると、コンパイラ108は、まず、処理対象ループnと
して、ループ1を取り出し(S204)、ループ1に対
してソフトウェアプリフェッチ処理を行う(S20
5)。
【0078】そのため、まず、処理対象配列参照sとし
て、A(i1)を取り出す(S302)。また、Lにタ
ーゲットマシンにおけるメモリレイテンシを代入する
(S303)。ここでは、L=100とする。次に、処
理対象ループnであるループ1が最内側ループか否かを
調べる(S304)。ループ1は、内側ループとしてル
ープ2,4を含み、最内側ループではないので、続い
て、プリフェッチ命令を挿入すべき位置を求める(S3
07)。
て、A(i1)を取り出す(S302)。また、Lにタ
ーゲットマシンにおけるメモリレイテンシを代入する
(S303)。ここでは、L=100とする。次に、処
理対象ループnであるループ1が最内側ループか否かを
調べる(S304)。ループ1は、内側ループとしてル
ープ2,4を含み、最内側ループではないので、続い
て、プリフェッチ命令を挿入すべき位置を求める(S3
07)。
【0079】そのために、まず、処理対象配列参照sで
あるA(i1)の直前のループ、すなわち、ループ4を
分割対象ループmとする(S401)。またkにL(=
100)を代入する(S402)。
あるA(i1)の直前のループ、すなわち、ループ4を
分割対象ループmとする(S401)。またkにL(=
100)を代入する(S402)。
【0080】次に、分割対象ループmであるループ4の
全体予測実行サイクル数dを求める(S403)。ルー
プ4のループ1回分の予測実行サイクルは、「1」で、
ループ繰り返し回数が「40」なので、d←40(=1
*40)となる。
全体予測実行サイクル数dを求める(S403)。ルー
プ4のループ1回分の予測実行サイクルは、「1」で、
ループ繰り返し回数が「40」なので、d←40(=1
*40)となる。
【0081】次に、dがkより大きいか否かを調べる
(S404)。この場合、d(=40)は、k(=10
0)より小さいので(S404:no)、分割対象ルー
プmを、現在の分割対象ループであるループ4の直前の
ループ、すなわち、ループ2とし、また、k←60(=
k−d=100−40)とする(S410)。
(S404)。この場合、d(=40)は、k(=10
0)より小さいので(S404:no)、分割対象ルー
プmを、現在の分割対象ループであるループ4の直前の
ループ、すなわち、ループ2とし、また、k←60(=
k−d=100−40)とする(S410)。
【0082】そして、改めて、現在の分割対象ループm
であるループ2の全体予測実行サイクル数dを求める
(S403)。ループ2のループ1回分の予測実行サイ
クルは「150」で、ループ繰り返し回数が「20」な
ので、d←3000(=150*20)となる。
であるループ2の全体予測実行サイクル数dを求める
(S403)。ループ2のループ1回分の予測実行サイ
クルは「150」で、ループ繰り返し回数が「20」な
ので、d←3000(=150*20)となる。
【0083】次に、dがkより大きいか否か調べる(S
404)。この場合、d(=3000)は、k(=6
0)より大きいので、分割対象ループmであるループ2
の分割を行うため、次に、ループ2のループ1回あたり
の予測実行サイクル数e(=150)を求め、β=[k
/e]=[60/150]=1を計算する(S40
5)。次に、その結果に基づいて、ループ2を2つのル
ープに分割する(S406)。ループ2の繰り返し回数
は20、β=1なので、ループ2を1〜19回を実行す
る前半ループm1と、最後の1回を実行する後半ループ
m2に分割する。
404)。この場合、d(=3000)は、k(=6
0)より大きいので、分割対象ループmであるループ2
の分割を行うため、次に、ループ2のループ1回あたり
の予測実行サイクル数e(=150)を求め、β=[k
/e]=[60/150]=1を計算する(S40
5)。次に、その結果に基づいて、ループ2を2つのル
ープに分割する(S406)。ループ2の繰り返し回数
は20、β=1なので、ループ2を1〜19回を実行す
る前半ループm1と、最後の1回を実行する後半ループ
m2に分割する。
【0084】図7(a)は、図6(a)に示したプログ
ラムのループ2を、前半ループm1と後半ループm2に
分割した時点でのプログラムをソースコードイメージで
示したものである。同図に示すように、元のループ(8
03〜807)が、前半ループ(903〜907)と、
後半ループ(908〜912)に分割されている。
ラムのループ2を、前半ループm1と後半ループm2に
分割した時点でのプログラムをソースコードイメージで
示したものである。同図に示すように、元のループ(8
03〜807)が、前半ループ(903〜907)と、
後半ループ(908〜912)に分割されている。
【0085】図7(b)は、ループ2の分割に伴って、
コンパイラ108が更新した後のループ表110を示す
図である。同図(a)に示すように、ループ2の分割に
よって、2つのループが増えているが、ループ(908
〜912)がループ5、ループ(909〜911)がル
ープ6とされる。
コンパイラ108が更新した後のループ表110を示す
図である。同図(a)に示すように、ループ2の分割に
よって、2つのループが増えているが、ループ(908
〜912)がループ5、ループ(909〜911)がル
ープ6とされる。
【0086】また、ループ5のループ繰り返し変数は
「i2」、繰り返し回数は「1」、内側ループは、ルー
プ「6」、直前ループは、ループ「2」、直後ループ
は、ループ「4」、予測実行サイクルは、「150」と
なる。ループ6のループ繰り返し変数は「i3」、繰り
返し回数は「30」、内側ループ、直前ループ、直後ル
ープは、いずれも「なし」、予測実行サイクルは、
「5」となる。
「i2」、繰り返し回数は「1」、内側ループは、ルー
プ「6」、直前ループは、ループ「2」、直後ループ
は、ループ「4」、予測実行サイクルは、「150」と
なる。ループ6のループ繰り返し変数は「i3」、繰り
返し回数は「30」、内側ループ、直前ループ、直後ル
ープは、いずれも「なし」、予測実行サイクルは、
「5」となる。
【0087】更に、ループ1の内側ループに、ループ
「5」が追加されており、ループ2の繰り返し回数及び
直後ループがそれぞれ、「19」及びループ「5」に更
新され、ループ4の直前ループが、ループ「5」に更新
されている。
「5」が追加されており、ループ2の繰り返し回数及び
直後ループがそれぞれ、「19」及びループ「5」に更
新され、ループ4の直前ループが、ループ「5」に更新
されている。
【0088】コンパイラ108は、ループ2の分割を終
了すると、次に、後半ループm2であるループ5が多重
ループであるか否かを調べる(S407)。この場合、
ループ5は、内側ループとして、ループ6を含み、多重
ループあるので(S407:yes)、分割対象ループ
mを、ループ6に変える(S408)。
了すると、次に、後半ループm2であるループ5が多重
ループであるか否かを調べる(S407)。この場合、
ループ5は、内側ループとして、ループ6を含み、多重
ループあるので(S407:yes)、分割対象ループ
mを、ループ6に変える(S408)。
【0089】その後、改めて、分割対象ループmである
ループ6の全体予測実行サイクルを求める(S40
3)。この場合、150(=30*5)であるので、そ
れをdとする。次に、dがkより大きいか否かを調べる
(S404)。この場合、d(=150)は、k(=6
0)より大きいので(S404:yes)、ループ6の
分割を行うため、ループ6のループ1回あたりの予測実
行サイクル数e(=5)を求め、β=[k/e]=[6
0/5]=12を計算する(S405)。
ループ6の全体予測実行サイクルを求める(S40
3)。この場合、150(=30*5)であるので、そ
れをdとする。次に、dがkより大きいか否かを調べる
(S404)。この場合、d(=150)は、k(=6
0)より大きいので(S404:yes)、ループ6の
分割を行うため、ループ6のループ1回あたりの予測実
行サイクル数e(=5)を求め、β=[k/e]=[6
0/5]=12を計算する(S405)。
【0090】そして、ループ6を最後のβ回のみを実行
する後半ループm2と、その前までの繰り返しを実行す
る前半ループm1とに分割する(S406)。ループ6
の繰り返し回数は30なので、ループ6を、1〜18
(=30−12)回実行する前半ループm1と、19〜
30回実行する後半ループm2に分割する。続いて、後
半ループm2が多重ループか否かを調べると(S40
7)、そうではないので(S407:no)、現時点で
の前半ループm1と後半ループm2の間をプリフェッチ
命令を挿入すべき位置とし(S409)、その位置に、
処理対象配列参照sであるA(i1)についてのプリフ
ェッチ命令を挿入する(S308)。
する後半ループm2と、その前までの繰り返しを実行す
る前半ループm1とに分割する(S406)。ループ6
の繰り返し回数は30なので、ループ6を、1〜18
(=30−12)回実行する前半ループm1と、19〜
30回実行する後半ループm2に分割する。続いて、後
半ループm2が多重ループか否かを調べると(S40
7)、そうではないので(S407:no)、現時点で
の前半ループm1と後半ループm2の間をプリフェッチ
命令を挿入すべき位置とし(S409)、その位置に、
処理対象配列参照sであるA(i1)についてのプリフ
ェッチ命令を挿入する(S308)。
【0091】図8は、プリフェッチ命令を挿入した時点
でのプログラムをソースコードイメージで示したもので
ある。同図に示すように、前半ループ(1009〜10
11)と後半ループ(1013〜1015)の間にプリ
フェッチ命令(1012)が挿入されている。なお、こ
の場合、ループ(1008〜1016)は1回しか回ら
ないので、前述したように、ここはループにしなくても
よい。
でのプログラムをソースコードイメージで示したもので
ある。同図に示すように、前半ループ(1009〜10
11)と後半ループ(1013〜1015)の間にプリ
フェッチ命令(1012)が挿入されている。なお、こ
の場合、ループ(1008〜1016)は1回しか回ら
ないので、前述したように、ここはループにしなくても
よい。
【0092】図8のプログラムでは、配列要素A(i
1)のプリフェッチ命令(1012)と配列要素A(i
1)の参照(1020)の間で、ループ(1013〜1
015)とループ(1017〜1019)が実行され
る。ループ(1013〜1015)の予測実行サイクル
数は、5*(30−19+1)=60であり、ループ
(1017〜1019)の予測実行サイクル数は、1*
40=40である。つまり、合計100サイクルであ
り、メモリレイテンシLと等しくなる。従って、データ
の参照にちょうど間に合うように、プリフェッチ命令が
発行されることになる。
1)のプリフェッチ命令(1012)と配列要素A(i
1)の参照(1020)の間で、ループ(1013〜1
015)とループ(1017〜1019)が実行され
る。ループ(1013〜1015)の予測実行サイクル
数は、5*(30−19+1)=60であり、ループ
(1017〜1019)の予測実行サイクル数は、1*
40=40である。つまり、合計100サイクルであ
り、メモリレイテンシLと等しくなる。従って、データ
の参照にちょうど間に合うように、プリフェッチ命令が
発行されることになる。
【0093】以上の実施形態では、プリフェッチ命令を
挿入するためにループを分割していたが、ループを分割
せず、ループ中に条件付きのプリフェッチ命令を挿入す
るようにしてもよい。
挿入するためにループを分割していたが、ループを分割
せず、ループ中に条件付きのプリフェッチ命令を挿入す
るようにしてもよい。
【0094】図9は、図5(a)に示したプログラムに
おいて、ループを分割してプリフェッチ命令を挿入する
かわりに、ループ中に条件付きのプリフェッチ命令実行
コード(1106〜1107)を挿入した場合のプログ
ラムをソースコードイメージで示した図である。この場
合、制御変数jが(M−β+1)と等しいとき、すなわ
ち最後からβ番めの繰り返しのときにA(i)のプリフ
ェッチ命令が実行され、プリフェッチ命令が実行される
タイミングは、図5(c)の場合と同じになる。このよ
うな処理を行うには、例えば、図4のステップS406
でループを分割するかわりに、プリフェッチ命令を発行
すべきループmの繰り返し回数N−β+1を記憶してお
いて、その後、その条件に該当するときに処理対象配列
参照sのプリフェッチ命令を実行するようなコードを挿
入するようにすればよい。
おいて、ループを分割してプリフェッチ命令を挿入する
かわりに、ループ中に条件付きのプリフェッチ命令実行
コード(1106〜1107)を挿入した場合のプログ
ラムをソースコードイメージで示した図である。この場
合、制御変数jが(M−β+1)と等しいとき、すなわ
ち最後からβ番めの繰り返しのときにA(i)のプリフ
ェッチ命令が実行され、プリフェッチ命令が実行される
タイミングは、図5(c)の場合と同じになる。このよ
うな処理を行うには、例えば、図4のステップS406
でループを分割するかわりに、プリフェッチ命令を発行
すべきループmの繰り返し回数N−β+1を記憶してお
いて、その後、その条件に該当するときに処理対象配列
参照sのプリフェッチ命令を実行するようなコードを挿
入するようにすればよい。
【0095】また、以上の実施形態では、メモリ参照が
ループ内にある場合を対象にしていたが、ループ内にな
い場合に適用することもできる。図10は、プログラム
手続き「subroutine f(A,B,i)」に対して、本発明を適
用した例を示す図である。
ループ内にある場合を対象にしていたが、ループ内にな
い場合に適用することもできる。図10は、プログラム
手続き「subroutine f(A,B,i)」に対して、本発明を適
用した例を示す図である。
【0096】ここでは、図10(a)に示したプログラ
ム手続き内の配列参照A(i)(1207)に対して、
同図(b)のように直前のループを分割してプリフェッ
チ命令(1215)を挿入している。このような処理に
よって、メモリレイテンシ分だけ前にプリフェッチ命令
を実行することができる。このような処理を行うには、
図2のステップS203〜S204でループを取り出す
とき、プログラム手続き全体を1つの仮想的なループと
考えて処理すればよい。
ム手続き内の配列参照A(i)(1207)に対して、
同図(b)のように直前のループを分割してプリフェッ
チ命令(1215)を挿入している。このような処理に
よって、メモリレイテンシ分だけ前にプリフェッチ命令
を実行することができる。このような処理を行うには、
図2のステップS203〜S204でループを取り出す
とき、プログラム手続き全体を1つの仮想的なループと
考えて処理すればよい。
【0097】
【発明の効果】以上詳細に説明したように、本発明によ
れば、最内側ループ中にないデータの参照に対して、プ
リフェッチしたデータが使用される前にキャッシュから
追い出されることに起因するキャッシュミスを減少さ
せ、プログラム実行の高速化を図ることができる。
れば、最内側ループ中にないデータの参照に対して、プ
リフェッチしたデータが使用される前にキャッシュから
追い出されることに起因するキャッシュミスを減少さ
せ、プログラム実行の高速化を図ることができる。
【図1】 本発明によるコンパイラが稼動する計算機シ
ステムの構成を示す図である。
ステムの構成を示す図である。
【図2】 コンパイラ108のコンパイル処理の流れを
示すフローチャートである。
示すフローチャートである。
【図3】 ソフトウェアプリフェッチ処理の流れを示す
図である。
図である。
【図4】 プリフェッチ命令を挿入すべき位置を求める
処理の流れを示す図である。
処理の流れを示す図である。
【図5】 本発明によるソフトウェアプリフェッチ処理
の例を示す図である
の例を示す図である
【図6】 コンパイル処理の対象とされるプログラムの
例とそのループ表を示す図である。
例とそのループ表を示す図である。
【図7】 ループ分割をした時点でのプログラムのソー
スコードイメージとそのループ表を示す図である。
スコードイメージとそのループ表を示す図である。
【図8】 プリフェッチ命令を挿入した時点でのプログ
ラムをソースコードイメージで示した図である。
ラムをソースコードイメージで示した図である。
【図9】 ループ中に条件付きのプリフェッチ命令実行
コードを挿入した場合のプログラムをソースコードイメ
ージで示した図である。
コードを挿入した場合のプログラムをソースコードイメ
ージで示した図である。
【図10】 プログラム手続き内の配列参照に対するソ
フトウェアプリフェッチ処理の例を示す図である。
フトウェアプリフェッチ処理の例を示す図である。
【図11】 従来のソフトウェアプリフェッチ方法の例
を示す図である。
を示す図である。
【図12】 従来のソフトウェアプリフェッチ方法の例
を示す図である
を示す図である
108 コンパイラ S205 ソフトウェアプリフェッチ処理
Claims (12)
- 【請求項1】 プリフェッチ命令を持つプロセッサに対
するオブジェクトコードを生成するコンパイラにおい
て、 プリフェッチの対象とするメモリ参照を含む第1のルー
プがその内側に第2のループを有する場合に、 当該第2のループのループ繰り返し1回あたりの実行サ
イクル数と、データをプリフェッチするのに要するサイ
クル数であるメモリレイテンシとに基づいて、当該メモ
リレイテンシに相当する第2のループの繰り返し回数β
を求め、 前記第2のループを、終わりのβ回を実行する後半ルー
プと、その前までの繰り返しを実行する前半ループとに
分割し、 前半ループと後半ループの間にプリフェッチ命令を挿入
することを特徴とするソフトウェアプリフェッチ方法。 - 【請求項2】 プリフェッチ命令を持つプロセッサに対
するオブジェクコードを生成するコンパイラにおいて、 プリフェッチの対象とするメモリ参照を含む第1のルー
プがその内側に第2のループを有する場合に、 当該第2のループのループ繰り返し1回あたりの実行サ
イクル数と、データをプリフェッチするのに要するサイ
クル数であるメモリレイテンシとに基づいて、当該メモ
リレイテンシに相当する第2のループの繰り返し回数β
を求め、 前記第2のループの、最後からβ回目の繰り返しのとき
にプリフェッチ命令を実行する、条件付きのプリフェッ
チ命令実行コードを挿入することを特徴とするソフトウ
ェアプリフェッチ方法。 - 【請求項3】 プリフェッチ命令を持つプロセッサに対
するオブジェクトコードを生成するコンパイラにおい
て、 プリフェッチの対象とするメモリ参照を含むプログラム
手続き内にループがある場合に、 当該ループのループ繰り返し1回あたりの実行サイクル
数と、データをプリフェッチするのに要するサイクル数
であるメモリレイテンシとに基づいて、当該メモリレイ
テンシに相当する前記ループの繰り返し回数βを求め、 前記ループを、終わりのβ回を実行する後半ループと、
その前までの繰り返しを実行する前半ループとに分割
し、 前半ループと後半ループの間にプリフェッチ命令を挿入
することを特徴とするソフトウェアプリフェッチ方法。 - 【請求項4】 プリフェッチ命令を持つプロセッサに対
するオブジェクトコードを生成するコンパイラにおい
て、 プリフェッチの対象とするメモリ参照を有するプログラ
ム手続き内にループが含まれる場合に、 当該ループのループ繰り返し1回あたりの実行サイクル
数と、データをプリフェッチするのに要するサイクル数
であるメモリレイテンシとに基づいて、当該メモリレイ
テンシに相当する前記ループの繰り返し回数βを求め、 前記ループの、最後からβ回目の繰り返しのときに、プ
リフェッチ命令を実行する、条件付きのプリフェッチ命
令実行コードを挿入することを特徴とするソフトウェア
プリフェッチ方法。 - 【請求項5】 プリフェッチ命令を持つプロセッサに対
するオブジェクトコードを生成するコンパイル装置であ
ってプリフェッチの対象とするメモリ参照を含む第1の
ループがその内側に第2のループを有する場合に、当該
第2のループのループ繰り返し1回あたりの実行サイク
ル数と、データをプリフェッチするのに要するサイクル
数であるメモリレイテンシとに基づいて、当該メモリレ
イテンシに相当する第2のループの繰り返し回数βを求
める手段と、 前記第2のループを、終わりのβ回を実行する後半ルー
プと、その前までの繰り返しを実行する前半ループとに
分割する手段と、 前半ループと後半ループの間にプリフェッチ命令を挿入
する手段とを備えることを特徴とするコンパイル装置。 - 【請求項6】 プリフェッチ命令を持つプロセッサに対
するオブジェクコードを生成するコンパイル装置であっ
て、 プリフェッチの対象とするメモリ参照を含む第1のルー
プがその内側に第2のループを有する場合に、当該第2
のループのループ繰り返し1回あたりの実行サイクル数
と、データをプリフェッチするのに要するサイクル数で
あるメモリレイテンシとに基づいて、当該メモリレイテ
ンシに相当する第2のループの繰り返し回数βを求める
手段と、 前記第2のループの、最後からβ回目の繰り返しのとき
にプリフェッチ命令を実行する、条件付きのプリフェッ
チ命令実行コードを挿入する手段とを備えることを特徴
とするコンパイル装置。 - 【請求項7】 プリフェッチ命令を持つプロセッサに対
するオブジェクコードを生成するコンパイル装置であっ
て、 プリフェッチの対象とするメモリ参照を含むプログラム
手続き内にループがある場合に、当該ループのループ繰
り返し1回あたりの実行サイクル数と、データをプリフ
ェッチするのに要するサイクル数であるメモリレイテン
シとに基づいて、当該メモリレイテンシに相当する前記
ループの繰り返し回数βを求める手段と、 前記ループを、終わりのβ回を実行する後半ループと、
その前までの繰り返しを実行する前半ループとに分割す
る手段と、 前半ループと後半ループの間にプリフェッチ命令を挿入
する手段とを備えることを特徴とするコンパイル装置。 - 【請求項8】 プリフェッチ命令を持つプロセッサに対
するオブジェクコードを生成するコンパイル装置であっ
て、 プリフェッチの対象とするメモリ参照を有するプログラ
ム手続き内にループが含まれる場合に、当該ループのル
ープ繰り返し1回あたりの実行サイクル数と、データを
プリフェッチするのに要するサイクル数であるメモリレ
イテンシとに基づいて、当該メモリレイテンシに相当す
る前記ループの繰り返し回数βを求める手段と、 前記ループの最後からβ回目の繰り返しのときにプリフ
ェッチ命令を実行する、条件付きのプリフェッチ命令実
行コードを挿入する手段とを備えることを特徴とするコ
ンパイル装置。 - 【請求項9】 ソースコードを読み込んで、プリフェッ
チ命令を持つプロセッサに対するオブジェクトコードを
生成するコンパイル装置において、 前記ソースコードが、第1のループを有し、更に、当該
第1のループの内側にプリフェッチの対象とされるメモ
リ参照及び第2のループを有する場合、 前記オブジェクトコードは、 前記第2のループに対応する前半ループ及び後半ループ
と、 前半ループと後半ループの間にプリフェッチ命令とを有
し、 前記後半ループの繰り返し回数は、データをプリフェッ
チするのに要するサイクル数に相当する回数であること
を特徴とするコンパイル装置。 - 【請求項10】 プリフェッチ命令を持つプロセッサに
対するオブジェクトコードを生成するコンパイラであっ
て、 プリフェッチの対象とするメモリ参照を含む第1のルー
プがその内側に第2のループを有する場合に、当該第2
のループのループ繰り返し1回あたりの実行サイクル数
と、データをプリフェッチするのに要するサイクル数で
あるメモリレイテンシとに基づいて、当該メモリレイテ
ンシに相当する第2のループの繰り返し回数βを求める
ステップと、 前記第2のループを、終わりのβ回を実行する後半ルー
プと、その前までの繰り返しを実行する前半ループとに
分割するステップと、 前半ループと後半ループの間にプリフェッチ命令を挿入
するステップとを備えることを特徴とするコンパイラを
記録した記録媒体。 - 【請求項11】 オブジェクトコードを記録した記録媒
体であって、 前記オブジェクトコードは、 1つのループ処理に相当する前半ループ及び後半ループ
と、 後半ループのうしろに、メモリ参照をする命令と、 前半ループと後半ループの間に、前記メモリ参照につい
てのプリフェッチ命令とを有し、 前記後半ループの繰り返し回数は、前記オブジェクトコ
ードを実行可能なコンピュータにおいて、データをプリ
フェッチするのに要するサイクル数に相当する回数であ
ることを特徴とする記録媒体。 - 【請求項12】 オブジェクトコードを記録した記録媒
体であって、 前記オブジェクトコードは、 ループと、 当該ループのうしろに、メモリ参照をする命令と、 前記ループの最後からβ回目の繰り返しのときに、前記
メモリ参照についてのプリフェッチ命令を実行するコー
ドとを有し、 前記βは、前記オブジェクトコードを実行可能なコンピ
ュータにおいて、データをプリフェッチするのに要する
サイクル数に相当する前記ループの繰り返し回数である
ことを特徴とする記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP11008234A JP2000207224A (ja) | 1999-01-14 | 1999-01-14 | ソフトウェアプリフェッチ方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP11008234A JP2000207224A (ja) | 1999-01-14 | 1999-01-14 | ソフトウェアプリフェッチ方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2000207224A true JP2000207224A (ja) | 2000-07-28 |
Family
ID=11687474
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP11008234A Pending JP2000207224A (ja) | 1999-01-14 | 1999-01-14 | ソフトウェアプリフェッチ方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2000207224A (ja) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005122506A (ja) * | 2003-10-17 | 2005-05-12 | Matsushita Electric Ind Co Ltd | コンパイラ装置 |
WO2005078579A1 (ja) * | 2004-02-12 | 2005-08-25 | Matsushita Electric Industrial Co., Ltd. | プログラム変換装置およびプログラム変換方法 |
KR100917491B1 (ko) * | 2001-02-21 | 2009-09-16 | 가부시키가이샤 한도다이 리코가쿠 겐큐 센터 | 캐시 메모리 시스템 |
JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
JP2010244204A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | コンパイラプログラムおよびコンパイラ装置 |
JP2017068328A (ja) * | 2015-09-28 | 2017-04-06 | 日本電気株式会社 | キャッシュ制御装置、キャッシュ制御方法およびキャッシュ制御プログラム |
US9798528B2 (en) | 2006-09-13 | 2017-10-24 | International Business Machines Corporation | Software solution for cooperative memory-side and processor-side data prefetching |
-
1999
- 1999-01-14 JP JP11008234A patent/JP2000207224A/ja active Pending
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR100917491B1 (ko) * | 2001-02-21 | 2009-09-16 | 가부시키가이샤 한도다이 리코가쿠 겐큐 센터 | 캐시 메모리 시스템 |
JP2005122506A (ja) * | 2003-10-17 | 2005-05-12 | Matsushita Electric Ind Co Ltd | コンパイラ装置 |
WO2005078579A1 (ja) * | 2004-02-12 | 2005-08-25 | Matsushita Electric Industrial Co., Ltd. | プログラム変換装置およびプログラム変換方法 |
US9798528B2 (en) | 2006-09-13 | 2017-10-24 | International Business Machines Corporation | Software solution for cooperative memory-side and processor-side data prefetching |
JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
JP2010244204A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | コンパイラプログラムおよびコンパイラ装置 |
JP2017068328A (ja) * | 2015-09-28 | 2017-04-06 | 日本電気株式会社 | キャッシュ制御装置、キャッシュ制御方法およびキャッシュ制御プログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Farcy et al. | Dataflow analysis of branch mispredictions and its application to early resolution of branch outcomes | |
JP4374221B2 (ja) | コンピュータシステムおよび記録媒体 | |
KR102554799B1 (ko) | 분기 명령어의 유형에 기초한 사전 분기 예측의 선택적 수행 | |
JP2005122506A (ja) | コンパイラ装置 | |
JP6546584B2 (ja) | 推論的ベクトル演算の実行を制御するためのデータ処理装置及び方法 | |
JPH1091455A (ja) | キャッシュ・ヒット/ミスにおける分岐 | |
JP5205777B2 (ja) | プリフェッチ処理装置、プリフェッチ処理プログラムおよびプリフェッチ処理方法 | |
JPH10293692A (ja) | 多重ループ向けデータプリフェッチ方法、プロセッサおよびプログラム生成方法 | |
CN111159062B (zh) | 一种缓存数据的调度方法、装置、cpu芯片及服务器 | |
EP3144814B1 (en) | Method and apparatus for generating a profile of a target program | |
WO1999030231A1 (fr) | Procede permettant d'optimiser l'acces memoire | |
JP2008052684A (ja) | 分岐履歴長の表示器、分岐予測システム及び分岐予測方法 | |
US20040117606A1 (en) | Method and apparatus for dynamically conditioning statically produced load speculation and prefetches using runtime information | |
KR20030034172A (ko) | 주프로세서용 명령의 프리페치에 보조프로세서를 이용하는방법 및 장치 | |
JP2001195304A (ja) | キャッシュ記憶装置 | |
US7228528B2 (en) | Building inter-block streams from a dynamic execution trace for a program | |
JP2000207224A (ja) | ソフトウェアプリフェッチ方法 | |
JP2006216040A (ja) | ソフトウエアによる動的予測方法および装置 | |
JP6119523B2 (ja) | 演算処理装置、演算処理装置の制御方法及びプログラム | |
JP2014112327A (ja) | 変換プログラム、変換装置及び変換方法 | |
JPH10320212A (ja) | キャッシュ向け最適化方法 | |
CN114610388A (zh) | 一种指令跳转方法、处理器及电子设备 | |
US20170115973A1 (en) | Operating method of semiconductor device and semiconductor system | |
JPH11161692A (ja) | 消費電力のシミュレーション方法 | |
JP2011081836A (ja) | コンパイラ装置 |