JP2006330813A - プリフェッチ起動命令挿入機能を備えたコンパイラ装置 - Google Patents
プリフェッチ起動命令挿入機能を備えたコンパイラ装置 Download PDFInfo
- Publication number
- JP2006330813A JP2006330813A JP2005149446A JP2005149446A JP2006330813A JP 2006330813 A JP2006330813 A JP 2006330813A JP 2005149446 A JP2005149446 A JP 2005149446A JP 2005149446 A JP2005149446 A JP 2005149446A JP 2006330813 A JP2006330813 A JP 2006330813A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- prefetch
- data stream
- loops
- source program
- 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
Images
Landscapes
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】 多重ループ内のデータストリームに対して、プリフェッチ起動命令を連続的に参照される最も外側のループの直前に挿入することにより、プリフェッチ起動命令の実行回数を削減してプログラム実行の高速化を図る。
【解決手段】 ループに属するプリフェッチ対象データに対して、データが属するループの外側ループを順に辿り、そのループより内側の全ループのイタレーション間で対象データが連続的にアクセスされるようなループのうち最も外側のループを検出し、検出したループ全体で参照されるデータストリームに対するプリフェッチ起動命令を生成して挿入する。
【選択図】 図1
【解決手段】 ループに属するプリフェッチ対象データに対して、データが属するループの外側ループを順に辿り、そのループより内側の全ループのイタレーション間で対象データが連続的にアクセスされるようなループのうち最も外側のループを検出し、検出したループ全体で参照されるデータストリームに対するプリフェッチ起動命令を生成して挿入する。
【選択図】 図1
Description
本発明は、コンパイル技術に関し、特に、キャッシュを備える計算機におけるプリフェッチ命令挿入技術に関する。
近年、命令レベルの並列度や動作周波数の向上によりマイクロプロセッサの性能は飛躍的に向上している。一方、計算機の主記憶を構成するDRAMの性能向上は低いレベルに留まっている。この結果、主記憶参照に要するサイクル数は増加する傾向にある。
この問題を解決するために、従来のシステムでは、データ参照の局所性に着目して、主記憶と比較して小容量ではあるものの高速なメモリ(キャッシュ)を配置し、最近参照したデータをキャッシュ上に置くことによって主記憶参照の回数を減らす方式を採ってきた。しかし、数値計算処理などの大規模なデータを使用する計算では、データ参照の局所性が低いためキャッシュミスが多発し、主記憶参照によって生じる待ち時間がプログラムの実行性能にあたえる影響は大きいものとなる。
このような大規模データに対するキャッシュミスを回避するため、主記憶からキャッシュへデータを先行的に読み出すプリフェッチと呼ばれる技術がある。プリフェッチを実現する方式には、ハードウェアで実現する方式、ソフトウェアで実現する方式、両者を組み合わせたハイブリッド方式がある。
ソフトウェアによりプリフェッチを行う方式では、必要となる命令またはデータを該当する命令の実行前に主記憶からキャッシュへ転送するプリフェッチ命令をプロセッサの命令セットに用意し、コンパイラによってソースプログラムのコンパイル時にプリフェッチ命令をソースプログラムの一部に挿入する。
コンパイラがプリフェッチ対象とする典型的なケースは、ループ内で参照される連続アクセスである。例えばループ内に配列参照A[i](iはループ制御変数)があった場合、prefetch(&A[i+d])のようなプリフェッチ命令をループ内に挿入することにより、dイタレーション後に参照するデータをプリフェッチする。ここでdの値は、ループの1回の繰り返しにかかるサイクル数と、主記憶参照に要するサイクル数に基づき計算する。
ハードウェアによるプリフェッチ方式では、プロセッサはメモリ参照のアドレスを記録して連続的なアドレスのアクセスを検出し、プリフェッチ対象のデータストリームとして登録する機構を備えている。また、登録したデータストリームに対しては、ストリームのデータが参照されるタイミングに合わせて、先行的にデータのプリフェッチを続ける機構を備える。これらの機構により、メモリを連続的に参照するデータストリームに対して、プログラムの実行中にプロセッサによる自動的なプリフェッチ処理が実施される。
ハイブリッド方式では、データストリームを指定するプリフェッチ命令(以後、プリフェッチ起動命令と呼ぶ)を用意する。コンパイラは、コンパイル時にソースプログラムを解析し、メモリを連続的にアクセスするデータストリームを検出すると、プリフェッチ起動命令を生成して初期アドレスやストリームの長さなどを指定する。プリフェッチ起動命令で指定されたデータストリームに対して、キャッシュラインを順次プリフェッチしていく処理は、上記のハードウェア方式と同様に、ハードウェアにより実行時に自動的に実施される。
図6にハイブリッド方式によるプリフェッチを行うためのコード例を示す。本例はC言語で記述され、配列aを連続的にアクセスするループを備える。ここで配列aの各要素は4バイトであるとする。ハイブリッド方式では、配列aのアクセスに対するプリフェッチ起動命令が本ループの直前に挿入される。図6では、プリフェッチ起動命令をstreamprefetchという記述により、ソースイメージで示している。streamprefetchの引数には、ループの初回イタレーションにおいて参照される配列aのアドレス&a[0]、データストリームのサイズ即ちループ全体で参照される要素数を示すN、データストリームが繰り返しごとに参照するアドレスの差を示す4、何要素分先読みするかを示す1が指定されている。
このようなプリフェッチ方式に関しては、非特許文献1に記載されている。
Andy D. Pimentel, Louis O. Hertzberger, Pieter Struik, and Pieter van der Wolf, Hardware versus Hybrid Data Prefetching in Multimedia Processors: A Case Study', In Proc. of the IEEE Int. Performance, Computing and Communications Conference, Feb. 2000.
ハイブリッド方式のプリフェッチでは、コンパイラがプリフェッチ対象のデータストリームを検出し、プリフェッチ起動命令をオブジェクトコードに挿入する必要がある。コンパイラのプリフェッチ処理は対象データが属するループを対象として行い、ループの開始前にプリフェッチ起動命令が実行されるようなコードを生成する。
例えば、図7のソースプログラムを考える。本例はC言語で記述され、i、j、kの3重ループ中に配列a、bの参照がある。ここで配列aに着目すると、aの参照が属する最内側ループ(kループ)に対する解析で、a[i][j][0]からa[i][j][99]までの要素を連続的にアクセスすることから、コンパイラはこの範囲をアクセスするデータストリームをプリフェッチ対象と認識し、図8に示すようにkループの直前にプリフェッチ起動命令を挿入する。
ところが、配列aのアクセスを3重ループ全体で考えると、本例の3重ループにおいてはa[0][0][0]からa[9][99][99]まで配列aの全要素をメモリ配置に従って順にアクセスしている。すなわち、配列aについては、この範囲全体を1つのデータストリームと考えることができる。この場合、プリフェッチ起動命令はiループの開始前に実行すればよいが、従来の方法では、コンパイラはkループの開始前にプリフェッチ起動命令を挿入する。従って、kループの実行ごとにプリフェッチ起動命令が実行されることとなる。従来の方法では、本来不要であるプリフェッチ起動命令の実行ごとに、プリフェッチストリームの登録や、先読みするデータのプリフェッチなど、プリフェッチの立ち上げオーバーヘッドがかかるため、実行時間の増加につながるという問題がある。
本発明は、上記事情に鑑みてなされたもので、ハイブリッド方式のプリフェッチ機構を備えたプロセッサに対するコード生成方法において、多重ループ内で参照されるデータストリームに対して、プリフェッチ起動命令を適切な位置に挿入することにより、プリフェッチ起動命令の実行回数を削減し、オブジェクトコードの実行性能向上を図ることを目的とする。
本発明は、ループに属するプリフェッチ対象データに対して、データが属するループの外側ループを順に辿り、そのループより内側の全ループのイタレーション間で対象データが連続的にアクセスされるようなループのうち最も外側のループを検出し、検出したループ全体で参照されるデータストリームに対するプリフェッチ起動命令を生成して挿入する。
具体的には、ソースプログラムをオブジェクトコードに変換するコンパイラ装置であって、前記ソースプログラムを解析し、当該ソースプログラムが備える多重ループのそれぞれのループについてループ表を生成するループ表生成手段と、前記ループの中で、当該ループが処理対象とするデータストリームが連続して参照されるループの中で、最も外側のループを抽出する連続参照ループ抽出手段と、前記連続参照ループ抽出手段で抽出されたループの直前に、メモリ上のデータを予めキャッシュ上に転送しておくプリフェッチ処理の開始を、当該プリフェッチ処理の対象とするデータストリームを指定して指示するプリフェッチ起動命令を挿入しオブジェクトコードを生成するオブジェクトコード生成手段と、を備えることを特徴とするコンパイラ装置を提供する。
本発明によれば、ハイブリッド方式のプリフェッチ機構を備えたプロセッサに対するコード生成方法において、多重ループ内で参照されるデータストリームに対して、プリフェッチ起動命令を適切な位置に挿入することにより、プリフェッチ起動命令の実行回数を削減し、オブジェクトコードの実行性能向上を図ることができる。
<<第一の実施形態>>
以下、図面を用いて本発明の実施の形態について説明する。
以下、図面を用いて本発明の実施の形態について説明する。
図1は、本実施形態によるコンパイラが稼動する計算機システムの構成図である。本計算機システムは、CPU201、ディスプレイ装置202、キーボード203、主記憶装置204、および外部記憶装置205を備える。キーボード203は、ユーザからのコンパイラ起動命令などの入力を受け付ける。ディスプレイ装置202はコンパイラ終了メッセージおよびエラーメッセージなどを表示する。外部記憶装置205には、ソースプログラム206とオブジェクトプログラム207が格納される。主記憶装置204には、コンパイラプログラム208、コンパイル過程で必要となる中間コード209とループ表210とが格納される。コンパイル処理は、CPU201がコンパイラプログラム208を実行することにより行われる。
図2に、図1のシステムで稼動するコンパイラプログラム208の処理手順を示す。
コンパイラプログラム208は、ソースプログラム206を読み込み、構文解析を行い、中間コード209を出力する(ステップ301:構文解析)。
次に、中間コード209を解析し、ソースプログラム206に含まれるループの集合を求め、ループ表210に記録する(ステップ302:ループ解析)。ループを解析し、ループ表210を生成する方法に関しては、例えば、Michael Wolfe著「High Performance Compilers for Parallel Computing」、Addison-Wesley Publishing Company, 1996の67頁に記載されている。
次に、コンパイラプログラム208は、各ループに対し、プリフェッチ処理を行う。まず、プリフェッチ処理が未処理であるループの有無を判定する(ステップ303)。判定は、例えば、ループ表に処理済みの有無を記録する欄を設け、その欄の記録を参照するなどの方法により行う。また、ループ表のループ番号順に処理を進めるよう構成してもよい。
未処理のループがある場合、未処理のループから1つループを取り出す(ステップ304)。取り出したループを対象にプリフェッチ処理を行った後(ステップ305)、ステップ303へ戻る。ステップ305での処理の詳細については、本発明の特徴となる部分であるので、後述する。
一方、コンパイラプログラム208は、ステップ303において未処理のループがないと判定した場合、ステップ306へ進み、中間コード209をオブジェクトプログラム207に変換し、出力する(ステップ306:コード生成)。
ここで、上記ステップ302のループ解析により生成されるループ表210について説明する。図3は、ループ表210の一例である。ループ表210には、ループ番号501、外側ループ502、制御変数503、初期値504、終値505、増分値506、ループ回数507が格納される。
ループ番号501はコンパイラ内でループを識別するための番号である。外側ループ502は、対象ループを取り囲むループのうち最も内側のループのループ番号である。対象ループが最も外側のループの場合、「なし」が外側ループ502として登録される。制御変数503は、対象ループの繰り返しを制御するループ制御変数である。初期値504、終値505、増分値506は、それぞれ、制御変数503(ループ制御変数)の初期値、終値、繰り返しごとの増分である。ループ回数507は、ループの繰り返し回数である。ループ回数507は制御変数503(ループ制御変数)の初期値、終値、増分値から求められる。
次に、上述のステップ305における1つのループに対するプリフェッチ処理の処理手順を、説明する。図4は、本実施形態のプリフェッチ処理の処理フローである。以下の処理はコンパイラプログラム208に従って、CPU201が行うものである。
処理対象ループ中に未処理かつプリフェッチの対象とすべき配列参照があるかどうかを判別する(ステップ101)。なお、各配列参照は、その参照を囲む最も内側のループで処理対象とするものとする。従って、対象ループに直接属する配列参照が処理対象となる。例えば、図7に示すソースプログラムでは、制御変数がiおよびjのループには、直接属する配列参照はない。一方、制御変数がkのループには、s=s+a[i][j][k]+b[i][j][k];で示される配列参照を含む処理ステップがあり、直接属する配列参照があると判別される。
また、本実施形態のプリフェッチ処理では、参照アドレスが連続的なデータストリームを対象とするため、繰り返しごとの参照アドレスの増分が一定で、その値が一定値(例えば、キャッシュラインサイズ)以下であるなどの判定基準も考慮し、対象配列を決める。
未処理の配列参照がある場合、その中から配列参照を1つ取り出しAとする(ステップ102)。
変数LOOPを処理対象ループに初期化する(ステップ103)。ここでは、ループ表210の処理対象ループのループ番号501を変数LOOPに代入する。以後、変数LOOPで示される処理対象のループを、LOOPと呼ぶ。
LOOPの外側ループの有無をループ表210の外側ループ502の値により判定し(ステップ104)、外側ループがある場合、外側ループを取り出す(ステップ105)。ステップ104で外側ループがないと判定した場合、ステップ108へ進む。
次に、配列Aが外側ループ502のイタレーション間で連続であるかどうかを判定する(ステップ106)。本ステップの判定手順の詳細は後で説明する。ステップ106で連続でないと判定した場合は、ステップ108へ進む。連続であると判定した場合は、ステップ107へ進んで変数LOOPをLOOPの外側ループ502に更新し、ステップ104へ戻り外側ループを辿って判定する処理を繰り返す。
ここまでの処理により、ステップ108への到達時には、LOOPおよびその内側の各ループから構成されるループネストの実行中、配列Aは連続的に参照されることになる。
そして、変数LOOPで示されるループの実行により参照される配列Aのデータ長を計算する(ステップ108)。配列Aは連続的に参照されるので、ここで計算するデータ長は、配列Aの添え字を解析してLOOPに関するストライドを求め、本ストライドとLOOPのループ回数の積により求めることができる。ここでストライドは、データストリームが繰り返しごとに参照するアドレスの差を要素数で示したものとする。
配列Aのプリフェッチ起動命令を生成し、LOOPの直前に挿入する(ステップ109)。プリフェッチ起動命令は、配列Aの初期アドレス、ステップ108で求めたデータ長などを引数として生成する。配列Aの初期アドレスは、配列Aの添え字に各ループ制御変数の初期値504を代入することなどによって求めることができる。
次に、上記ステップ106において外側ループイタレーション間の連続性を判定する判定処理の手順を説明する。図5は、本判定処理を説明するためのフローである。本判定処理もコンパイラプログラム208をCPU201が実行することにより実現される。
はじめに、本判定処理で用いる変数を初期化する(ステップ401)。具体的には、変数INNERLOOPに配列Aを含む現在プリフェッチ処理中のループ、すなわち、ステップ304で取り出したループのループ番号501を登録し、変数OUTERLOOPにステップ106で判定対象とする外側ループのループ番号501を登録する。以後、変数INTERLOOPで示されるループをINTERLOOPと、変数OUTERLOOPで示されるループをOUTERLOOPと呼ぶ。REFSIZEは配列Aの参照サイズを計算するための変数で、配列Aを含むループのループ回数507と配列Aを含むループにおける配列Aのストライドとの積を初期値に設定する。
ループ表210からINNERLOOPの外側ループ502を取り出し、OUTERLOOPと一致するかどうか判別する(ステップ402)。一致する場合にはステップ405へ進む。一致しない場合には、取り出した外側ループ502をINNERLOOPに登録し(ステップ403)、ステップ404へ進む。
REFSIZEにINNERLOOPのループ回数を掛けて更新した後(ステップ404)ステップ402へ戻る。
ステップ402、403、404を繰り返すことにより、OUTERLOOPの内側のループを実行した場合、すなわち、OUTERLOOPの1イタレーションを実行した場合に参照される配列AのデータサイズがREFSIZEに設定される。
一方、ステップ402において一致する場合、OUTERLOOPの1イタレーションごとの配列Aの参照アドレスの差が何要素分であるかを求め、変数OUTERSTRIDEに設定する(ステップ405)。
そして、OUTERSTRIDEとREFSIZEの差を計算し、この差の絶対値がα以下であるかどうかを判定する(ステップ406)。ここでαには、ハードウェアによるプリフェッチ動作が中断されないような小さな値を選ぶ。例えば、αに1キャッシュラインに含まれる配列要素数などを設定する。
ステップ406で差の絶対値がα以下であれば、連続であると判定し(ステップ407)、処理を終了する。一方、α以下でなければ、連続でないと判定し(ステップ408)、処理を終了する。
以上、本実施形態のプリフェッチ処理について説明した。
次に、図7に示すソースプログラムに、本実施形態のプリフェッチ処理を適用した場合の処理手順を説明する。以下についても、コンパイルプログラム208に従って、CPU201が処理を行う。
構文解析301の後、ループ解析302において図3に示すループ表を作成する。ここで、本実施形態では、ループ番号501は外側ループから順に1、2、3と付与される。
ステップ303、304において、未処理ループとして、ループ1、ループ2、ループ3が順に取り出される。しかし、ループ1およびループ2には、直接属する配列参照がないため、プリフェッチ処理305において、図4のステップ101で処理が終了する。すなわち、プリフェッチ処理は適用されない。一方、ループ3は、直接属する配列参照があり、プリフェッチ処理が行われる。以下では、ループ3に対するプリフェッチ処理305について説明する。
ステップ102において、まず配列参照a[i][j][k]を取り出す。ステップ103で変数LOOPにループ3を設定する。ステップ104でループ3の外側ループ502はループ2であるので、ステップ105へ進み、ループ2を取り出す。ステップ106では図5の処理手順に従い、配列参照a[i][j][k]がループ2のイタレーション間で連続であるか否かを判定する。
ステップ401において、変数INNERLOOPにループ3を、OUTERLOOPにループ2を設定する。配列参照a[i][j][k]のループ3におけるストライドは1要素、ループ回数は100であるので、REFSIZEに100(1×100)を設定する。
ステップ402において、ループ3の外側ループはループ2でOUTERLOOPと一致するので、ステップ405へ進む。
ステップ405でループ2における配列参照a[i][j][k]のストライドを計算する。ループ2が1回実行されるごとに制御変数jが1増加する。配列参照a[i][j][k]において2番目の次元の添え字がjであり、配列aの宣言a[10][100][100]から3番目の次元のサイズのサイズが100であるので、ループ2における配列参照a[i][j][k]のストライドは100である。
ここでは、αを例えば0とする。ステップ406では、OUTERSTRIDEとREFSIZEはともに100であるので、ステップ406の判定を満たす。従って、ステップ407へ進み、連続であると判定し、判定処理を終了し、図4のステップ107へ進む。
ステップ107では、変数LOOPにループ2を設定し、ステップ104へ戻る。ループ2には外側ループ502としてループ1があるので、ステップ105でループ1を取り出す。ステップ106では、配列参照a[i][j][k]がループ1のイタレーション間で連続であるかどうかを判定する。
ステップ401において、変数INNERLOOPにループ3を、変数OUTERLOOPにループ1を、配列参照a[i][j][k]のループ3におけるストライドは1要素、ループ回数は100であるため、変数REFSIZEに100を設定する。
ステップ402において、ループ3の外側ループはループ2でOUTERLOOPと一致しないので、ステップ403で変数INNERLOOPにループ2を設定する。
ステップ404において、ループ2のループ回数は100であるので、REFSIZEを100×100=10000に更新し、ステップ402へ戻る。
ステップ402において、ループ2の外側ループ502はループ1でOUTERLOOPと一致するので、ステップ405へ進む。
ステップ405でループ1における配列参照a[i][j][k]のストライドを計算する。ループ1が1回実行されるごとに制御変数iが1増加する。a[i][j][k]において1番目の次元の添え字がiであり、配列aの宣言a[10][100][100]から2番目および3番目の次元のサイズがそれぞれ100であるので、aのストライドは100×100=10000である。
ステップ406において、OUTERSTRIDEとREFSIZEはともに10000であるので、αが0の場合、本判定を満たし、ステップ407へ進む。そして、連続であると判定し、図4のステップ107へ進む。
図4のステップ107では、変数LOOPにループ1を設定してステップ104へ戻る。
ステップ104では、ループ1の外側ループがないため、ステップ108へ進む。
ステップ108では、ループ1で参照される配列参照a[i][j][k]のデータ長を計算する。ループ1におけるストライドは10000、ループ1のループ回数は10であるのでデータ長を100000とする。
ステップ109では、プリフェッチ起動命令streamprefetch(&a[0][0][0], 100000, 4, 1)を生成する。ここで、本命令の第1引数はループで参照される初期アドレス、第2引数はステップ108で求めたデータ長、第3引数は配列a[i][j][k]の参照ごとのアドレスの差をバイト数で示した値である。第4引数はa[i][j][k]が参照されたときに何要素先をプリフェッチするかを示す値である。本実施形態ではこの値を1とする。生成したプリフェッチ起動命令をループ1の直前に挿入する。
次に、ステップ101へ戻り、ループ内の次の配列参照b[i][j][k]の処理を行う。ステップ105でループ3の外側ループ502であるループ2を取り出し、ステップ106で、ループ3がループ2のイタレーション間で連続であるかを判定する。本判定処理は配列aで説明したのと同様であり、連続であると判定してステップ107へ進んで変数LOOPをループ2に更新する。
ステップ104へ戻り、ステップ105でループ2の外側ループ502であるループ1取り出し、ステップ106で、ループ2がループ1のイタレーション間で連続かどうかを判定する。
ステップ401において、変数INNERLOOPにループ3を、変数OUTERLOOPにループ1を、REFSIZEに100を設定する。
ステップ402において、ループ3の外側ループ502はループ2でOUTERLOOPと一致しないので、ステップ403で変数INNERLOOPにループ2を設定する。
ステップ404において、ループ2のループ回数は100であるので、REFSIZEを100×100=10000に更新し、ステップ402へ戻る。
ステップ402において、ループ2の外側ループ502はループ1でOUTERLOOPと一致するので、ステップ405へ進む。
ステップ405でループ1における配列参照b[i][j][k]のストライドを計算する。ループ1が1回実行されるごとに制御変数iが1増加する。配列参照b[i][j][k]において1番目の次元の添え字がiであり、配列bの宣言b[10][200][100]から2番目の次元のサイズが200、3番目の次元のサイズが100であるので、ループ1における配列参照bのストライドは200×100=20000である。
ステップ406において、OUTERSTRIDEが20000、REFSIZEが10000であるので、両者の差が所定範囲α(=0)外であるため、ステップ408へ進み、連続でないと判定し、図4の処理に戻る。
ここでは、ステップ106で連続でないと判定されたので、ステップ108へ進み、この時点のLOOPであるループ2で参照されるb[i][j][k]のデータ長を計算する。ループ2におけるストライドは100、ループ2のループ回数は100であるのでデータ長は10000である。
ステップ109ではプリフェッチ起動命令streamprefetch(&b[i][0][0], 10000, 4, 1)を生成する。生成したプリフェッチ起動命令をループ2の直前に挿入する。
ステップ101へ戻り、未処理のプリフェッチ対象配列がないため処理を終了する。
以上で説明したプリフェッチ処理の適用により、図7で示したループに対して、生成されるコードを図9に示す。
図9のコードを従来のプリフェッチ方法による図8のコードと比較すると、図8のコードでは各配列参照a[i][j][k]およびb[i][j][k]に対してそれぞれプリフェッチ起動命令が10×100=1000回実行されるのに対して、図9のコードでは配列参照a[i][j][k]に対するプリフェッチ起動命令の実行は1回、配列参照b[i][j][k]に対しては10回となり、プリフェッチ起動命令の実行回数を大幅に削減することができる。
すなわち、本実施形態によれば、多重ループにおいて連続的に参照されるデータストリームに対して、各外側ループのイタレーション間で連続であるかを判定する手段を設けることにより、連続的に参照されるループ範囲を求め、そのループ開始時にのみプリフェッチ起動命令を実行するコードを生成することができる。これにより、データ参照を含むループの開始前に毎回プリフェッチ起動命令を実行する場合と比較して、キャッシュミスの頻度を増加させることなく、プリフェッチ起動命令の実行回数を削減でき、プログラム実行の高速化が図れる。
本実施形態は、計算機において、オブジェクトプログラムの実行時間を削減する最適化機能を備えたコンパイラに適用できる。
201:CPU、202:ディスプレイ装置、203:キーボード、204:主記憶装置、205:外部記憶装置、206:ソースプログラム、207:オブジェクトプログラム、208:コンパイラ、209:中間コード、220:ループ表
Claims (6)
- ソースプログラムをオブジェクトコードに変換するコンパイラ装置であって、
前記ソースプログラムを解析し、当該ソースプログラムが備える多重ループのそれぞれのループについてループ表を生成するループ表生成手段と、
前記ループの中で、当該ループが処理対象とするデータストリームが連続して参照されるループの中で、最も外側のループを抽出する連続参照ループ抽出手段と、
前記連続参照ループ抽出手段で抽出されたループの直前に、メモリ上のデータを予めキャッシュ上に転送しておくプリフェッチ処理の開始を、当該プリフェッチ処理の対象とするデータストリームを指定して指示するプリフェッチ起動命令を挿入しオブジェクトコードを生成するオブジェクトコード生成手段と、を備えること
を特徴とするコンパイラ装置。 - 請求項1記載のコンパイラ装置であって、
前記連続参照ループ抽出手段は、
前記ループ表に従って、内側のループから順に、判別対象ループとして当該判別対象ループが処理対象とするデータストリームが、当該判別対象ループの外側ループのうち最も内側のループ(近接外側ループ)のイタレーション間で連続して参照されるか否かを判別し、
連続して参照されると判別された場合、当該近接外側ループを前記判別対象ループとして前記判別を、前記ループ表の全てのループについて繰り返し、最後のループを前記最も外側のループとして抽出し、
連続して参照されないと判別された場合、当該判別対象ループを前記最も外側のループとして抽出すること
を特徴とするコンパイラ装置。 - メモリ上のデータを予めキャッシュ上に転送しておくプリフェッチ処理を行う機構を備えたプロセッサが、記憶装置に格納された多重ループを有するソースプログラムに対し、前記プリフェッチ処理の対象とするデータストリームを指定して前記プリフェッチ処理の開始を指示するプリフェッチ起動命令を挿入しオブジェクトコードを生成する方法であって、
前記プロセッサが前記ソースプログラムを解析し、前記多重ループの各ループのループ表を生成するループ表生成ステップと、
前記ループ表に従って、内側のループから順に全てのループについて、当該ループが処理対象とするデータストリームが連続して参照されるか否か判別し、連続して参照されると判別されたループの中で、最も外側のループを、当該ループの直前に前記プリフェッチ起動命令を挿入すべきループと決定するプリフェッチ起動命令挿入位置決定ステップと、
前記プリフェッチ起動命令挿入位置決定ステップにおいて決定されたループの直前に当該プリフェッチ起動命令を挿入し、オブジェクトコードを生成するオブジェクトコード生成ステップと、
を備えることを特徴とするオブジェクトコード生成方法。 - メモリ上のデータを予めキャッシュ上に転送しておくプリフェッチ処理を行う機構を備えたプロセッサが、記憶装置に格納された多重ループを有するソースプログラムに対し、前記プリフェッチ処理の対象とするデータストリームを指定して前記プリフェッチ処理の開始を指示するプリフェッチ起動命令を直前に挿入するループを決定するプリフェッチ起動命令挿入位置決定方法であって、
前記プロセッサが、前記記憶装置に格納されたソースプログラムのループを解析し、当該解析結果に従って、最も内側のループから順に、前記プリフェッチ処理の対象となるデータストリームを処理対象として有するループ全てについて、
1)当該ループ内にプリフェッチ処理の対象とすべきデータストリームがあるか否かを判別するデータ判別ステップと、
2)前記データストリームがあった場合、当該ループに外側ループがあるか否かを判別するループ位置判別ステップと、
3)当該ループに外側ループがあった場合、当該データストリームが前記外側ループのイタレーション間で連続であるか否かを判別する連続性判別ステップと、を繰り返し、
前記ループ位置判別ステップで、当該ループに外側ループがないと判別された場合、または、前記連続性判別ステップにおいて当該データストリームが連続でないと判別された場合、当該ループを前記プリフェッチ起動命令を直前に挿入するループと決定すること
を特徴とするプリフェッチ起動命令挿入位置決定方法。 - メモリ領域に連続的に配置されるデータストリームへの参照が、多重ループを備える記憶装置に格納されたソースプログラムにおいて判定対象ループの外側ループの内最も内側ループ(近接外側ループと呼ぶ。)のイタレーション間で連続であるか否かを判定する連続性判定方法であって、
プロセッサが前記記憶装置に格納されたソースプログラムを解析し、当該解析結果を用いて、前記判定対象ループのループ回数と前記データストリームが当該ループのイタレーション毎に参照するアドレスの差を要素数で示したストライドとの積を判定対象ループストライドサイズとして算出する判定対象ループストライド算出ステップと、
プロセッサ前記記憶装置に格納されたソースプログラムを解析し、当該解析結果を用いて、前記近接外側ループにおける、前記データストリームに対する前記ストライドを外側ループストライドサイズとして取得する外側ループストライド取得ステップと、
プロセッサが、前記判定対象ループストライドサイズと前記外側ループストライドサイズとを比較し、両者が合致しない場合連続であると判定する連続性判定ステップと、を備えること
を特徴とする連続性判定方法。 - コンピュータを、
ソースプログラムを解析し、当該ソースプログラムが備える多重ループのそれぞれのループについてループ表を生成するループ表生成手段と、
前記ループの中で、当該ループが処理対象とするデータストリームが連続して参照されるループの中で、最も外側のループを抽出する連続参照ループ抽出手段と、
前記連続参照ループ抽出手段で抽出されたループの直前に、メモリ上のデータを予めキャッシュ上に転送しておくプリフェッチ処理の開始を、当該プリフェッチ処理の対象とするデータストリームを指定して指示するプリフェッチ起動命令を挿入しオブジェクトコードを生成するオブジェクトコード生成手段と、として機能させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005149446A JP2006330813A (ja) | 2005-05-23 | 2005-05-23 | プリフェッチ起動命令挿入機能を備えたコンパイラ装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005149446A JP2006330813A (ja) | 2005-05-23 | 2005-05-23 | プリフェッチ起動命令挿入機能を備えたコンパイラ装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2006330813A true JP2006330813A (ja) | 2006-12-07 |
Family
ID=37552474
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2005149446A Pending JP2006330813A (ja) | 2005-05-23 | 2005-05-23 | プリフェッチ起動命令挿入機能を備えたコンパイラ装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2006330813A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9483244B2 (en) | 2014-05-15 | 2016-11-01 | Fujitsu Limited | Compiling method and compiling device |
US9830268B2 (en) | 2014-05-14 | 2017-11-28 | Fujitsu Limited | Arithmetic processing device for disabling an unnecessary prefetch command and control method of arithmetic processing device for disabling an unnecessary prefetch command |
-
2005
- 2005-05-23 JP JP2005149446A patent/JP2006330813A/ja active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9830268B2 (en) | 2014-05-14 | 2017-11-28 | Fujitsu Limited | Arithmetic processing device for disabling an unnecessary prefetch command and control method of arithmetic processing device for disabling an unnecessary prefetch command |
US9483244B2 (en) | 2014-05-15 | 2016-11-01 | Fujitsu Limited | Compiling method and compiling device |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7681188B1 (en) | Locked prefetch scheduling in general cyclic regions | |
US6539541B1 (en) | Method of constructing and unrolling speculatively counted loops | |
US9798528B2 (en) | Software solution for cooperative memory-side and processor-side data prefetching | |
US6675374B2 (en) | Insertion of prefetch instructions into computer program code | |
Hwu et al. | Compiler technology for future microprocessors | |
US8413127B2 (en) | Fine-grained software-directed data prefetching using integrated high-level and low-level code analysis optimizations | |
US6959435B2 (en) | Compiler-directed speculative approach to resolve performance-degrading long latency events in an application | |
US6721943B2 (en) | Compile-time memory coalescing for dynamic arrays | |
US20040093591A1 (en) | Method and apparatus prefetching indexed array references | |
JP4751510B2 (ja) | メモリアクセス最適化方法 | |
JP3546341B2 (ja) | 多重ループ向けデータプリフェッチ方法およびプログラム生成方法 | |
Smithson et al. | Binary rewriting without relocation information | |
US6314431B1 (en) | Method, system, and apparatus to improve instruction pre-fetching on computer systems | |
US20090049434A1 (en) | Program translating apparatus and compiler program | |
WO2008110418A1 (en) | Uniform external and internal interfaces for delinquent memory operations to facilitate cache optimization | |
US6681318B2 (en) | Method and apparatus for using an assist processor to prefetch instructions for a primary processor | |
US20030088863A1 (en) | Method and apparatus for selecting references for prefetching in an optimizing compiler | |
US7257810B2 (en) | Method and apparatus for inserting prefetch instructions in an optimizing compiler | |
CN111159062A (zh) | 一种缓存数据的调度方法、装置、cpu芯片及服务器 | |
JP2003108386A (ja) | 間接参照データプリフェッチ方法 | |
US7313787B2 (en) | Compiler and method for optimizing object codes for hierarchical memories | |
JP2006330813A (ja) | プリフェッチ起動命令挿入機能を備えたコンパイラ装置 | |
JP2014112327A (ja) | 変換プログラム、変換装置及び変換方法 | |
JPH10333916A (ja) | ノンブロッキングキャッシュ対応のコードスケジューリング方式及びそのプログラムを記録した記憶媒体 | |
JP5251688B2 (ja) | コンパイラプログラムおよびコンパイラ装置 |