JP4064869B2 - コード変換装置、コード変換方法及びプログラム - Google Patents

コード変換装置、コード変換方法及びプログラム Download PDF

Info

Publication number
JP4064869B2
JP4064869B2 JP2003151478A JP2003151478A JP4064869B2 JP 4064869 B2 JP4064869 B2 JP 4064869B2 JP 2003151478 A JP2003151478 A JP 2003151478A JP 2003151478 A JP2003151478 A JP 2003151478A JP 4064869 B2 JP4064869 B2 JP 4064869B2
Authority
JP
Japan
Prior art keywords
data
iteration
machine language
code
load
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 - Fee Related
Application number
JP2003151478A
Other languages
English (en)
Other versions
JP2004355279A (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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2003151478A priority Critical patent/JP4064869B2/ja
Publication of JP2004355279A publication Critical patent/JP2004355279A/ja
Application granted granted Critical
Publication of JP4064869B2 publication Critical patent/JP4064869B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Description

【0001】
【発明の属する技術分野】
本発明は、Java(Javaは登録商標)のバイトコード等を機械語コードへ変換するコード変換装置、コード変換方法、JITコンパイラ、JITコンパイル方法及びプログラムに係り、詳しくは適切なプリフェッチを組み込んだ機械語コードを生成するコード変換装置、コード変換方法及びプログラム、並びにヒープメモリ内のデータ構造に基づき適切な機械語コードを生成するJITコンパイラ、JITコンパイル方法及びプログラムに関するものである。
【0002】
【従来の技術】
最初に、Java Just-In-Time(以下JIT)コンパイラについて説明する。
【0003】
Javaとは、サン・マイクロシステムズ社(Sun Microsystems Inc.)によって開発されたオブジェクト指向のプログラミング言語である。Javaプログラミング言語で記述されたプログラムは、Javaバイトコードコンパイラによってバイトコード(bytecode)と呼ばれる形式のプログラムに変換され、Java仮想計算機(Java virtual machine; JVM)によって実行される。Java仮想計算機は、実際の計算機上で稼動するプログラムであり、計算機毎のプロセッサおよびオペレーティングシステムの違いを吸収して、単一のJavaプログラミング言語による実行環境を異なる種類の計算機上で提供する。
【0004】
バイトコード形式のプログラムは、Java仮想計算機が稼動するいかなる計算機においても実行することができる。しかし、Java仮想計算機はバイトコードを1命令ずつ解釈して実行するため、プログラムの実行が遅いという問題がある。特に、同じプログラムをCやC++などのプログラミング言語で記述したものと実行時間を比較すると、著しく実行速度が遅い。なぜならば、これらの言語では、コンパイラによってプログラムを予め実際の計算機上で稼動する機械語命令形式に変換してから実行するからである。この問題に対して、Java仮想計算機はバイトコードの実行中に、バイトコード形式のプログラムを機械語命令形式のプログラムにコンパイルし、得られた機械語命令形式のプログラムを実際の計算機上で直接実行することでプログラムの実行速度を向上する。 このように、バイトコードから機械語への変換をプログラムの実行時に行うコンパイラを、Java JITコンパイラと呼ぶ。この方式は、プログラムの実行中にJITコンパイルを行うため、プログラムの実行時間に加えてJITコンパイルの時間が必要になるが、機械語形式による実行が高速であるため、Java仮想計算機のみによるバイトコードの実行より遥かに高速である。一般にJava JITコンパイラは、Javaプログラミング言語における手続きであるメソッド(method)を単位として、Javaプログラムがメソッドを呼び出す直前にJITコンパイルを行う。また、JITコンパイルにかかる時間を減らすため、Java仮想計算機はプログラム中で頻繁に実行されるメソッドだけをJITコンパイルする。
【0005】
次に、JITコンパイラが生成した機械語命令形式のプログラムにおける、キャッシュメモリへのプリフェッチ命令の利用について説明する。
【0006】
近年のプロセッサでは、演算の実行が主記憶の参照に比べて著しく高速であるため、プロセッサが頻繁に使用するデータの一部をプロセッサ内の高速だが容量が限られているキャッシュメモリに格納する。ロード命令が読み出すアドレス(address; メモリ上の番地)がキャッシュメモリ内に存在する場合は、ロード命令は高速に実行される。ロード命令が読み出すアドレスがキャッシュメモリ内に存在しない場合は、最近参照されていないアドレスがキャッシュメモリから追い出され、代わりに今参照されたアドレスがキャッシュメモリ内に読み込まれるまで、ロード命令の実行は遅延される。これをキャッシュミス(cache miss)と呼ぶ。
【0007】
プログラムが同じメモリアドレスを繰り返し参照する場合にはキャッシュメモリによるメモリ参照の高速化の効果が大きいが、プログラムが次々と異なるアドレスを参照する場合には、頻繁にキャッシュミスが発生し、キャッシュメモリによるメモリ参照の高速化の効果が小さくなる。この問題に対して、近年のプロセッサはプリフェッチ命令を提供している。プリフェッチ命令はメモリ参照を行う機械語命令で、参照されたメモリがキャッシュメモリ内に存在しない場合は、通常のロード命令と同様、主記憶からキャッシュメモリへのメモリ内容の読み込みを行う。しかし、プリフェッチ命令は読み出された結果をプロセッサに返さないため、プリフェッチ命令の実行は他の命令を遅延することがない。プリフェッチ命令をロード命令より充分先に実行しておくことで、ロード命令を実行するときのキャッシュミスを防ぐことができる。
【0008】
Java仮想計算機が、配列(array)やオブジェクト(object)などのJavaプログラムで使用されるデータ構造を格納するメモリの領域を、ヒープメモリ(heap memory)と呼ぶ。Java仮想計算機がバイトコード形式のプログラムを実行する場合も、Java JITコンパイラによって生成された機械語命令形式のプログラムを実行する場合のいずれも、データ構造は同一のヒープメモリ上に生成される。Javaプログラムでは、配列やオブジェクトが頻繁に生成されるため、メモリ参照の割合が多い。したがってJavaプログラムの実行を高速化するには、キャッシュミスによる性能低下を防ぐことが重要である。その際、JITコンパイラが生成する機械語命令形式のプログラム中に、ヒープ上のアドレスに対するプリフェッチ命令を挿入することで、配列やオブジェクト中のデータに対するロード命令が実行されるときのキャッシュミスを防ぐことができる。
【0009】
プリフェッチングは、キャッシュミスが頻繁に発生するプログラムを高速化するための有効な手段である。多くの数値計算プログラムは、巨大なベクトルや行列を参照するためキャッシュミスの頻度が高いが、Javaなど近年のオブジェクト指向プログラミング言語においても、大量のオブジェクトがヒープメモリ上に生成されるため、それらを参照する際にキャッシュミスが頻繁に発生する。プリフェッチングを用いてプログラムを高速化するためには、以下の三点に注意する必要がある。第一に、プリフェッチ命令とデータを実際に参照するロード命令の間隔を適切に選ぶ必要がある。プリフェッチ命令の実行が遅すぎると、ロード命令が実際にデータを参照する時に、キャッシュメモリ上にデータが間に合わない可能性がある。プリフェッチ命令の実行が早すぎると、ロード命令が実際にデータを参照する前に、プリフェッチされたデータがキャッシュメモリから追い出されてしまう可能性がある。第二に、プリフェッチ命令はメモリ参照を行うので、プログラムの実行中にプロセッサと主記憶の間のデータ転送能力に余裕がない場合は性能低下を招く可能性がある。第三に、プリフェッチされるアドレスの計算のオーバーヘッド(overhead; 余分な手間)をできるだけ軽減する必要がある。
【0010】
従来、配列参照を対象とするプリフェッチングについては、有効なアルゴリズムが数多く開発されてきた(例:非特許文献1)。しかし、ポインタ参照を対象とするプリフェッチングは、プリフェッチされるアドレスを計算するためにポインタ参照が必要になるため、有効なアルゴリズムを開発することが困難であった(例:非特許文献2,3)。例として、リスト(list)構造を先頭から辿るループ(loop; プログラム中の繰り返し)について考える。ループの第i番目のイテレーション(iteration; ループ中の命令全体の第i回目の繰り返し)において、第i+c番目のイテレーションで参照されるリストの要素をプリフェッチするためには、c回のポインタ参照を行わなければプリフェッチされるアドレスを計算することができない。
【0011】
これに対して近年、配列参照とポインタ参照を統一的に扱うことができるプリフェッチングアルゴリズムが提案されている(例:非特許文献4,5)。非特許文献4,5は、Javaではなく、C言語に関するものである。非特許文献4,5の著作者はユフォン・ウ(Youfeng Wu)及びその他であるので、以降、非特許文献4,5に開示されている技術内容については「Wuら」と著作者名で特定することにする。Wuらの手法は、ポインタ参照を行うロード命令によるロードデータのアドレスが、連続したイテレーションにおいてしばしば定数ストライド(stride; 幅)の増減(注:増だけでなく、減もあり得る。)をするという観測に基づく。例として、再びリストを先頭から辿るループについて考える。もし、プログラムがリストの各要素を先頭から順番にヒープメモリ上にアロケート(allocate; 場所を確保)し、各要素の大きさがほぼ同じであったとすれば、リストを辿るポインタ参照のためのロード命令によるロードデータのアドレスは、連続したイテレーションにおいて定数ストライドの増減をする可能性が高い。Wuらは、ロード命令によるロードデータのアドレスの定数ストライドを検出するため、プログラムの実行中においてロード命令によるロードデータのアドレスの前回との差分をプロファイル(profile; 値の履歴を集計)し、オフライン(off-line; プログラムの実行後。注:Wuらの技術はC言語に係るものであるので、コンパイラの作動前に、すなわちコンパイラの非作動期間としてのオフライン期間にプロファイルを解析する。)の解析で検出した定数ストライドの値を使って、プログラムの再コンパイル時にプリフェッチ命令を挿入するという手法を開発した。
【0012】
【非特許文献1】
トッド・シー.・マウリィ、モニカ・エス.・ラム及びアヌープ・グプタ著「プリフェッチングのためのコンパイラアルゴリズムの設計及び評価」プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第5回国際会議会議録、1992年10月、p.62−73( Todd C. Mowry, Monica S. Lam, and Anoop Gupta, "Design and Evaluation of a Compiler Algorithm for Prefetching", in Proc. of the Fifth International Conference on Architectural Support for Programming Languages and Operating Systems, pp. 62-73, October 1992.)
【非特許文献2】
チ−クォン・ルク及びトッド・シー.・マウリィ著「再帰データ構造のためのコンパイラベースのプリフェッチング」、プログラミンク言語及びオペレーティングシステムのためのアーキテクチャサポートに関する第7回国際会議会議録、1996年10月、p.222−233( Chi-Keung Luk and Todd C. Mowry, "Compiler-Based Prefetching for Recursive Data Structures", in Proc. of the 7th International Conference on Architectural Support for Programming Languages and Operating Systems, pp. 222-233, October 1996.)
【非特許文献3】
ブレンドン・カフーン及びカスリン・エス.・マンキンリィ著「Javaにおけるリンクデータ構造をプリフェッチングするソフトウェアのためのデータフロー解析」、2001年9月( Brendon Cahoon and Kathryn S. McKinley, "Data Flow Analysis for Software Prefetching Linked Data Structures in Java", in Proc. of the International Conference on Parallel Architectures and Compiler Techniques, September 2001.)
【非特許文献4】
ユフォン・ウ、マウリシオ・セラノ、ラケシュ・クリッシュネイヤー、ウェイ・リ及びヤッセ・ファン著「不規則的なコードのためのストライドプリフェッチングを案内する値プロファイル」コンパイラ構造に関する第11回国際会議会議録、2002年4月( Youfeng Wu, Mauricio Serrano, Rakesh Krishnaiyer, Wei Li, and Jesse Fang, "Value-Profile Guided Stride Prefetching for Irregular Code", in Proc. of the 11th International Conference on Compiler Construction, pp. 307-324, April 2002, LNCS 2304.)
【非特許文献5】
ユフォン・ウ著「コンパイラプリフェッチングにおける不規則プログラム及びその使用においての規則的ストライドパターンの効率的発見」プログラミング言語設計及び実装に関するACM SIGPLANの会議録、2002年6月、p.210−221(Youfeng Wu, "Efficient Discovery of Regular Stride Patterns in Irregular Programs and Its Use in Compiler Prefetching", in Proc. of the ACM SIGPLAN Conference on Programming Language Design and Implementation, pp. 210-221, June 2002.)
【0013】
【発明が解決しようとする課題】
Wuらの手法は従来のポインタ参照を対象とするプリフェッチングに比べて大きな性能向上を実現することが可能であるが、以下の二点において改善の余地がある。
(a)Wuらの手法は、同一のロード命令によるロードデータのアドレスが連続したイテレーション間において定数ストライドを示す場合にのみプリフェッチ命令を挿入する。この手法は、プリフェッチされるアドレスを、ロード命令によるロードデータのアドレスに定数を加えることで計算できるという利点があるが、このような定数ストライドが存在しないプログラムには有効ではない。
(b)Wuらの手法は、まず最初に定数ストライドを検出するためにプロファイル取得用の命令を含んだプログラムを実行する必要がある。Wuらの実験では、定数ストライドの検出に必要な実行時間は、プログラム中の実行頻度を集計するプロファイリングに対して+17%増加する。このオーバーヘッドは、Wuらが適用したC原語のコンパイルの場合には、ある程度許容できるが、Javaのようにプロファイルの取得がオンライン(on-line; プログラムの実行中)で行われる環境では無視できない。
【0014】
本発明の目的は、イテレーション間定数ストライド以外のストライドを利用して、キャッシュミスを抑制した機械語プログラムを生成するコード変換装置、コード変換方法及びプログラムを提供することである。
【0015】
本発明の他の目的は、プロファイルの作成及び参照を省略して、ヒープメモリ内のデータ構造に基づく有効な機械語プログラムを高速生成するJITコンパイラ、JITコンパイル方法及びプログラムを提供することである。
【0016】
【課題を解決するための手段】
変換処理対象コードを機械語コードへ変換する本発明のコード変換装置は次のものを有している。
所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目手段、
各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目手段、
ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出手段、
前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算手段、
相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定手段、
ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成手段、及び
プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成手段。
【0017】
バイトコードを実行するJava仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のJITコンパイラは次のものを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段。
【0018】
変換処理対象コードを機械語コードへ変換する本発明のコード変換方法は次のステップを有している。
所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目ステップ、
各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目ステップ、
ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出ステップ、
前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算ステップ、
相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定ステップ、
ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成ステップ、
プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成ステップ。
【0019】
バイトコードを実行するJava仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する本発明のJITコンパイル方法は次のステップを有している。
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ。
【0020】
本発明のコード変換用プログラムは、前述のコード変換装置の各手段としてコンピュータを機能させ、あるいは前述のコード変換方法の各ステップをコンピュータに実行させる。また、本発明のJITコンパイラ用プログラムは、前述のJITコンパイラの各手段としてコンピュータを機能させ、あるいは前述のJITコンパイル方法の各ステップをコンピュータに実行させる。
【0021】
【発明の実施の形態】
以降、本発明をその実施の形態及び実施例について具体的に説明する。なお、本発明は実施の形態及び実施例に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【0022】
本実施の形態が基づく基本思想は次の2つである。
(1)連続したイテレーションにおける同一のロード命令によるロードデータのアドレス間の定数ストライド(inter-iteration constant stride; 以下イテレーション間の定数ストライド)に加えて、同一のイテレーションにおける異なるロード命令によるロードデータのアドレス間の定数ストライド(intra-iteration constant stride; 以下イテレーション内の定数ストライド)を検出する。プリフェッチの対象を、1)イテレーション間の定数ストライドを持つロード命令L1、2)ロード命令L1の値をアドレスとしてメモリ参照を行うロード命令(L2)、3)ロード命令L2とイテレーション内定数ストライドを持つロード命令L3、に拡張することで、プリフェッチングの適用範囲を広げる。
(2)JITコンパイル時に、メソッドが呼び出されるときの実際の引数の値を使って、プリフェッチ命令を挿入しようとしているループを、先頭から数イテレーションだけ副作用(注:メインメモリにデータを書き込むことは状態の変更に繋がるので、「副作用」と呼んでいる。)を起こさずに部分的に評価し、イテレーション間およびイテレーション内の定数ストライドを検出する。以下では、この操作をオブジェクトインスペクション(object inspection)と呼ぶ。この方法は実際のヒープメモリ上のデータ構造を参照することができるという利点がある。またプロファイルを取得するオーバーヘッドはプログラムの実行時(注:プログラムの実行時間又は実行期間とは、JITコンパイラの処理時間に対して、Java仮想計算機がJITコンパイラの生成した機械語コード部分を実行している時間又は期間を言うものとする。)ではなくJITコンパイル時だけ必要である。JITコンパイラの時間はプログラムの実行時間に比べて小さいため、定数ストライドの検出は極めて少ない実行時間で実現できる。
【0023】
以下において、本実施の形態の全体の手順を述べる。
【0024】
本実施の形態は、Java JITコンパイラがバイトコードを機械語命令にJITコンパイルする際に、ロード命令によるロードデータのアドレス間の定数ストライドを利用したプリフェッチ命令を生成することを目的とする。Java JITコンパイラはJava仮想計算機がJavaメソッドを実行する直前に呼び出され、JITコンパイル対象となるメソッドを実行するために必要な引数はJava仮想計算機のスタック(メソッドの実行に必要なデータを格納するメモリ領域)上に用意されている。メソッドのJITコンパイルは、初回であっても最適化のための再コンパイルであっても構わない。
【0025】
プリフェッチングは、入力となるJavaメソッドを表す中間コードを、プリフェッチ命令を含む中間コード(intermediate code)に変換することで実現される。与えられたJavaメソッドに対して、コンパイラはメソッド内の制御フローグラフのループを検出して、ループネスティングフォレスト(loop nesting forest; LNF; ループの入れ子関係を表現する木構造の集まり)を生成する。LNFの各頂点はループを、LNFの辺はループ間の入れ子関係を表す。本実施の形態のプリフェッチングアルゴリズムは、LNFの各木構造をメソッド内の実行順に従って探索し、木構造内の各ループをポストオーダー(post-order; 木の節点を子供から親の順に探索する順序)、すなわち内側のループから外側のループの順に探索する。
【0026】
各ループにおいて、本実施の形態のアルゴリズムは以下の三段階の操作を行う。
(a)ループ内のロード命令の依存関係を表現するグラフ(load dependence graph; 以下ロード依存グラフ)を生成する。ロード依存グラフは、イテレーション内定数ストライドの存在を調べるロード命令を、データ依存があるロード命令の組に限定して、JITコンパイル時のオーバーヘッドを軽減するために使用される。
(b)オブジェクトインスペクションによってループを先頭から数イテレーションだけ評価し、ロード依存グラフ上でイテレーション間およびイテレーション内の定数ストライドの有無を調べる。定数ストライドが存在する場合は、グラフの注釈として定数ストライドの値を記録する。
(c)ロード依存グラフにおいて定数ストライドを持つロード命令について、プリフェッチ命令の挿入が有効かどうかを予測し、効果があると思われるロード命令に対してプリフェッチ命令を生成する。
【0027】
繰り返し回数の少ないループに含まれるロード命令については、Wuらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【0028】
繰り返し回数の少ないループに含まれるロード命令については、Wuらの手法と同様に、それらが外側のループに存在するとみなす。本実施の形態のアルゴリズムでは、ループの繰り返し回数が小さいことをオブジェクトインスペクションの間に検出する。
【0029】
以下で、上記(a)〜(c)の各段階の詳細を述べる。
【0030】
[(a)ロード依存グラフの生成]
ロード依存グラフは、ロード命令を頂点(vertex)とし、ロード命令間のデータ依存関係を辺(edge)とする有向グラフ(directed graph)である。ロード依存グラフは、プリフェッチングの対象となるループ内で、連続したポインタ参照を辿るロード命令を検出するために生成される。各頂点は、オブジェクトへの参照を引数として受け取りメモリ参照を行うようなロード命令である。各有向辺(L1, L2)は、ロード命令L2がロード命令L1に対して直接データ依存することを表す。中間コードとしてJavaバイトコードを用いた場合、ロード依存グラフの頂点となる命令は、getfield, getstatic, aaload, iaload, daload, arraylengthなどである。このうち、グラフの中で後継頂点を持つ可能性がある命令は、オブジェクトの参照を生成する命令、すなわちaaload(配列の要素のロード), getfield(オブジェクトのフィールド変数のロード), getstatic(クラスの静的変数のロード)である。与えられたループの内側にループがあって、内側のループの繰り返し回数が少ない場合は、内側のループ内のロード命令も同じロード依存グラフの頂点として扱う。ロード依存グラフはメソッド内の使用・定義連鎖など、中間コード間のデータ依存関係を表すグラフから生成することができる。
【0031】
[(b)オブジェクトインスペクション]
ロード依存グラフを生成したら、オブジェクトインスペクションによって定数ストライドを検出する。オブジェクトインスペクションでは、与えられたループの中の命令を実際のメソッドの引数の値を用いて定数回(例えば20回)だけ部分評価(partial interpretation)し、各ロード命令によるロードデータのアドレスをロード依存グラフに記録する。部分評価が終了したら、アドレスの履歴から定数ストライドの有無を計算する。ロード依存グラフの各頂点のアドレスについて、連続したイテレーション間の定数ストライドを調べ、有向辺で結ばれたロード命令によるロードデータのアドレスの組について、同じイテレーション内の定数ストライドを調べる。計算されたアドレスの差分が、大部分(例えば75%以上。注:キャッシュメモリへのプリフェッチはキャッシュラインを単位に実施されるので、ストライドに多少の誤差があっても、定数ストライドに基づくプリフェッチにより目的(target)のデータはキャッシュメモリに書き込まれる。)のイテレーション間及びイテレーション内で同じ値であれば、ロード命令が定数ストライドを持つとみなして、対応する頂点または辺に定数ストライドの値を記録する。
【0032】
オブジェクトインスペクションは、メソッド内の中間コードをメソッドの先頭から順に部分評価する。メソッドの引数が与えられても、全ての命令の評価において引数が計算できるとは限らない。このような場合は、命令の引数は「不定値」という特別な値を取るとみなす。引数に不定値を含むような命令の評価結果はやはり不定値である。
【0033】
オブジェクトインスペクションはJITコンパイル時の解析であり、Javaプログラムの実行に対して副作用を与えないようにする必要がある。特に、ストア命令を評価するときにメモリに書き込みを行なってはならない。このため、JITコンパイル時にJava仮想計算機のスタック(stack)の複製を用意し、Javaプログラムのローカル変数(local variable)への書き込みは複製されたスタック上で行なう。また、ヒープメモリ上のオブジェクトに対するストア命令の評価は、書き込まれるアドレスと値の組をハッシュテーブル(hash table)に記録することで実現し、オブジェクトや配列に対するロード命令を評価する際には、最初にこのハッシュテーブルの値を検索する。同様な理由で、JITコンパイル時に仮想的なヒープメモリを用意し、オブジェクトを生成する命令の評価を行なう。
【0034】
オブジェクトインスペクションによる評価がプリフェッチの対象となるループの入り口に到達する前に、別のループに出会う可能性がある。このような別のループについては、ループ中の命令を一回だけ評価する。なぜならば、このようなループの評価の結果が目標とするループのイテレーションの初期値に影響を与えることは少ないからである。例えば、配列の要素を辿るループでは、配列の添字の変数は0に初期化されることが多いし、オブジェクトのリストを辿るループでは、リストの要素へのポインタは引数の値に初期化されることが多い。また、オブジェクトインスペクションのオーバーヘッドを低く抑えるためにも、他のループが実際に終了するまで評価するのは現実的でない。
【0035】
他のメソッドへの呼び出しは単に無視される。メソッド呼び出しが値を返す場合は、不定値を返すとみなす。解析の精度を上げる方法として、メソッド呼び出しにおいて、さらに呼び出されるメソッド内のオブジェクトインスペクションを行なうという手続き間解析(inter-procedural analysis)の手法が考えられるが、JITコンパイル時間との兼ね合いを考慮する必要がある。
【0036】
[(c)プリフェッチ命令の生成]
オブジェクトインスペクションの後、ロード依存グラフの頂点のうち定数ストライドを持つものに対してプリフェッチ命令を生成する。最初に、各定数ストライドに対して生成するコード列について説明する。次に、効果的で冗長でないプリフェッチ命令を生成するための、プリフェッチによる効果の解析方法について説明する。最後に、本実施の形態で前提とする二種類のプリフェッチ命令の、機械語命令に対する対応について説明する。
【0037】
(c.1)コード列
ロード依存グラフの頂点Lxがイテレーション間定数ストライドdを持つとする。 頂点Lxが後継頂点(adjacents)を持たないか、または全ての後継頂点がイテレーション間定数ストライドを持つ場合、cイテレーション後におけるロード命令Lxが参照するデータを現在のイテレーションでプリフェッチするためには、A(L)を現在のイテレーションにおいてロード命令Lが参照するアドレスとすると、以下のコードを生成すればよい。なお、*は乗算を意味する。
prefetch (A(Lx) + d*c);
【0038】
ここで、prefetchは与えられたアドレスをキャッシュメモリ内にプリフェッチする命令を表す。今度は、頂点Lxがイテレーション間定数ストライドを持たない後継頂点Lyを持つとする。ロード命令LxおよびLyがcイテレーション後に参照するデータをプリフェッチするためには、以下のコードを生成すればよい。
a = spec_load (A(Lx) + d*c);
prefetch (F[Lx,Ly] (a));
【0039】
ここで、spec_loadは与えられたアドレスをアクセス違反を起こさずにロードする命令(speculative load; 以下投機的ロード命令)である。また、F[Lx, Ly]はLxの結果として得られるオブジェクト参照のアドレスからLyのアドレスを得る関数である。「F[Lx,Ly] (a)」の「(a)」は、Lyのアドレスを得る際のオブジェクト参照のアドレスがLx及びa = spec_load (A(Lx) + d*c)に基づくaであるこを意味している。通常、F[Lx,Ly] (a)の演算は定数値の加算で表される。さらに、Lyとの間にイテレーション内定数ストライドを持つロード命令Lzが存在する場合は、以下のコード生成によってLzが参照するアドレスも同様にプリフェッチすることができる。
【0040】
prefetch (F[Lx,Ly] (a) + S[Ly,Lz]);
【0041】
ここで、S[Ly, Lz]はロード命令Ly, Lzの間のイテレーション内定数ストライドの値を表す。スケジューリング距離cの実際の値は、プリフェッチ命令を挿入するループ内の計算の量やメモリ参照の数など、様々な要素に依存する。
【0042】
(c.2)プリフェッチの効果の解析
プリフェッチ命令はメモリ参照を行なうため、プロセッサのメモリ参照のための演算器及びデータ転送のためのバンド幅を消費する。従って、プリフェッチ可能なロード命令の中から、プリフェッチが効果的なものを選ぶ必要がある。理想的には、頻繁にキャッシュミスを起こすロード命令だけにプリフェッチを生成するのが望ましい。しかし、キャッシュミスの有無はキャッシュメモリの容量や、前後に実行される他のロード命令などの様々な動的な要素に影響されるため、コンパイル時に予測することは難しい。
【0043】
代わりに、以下の簡単な解析によってプリフェッチによる効果を見積もる。すなわち、ロード命令Lが以下の三つの条件を満たす場合、Lのアドレスのプリフェッチが効果的であると判断する。
(c.2.a)ロード命令Lに対してデータ依存する命令(ロード命令でなくともよい)が存在する。
(c.2.b)ロード命令Lが参照するデータが、既にプリフェッチ命令が挿入された他のロード命令と同じキャッシュライン(cache line; キャッシュメモリでメモリ内容を扱う単位)に入らない。
(c.2.c)ロード命令Lがイテレーション間定数ストライドを持つ場合に、定数ストライド値がキャッシュラインの大きさの半分より大きい。
【0044】
なお、(c.2.a)(c.2.b)は、後述の第2の擬似プログラムの行番号104,105に係る条件であるのに対し、(c.2.c)は、後述の第3の擬似プログラムの行番号133に係る条件である。ポインタ参照ロード命令XiがロードするデータDiをイテレーション間定数ストライドに基づきプリフェッチすることを考える場合、ポインタ参照ロード命令Xiの属するイテレーションより1個前のイテレーションにおけるポインタ参照ロード命令Xi-1とそれがロードするデータDi-1を考える。データDi-1及びDiとのアドレス間隔としてのイテレーション間定数ストライドがキャッシュラインのサイズの1/2以下であれば、データDi-1をプリフェッチしようとするとき、通常、該データDi-1はキャッシュメモリにすでに存在することになので、データDi-1のプリフェッチは意味がない。
【0045】
(c.3)機械語命令との対応:
c.1において使用したprefetch命令およびspec_load命令の実装では、プロセッサが提供するプリフェッチ命令または投機的ロード命令を使用するか、または通常のロード命令を、アクセス違反を調べる条件分岐命令によってガード(guard; 守る)するか、二通り考えることができる。目標とするプロセッサが専用の命令を提供している場合は、当然プロセッサが提供する命令を使用する方がオーバーヘッドが少ない。プロセッサが提供するプリフェッチ命令を使用すれば、命令数やメモリ参照のオーバーヘッドを最小に抑えることができる。通常プリフェッチ命令はプロセッサのメモリ転送のバンド幅が不足するような場合、例えばデータトランスレーションルックアサイドバッファ(data translation lookaside buffer; DTLB; 参照されるデータの論理アドレスを物理アドレスに変換するテーブル)のミスが発生する場合には実行されない。現在のところ、プリフェッチ命令は多くのプロセッサで提供されているが、投機的ロード命令を提供しているのはインテル社のIA-64アーキテクチャとスパーク社のSPARC V9アーキテクチャのみである。
【0046】
しかし、プロセッサがプリフェッチ命令を提供している場合においても、ガードされたロード命令が有効である局面が存在する。なぜならば、ガードされたロード命令はDTLBミスが発生するページ(page; 論理/物理アドレス変換の単位)を予めDTLBに読み込むことができるからである。従って、イテレーション間定数ストライドがページの大きさの半分より大きい場合は、ガードされたロード命令の方がプロセッサが提供するプリフェッチ命令より効果的である。さらに重要な場合として、メモリ参照によってアドレスが得られる場合がある。例えば上記のA(Ly)はイテレーション間で定数ストライドを持たないので、連続したイテレーションにおいて次々と異なるページを参照する可能性が高い。従って、Lyをプリフェッチするときにはガードされたロード命令が有効である。
【0047】
【実施例】
以下では、Java JITコンパイラにおける実施例を述べる。
例として、SPECjvm98ベンチマークの中の_202_jessベンチマークのコードの一部を考える。このプログラムはJava言語で記述されたエキスパートシステム(expert system; 与えられた知識データを基にして推論を行なうプログラム)である。以下のJavaプログラムは、_202_jessベンチマークの一部分を簡略化したものである。説明の便宜上、以下のJavaプログラムを「サンプルプログラム」と呼ぶとともに、コード列の左端には行番号を付ける。
【0048】
10:class TokenVector {
11: Token[] v;
12: int ptr;
13: void addElement (Token val) {...}
14: void removeElement (Token val) {...}
15: ...
16:}
【0049】
30:class Token {
31: ValueVector[] facts;
32: int size = 0;
33: Token (ValueVector firstFact) {
34: facts = new ValueVector[5];
35: facts[size++] = firstFact;
36: }
37: ...
38:}
【0050】
50:class Node2 {
51: Token findInMemory (TokenVector tv, Token t) {
52: TokenLoop:
53: for (int i = 0; i < tv.ptr; i++) {
54: Token tmp = tv.v[i];
55: for (int j = 0; j < t.size; j++) {
56: if (!t.facts[j].equals (tmp.facts[j]))
57: continue TokenLoop;
58: return tmp;
59: }
60: return null;
61: }
62: ...
63:}
【0051】
TokenVector型のオブジェクトtvは、その要素としてのToken型のオブジェクトvを適宜、増減される(行番号13,14)。Token型のオブジェクトtv.v及びtは、ValueVector型のオブジェクトfactsのリストを備える(行番号34)メソッドfindInMemory(行番号51〜59)の実行では、tmp.factsとt.factsとの同一番号の要素同士が対比され(行番号56)、もし一致したならば、そのときのオブジェクトtmpがメソッドfindInMemoryの返り値とされる(行番号58)。
【0052】
メソッドfindInMemory()は_202_jessベンチマークで全体の実行時間に占める割合が多いメソッドの一つである。ここでは、メソッドfindInMemory()の外側のループ(変数iを添字とするforループ)がプリフェッチ命令を生成する目標のループであるとする。_202_jessのプロファイルから、内側のループ(変数jを添字とするforループ)はループの反復回数が少ないことがわかるので、ここでは、内側のループのロード命令もプリフェッチの対象とする。図1はサンプルプログラムにおいて外側のループで辿るTokenオブジェクトに関連したデータ構造の説明図である。
【0053】
図2はサンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示している。図2において、演算子'&'は変数のアドレスを表す演算子である(Javaの表記ではない)。配列のlengthフィールド(field; 欄)へのロード命令はJavaプログラムには明示的に現れないが、配列の境界検査(bound check)のために生成される。
【0054】
Wuらのプリフェッチアルゴリズムは、反復回数の多いループに含まれる、アドレスがループ内で不変(invariant)でないロード命令について、各アドレスのイテレーション間ストライドの値のプロファイルを調べる。この例ではL4, L9, L10, L11がプロファイルの対象となるロード命令である。
【0055】
しかし、この_202_jessの上記コード部分の例では、イテレーション間定数ストライドを持つロード命令はL4だけである。この理由は、配列tv.vから参照されるTokenオブジェクトは、初期化段階で一度に生成されるのではなく、ベンチマークの実行中にメソッドaddElement()によって漸次追加されるためである。また、メソッドremoveElement()はTokenオブジェクトを配列tv.vから取り除く際に、配列の最後の要素を取り除かれた要素に代入する。従って配列tv.vのTokenオブジェクトを先頭から順に参照しても、L9, L10はイテレーション間定数ストライドを持たない。プロファイルによって得られたロード命令L4のイテレーション間定数ストライドがdバイトであったとすれば、cイテレーション先にアクセスされるデータをプリフェッチする命令を、Wuらのアルゴリズムに従って生成すると以下の擬似プログラムのように表される。説明の便宜上、以下の擬似プログラムを第1の擬似プログラムと呼ぶ。
【0056】
80:TokenLoop:
81: for (int i = 0; i < tv.ptr; i++) {
82: Token tmp = tv.v[i];
83: prefetch (&tv.v[i] + c*d);
84: for (int j = 0; j < t.size; j++) {
85: if (!t.facts[j].equals (tmp.facts[j]))
86: continue TokenLoop;
87: return tmp;
88: }
【0057】
第1の擬似プログラムでは、サンプルプログラムの行番号52〜59の対比から分かるように、prefetchが行番号83に追加されている。図3は第1の擬似プログラムの実行過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。プロセッサが現在実行している命令列の属するイテレーションの番号をiとする。i番のイテレーションの命令列の実行中に、アドレス&tv.v[i] + c*dのデータがキャッシュメモリにプリフェッチされる。
【0058】
なお、図3、図5及び図9において、破線の引出し線の付いた符号はそれがアドレスであることを意味し、実線の引出し線の付いた符号はそれがデータであることを意味している。
【0059】
これに対して、本実施例の手法を適用したときの手順は以下のようになる。まず外側のループ内のロード命令でプリフェッチの候補となるロード命令について、ロード依存グラフを生成する。図4はサンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【0060】
次に、オブジェクトインスペクションを用いて、外側のループを繰り返したときのイテレーション間およびイテレーション内の定数ストライドを検出する。上述のようにイテレーション間定数ストライドを持つロード命令はL4だけである。しかし、ロード命令L9のアドレスはL4の結果から得られるので、ポインタ参照を一回行なうことで、ロード命令L9で参照されるアドレスをプリフェッチすることができる。さらに、ロード命令L9, L10の間にイテレーション内定数ストライドが存在する。これは、Tokenオブジェクトのコンストラクタ(constructor; 初期化メソッド)の先頭で、配列オブジェクトをアロケートしてfactsフィールドに代入しているからである。すなわち、配列オブジェクトはTokenオブジェクトがアロケートされた直後にアロケートされるので、両者のヒープメモリ上の間隔は一定である可能性が高い。いま、Tokenオブジェクトの先頭からfactsフィールドへの間隔がoバイト、ロード命令L9, L10のイテレーション内定数ストライドがsバイトでキャッシュラインの大きさの半分より大きいとすると、本実施例によるプリフェッチングの結果は以下の擬似プログラムで表される。説明の便宜上、以下の擬似プログラムを第2の擬似プログラムと呼ぶことにする。
【0061】
100:TokenLoop:
101: for (int i = 0; i < tv.ptr; i++) {
102: Token tmp = tv.v[i];
103: tmp_pref = spec_load (&tv.v[i] + c*d);
104: prefetch (tmp_pref + o);
105: prefetch (tmp_pref + o + s);
106: for (int j = 0; j < t.size; j++) {
107: if (!t.facts[j].equals (tmp.facts[j]))
108: continue TokenLoop;
109: return tmp;
110: }
【0062】
第2の擬似プログラムでは、前述のサンプルプログラムに対して、行番号102〜105の命令コードが追加されている。また、第2の擬似プログラムでは、第1の擬似プログラムに対して、行番号83の内容が行番号103〜105の内容に変更されている。prefetchが行番号83に追加されている。図5は第2の擬似プログラムの実行過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。また、k=i+cとする。第2の擬似プログラムでは、プロセッサが現在実行している命令列の属するイテレーションの番号をiとする。i番のイテレーションの命令列の実行中に、アドレス&tv.v[i] + c*dのデータtmpが読み出され、tmp_prefをアドレスとするデータ、すなわちアドレスtmp_prefのデータが読み出される。そして、アドレス(tmp_pref+o)のデータ、すなわちk番目のイテレーションにおけるポインタ参照ロード命令L9がロードするデータが、行番号104においてヒープメモリからキャッシュメモリへプリフェッチされる。さらに、アドレス(tmp_pref+o+s)のデータ、すなわちk番目のイテレーションにおけるポインタ参照ロード命令L10がロードするデータが、行番号105においてヒープメモリからキャッシュメモリへプリフェッチされる。
【0063】
なお、第2の擬似プログラムに第1の擬似プログラムの行番号83のプリフェッチを追加することもできる。下記の第3の擬似プログラムがそれである。第3の擬似プログラムでは、第1の擬似プログラムの行番号83が行番号133に現れている。
【0064】
130:TokenLoop:
131: for (int i = 0; i < tv.ptr; i++) {
132: Token tmp = tv.v[i];
133: prefetch (&tv.v[i] + c*d);
134: tmp_pref = spec_load (&tv.v[i] + c*d);
135: prefetch (tmp_pref + o);
136: prefetch (tmp_pref + o + s);
137: for (int j = 0; j < t.size; j++) {
138: if (!t.facts[j].equals (tmp.facts[j]))
139: continue TokenLoop;
140: return tmp;
141: }
【0065】
本実施例の手法をIBM Developer Kit for Windows(Windowsは登録商標), Java Technology Edition Version 1.3.1のIBM Java JIT Compiler Version 4.0に実装して実験を行った。プロセッサは2 GHz Intel Pentium4(Pentiumは登録商標)、メモリサイズは1 GB、OSはMicrosoft Windows 2000 Professional + Service Pack 2である。図6はSPECjvm98ベンチマーク及びJavaGrande v2.0ベンチマークSection 3のPentium 4上での速度能向上率を示す。なお、SPECjvm98ベンチマークはStandard Performance Evaluation Corporation (SPEC), JVM Client98 (SPECjvm98), available at http://www.spec.org/osg/jvm98, 1998.であり、JavaGrande v2.0ベンチマークはJava Grande Benchmarking Project, Java Grande Forum Benchmark Suite, Version 2.0, available at http://www.epcc.ed.ac.uk/javagrande, 1999.である。SPECjvm98は幾何平均で4.3%、JavaGrande v2.0 Section 3は3.2%の性能向上を実現した。
【0066】
また、図7はSPECjvm98ベンチマーク及びJavaGrande v2.0ベンチマークSection 3のPentium 4上で実行した場合のコンパイル時間のオーバーヘッドを示す。数字はJITコンパイラの全コンパイル時間に対する割合である。コンパイル時間のオーバーヘッドは最大で3.7%である。Euler, MolDyn以外のプログラムに対しては1%以下に抑えられている。以上から、プリフェッチのためのコンパイル時間は実行時間に比べて非常に小さい。
【0067】
図8はコード変換装置10の機能ブロック図である。図9はコード変換装置10が処理過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。コード変換装置10は、変換処理対象コード11を機械語コード12へ変換する。コード変換装置10は、第1の着目手段15、第2の着目手段16、第1の検出手段17、第2の検出手段18、第1の計算手段19、第2の計算手段20、判定手段21、第1の機械語コード部分生成手段23、及び第2の機械語コード部分生成手段24を有している。第1の着目手段15は、所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード11上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する。第2の着目手段16は、各イテレーションB1,B2,〜,Bnにおける変換処理対象コード11上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する。第1の検出手段17は、ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する。第2の検出手段18は、データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する。第1の計算手段19は、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する。第2の計算手段20は、各イテレーションにおけるポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1とデータ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する。判定手段21は、相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する。設定手段22は、判定手段21の判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する。第1の機械語コード部分生成手段23は、ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する。第2の機械語コード部分生成手段24は、プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する。
【0068】
コード変換装置10とは例えばJITコンパイラである。変換処理対象コード11とは例えばJavaのバイトコードである。第1及び第2の割合は、等しくてもよく、例えば共に75%である。なお、当然のことながら、ヒープメモリが含まれるメインメモリからキャッシュメモリへのデータ転送はキャッシュラインを単位に行われる。したがって、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチすれば、該アドレス(Ub,1+Fy)を含む所定アドレス範囲のデータが、データUb,2と共にヒープメモリからキャッシュメモリへロードされる。以降、コード変換装置10の更なる具体的な構成について説明する。図8のコード変換装置10は、以下に述べる種々の具体的構成を任意の組み合わせで適宜、装備され得る。
【0069】
Javaでは、そのバイトコード上のポインタ参照ロード命令は、ソースコードにおけるオブジェクト型変数を呼び出す操作に対応している。
【0070】
第1及び第2の機械語コード部分生成手段24は、機械語コード部分H1,H2を、イテレーションBaを実行する機械語コード範囲に配置する。
【0071】
機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換装置10では、第1の機械語コード部分生成手段23は、機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、機械語コード部分H1を生成する。第2の機械語コード部分生成手段24は、機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、機械語コード部分H2を生成する。
【0072】
機械語としてプリフェッチ命令J1及びロード命令J3を装備するプロセッサ用のコード変換装置10では、第1の機械語コード部分生成手段23は、機械語コード部分H1が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレスUb,0(=Ua,0+p・Fx)のデータUb,1を検出する処理を含むように、機械語コード部分H1を生成する。第2の機械語コード部分生成手段24は、機械語コード部分H2が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレス(Ub,1+Fy)のデータVb2をプリフェッチする処理を含むように、機械語コード部分H2を生成する。
【0073】
なお、「ガードされたロード命令」とは所定の条件が満たされるときのみロードを実行するロード命令を言うものとする。本実施形態における「ガードされたロード命令」は、アクセス違反が無いと言う条件が満たされるときのみ、ロードを実行する。例えば、投機的に実行されるロード命令は、プログラムの本来の実行では読み出されない配列の要素や、配列の外のメモリを読み出すことがある。そのようなメモリ番地には、アドレスとして正しくない値(例えば0)が格納されている可能性がある。このような投機的なロード命令の結果をアドレス値として他のロード命令を実行する場合、そのロード命令はヒープメモリ以外のアドレス(0番地など)を読み出し、アクセス違反を起こす可能性がある。
【0074】
図10はコード変換装置10の構成をさらに具体化して示したものである。図8のコード変換装置10に対する追加点のみを説明する。グラフ生成手段26は、ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第1及び第2の着目手段16は、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。アドレス記録手段28は、ループAにおけるイテレーションB1,B2,〜,Bnについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第1及び第2の検出手段18は、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する。
【0075】
なお、「副作用を起こさない」とは、ヒープメモリのデータ構造を変化させる操作は行わないことを意味するものとする。
【0076】
図11はコード変換装置10の機能付加部を示している。予測手段31は、データUb,2のプリフェッチが有意義か否かを予測する。中止手段32は、予測手段31が有意義でないと予測した場合には、第1及び第2の機械語生成手段による機械語コード部分H1,H2の生成を中止させる。説明の便宜上、データUb,2をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令と呼ぶことにする。予測手段31は、データUb,2にデータ依存する命令が存在する場合、及び/又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータXに対して該データX用の機械語コード部分H2がすでに生成されていてデータUb,2はデータXとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測する。
【0077】
前述の第3の擬似プログラムの行番号133に対応する機能を追加装備するコード変換装置10は、式:Ua,0+p・Fxに基づきアドレス(Ua,0+p・Fx)のデータUb,1をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H3を生成する第3の機械語コード部分生成手段を有している。そして、該コード変換装置10は、さらに、キャッシュラインのサイズFsとしてFs≧が2・Fxであるならば第3の機械語コード部分生成手段による機械語コード部分H3の生成は中止とする制御手段を有している。
【0078】
図12はコード変換方法のフローチャートである。コード変換方法では、変換処理対象コードを機械語コードへ変換する。第1の着目ステップS35では、所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn1に着目する。第2の着目ステップS36では、各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令C1,2,C2,2,〜,Cn2であってポインタ参照ロード命令C1,1,C2,1,〜,Cn1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn2に着目する。第1の検出ステップS37では、ポインタ参照ロード命令C1,1,C2,1,〜,Cn1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,01に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,00を検出する。第2の検出ステップS38では、データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する。第1の計算ステップS39では、相互に隣接するイテレーションのポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する。第2の計算ステップS40では、各イテレーションにおけるポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1とデータ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する。判定ステップS41では、相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する。設定ステップS42では、判定ステップS41における判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する。第1の機械語コード部分生成ステップS43では、ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する。第2の機械語コード部分生成ステップS44では、プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する。
【0079】
本実施例のコード変換方法では、図12のフローチャートに係るコード変換方法を基本にして、以下に述べる具体的構成を任意の組み合わせで適宜追加可能である。
【0080】
変換処理対象コードはJavaのバイトコードである。コード変換方法はJITコンパイラである。
【0081】
第1及び第2の機械語コード部分生成ステップS44では、機械語コード部分H1,H2を、イテレーションBaを実行する機械語コード範囲に配置する。
【0082】
機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換方法において、第1の機械語コード部分生成ステップS43では、機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、機械語コード部分H1を生成する。第2の機械語コード部分生成ステップS44では、機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、機械語コード部分H2を生成する。
【0083】
機械語としてプリフェッチ命令J1及びロード命令J3を装備するプロセッサ用のコード変換方法において、第1の機械語コード部分生成ステップS43では、機械語コード部分H1が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレスUb,0(=Ua,0+p・Fx)のデータUb,1を検出する処理を含める。第2の機械語コード部分生成ステップS44では、機械語コード部分H2が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレス(Ub,1+Fy)のデータVb2をプリフェッチする処理を含むように、機械語コード部分H2を生成する。
【0084】
図13は図12のフローチャートにステップを追加したフローチャートの主要部である。グラフ生成ステップS45はS35の前に追加される。S45では、ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成する。第1及び第2の着目ステップS35,S36では、ポインタ参照ロード命令及びデータ依存ロード命令をロード依存グラフに基づき検出する。
【0085】
アドレス記録ステップS46はS36とS37との間に追加される。アドレス記録ステップS46では、ループAにおけるイテレーションB1,B2,〜,Bnについて変換処理対象コードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録する。第1及び第2の検出ステップS37,S38では、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する。
【0086】
図14は図12のフローチャートに別のステップを追加したフローチャートの主要部である。予測ステップS49及び中止ステップS50がS39とS42との間に追加されている。予測ステップS49では、判定ステップS41における判定に係るデータ依存ロード命令について、該データ依存ロード命令に基づくロードデータのプリフェッチが有意義か否かを予測する。予測ステップS49において有意義でないと予測した場合には、すなわち、S49の判定が「有り」の場合、S42へ進み、「否」である場合、中止ステップS50へ進む。中止ステップS50では、第1及び第2の機械語生成ステップにおける機械語コード部分H1,H2の生成を中止させる。
【0087】
図15はJITコンパイラ57の構成をJava仮想計算機55と共に示している。JITコンパイラ57は、バイトコード56を実行するJava仮想計算機55からの指示を受けて指示範囲のバイトコード56を機械語コード12へ変換する。JITコンパイラ57は、情報収集手段58及び変換手段59を有している。情報収集手段58は、指示範囲のバイトコード56の部分を機械語コード12へ試し実行用にコンパイルし試し実行用機械語コード12を、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換手段59は、情報収集手段58による収集情報に基づいて指示範囲のバイトコード56を機械語コード12へ変換する。
【0088】
図15のJITコンパイラ57はさらに以下の具体的構成を任意の組み合わせで装備可能になっている。変換手段59は、情報収集手段58による収集情報に依らずに指示範囲のバイトコード56を変換された機械語コード12に対して情報収集手段58による収集情報に基づく機械語コード12部分を追加した機械語コード12を生成するものである。収集情報は、ループA内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、変換手段59は、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード12部分を生成するものである。
【0089】
図16はJITコンパイル方法のフローチャートである。JITコンパイル方法では、バイトコードを実行するJava仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換する。情報収集ステップS63では、指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する。変換ステップS64では、情報収集ステップS63における収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する。
【0090】
図16に係るJITコンパイル方法は、さらに、以下の実施態様を任意の組み合わせで適宜追加され得る。
【0091】
変換ステップS64では、情報収集ステップS63における収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して情報収集ステップS63における収集情報に基づく機械語コード部分を追加した機械語コードを生成する。
【0092】
収集情報は、ループA内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含む。変換ステップS64では、収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する。
【0093】
図17はプログラムを実行するためのハードウェア構成図である。前述したコード変換装置70及びイテレーション57において各手段が実施する各機能は例えば図17のハードウェアを使用して実行される。システムバス70には、CPU71、メインメモリ72及び入出力制御装置73が接続される。CPU71及びキャッシュメモリ75は同一のチップに含まれ、CPU71内のプロセッサは、キャッシュメモリ75からデータをロードする。そして、キャッシュミスが生じた場合には、該キャッシュミスに係るデータを含むキャッシュラインがメインメモリ72からキャッシュメモリ75へロードされる。その後、CPU71内のプロセッサは該データをキャッシュメモリ75からロードする。入出力制御装置73には、ハードディスクインターフェース及びLANインターフェース等が含まれ、CPU71が実行する各種プログラム(JITコンパイラを含む。)はハードディスク装置等に格納されている。プログラムは、CPU71において実行されるのに先立ち、メインメモリ72に格納される。CPU71は、メインメモリ72の命令行を順次、読み出して、該プログラムを実行する。
【0094】
まとめとして本発明の構成に関して以下の事項を開示する。
(1):変換処理対象コードを機械語コードへ変換するコード変換装置において、
所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目手段、
各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目手段、
ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出手段、
前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出手段、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算手段、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算手段、
相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定手段、
ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成手段、及び
プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成手段、
を有していることを特徴とするコード変換装置。
【0095】
(2):前記変換処理対象コードはJavaのバイトコードであることを特徴とする(1)記載のコード変換装置。
(3):前記コード変換装置はJITコンパイラであることを特徴とする(1)又は(2)記載のコード変換装置。
(4):前記第1及び前記第2の機械語コード部分生成手段は、前記機械語コード部分H1,H2を、前記イテレーションBaを実行する機械語コード範囲に配置することを特徴とする(1)〜(3)のいずれかに記載のコード変換装置。
(5):機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換装置において、
前記第1の機械語コード部分生成手段は、前記機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、前記機械語コード部分H1を生成し、
前記第2の機械語コード部分生成手段は、前記機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、前記機械語コード部分H2を生成する、
ことを特徴とする(1)〜(4)のいずれかに記載のコード変換装置。
(6):機械語としてプリフェッチ命令J1及びロード命令J3を装備するプロセッサ用のコード変換装置において、
前記第1の機械語コード部分生成手段は、前記機械語コード部分H1が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレスUb,0(=Ua,0+p・Fx)のデータUb,1を検出する処理を含むように、機械語コード部分H1を生成し、
前記第2の機械語コード部分生成手段は、前記機械語コード部分H2が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレス(Ub,1+Fy)のデータVb2をプリフェッチする処理を含むように、機械語コード部分H2を生成する、
ことを特徴とする(1)〜(4)のいずれかに記載のコード変換装置。
(7):ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
を有し、
前記第1及び前記第2の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする(1)〜(6)のいずれかに記載のコード変換装置。
【0096】
(8):ループAにおけるイテレーションB1,B2,〜,Bnについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
を有し、
前記第1及び第2の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する、
ことを特徴とする(7)記載のコード変換装置。
(9):データUb,2のプリフェッチが有意義か否かを予測する予測手段、
前記予測手段が有意義でないと予測した場合には、前記第1及び前記第2の機械語生成手段による前記機械語コード部分H1,H2の生成を中止させる中止手段、
を有していることを特徴とする(1)〜(8)のいずれかに記載のコード変換装置。
(10):データUb,2をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令と呼ぶことにし、
前記予測手段は、データUb,2にデータ依存する命令が存在する場合、及び/又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータXに対して該データX用の機械語コード部分H2がすでに生成されていてデータUb,2はデータXとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする(9)記載のコード変換装置。
(11):式:Ua,0+p・Fxに基づきアドレス(Ua,0+p・Fx)のデータUb,1をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H3を生成する第3の機械語コード部分生成手段、及び
キャッシュラインのサイズFsとしてFs≧が2・Fxであるならば前記第3の機械語コード部分生成手段による機械語コード部分H3の生成は中止とする制御手段、
を有していることを特徴とする(1)〜(10)のいずれかに記載のコード変換装置。
【0097】
(12):バイトコードを実行するJava仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するJITコンパイラにおいて、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集手段、及び
前記情報収集手段による収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換手段、
を有していることを特徴とするJITコンパイラ。
(13):前記変換手段は、前記情報収集手段による収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集手段による収集情報に基づく機械語コード部分を追加した機械語コードを生成するものである、
ことを特徴とする(12)記載のJITコンパイラ。
(14):前記収集情報は、ループA内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換手段は、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成するものであることを特徴とする(12)又は(13)記載のJITコンパイラ。
【0098】
(15):変換処理対象コードを機械語コードへ変換するコード変換方法において、
所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目ステップ、
各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目ステップ、
ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出ステップ、
前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出ステップ、
相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算ステップ、
各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算ステップ、
相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定ステップ、
ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成ステップ、及び
プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成ステップ、
を有していることを特徴とするコード変換方法。
【0099】
(16):前記変換処理対象コードはJavaのバイトコードであることを特徴とする(15)記載のコード変換方法。
(17):前記コード変換方法はJITコンパイラであることを特徴とする(15)又は(16)に記載のコード変換方法。
(18):前記第1及び前記第2の機械語コード部分生成ステップでは、前記機械語コード部分H1,H2を、前記イテレーションBaを実行する機械語コード範囲に配置することを特徴とする(15)〜(17)のいずれかに記載のコード変換方法。
(19):機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換方法において、
前記第1の機械語コード部分生成ステップでは、前記機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、前記機械語コード部分H1を生成し、
前記第2の機械語コード部分生成ステップでは、前記機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、前記機械語コード部分H2を生成する、
ことを特徴とする(15)〜(18)のいずれかに記載のコード変換方法。
(20):機械語としてプリフェッチ命令J1及びロード命令J3を装備するプロセッサ用のコード変換方法において、
前記第1の機械語コード部分生成ステップでは、前記機械語コード部分H1が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレスUb,0(=Ua,0+p・Fx)のデータUb,1を検出する処理を含むように、機械語コード部分H1を生成し、
前記第2の機械語コード部分生成ステップでは、前記機械語コード部分H2が、アクセス違反を調べる条件用分岐命令によりガードされたロード命令J3によりアドレス(Ub,1+Fy)のデータVb2をプリフェッチする処理を含むように、機械語コード部分H2を生成する、
ことを特徴とする(15)〜(18)のいずれかに記載のコード変換方法。
(21):ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
を有し、
前記第1及び前記第2の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする(15)〜(20)のいずれかに記載のコード変換方法。
【0100】
(22):ループAにおけるイテレーションB1,B2,〜,Bnについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
を有し、
前記第1及び第2の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する、
ことを特徴とする(21)記載のコード変換方法。
(23):データUb,2のプリフェッチが有意義か否かを予測する予測ステップ、
前記予測ステップにおいて有意義でないと予測した場合には、前記第1及び前記第2の機械語生成ステップにおける前記機械語コード部分H1,H2の生成を中止させる中止ステップ、
を有していることを特徴とする(15)〜(22)のいずれかに記載のコード変換装置。
(24):データUb,2をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令と呼ぶことにし、
前記予測ステップでは、データUb,2にデータ依存する命令が存在する場合、及び/又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータXに対して該データX用の機械語コード部分H2がすでに生成されていてデータUb,2はデータXとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする(23)記載のコード変換装置。
(25):式:Ua,0+p・Fxに基づきアドレス(Ua,0+p・Fx)のデータUb,1をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H3を生成する第3の機械語コード部分生成ステップ、及び
キャッシュラインのサイズFsとしてFs≧が2・Fxであるならば前記第3の機械語コード部分生成ステップにおける機械語コード部分H3の生成は中止とする制御ステップ、
を有していることを特徴とする(15)〜(24)のいずれかに記載のコード変換装置。
【0101】
(26):バイトコードを実行するJava仮想計算機からの指示を受けて指示範囲のバイトコードを機械語コードへ変換するJITコンパイル方法において、
指示範囲のバイトコードの部分を機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行してヒープメモリにおけるデータ構造についての情報を収集する情報収集ステップ、及び
前記情報収集ステップにおける収集情報に基づいて指示範囲のバイトコードを機械語コードへ変換する変換ステップ、
を有していることを特徴とするJITコンパイル方法。
(27):前記変換ステップでは、前記情報収集ステップにおける収集情報に依らずに指示範囲のバイトコードを変換された機械語コードに対して前記情報収集ステップにおける収集情報に基づく機械語コード部分を追加した機械語コードを生成する、
ことを特徴とする(26)記載のJITコンパイル方法。
(28):前記収集情報は、ループA内の各イテレーションにおける所定ロード命令がヒープメモリから参照するデータのアドレスの規則性に係る情報を含み、
前記変換ステップでは、前記収集情報に基づき所定ロード命令に基づくロードデータをヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分を生成する、
ことを特徴とする(26)又は(27)に記載のJITコンパイル方法。
(29):(1)〜(11)のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
(30):(12)〜(14)のいずれかに記載のJITコンパイラの各手段としてコンピュータを機能させるためのJITコンパイラ用プログラム。
【0102】
【発明の効果】
本発明では、ループの各イテレーションにおけるポインタ参照ロード命令についてイテレーション間定数ストライドを検出するとともに、イテレーション間定数ストライドをもつポインタ参照ロード命令に基づいてロードされるデータとしての参照アドレスに対してイテレーション内定数ストライド関係にあるデータをプリフェッチする機械語コード部分を生成する。結果、機械語コードの実行では、キャッシュミスを抑制して、プログラムの実行速度を増大できる。
【図面の簡単な説明】
【図1】サンプルプログラムにおいて外側のループで辿るTokenオブジェクトに関連したデータ構造の説明図である。
【図2】サンプルプログラムにおいて二重ループに含まれるロード命令とそれが参照するデータの、ヒープメモリ上のアドレスとの関係を示す図である。
【図3】第1の擬似プログラムの実行過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。
【図4】サンプルプログラムにおけるロード命令に対応するロード依存グラフである。
【図5】第2の擬似プログラムの実行過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。
【図6】SPECjvm98ベンチマーク及びJavaGrande v2.0ベンチマークSection 3のPentium 4上での速度能向上率を示す図である。
【図7】SPECjvm98ベンチマーク及びJavaGrande v2.0ベンチマークSection 3のPentium 4上で実行した場合のコンパイル時間のオーバーヘッドを示す図である。
【図8】コード変換装置の機能ブロック図である。
【図9】コード変換装置が処理過程において関わるデータ及びアドレスを図1のデータ構造上に表示した図である。
【図10】コード変換装置の構成をさらに具体化して示したものである。
【図11】コード変換装置の機能付加部を示す図である。
【図12】コード変換方法のフローチャートである。
【図13】図12のフローチャートにステップを追加したフローチャートの主要部である。
【図14】図12のフローチャートに別のステップを追加したフローチャートの主要部である。
【図15】JITコンパイラの構成をJava仮想計算機と共に示す図である。
【図16】JITコンパイル方法のフローチャートである。
【図17】プログラムを実行するためのハードウェア構成図である。
【符号の説明】
10:コード変換装置、11:変換処理対象コード、12:機械語コード、15:第1の着目手段、16:第2の着目手段、17:第1の検出手段、18:第2の検出手段、19:第1の計算手段、20:第2の計算手段、21:判定手段、23:第1の機械語コード部分生成手段、24:第2の機械語コード部分生成手段、26:グラフ生成手段、28:アドレス記録手段28、31:予測手段、55:Java仮想計算機、57:JITコンパイラ、58:情報収集手段、59:変換手段。

Claims (21)

  1. 変換処理対象コードを機械語コードへ変換するコード変換装置において、
    所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目手段、
    各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目手段、
    ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出手段、
    前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出手段、
    相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算手段、
    各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算手段、
    相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定手段、
    前記判定手段の判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定手段、
    ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成手段、及び
    プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成手段、
    を有していることを特徴とするコード変換装置。
  2. 前記変換処理対象コードはJavaのバイトコードであることを特徴とする請求項1記載のコード変換装置。
  3. 前記コード変換装置はJITコンパイラであることを特徴とする請求項1記載のコード変換装置。
  4. 前記第1及び前記第2の機械語コード部分生成手段は、前記機械語コード部分H1,H2を、前記イテレーションBaを実行する機械語コード範囲に配置することを特徴とする請求項1記載のコード変換装置。
  5. 機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換装置において、
    前記第1の機械語コード部分生成手段は、前記機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、前記機械語コード部分H1を生成し、
    前記第2の機械語コード部分生成手段は、前記機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、前記機械語コード部分H2を生成する、
    ことを特徴とする請求項1記載のコード変換装置。
  6. ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成手段、
    を有し、
    前記第1及び前記第2の着目手段は、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項1記載のコード変換装置。
  7. ループAにおけるイテレーションB1,B2,〜,Bnについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録手段、
    を有し、
    前記第1及び第2の検出手段は、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する、
    ことを特徴とする請求項6記載のコード変換装置。
  8. データUb,2のプリフェッチが有意義か否かを予測する予測手段、
    前記予測手段が有意義でないと予測した場合には、前記第1及び前記第2の機械語生成手段による前記機械語コード部分H1,H2の生成を中止させる中止手段、
    を有していることを特徴とする請求項1記載のコード変換装置。
  9. データUb,2をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令と呼ぶことにし、
    前記予測手段は、データUb,2にデータ依存する命令が存在する場合、及び/又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータXに対して該データX用の機械語コード部分H2がすでに生成されていてデータUb,2はデータXとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項8記載のコード変換装置。
  10. 式:Ua,0+p・Fxに基づきアドレス(Ua,0+p・Fx)のデータUb,1をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H3を生成する第3の機械語コード部分生成手段、及び
    キャッシュラインのサイズFsとしてFs≧が2・Fxであるならば前記第3の機械語コード部分生成手段による機械語コード部分H3の生成は中止とする制御手段、
    を有していることを特徴とする請求項1記載のコード変換装置。
  11. 変換処理対象コードを機械語コードへ変換するコード変換方法において、
    コンピュータが、所定のループAにおける複数個のイテレーションの内で連続する所定個数nのイテレーションB1,B2,〜,Bn(なお、B1はループAにおける1番目のイテレーションBであることに限定されない。)を選択しそれらイテレーションB1,B2,〜,Bnにおける変換処理対象コード上のポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に着目する第1の着目ステップ、
    コンピュータが、各イテレーションB1,B2,〜,Bnにおける変換処理対象コード上の他のロード命令であってポインタ参照ロード命令C1,1,C2,1,〜,Cn,1にデータ依存するロード命令としてのデータ依存ロード命令C1,2,C2,2,〜,Cn,2に着目する第2の着目ステップ、
    コンピュータが、ポインタ参照ロード命令C1,1,C2,1,〜,Cn,1に基づきプロセッサがロードするデータとしての参照値U1,1,U2,1,〜,Un,1に対してそれらがヒープメモリにおいて格納されているアドレスU1,0,U2,0,〜,Un,0を検出する第1の検出ステップ、
    コンピュータが、前記データ依存ロード命令Cr,2〜Cs,2(ただし1≦r<s≦n)に基づきプロセッサがロードするデータUr,2,Ur+1,2,〜,Us,2に対してそれらがヒープメモリにおいて格納されているアドレスUr,y,Ur+1,y,〜,Us,yを検出する第2の検出ステップ、
    コンピュータが、相互に隣接するイテレーションの前記ポインタ参照ロード命令のロードデータのアドレスの差分U2,0−U1,0,U3,0−U2,0,〜,Un,0−Un-1,0をイテレーション間ストライドF1として計算する第1の計算ステップ、
    コンピュータが、各イテレーションにおける前記ポインタ参照ロード命令の参照値Ur,1,Ur+1,1,〜,Us,1と前記データ依存ロード命令のロードデータのアドレスUr,y,Ur+1,y,〜,Us,yとの差分Ur,y−Ur,1,Ur+1,y−Ur+1,1,Us,y−Us,1をイテレーション内ストライドF2として計算する第2の計算ステップ、
    コンピュータが、相互に同一となっているイテレーション間ストライドF1がイテレーション間ストライドF1の総数に対して第1の割合以上存在しかつ相互に同一となっているイテレーション内ストライドF2がイテレーション内ストライドF2の総数に対して第2の割合以上存在すると言う条件が満たされるか否かを判定する判定ステップ、
    コンピュータが、前記判定ステップにおける判定が「正」である場合には該同一のイテレーション間ストライドF1及び該同一のイテレーション内ストライドF2に基づいてそれぞれイテレーション間定数ストライドFx及びイテレーション内定数ストライドFyを設定する設定ステップ、
    コンピュータが、ループAのイテレーションBaにおけるポインタ参照ロード命令Ca,1に基づいてプロセッサがロードするデータUa,1がヒープメモリにおいて格納されているアドレスUa,0及び自然数p(ただし、イテレーションBaよりp個、後のイテレーションをイテレーションBbとすると、イテレーションBbはループAの最後のイテレーションを越えない。)に対してヒープメモリ上のアドレスUb,0(=Ua,0+p・Fx)にアクセスして該アドレスUb,0のデータUb,1を検出する機械語コード部分H1を生成する第1の機械語コード部分生成ステップ、及び
    コンピュータが、プロセッサがループAのイテレーションBbを実行するのに先立ち、ヒープメモリ上のアドレス(Ub,1+Fy)のデータUb,2をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H2を生成する第2の機械語コード部分生成ステップ、
    を有していることを特徴とするコード変換方法。
  12. 前記変換処理対象コードはJavaのバイトコードであることを特徴とする請求項11記載のコード変換方法。
  13. 前記コード変換方法はJITコンパイラであることを特徴とする請求項11記載のコード変換方法。
  14. 前記第1及び前記第2の機械語コード部分生成ステップでは、前記機械語コード部分H1,H2を、前記イテレーションBaを実行する機械語コード範囲に配置することを特徴とする請求項11記載のコード変換方法。
  15. 機械語としてプリフェッチ命令J1及び投機的ロード命令J2を装備するプロセッサ用のコード変換方法において、
    前記第1の機械語コード部分生成ステップでは、前記機械語コード部分H1が、アドレスUb,0(=Ua,0+p・Fx)のデータUb,1をロードする投機的ロード命令J2を含むように、前記機械語コード部分H1を生成し、
    前記第2の機械語コード部分生成ステップでは、前記機械語コード部分H2が、アドレス(Ub,1+Fy)のデータUb,2をプリフェッチするプリフェッチ命令J1を含むように、前記機械語コード部分H2を生成する、
    ことを特徴とする請求項11記載のコード変換方法。
  16. コンピュータが、ループA内のロード命令の依存関係を表現するグラフとしてのロード依存グラフを生成するグラフ生成ステップ、
    を有し、
    前記第1及び前記第2の着目ステップでは、前記ポインタ参照ロード命令及び前記データ依存ロード命令をロード依存グラフに基づき検出することを特徴とする請求項11記載のコード変換方法。
  17. コンピュータが、ループAにおけるイテレーションB1,B2,〜,Bnについてバイトコードを機械語コードへ試し実行用にコンパイルし試し実行用機械語コードを、副作用を起こさずに試し実行して、各イテレーションのロード命令によるロードデータのアドレスをロード依存グラフに記録するアドレス記録ステップ、
    を有し、
    前記第1及び第2の検出ステップでは、ロード依存グラフに記録されたアドレスに基づきアドレスU1,0〜アドレスUn,0及びアドレスUr,1〜アドレスUs,1を検出する、
    ことを特徴とする請求項16記載のコード変換方法。
  18. コンピュータが、データUb,2のプリフェッチが有意義か否かを予測する予測ステップ、及び
    コンピュータが、前記予測ステップにおいて有意義でないと予測した場合には、前記第1及び前記第2の機械語生成ステップにおける前記機械語コード部分H1,H2の生成を中止させる中止ステップ、
    を有していることを特徴とする請求項11記載のコード変換方法
  19. データUb,2をロードするデータ依存ロード命令を対象データ依存ロード命令、該対象データ依存ロード命令と呼ぶことにし、
    前記予測ステップでは、データUb,2にデータ依存する命令が存在する場合、及び/又は対象データ依存ロード命令とは別のデータ依存ロード命令がロードするデータXに対して該データX用の機械語コード部分H2がすでに生成されていてデータUb,2はデータXとは同一のキャッシュラインには入らない場合、プリフェッチ命令の挿入が有意義と予測することを特徴とする請求項18記載のコード変換方法
  20. コンピュータが、式:Ua,0+p・Fxに基づきアドレス(Ua,0+p・Fx)のデータUb,1をヒープメモリからキャッシュメモリへプリフェッチする機械語コード部分H3を生成する第3の機械語コード部分生成ステップ、及び
    コンピュータが、キャッシュラインのサイズFsとしてFs≧が2・Fxであるならば前記第3の機械語コード部分生成ステップにおける機械語コード部分H3の生成は中止とする制御ステップ、
    を有していることを特徴とする請求項11記載のコード変換方法
  21. 請求項1〜10のいずれかに記載のコード変換装置の各手段としてコンピュータを機能させるためのコード変換用プログラム。
JP2003151478A 2003-05-28 2003-05-28 コード変換装置、コード変換方法及びプログラム Expired - Fee Related JP4064869B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2003151478A JP4064869B2 (ja) 2003-05-28 2003-05-28 コード変換装置、コード変換方法及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2003151478A JP4064869B2 (ja) 2003-05-28 2003-05-28 コード変換装置、コード変換方法及びプログラム

Publications (2)

Publication Number Publication Date
JP2004355279A JP2004355279A (ja) 2004-12-16
JP4064869B2 true JP4064869B2 (ja) 2008-03-19

Family

ID=34046992

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003151478A Expired - Fee Related JP4064869B2 (ja) 2003-05-28 2003-05-28 コード変換装置、コード変換方法及びプログラム

Country Status (1)

Country Link
JP (1) JP4064869B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8433852B2 (en) * 2010-08-30 2013-04-30 Intel Corporation Method and apparatus for fuzzy stride prefetch
CN114371852B (zh) * 2022-01-13 2023-10-24 抖音视界有限公司 一种编译方法及装置

Also Published As

Publication number Publication date
JP2004355279A (ja) 2004-12-16

Similar Documents

Publication Publication Date Title
US8024719B2 (en) Bounded hash table sorting in a dynamic program profiling system
Kazi et al. Techniques for obtaining high performance in Java programs
US7725883B1 (en) Program interpreter
Cierniak et al. Practicing JUDO: Java under dynamic optimizations
US7114036B2 (en) Method and apparatus for autonomically moving cache entries to dedicated storage when false cache line sharing is detected
US7496908B2 (en) Method and apparatus for optimizing code execution using annotated trace information having performance indicator and counter information
US7526757B2 (en) Method and apparatus for maintaining performance monitoring structures in a page table for use in monitoring performance of a computer program
US7574587B2 (en) Method and apparatus for autonomically initiating measurement of secondary metrics based on hardware counter values for primary metrics
US7093081B2 (en) Method and apparatus for identifying false cache line sharing
Chen et al. Data dependence profiling for speculative optimizations
Mock et al. Calpa: A tool for automating selective dynamic compilation
US7181599B2 (en) Method and apparatus for autonomic detection of cache “chase tail” conditions and storage of instructions/data in “chase tail” data structure
Merten et al. An architectural framework for runtime optimization
US20100115494A1 (en) System for dynamic program profiling
US20040194077A1 (en) Methods and apparatus to collect profile information
US20050155018A1 (en) Method and apparatus for generating interrupts based on arithmetic combinations of performance counter values
Mancuso et al. Light-PREM: Automated software refactoring for predictable execution on COTS embedded systems
Williams et al. Dynamic interpretation for dynamic scripting languages
Inagaki et al. Stride prefetching by dynamically inspecting objects
Chang et al. Efficient just-in-time execution of dynamically typed languages via code specialization using precise runtime type inference
Watterson et al. Goal-directed value profiling
Suganuma et al. Evolution of a Java just-in-time compiler for IA-32 platforms
Lee et al. A two-phase escape analysis for parallel Java programs
JP4064869B2 (ja) コード変換装置、コード変換方法及びプログラム
Burtscher et al. Static load classification for improving the value predictability of data-cache misses

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070822

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070903

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: 20071219

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20071219

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20071227

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: 20110111

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees