(57)【要約】      （修正有）【課題】トレースベースのコンパイラにおいてマルチレベルのコンパイレーションを実現できる技術を提供する。【解決手段】トレース生成装置は、最大長を所定長以下に制限され低い最適化レベルで生成されたコンパイル済みトレースの実行に基づき、トレース間の実行の遷移を表す有向グラフを生成するＴＴグラフ生成部２２０と、タイマーベースのサンプリングでタイマーティックがあたったトレースに対応するノードを出発点として有向グラフのエッジを逆方向に辿り、周期トレースの手前又はエッジがなくなったところで停止して辿り着いたトレースの再コンパイルカウンタを増加するＴＴグラフ更新部２２１と、いずれかの再コンパイルカウンタの値が第１閾値を超えることを条件に、対応するトレースの先頭を新たなトレースの先頭として、所定長より長いトレースの生成を許可して新たなトレースを生成するトレース生成部２２２とを含む。【選択図】図２
2014075046.tif 000002
【特許請求の範囲】
【請求項１】
コンピューターによるトレースの生成方法であって、
（ａ）前記コンピュータが、最大長を所定長以下に制限されたトレースをコンパイルして得られたコンパイル済みトレースの実行に基づいて、トレース間の実行の遷移を表す有向グラフを作成するステップであって、トレースを示す各ノードが再コンパイルカウンタを有する、前記作成するステップと、
（ｂ）前記コンピュータが、前記コンパイル済みトレースの実行中におけるタイマーベースのサンプリングにおいて、タイマーティックがあたったトレースに対応するノードを出発点として前記有向グラフのエッジを逆方向に辿り、周期トレース若しくは再コンパイル済みトレースの手前又はエッジがなくなったところで停止して辿り着いたトレースの前記再コンパイルカウンタを増加するステップと、
（ｃ）前記コンピュータが、いずれかの前記再コンパイルカウンタの値が第１閾値を超えることを条件に、前記第１閾値を超えた前記再コンパイルカウンタを有するノードに対応するトレースの先頭を新たなトレースの先頭として決定し、前記所定長より長いトレースの生成を許可して前記新たなトレースを生成するステップと、
を含むトレース生成方法。
【請求項２】
前記コンパイル済みのトレースは、前記タイマーティックがあたったトレースを見つけるためのyield pointをトレースの入り口及びループのバックエッジにのみ挿入されている、請求項１に記載のトレース生成方法。
【請求項３】
前記有向グラフの各エッジは該エッジが表す遷移の相対頻度を示す重みを有し、前記コンピュータが、タイマーティックがあたったトレースとその直前に実行されたトレースとの間のエッジの前記重みを増加するステップ（ｄ）を更に含み、ステップ（ｂ）において、前記コンピュータは、その重みが所定の条件を満たすエッジのみを辿る、請求項２に記載のトレース生成方法。
【請求項４】
前記所定の条件を満たすエッジとは、前記有向グラフを逆方向に辿る途中に存在するノードに入ってくるエッジが複数ある場合に、該複数のエッジの重みの合計に対するそのエッジの重みの比率が第２閾値を超えるエッジである、請求項３に記載のトレース生成方法。
【請求項５】
前記所定の条件を満たすエッジとは、次に辿ろうとするノードから出ているエッジが複数ある場合に、該複数のエッジの重みの合計に対する現在のノードから前記次のノードへのエッジの重みの比率が第３閾値を超えるエッジである、請求項３に記載のトレース生成方法。
【請求項６】
ステップ（ｄ）は、前記コンピュータが、前記有向グラフ上で前記タイマーティックがあたったトレースに続く１以上のトレースのyield pointにおいて連続して実行が停止するための設定を行うステップを含む、請求項３に記載のトレース生成方法。
【請求項７】
前記連続して実行が停止するための設定は、実行が、周期トレース、既に停止済みのトレース及びコンパイル済みのトレースのうちのいずれかに到達したこと、連続した実行の停止が所定回数に達したこと、又は次のトレースが存在しないトレースを抜けたことに応答して終了する、請求項６に記載のトレースの生成方法。
【請求項８】
前記コンパイル済みのトレースは、その実行によりトレースを抜けることとなった命令のポインタを記録する命令を挿入されており、ステップ（ｄ）は、トレースの入り口に挿入されたyield pointで実行が停止することに応答して、前記コンピュータが記録された前記命令のポインタの値を参照することにより前記直前に実行されたトレースを特定するステップを含む、請求項３に記載のトレース生成方法。
【請求項９】
コンピュータに、請求項１乃至８のいずれか一項に記載のトレース生成方法の各ステップを実行させるためのトレース生成プログラム。
【請求項１０】
コンピュータによるマルチレベルのコンパイレーション実行方法であって、
（ａ）前記コンピュータが、最大長を所定長以下に制限して生成されたトレースをコンパイルするステップと、
（ｂ）前記コンピュータが、生成したコンパイル済みのトレースの実行結果を取得するステップと、
（ｃ）前記コンピュータが、取得した実行結果に対して請求項１乃至８いずれか一項に記載の方法の各ステップを実行するステップと、
（ｄ）前記コンピュータが、ステップ（ｃ）の結果生成された前記新たなトレースに対して再コンパイルを実行するステップと、
を含むマルチレベルのコンパイレーション実行方法。
【請求項１１】
コンピュータに、請求項１０に記載のマルチレベルのコンパイレーション実行方法の各ステップを実行させるためのマルチレベルのコンパイレーション実行プログラム。
【請求項１２】
トレース生成装置であって、
最大長を所定長以下に制限されたトレースをコンパイルして得られたコンパイル済みトレースの実行に基づいて、トレース間の実行の遷移を表す有向グラフを生成する有向グラフ生成部であって、トレースを示す各ノードが再コンパイルカウンタを有する、前記有向グラフ生成部と、
前記コンパイル済みトレースの実行中におけるタイマーベースのサンプリングにおいて、タイマーティックがあたったトレースに対応するノードを出発点として前記有向グラフのエッジを逆方向に辿り、周期トレース若しくは再コンパイル済みトレースの手前又はエッジがなくなったところで停止して辿り着いたトレースの前記再コンパイルカウンタを増加する有向グラフ更新部と、
いずれかの前記再コンパイルカウンタの値が第１閾値を超えることを条件に、前記第１閾値を超えた前記再コンパイルカウンタを有するノードに対応するトレースの先頭を新たなトレースの先頭として決定し、前記所定長より長いトレースの生成を許可して前記新たなトレースを生成する生成部と、
を含むトレース生成装置。
【請求項１３】
前記コンパイル済みのトレースは、前記タイマーティックがあたったトレースを見つけるためのyield pointをトレースの入り口及びループのバックエッジにのみ挿入されている、請求項１２に記載のトレース生成装置。
【請求項１４】
前記有向グラフの各エッジは該エッジが表す遷移の相対頻度を示す重みを有し、前記有向グラフ更新部は、更に、タイマーティックがあたったトレースとその直前に実行されたトレースとの間のエッジの前記重みを増加し、前記有向グラフのエッジを逆方向に辿る際には、その重みが所定の条件を満たすエッジのみを辿る、請求項１３に記載のトレース生成装置。
【請求項１５】
前記所定の条件を満たすエッジとは、前記有向グラフを逆方向に辿る途中に存在するノードに入ってくるエッジが複数ある場合に、該複数のエッジの重みの合計に対するそのエッジの重みの比率が第２閾値を超えるエッジである、請求項１４に記載のトレース生成装置。
【請求項１６】
前記所定の条件を満たすエッジとは、次に辿ろうとするノードから出ているエッジが複数ある場合に、該複数のエッジの重みの合計に対する現在のノードから前記次のノードへのエッジの重みの比率が第３閾値を超えるエッジである、請求項１４に記載のトレース生成装置。
【請求項１７】
前記有向グラフ更新部は、更に、前記有向グラフ上で前記タイマーティックがあたったトレースに続く１以上のトレースのyield pointにおいて連続して実行が停止するための設定を行う、請求項１４に記載のトレース生成装置。
【請求項１８】
前記連続して実行が停止するための設定は、実行が、周期トレース、既に停止済みのトレース及びコンパイル済みのトレースのうちのいずれかに到達したこと、連続した実行の停止が所定回数に達したこと、又は次のトレースが存在しないトレースを抜けたことに応答して終了する、請求項１７に記載のトレースの生成装置。
【請求項１９】
前記コンパイル済みのトレースは、その実行によりトレースを抜けることとなった命令のポインタを記録する命令を挿入されており、前記有向グラフ更新部は、トレースの入り口に挿入されたyield pointで実行が停止することに応答して記録された前記命令のポインタの値を参照することにより前記直前に実行されたトレースを特定する、請求項１４に記載のトレース生成装置。
【請求項２０】
マルチレベルのコンパイレーション装置であって、
最大長を所定長以下に制限して生成されたトレースをコンパイルするコンパイラと、
生成されたコンパイル済みのトレースの実行結果を入力とする、請求項１２乃至１９のいずれか一項に記載されたトレース生成装置とを含み、
前記コンパイラは、前記トレース生成装置により出力された前記新たなトレースに対して再コンパイルを実行する、マルチレベルのコンパイレーション装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、トレースベースのコンパイラ技術に関し、より詳細には、トレースベースのコンパイラに適用するマルチレベルのコンパイレーション技術に関する。
【背景技術】
【０００２】
従来、頻繁に実行される一続きのコード列（以下、「トレース」という）をコンパイル及び実行の基本単位とするトレースベースのコンパイラが知られている（例えば、非特許文献１、２、及び３を参照）。トレースベースのコンパイラではトレースの選択が重要な鍵となる。より長いトレースの生成は、コンパイラによる最適化の機会を増やし、コンパイル済みトレース間の遷移によるオーバーヘッドを減らす。しかしながら長いトレースの生成はしばしば重複したトレースの生成を引き起こし、コードサイズやコンパイル時間を増加させ、起動時のパフォーマンスを下げる（例えば、非特許文献１を参照）。
【０００３】
トレースベースのコンパイラにおいてより長いトレースを生成することは、メソッドベースのコンパイラにおいて積極的にメソッド・インラインを行うことでコンパイルスコープを広げることに似ている。メソッドベースのＪＩＴコンパイラを用いるシステムでは、高速なスタートアップと高いピーク性能を両立させるために適応的マルチレベルのコンパイレーション技術が広く用いられている（例えば、非特許文献４〜８及び特許文献１を参照）。適応的マルチレベルのコンパイレーション技術では、プログラムの起動時には低い最適化レベルでコンパイルを行い、起動後においては、プロファイリングにより実行時間をより多く使っているメソッドをみつけより高い最適化レベルで再コンパイルを行う。トレースベースのコンパイラにおいても、マルチレベルのコンパイレーションを行って、起動速度とピークパフォーマンスの両立を図ることが望まれる。
【０００４】
なお、以下の先行技術文献のリストにおいて、非特許文献１０は、本発明の実施例において使用するトレース同士を結合する最適化技術（trace linking optimization）についての背景技術としてリストしたものである。また、非特許文献１１は、本発明の実施例において使用する技術のもととなったバーストトレーシング技術についての背景技術としてリストしたものである。また、非特許文献１２乃至１４は、再コンパイルをサポートする既存のトレーシング技術としてリストしたものである。しかしながら、非特許文献１２における再コンパイルは、頻繁にアボートするトレースを修正するためのものであり、本発明のようにアップグレードを目的とするものではない。また、非特許文献１３及び１４における１回目のコンパイルは、実行を監視するために挿入されたコードをコンパイルするためのものであり、これら文献における再コンパイルは通常のコンパイルに相当し、本発明のようにアップグレードを目的とするものではない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第７３８６６８６号明細書
【特許文献２】米国特許第６９７１０９１号明細書
【非特許文献】
【０００６】
【非特許文献１】P. Wu, H. Hayashizaki, H. Inoue,and T. Nakatani, “Reducing Trace Selection Footprint for Large-scale JavaApplications with no Performance Loss”, in Proceedings of the ACMObject-Oriented Programming, Systems, Languages & Applications, pp.789-804, 2011.
【非特許文献２】H. Inoue, H. Hayashizaki, P. Wu,and T. Nakatani, “A Trace-based Java JIT Compiler Retrofitted from aMethod-based Compiler”, in Proceedings of the International Symposium on CodeGeneration and Optimization, pp.246-256, 2011.
【非特許文献３】H. Hayashizaki, P. Wu, H. Inoue, M. Serrano, and T. Nakatani, “Improvingthe Performance of Trace-based Systems by False Loop Filtering”, In Proceedingsof Sixteenth International Conference on Architectural Support for ProgrammingLanguages and Operating Systems, pp. 405-418, 2011.
【非特許文献４】MichaelPaleczny, Christopher Vick, and Cliff Click, “TheJava Hotspot TM Server Compiler”, in Proceedings of the USENIX Java VirtualMachine Research and Technology Symposium, pp.1-12, 2001.
【非特許文献５】N.Greevski, A. Kielstra, K. Stoodley, M. Stoodley, and V. Sundaresan,“Java just-in-time compiler and virtual machine improvements for server andmiddleware application”. In Proceedings of the USENIX Virtual Machine Researchand Technology Symposium, pp. 151-162, 2004.
【非特許文献６】T. Suganuma, T. Yasue, M. Kawahito,H. Komatsu, and T. Nakatani, “A dynamic optimization framework for a Javajust-in-time compiler”, in Proceedings of the ACM Conference on Object-OrientedProgramming Systems, Languages, and Applications, pp.180-195, 2001
【非特許文献７】M. Arnold, S. Fink, D. Grove, M. Hind, andP.F.Sweeney, “Adaptive optimization in the Jalapeno JVM”, in Proceedings of theACM SIGPLAN conference on Object-oriented programming, systems, languages, andapplications, pp.47-65, 2000.
【非特許文献８】U. Holzle and D. Ungar, “A thirdgeneration self implementation: Reconciling responsiveness with performance”,in Proceedings of the ACM conference on Object-Oriented Programming, Systems,Languages, and Applications, pp. 229-243, 1994.
【非特許文献９】T. Mytkowicz, A. Diwan, M. Hauswirth, and P. F. Sweeney, “Evaluatingthe accuracy of Java profilers”, in Proceedings of the ACM SIGPLAN conferenceof Programming language design and implementation, pp. 1879-197. 2010.
【非特許文献１０】V. Bala, E. Duesterwald, and S. Banerjia,“Dynamo: A Transparent Runtime Optimization System”, in Proceedings of the ACMProgramming Language Design and Implementation, pp. 1-12, 2000.
【非特許文献１１】M. Hirzel, and T. M. Chilimbi, “Burst tracing: a framework forlow-overhead temporal profiling”, in Proceedings of the 4th Workshopon Feedback-Directed and Dynamic Optimization, pp. 117-126, 2001.
【非特許文献１２】C. Haubl and H. Mossenbock, “Trace-based Compilation for the JavaHotSpot Virtual Machine”, in Proceedings of the International Conference on thePrinciples and Practice of Programming in Java, pp. 129-138, 2011.
【非特許文献１３】M. Bebenita, F. Brandner, M. Fahndrich, F. Logozzo, W. Schulte, N. Tillmann, and H. venter, “SPUR: A trace-based JITcompiler for CIL”, in Proceedings of the ACM international conference on Objectoriented programming systems languages and applications, pp. 708-725, 2010.
【非特許文献１４】M. Bebenita, M. Chang, G. Wagner, A. Gal, C. Wimmer, and M. Franz, “Trace-basedcompilation in execution environments without interpreters”, in Proceedings ofthe 8th International Conference on the Principles and Practice ofProgramming in Java, pp. 59-68, 2010.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
トレースベースのコンパイラにおいてマルチレベルのコンパイレーション技術を使用するためには、再コンパイル時に長いトレースを生成してより大きなコンパイルスコープを得る必要がある。しかしながらコンパイルの基本単位をメソッドとするメソッドベースのコンパイラと異なり、トレースの生成ではコンパイルスコープの開始位置及び終了位置の自由度が高いため、単にトレースの最大長の制約を緩めるだけでは上述したように重複したトレースや開始位置が不適切なトレースが生成されてしまう。
【０００８】
メソッドベースのコンパイラでは頻繁に実行されるメソッドを見つけるために、タイマーベースのサンプリングが利用されている（例えば、特許文献２、非特許文献９を参照）。タイマーベースのサンプリングでは安全な位置で実行を停止させるために、メソッドの先頭、ループのバックエッジにyieldpoint (async check point) が挿入される。そして実行時にタイマー割り込みが起きるとフラグが設定され、スレッドが次のyieldpointに達したときに止まる必要があることが示される。なお停止した位置がメソッドの先頭に挿入されたyieldpointである場合は、１段のスタックウォークを行ってメソッドの呼び出し元を特定し、呼び出し元にタイマーティック（timer tick）があたったとして実行時間がチャージされる。また、メソッドの呼び出しとループを含まないメソッドについては、メソッドを抜ける場所（リターン）にyieldpointが挿入されて、タイマーが全く当たらないということがないようにされる。
【０００９】
トレースベースのコンパイラにおいても、タイマーベースのサンプリングを利用して頻繁に実行される直線実行パスを見つけることが考えられる。しかしながら、トレースを抜ける場所にyield pointを挿入しようとすると、条件分岐ごとに出口（exit）が存在するため挿入数が多くなり、コードサイズが大きくなる。また、トレースベースの実行では元の場所に戻るということがないため、スタックウォークなどの手段では停止したトレースの直前のトレースを見つけることができず、実行時間を適切にチャージできない。  
【００１０】
この発明は、上記の問題点を解決するためになされたものであって、トレースベースのコンパイラにおいてマルチレベルのコンパイレーションを実現することのできる技術を提供することを目的とする。本発明はまた、タイマーベースのサンプリングを利用して、重複したトレースの生成と、更に望ましくはコードサイズの増加とを避けながら、長い実行時間を費やすトレースを見つけ出すことのできる技術を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題を解決するために、本発明の１態様によれば、以下のようなコンピュータによるトレースの生成方法が提供される。該トレース生成方法は、（ａ）前記コンピュータが、最大長を所定長以下に制限されたトレースをコンパイルして得られたコンパイル済みトレースの実行に基づいて、トレース間の実行の遷移を表す有向グラフ（以下、「ＴＴ（Trace Transition)グラフ」という）を作成するステップであって、トレースを示す各ノードが再コンパイルカウンタを有する、前記作成するステップと、（ｂ）前記コンピュータが、前記コンパイル済みコードの実行中におけるタイマーベースのサンプリングにおいて、タイマーティックがあたったトレースに対応するノードを出発点として前記ＴＴグラフのエッジを逆方向に辿り、周期トレース若しくは再コンパイル済みトレースの手前又はエッジがなくなったところで停止して辿り着いたトレースの前記再コンパイルカウンタを増加するステップと、（ｃ）前記コンピュータが、いずれかの前記再コンパイルカウンタの値が第１閾値を超えることを条件に、前記第１閾値を超えた前記再コンパイルカウンタを有するノードに対応するトレースの先頭を新たなトレースの先頭として決定し、前記所定長より長いトレースの生成を許可して前記新たなトレースを生成するステップとを含む。
【００１２】
好ましくは、前記コンパイル済みのコードは、前記タイマーティックがあたったトレースを見つけるためのyield pointをトレースの先頭及びループのバックエッジにのみ挿入されている。
【００１３】
好ましくは、前記ＴＴグラフの各エッジは該エッジが表す遷移の相対頻度を示す重みを有する。そして上記トレース生成方法は、タイマーティックがあたったトレースとその直前に実行されたトレースとの間のエッジの前記重みを増加するステップ（ｄ）を更に含み、上記ステップ（ｂ）において、前記コンピュータは、その重みが所定の条件を満たすエッジのみを辿って辿り着いたトレースの前記再コンパイルカウンタを増加する。
【００１４】
ここで前記所定の条件を満たすエッジとは、前記有向グラフを逆方向に辿る途中に存在するノードに入ってくるエッジが複数ある場合には、該複数のエッジの重みの合計に対するそのエッジの重みの比率が第２閾値を超えるエッジである。
【００１５】
また、次に辿ろうとするノードから出ているエッジが複数ある場合には、前記所定の条件を満たすエッジとは、該複数のエッジの重みの合計に対する現在のノードから前記次のノードへのエッジの重みの比率が第３閾値を超えるエッジである。
【００１６】
更に好ましくは、ステップ（ｄ）は、前記コンピュータが、前記ＴＴグラフ上で前記タイマーティックがあたったトレースに続く１以上のトレースのyield pointにおいて連続して実行が停止するための設定を行うステップを含む。そして、前記連続して実行が停止するための設定は、実行が、周期トレース、既に停止済みのトレース及びコンパイル済みのトレースのうちのいずれかに到達したこと、連続した実行の停止が所定回数に達したこと、又は次のトレースが存在しないトレースを抜けたことに応答して終了する。
【００１７】
また好ましくは、前記コンパイル済みのトレースは、その実行によりトレースを抜けることとなった命令のポインタを記録する命令を挿入されている。そして、ステップ（ｄ）は、トレースの入り口に挿入されたyield pointで実行が停止することに応答して、前記コンピュータが記録された前記命令のポインタの値を参照することにより直前に実行されたトレースを特定するステップを含む。
【００１８】
また、本発明の他の態様によれば、以下のようなコンピュータによるマルチレベルのコンパイレーション実行方法が提供される。該マルチレベルのコンパイレーション実行方法は、（ａ）前記コンピュータが、最大長を所定長以下に制限して生成されたトレースをコンパイルするステップと、（ｂ）前記コンピュータが、生成したコンパイル済みのトレースの実行結果を取得するステップと、（ｃ）前記コンピュータが、取得した実行結果に対して上記説明したいずれかのトレース生成方法の各ステップを実行するステップと、（ｄ）ステップ（ｃ）の結果生成された前記新たなレースに対して前記コンピュータが再コンパイルを実行するステップとを含む。
【００１９】
以上、トレースの生成方法及びマルチレベルのコンパイレーション実行方法として本発明を説明したが、本発明は、上記説明したトレース生成方法及びマルチレベルのコンパイレーション実行方法のそれぞれの各ステップをコンピュータに実行させるためのトレース生成プログラム及びマルチレベルのコンパイレーション実行プログラムとして把握することもできる。また、そのようなトレース生成プログラム及びマルチレベルのコンパイレーション実行プログラムをそれぞれ、１以上のコンピュータにインストールすることにより実現されるトレース生成装置及びマルチレベルのコンパイレーション実行装置として把握することもできる。
【発明の効果】
【００２０】
本発明によれば、タイマーベースのサンプリングを用いてトレース間の実行の遷移を表すＴＴグラフを作成しこれに基づいて適切なトレースに実行時間のチャージを行うので、重複が少なくより長い真にホットなトレースを見つけることができる。また、ＴＴグラフを用いてより長い実行時間を消費するトレースを選択できるため、トレースベースのコンパイラにおいてマルチレベルのコンパイレーションを行うことが可能となり、高速なスタートアップと高いピーク性能の両立を図ることができる。本発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００２１】
【図１】本発明の実施の形態に係るトレース生成装置及びマルチレベルのコンパイラ装置を実現するのに好適なコンピュータ・システム１００のハードウェア構成の一例を示した図である。
【図２】図１に示すコンピュータ・システム１００のソフトウェアの構成の一例を示す図である。
【図３】図３（ａ）は、線形トレースにおけるyield pointの挿入位置を説明する図である。図３（ｂ）は、周期トレースにおけるyield pointの挿入位置を模式的に示した図である
【図４】ＴＴグラフの一例を示す図である。
【図５】図５（ａ）は、ＴＴグラフにおけるエッジの重みの更新方法を説明する図である。図５（ｂ）は、ＴＴグラフにおけるエッジの重みの他の更新方法を説明する図である。
【図６】ＴＴグラフを用いた再コンパイルカウンタの更新方法を説明する図である。
【図７】ＴＴグラフを用いた再コンパイルカウンタの他の更新方法を説明する図である。
【図８】ＴＴグラフを用いた再コンパイルカウンタの更に他の更新方法を説明する図である。
【図９】図９（ａ）は、ＴＴグラフを用いて選択したトレースの一例を示す図である。図５（ｂ）は、トＴＴグラフを用いることなく選択したトレースの一例を示す図である。
【図１０】本発明の実施の形態に係るマルチレベルのコンパイレーション処理全体の流れの一例を示すフローチャートである。
【図１１】ＴＴグラフの更新処理及び該ＴＴグラフに基づく再コンパイル処理の流れの一例を示すフローチャートである。
【図１２】ＴＴグラフを用いた再コンパイルカウンタの増加処理の流れの一例を示す図である。
【図１３】ＴＴグラフの生成及び該ＴＴグラフに基づく再コンパイルの擬似コードの一例を示す図である。
【図１４】従来技術と本発明とで起動時間を比較した実験結果を示す図である。
【図１５】従来技術と本発明とで実行時間を比較した実験結果を示す図である。
【図１６】従来技術と本発明とで合計コンパイル時間を比較した実験結果を示す図である。
【発明を実施するための形態】
【００２２】
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００２３】
図１は、本発明を実施するのに好適なコンピュータ・システム１００のハードウェア構成の一例を示す。コンピュータ・システム１００は、バス１０６に接続されたメインＣＰＵ（中央処理装置）１０２とメイン・メモリ１０４を含んでいる。ＣＰＵ１０２は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i（商標）シリーズ、Core 2（商標）シリーズ、Atom（商標）シリーズ、Xeon（商標）シリーズ、Pentium（登録商標）シリーズ、Celeron（登録商標）シリーズ、AMD社のPhenom（商標）シリーズ、Athlon（商標）シリーズ、Turion（商標）シリーズ又はSempron（商標）が使用されうる。メイン・メモリ１０４は好ましくは、1GB以上の容量、より好ましくは、2GB以上の容量をもつものであってよい。
【００２４】
バス１０６には、ディスプレイ・コントローラ１０８を介して、ディスプレイ１１０、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ１１０は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。
【００２５】
バス１０６にはまた、ＳＡＴＡ又はＩＤＥコントローラ１１２を介して、ディスク１１４、例えばシリコン・ディスク又はハードディスクが接続されうる。バス１０６にはまた、ＳＡＴＡ又はＩＤＥコントローラ１１２を介して、任意的に、ドライブ１１６、例えばＣＤ、ＤＶＤまたはＢＤドライブが接続されうる。バス１０６にはさらに、任意的に、キーボード・マウスコントローラ１１８又はＵＳＢバス（図示せず）を介して、キーボード１２０及びマウス１２２が接続されうるが、本発明を実施する上では必要ない。    
【００２６】
ディスク１１４には、オペレーティング・システム、J2EEなどのJava（登録商標）処理環境、Java（登録商標）アプリケーション、Java（登録商標）仮想マシン（VM）を提供するプログラム、その他のプログラム及びデータが、メイン・メモリ１０４にロード可能なように記憶されている。
【００２７】
オペレーティング・システムは、例えば、LINUX（登録商標）、マイクロソフト・コーポレーションが提供するWindows（登録商標）オペレーティング・システム、アップル・コンピュータ・インコーポレイテッドが提供するMacOS（登録商標）若しくはiOS（登録商標）、XWindow System備えるUNIX（登録商標）系システム（たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）が提供するAIX（登録商標）でありうる。
【００２８】
上記ディスク１１４には更に、オペレーティング・システムと協働してＣＰＵ１０２に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記ディスク１１４には、コンピュータ・システム１００にインストールされ、コンピュータ・システム１００を本発明の実施形態によるトレース生成装置として機能させるトレース生成プログラム、コンピュータ・システム１００を本発明の実施形態によるマルチレベルのコンパイレーション実行装置として機能させるマルチレベルのコンパイレーション実行プログラム、及びそれら関連データを記録することができる。なお、マルチレベルのコンパイレーション実行プログラムは、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを、トレース生成装置によって生成されたトレースに基づきマルチレベルのコンパイレーションを実行可能なように一部修正することによって実装可能である。
【００２９】
上記トレース生成プログラムは、ＴＴグラフ生成モジュールと、ＴＴグラフ更新モジュールと、トレース生成モジュールと、トレースキャッシュを含む。これらプログラム及びモジュールは、ＣＰＵ１０２に働きかけて、コンピュータ・システム１００を、各々後述するＴＴグラフ生成部２２０と、ＴＴグラフ更新部２２１と、トレース生成部２２２と、トレースキャッシュ２２４としてそれぞれ機能させる。また、上記マルチレベルのコンパイレーション実行プログラムは、中間コード生成モジュール、最適化モジュール、コード生成モジュールを含む。これらプログラム及びモジュールは、ＣＰＵ１０２に働きかけて、コンピュータ・システム１００を、各々後述する中間コード生成部２３０と、最適化部２３２と、コード生成部２３４としてそれぞれ機能させる。
【００３０】
上記コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。ドライブ１１６は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭまたはＢＤからプログラムをディスク１１４にインストールするために使用されうる。
【００３１】
通信インタフェース１２６は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース１２６は、通信コントローラ１２４を介してバス１０６に接続され、コンピュータ・システム１００を通信回線１２８に物理的に接続する役割を担い、コンピュータ・システム１００のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境に基づくもの、又は、無線ＬＡＮ環境、例えば、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ規格に基づくものであってもよい。
【００３２】
以上から、本発明の実施態様において使用されるコンピュータ・システム１００は、特定のオペレーティング・システム環境に限定されるものではないことを理解することができるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３３】
図２は、図１に示すコンピュータ・システム１００のソフトウェアの構成の一例を示す図である。ＣＰＵ１０２は、ディスク１１４からJava（登録商標）仮想マシン（VM）、本発明の実施形態によるトレース生成プログラム、マルチレベルのコンパイレーション実行プログラムをメイン・メモリ１０４に読み出し実行することにより、オペレーティング・システム２０２、仮想マシン２０６、トレーシング実行環境２２６、及び動的コンパイラ２２８をメイン・メモリ１０４に展開する。オペレーティング・システム２０２は、ＣＰＵ１０２やメモリの管理など、コンピュータ・システム１００が有する基本的な機能を提供するソフトウェアである。
【００３４】
仮想マシン２０６は、バイトコードの低速実行（ｉｎｔｅｒｐｒｅｔ）、およびコンパイル済みトレースの実行を行うエミュレータである。仮想マシン２０６は、インタープリタ２０８と、実行部２１２と、トレースディスパッチャ２１４を含んで構成される。
【００３５】
トレースディスパッチャ２１４は、トレースキャッシュ２２４を参照して次に実行するバイトコードアドレスから始まるコンパイル済みトレースがコードキャッシュ２１６に保存されている否かを判定する。インタープリタ２０８は、コンパイル済みトレースが存在しない場合に、処理対象のバイトコードを低速に実行する。実行部２１２は、コンパイル済みトレースが存在する場合、動的コンパイラ２２８が生成したコンパイル済みトレースを保存するメモリ領域であるコードキャッシュ２１６からコンパイル済みトレースを取得して実行する。
【００３６】
トレーシング実行環境２２６は、インタープリタ２０８によるバイトコード及び実行部２１２によるコンパイル済みトレースの実行の結果に基づき、現在の最大長に関する制約の下で実行時間をより多く使っているトレース（以下、「ホットパス」ともいう）をコンパイル対象として選択するためのソフトウェアモジュール群である。トレーシング実行環境２２６は、トレース選択エンジン２１８と、トレースキャッシュ２２４とを含んで構成される。トレース選択エンジン２１８は、起動時の低い最適化レベルにおいては最大長を所定長以下に制限してトレースを選択し、起動後のより高い最適化レベルにおいては所定長よりも長いトレースの生成を許可して新たにトレースを選択する。トレースキャッシュ２２４は、コンパイル時の最適化レベルや、後述するＴＴグラフ生成部２２０によって生成されるＴＴグラフのデータ構造など、トレースを管理するための情報を記憶する。
【００３７】
本発明では、起動後のより高い最適化レベルに対してタイマーベースのサンプリングにより頻繁に実行される直線実行パスを見つけるために、トレース間の実行の遷移を表す有向グラフであるＴＴグラフを作成する。そしてＴＴグラフを用いて適切なトレースに実行時間のチャージを行うことで、重複したトレースの生成を避けながら長い実行時間を費やすトレースを見つけ出す。そのため、本発明に係るトレース選択エンジン２１８は、ＴＴグラフ生成部２２０、ＴＴグラフ更新部２２１、トレース生成部２２２を含んで構成される。これら３つの構成要素のそれぞれの機能の詳細については図４〜図９を参照して後述する。
【００３８】
動的コンパイラ２２８は、起動時には起動速度を優先して低い最適化レベルでコンパイルを行い、起動後にはピークパフォーマンスを優先してより高い最適化レベルでコンパイルを行う、マルチレベルのコンパイレーションを採用するコンパイラである。動的コンパイラ２２８は、トレース選択エンジン２１８が出力するトレースを入力として、入力トレースに適用された制約に対応する最適化レベルで最適化を行い、ネイティブコードを動的に生成する。動的コンパイラ２２８は、中間コード生成部２３０と、最適化部２３２と、コード生成部２３４とを含んで構成される。
【００３９】
中間コード生成部２３０は、トレース選択エンジン２１８が出力したトレースを動的コンパイラ２２８内部で扱う表現（intermediate representation）に変換する。最適化部２３２は、起動時における所定長以下のトレースに対しては低い最適化レベルの最適化処理を施しコード生成部２３０に出力する。最適化部２３２はまた、起動後における所定長以上の長さを許可されて選択されたトレースに対しては、より高い最適化レベルの最適化処理を施しコード生成部２３０に出力してアップグレードのための再コンパイルを図る。コード生成部２３４は、最適化部２３２により出力された最適化済みのトレースをネイティブコードに変換し、コードキャッシュ２１６に格納する。
【００４０】
以下では、まず図３を参照して、タイマーベースのサンプリングとそこで使用するyield pointについて説明する。続いて、図４〜図９を参照して、ＴＴグラフの生成、更新及びＴＴグラフに基づく再コンパイルについて説明する。続いて図１０〜図１３を参照して、ＴＴグラフの生成及び更新処理を含む、マルチレベルのコンパイレーション処理全体の流れを説明する。最後に図１４〜図１６を参照して、従来技術と本発明とを比較した実験結果について説明する。
【００４１】
１．タイマーベースのサンプリングとyield point  
タイマーベースのサンプリングでは、コンパイル済みコードの実行中にタイマー割り込みが起こると、yield flagと呼ばれるスレッドローカルなフラグが設定されて、次のyield pointでスレッドが停止する必要があることが示される。実行が次のyield pointで停止すると、対応するメソッドで実行時間が使われているとみなされ実行時間がチャージされる。このようにyield pointを用いることで、ランタイムシステムはスレッドを安全に停止できると共に、タイマーティックがあたった正確なプログラム位置を特定できる。従ってyield pointの挿入位置がプロファイリングの正確さとオーバーヘッドとを決める（詳細は例えば非特許文献９を参照）。
【００４２】
ここでトレースベースのコンパイラにおいてタイマーベースのサンプリングを利用することを考える。タイマー割り込み時に実行されているトレースを正確に特定できるようにするためには、トレースの入り口（entry point）と全ての出口（exit point）にyield pointを挿入する必要がある。しかし全ての出口にyield pointを挿入するとなると、既に述べたように条件分岐ごとにexit pointが存在するため、yield pointの挿入数が多くなりコードサイズが大きくなる。そこで本発明では、ほとんどのexit pointは実行時間のチャージのためのトリガーとなることはないという事実に基づき、yield pointをトレースの先頭及びループのバックエッジにのみ挿入する。  
【００４３】
図３（ａ）は、線形トレース（linear trace）におけるyield pointの挿入位置を説明する図である。図３（ａ）に示す線形トレースは、基本ブロックＡ、Ｂ、Ｃから構成される。タイマーティックを正しく処理するためには、トレースの入り口３００と、全ての出口３０２、３０４、３０６にyield pointを挿入する必要がある。しかしながら本発明では上記事実に基づいてトレースの入り口３００にのみyield pointを挿入し、コードサイズが大きくなることを防ぐ。
【００４４】
また、図３（ｂ）は、周期トレース（cyclic trace）におけるyield pointの挿入位置を説明する図である。図３（ｂ）に示す周期トレースは、基本ブロックＡ、Ｂから構成される。タイマーティックを正しく処理するためには、トレースの入り口３０８と、ループのバックエッジ３１２と、全ての出口３１０にyield pointを挿入する必要がある。しかし本発明では上記事実に基づいてトレースの入り口３０８と、ループのバックエッジ３１２にのみyield pointを挿入し、コードサイズが大きくなることを防ぐ。なお、本実施例においてコンパイル単位とするトレースは、線形トレースと、周期トレースであり、各トレースは、図３（ａ）及び図３（ｂ）に示すように、１つの入り口と１以上の出口をもつブロックとする。
【００４５】
本発明ではトレース出口のyield pointを省略する代わりに、トレース内で最後に実行される命令として分岐及び結合命令（branch-and-link命令）を挿入し、その実行によりトレースを抜けることとなった命令のポインタをリンクレジスタに記録する。これによって、タイマー割り込みにより実行がトレースの入り口に挿入されたyield pointで停まった場合でも、リンクレジスタの値を参照して直前に実行されていたトレースを特定することができる。なお、メソッドベースのコンパイラでは、トレース入り口のyield pointで実行が停まった場合、常に直前に実行されていたトレースに対して実行時間のチャージを行うが、本発明に係るトレーシング実行環境２２６では、詳細は後述するがホットパス全体を見つけ出すためにＴＴグラフを用いて実行時間をチャージすべき適切なトレースをその都度決定する。
【００４６】
上述したbranch-and-link命令は、通常のbranch命令と同じジャンプ命令であるが、ジャンプする際にリンクレジスタという専用レジスタにジャンプ元のアドレスを保存する命令である。branch-and-link命令は、一般的にはメソッドの呼び出しに使用され、呼び出されたメソッドから戻る際にリンクレジスタに保存されたアドレスが参照される。本実施例では、トレースリンキング技術によりトレース同士をリンクする際に、branch命令の代わりにbranch-and-link命令を用いることで、直前に実行されたトレースを特定可能とする。
【００４７】
なお、トレースリンキング技術とは、トレース間で実行をインタープリタ２０８に戻さずに直接次のトレースに実行を移させるために用いられる最適化技術である。トレースリンキングを実現するためには、元のトレースの出口から直に次のトレースの先頭アドレスへのジャンプを行うコードを生成しこれを元のトレースに挿入する必要がある。このため通常は、コンパイル時に実行コードの最後にトレースディスパッチャ２１４へのbranch命令を挿入し、トレースディスパッチャ２１４は、次のトレースが一意に決まることを条件として、ジャンプ元、ジャンプ先のトレースがコンパイルされた後最初の実行時にbranch命令のとび先を次のトレースの先頭アドレスに書き換える。本実施例では上述したように、トレース同士をリンクする際にbranch命令の代わりにbranch-and-link命令によりトレースの先頭アドレスへジャンプするよう書き換える。なおトレースリンキングは既存技術であり本発明の要旨ではないからこれ以上の説明は省略する。トレースリンキングの更なる詳細については、例えば非特許文献１０を参照されたい。
【００４８】
２．ＴＴグラフの生成
ＴＴグラフ生成部２２０は、最大長を所定長以下に制限してコンパイルされたコンパイル済みトレースの実行中にタイマーベースのサンプリングを用いたプロファイリングを行うことで、ＴＴグラフを生成する。ＴＴグラフは、トレース間の実行の遷移を表す有向グラフであり、有向グラフの各ノードはトレースを示し、ノード間のエッジはトレース間の実行の遷移を示す。各ノードは該ノードにタイマーティックがあたった頻度を示す再コンパイルカウンタを有し、各エッジは対応するトレース間の遷移の相対頻度を示す重みを有する。
【００４９】
一例としてＴＴグラフは、ＴＴグラフ内の各ノードに対し次のａ〜ｃの情報を保持するデータ構造で保持されてよい。
ａ．タイマーティックが当たった回数を数えるカウンタ（以下、「再コンパイルカウンタ」という）
ｂ．入ってくるエッジ（incoming edge）それぞれについて｛元のノード，エッジの重みカウンタ｝
ｃ．出ていくエッジ（outgoing edge）それぞれについて｛行先のノード，エッジの重みカウンタ｝
ここで各ノードは、該ノードが示すトレースの情報を管理するデータ構造へのポインタによって識別されてよい。なお１のノードに入ってくる又は出ていくエッジ数が多くなる場合は、重みカウンタが大きい上位のエッジの情報のみを保持し、残りのエッジについてはその他のエッジとしてまとめてカウントしてよい。これによりエッジ数の多いノードが増えてもメモリ消費が問題となることはない。
【００５０】
ＴＴグラフの生成は次のようにして行う。まずプログラムの起動時にコンパイル単位であるトレースの最大長を所定長以下に制限し短い多数のトレースを生成する。そして生成したトレースに対応する有向グラフのノードを作成する。但しこの時点では各ノードに対して保持される上記ａ〜ｃの各情報の中身は空である。次に生成された多数のトレースを低い最適化レベルでコンパイルする。このときトレースの先頭及びループのバックエッジにyield pointを挿入する。
【００５１】
次にコンパイル済みトレースを実行部２１２により実行し、トレースディスパッチャ２１４によりトレースリンキングが行われることに応答してＴＴグラフ内の対応するノード間のエッジをはる。より具体的には、元のトレースのノードに対しては情報ｃの行先のノードを設定し、現在のトレースのノードに対しては情報ｂの元のノードを設定し、それぞれ対応するエッジの重みカウンタを１で初期化する。これにより元のトレースと次のトレースとの間にエッジがはられる。
【００５２】
図４は、トレース同士が結合されたばかりの時点におけるＴＴグラフの基本構造の一例を示す図である。図４に示すように、一般的にはホットループが周期トレース（ノード４００が示すcyclictraceを参照）として選択され、そこから抜けた先が順次次のトレース（ノード４０２、４０６、…が示すlineartrace 1、linear trace 2、…を参照）としてコンパイルされていく。ＴＴグラフ内のノードには、linear trace2を示すノード４０６のように入ってくるエッジが複数のものもある。上述したように本実施例においてトレースは１つの入り口と１以上の出口をもつブロックであるので、全ての入ってくるエッジは次のトレースの先頭にジャンプしなくてはならない。またＴＴグラフ内のノードには、lineartrace3を示すノード４０８のように出ていくエッジが複数のものもある。出ていくエッジは、トレースの途中にある出口又はトレースの終わりにある出口のいずれかから次のトレースの先頭への遷移を示す。
【００５３】
３．エッジの重みの更新
ＴＴグラフの基本構造ができると、次にＴＴグラフ更新部２２１は、コンパイル済みトレースを実行中にタイマーベースのサンプリング用いてプロファイリングを行うことにより、エッジの重みがトレース間の遷移の相対頻度を示すように調整する。即ちＴＴグラフ更新部２２１は、プロファイリングにより２つのトレース間の遷移を見つけると、該遷移を示すエッジの重みを１増加する。より具体的には、ＴＴグラフ更新部２２１は、タイマーティックがあたったトレースとその直前に実行されたトレースとの間のエッジの重みを増加する。なお、ノードに入ってくるエッジが複数ある場合には、リンクレジスタを参照して該当する１のエッジを特定する。
【００５４】
図５（ａ）を参照して、エッジの重みの調整方法を具体的に説明する。図５（ａ）に示すように、linear trace 1（ノード５０２）を実行中にタイマー割り込みが起きてyield flagが設定され、実行が次のトレース、即ちlinear trace 2（ノード５０６）の先頭のyield pointで停まったとする。このとき直前のトレースはlineartrace 1（ノード５０２）であるので、linear trace 1のノード５０２とlinear trace 2のノード５０６間のエッジの重みを１増やす。なお、現在のトレースは、現在の命令のポインタからを特定され、直前のトレースはリンクレジスタを参照することにより特定される。また、周期トレースの実行中にタイマー割り込みが起こり、実行がその周期トレースのバックエッジのyieldpointで停まる場合は、同一のトレースへの遷移であり調整すべきエッジがないので何もしない。
【００５５】
サンプルを効率的に収集して十分に正確なＴＴグラフをより早く構築するために、従来技術のバーストトレーシング技術を応用することもできる。バーストトレーシング技術は、サンプリング開始時に１のイベントの代わりに一連のイベント列（バースト）をサンプリングすることによって、低オーバーヘッドの短時間のプロファイリングを可能とする技術である（詳細は非特許文献１１を参照）。そこで本発明においてもバーストトレーシング技術を応用したバーストサンプリング、即ち、トレースの先頭のyieldpointごとに繰り返し実行を停止して、一連のトレース間の遷移をサンプリングすることを考える。
【００５６】
バーストサンプリングを利用する場合、ＴＴグラフ更新部２２１はＴＴグラフ上でタイマーティックがあたったトレースに続く１以上のトレースのyield pointにおいて連続して実行が停止するよう設定を行う。具体的には、ＴＴグラフ更新部２２１は実行がトレース先頭の任意のyield pointで停止するごとにyield flagを設定し、次のyield pointでスレッドが停止する必要があることを示す。
【００５７】
図５（ｂ）を参照してバーストサンプリングを具体的に説明する。図５（ｂ）に示すように、プロファイリングを開始後タイマー割り込みが起きてyield flagが設定され、linear trace 2を示すノード５２６の先頭のyieldpointで実行が停止したとする。ＴＴグラフ更新部２２１は対応するエッジの重み、即ちlinear trace 1のノード５２２とlineartrace 2を示すノード５２６の間のエッジの重みを１増加した後、次のyield pointで再び実行が停止するようにyield flagを設定する。そして次のlinear trace 3のyield pointで実行が停止するとＴＴグラフ更新部２２１は再び上記処理を繰り返す。
【００５８】
ＴＴグラフ更新部２２１は上記処理を、（１）連続した実行の停止回数が所定数に達したこと、（２）実行が、周期トレース、バーストサンプリングにおいて既に停止済みのトレース、及びコンパイル済みトレースのうちのいずれかのトレースに到達したこと、（３）実行が、次のトレースが存在しないトレースの出口を通過したことのいずれかに応答して終了する。このようにバーストサンプリングを利用することで、タイマー割り込み頻度を増やすことなく連続したトレース間の遷移をサンプリングすることができる。また、ほとんどのホットパスが再コンパイル済みとなれば、上記（２）の条件によりほとんどのバーストサンプリングは終了する。そのため定常状態では、バーストサンプリングによるオーバーヘッドは、繰り返し停止のない通常のサンプリングと比較してそれほど大きくない。
【００５９】
４．再コンパイルカウンタの更新及びＴＴグラフに基づく再コンパイル
ＴＴグラフ更新部２２１は、エッジの重みの更新と平行して、ＴＴグラフ内の各ノードが有する再コンパイルカウンタを更新する。上述したように各ノードの再コンパイルカウンタはそのノードが示すトレースにタイマーティックがあたった頻度を示す。但しここでいうタイマーティックがあたった頻度とは、そのトレースに真にタイマーティックがあたった頻度ではなく、タイマー割り込みが起きたときにそのトレースに実行時間をチャージすべきと判断された頻度である。
【００６０】
本発明では実行時間をチャージすべきトレースを以下のようにＴＴグラフを用いて決定する。即ち、ＴＴグラフ更新部２２１は、コンパイル済みコードの実行中において、タイマーティックがあたったトレースに対応するノードを出発点としてＴＴグラフのエッジを逆方向に辿り、周期トレース、再コンパイル済みトレース、若しくは後述する無効トレースの手前、又はエッジがなくなったところで停止して辿り着いたトレースの再コンパイルカウンタを増加する。
【００６１】
再コンパイルカウンタを増加する際にＴＴグラフ更新部２２１はまた、その値を所定の閾値Ｓ１と比較する。そして再コンパイルカウンタの値が所定の閾値Ｓ１よりも大きいと判定した場合、ＴＴグラフ更新部２２１は、所定の閾値Ｓ１よりも大きい再コンパイルカウンタを有するノードに無効のマークをつけ、該ノードの全ての入ってくるエッジ及び出ていくエッジを削除する。次に実行が無効マークのついたトレースに到達するとトレース生成部２２２が呼び出され、トレース生成部２２２は無効マークのついたトレースの先頭アドレスを新たなトレースの開始位置として、所定長以上の長さを許可して新たにトレースを生成する。生成された新たなトレースはその後動的コンパイラ２２８に対して出力され、高い最適化レベルで最適化される。コンパイル済みとなった新たなトレースは、ＴＴグラフ生成部２２０により新規ノードとしてＴＴグラフに追加される。なお無効マークは一定時間経過した後は削除される。
【００６２】
このように本発明に係るトレーシング実行環境２２６は、ＴＴグラフを利用して適切なトレースに実行時間をチャージし、ホットパス全体を見つけ出す。なお、周期トレースに到達した際に逆方向の探索をそれ以上行わないのは、上述したように本実施例では周期トレースと線形トレースのみをコンパイル単位とするためである。従って、たとえ最適化レベルが高く設定され所定長よりも長くトレースを生成することが許されていても、周期トレースと線形トレースとが互いに混じるような形でＴＴグラフを逆方向に探索することはしない。
【００６３】
図６は、上記再コンパイルカウンタの更新方法を説明する図である。図６に示すように、ノード６０８が示すlinear trace 3を実行中にタイマー割り込みが起こりyield flagが設定され、次のノード６１０が示すlinear trace 4の先頭のyield pointで実行が停まったとする。この場合タイマーティックがあたったトレースはlinear trace 4であるため対応するノード６１０が出発点となる。ノード６１０を出発点としてＴＴグラフを逆方向へ辿っていくと（矢印６１４参照）、linear trace 1を示すノード６０２に到達する。ノード６０２は周期トレースを示すノード６００の手前のノードであるため、ノード６０２で逆方向の探索を終了し、その再コンパイルカウンタを１増加して実行時間をチャージする。
【００６４】
上述したようにＴＴグラフ内には複数の入ってくるエッジや複数の出ていくエッジをもつノードが存在し得る。ＴＴグラフを逆方向に辿る途中に複数のエッジを有するノードがある場合、ＴＴグラフ更新部２２１は、その重みが所定の条件を満たすエッジのみを辿る。より具体的には、ＴＴグラフ更新部２２１は、ＴＴグラフを逆方向に辿る途中に存在するノードに入ってくるエッジが複数ある場合に、該複数のエッジの重みの合計に対するそのエッジの重みの比率が所定の閾値Ｓ２を超えるエッジのみを辿る（第１更新方法）。ＴＴグラフ更新部２２１はまた、次に辿ろうとするノードから出ているエッジが複数ある場合に、該複数のエッジの重みの合計に対する、現在のノードから次のノードへのエッジの重みの比率が所定の閾値Ｓ３を超えるエッジのみを辿る（第２更新方法）。これは、複数のエッジの重みの合計値に対する対象のエッジの重みの比率が所定の閾値より小さいということは、そのパス（エッジ）がめったに実行されないパスということになるからである。なお、条件を満たすエッジが複数ある場合はその条件を満たす全てのエッジを辿る。
【００６５】
図７は、上記再コンパイルカウンタの更新方法（第１更新方法）を説明する図である。図７に示すように、ノード７０８が示すlinear trace 3を実行中にタイマー割り込みが起こりyield flagが設定され、次のノード７１０が示すlinear trace 4の先頭のyield pointで実行が停まったとする。この場合タイマーティックがあたったトレースはlinear trace 4であるため対応するノード７１０が出発点となる。ノード７１０を出発点としてＴＴグラフを逆方向へ辿っていくと２つの入ってくるエッジ７１４、７１６を有するノード７０６に到達する。
【００６６】
ここで所定の閾値Ｓ２を２つの入ってくるエッジ７１４、７１６の重みの合計値８（８＝６＋２）の２０％とすると、エッジ７１４の重み値６もエッジ７１６の重み値２もどちらも２０％を超えるので両方のエッジについて引き続き逆方向の探索が続けられる。するとエッジ７１４についてはノード７００が周期トレースとなるためその手前のノード７０２で逆方向探索を終了する。そしてノード７０２の再コンパイルカウンタを１増加して実行時間をlinear trace 1にチャージする。エッジ７１６についてはノード７０４に到達した時点で入ってくるエッジがなくなるので、ノード７０４の再コンパイルカウンタを１増加して実行時間をlinear trace 1’にチャージする。
【００６７】
図８は、上記再コンパイルカウンタの更新方法（第２更新方法）を説明する図である。図８に示すように、ＴＴグラフの逆方向の探索が開始され、現在のノードがlinear trace 4’を示すノード８１２に到達したとする（矢印８１８を参照）。すると次に辿ろうとするノード８０８は複数の出ていくエッジ８１４、８１６を有しているので、重みを用いてそのエッジを辿るための条件が満たされるか否か検討する。
【００６８】
ここで所定の閾値Ｓ３を２つの出ていくエッジ８１４、８１６の重みの合計値９（９＝８＋１）の２０％とすると、エッジ８１６の重み値１は２０％より小さいのでエッジ８１６を辿ることはしない。結果、逆方向の探索はノード８１２で終了し、ノード８１２の再コンパイルカウンタを１増加して実行時間をlinear trace 4’チャージする。
【００６９】
図９（ａ）は、ＴＴグラフを用いて選択した所定長よりも長いトレースの一例を示す図である。図９（ｂ）は、ＴＴグラフを用いることなく選択した所定長よりも長いトレースの一例を示す図である。なお、図９（ｂ）に示すＴＴグラフ（トレース９１６を除く）は、図９（ａ）に示したＴＴグラフと同一であり、これは理解を容易にするために提供しているに過ぎないことを理解されたい。
【００７０】
図９（ａ）に示す所定長よりも長い再コンパイルのためのトレース９１４は、ＴＴグラフを使用することにより開始位置が適切に選択され生成されたトレースである。そのためトレース９１４はホットパス全体を含む。これに対し図９（ｂ）に示す所定長よりも長い再コンパイルのためのトレース９１６は、タイマー割り込みが偶然発生した位置を開始位置として生成されたトレースである。そのため、トレース９１６はホットパスの一部のみを含む。結果、トレース９１４に対してはホットパス全体を考慮した最適化を行うことができ、よい実行コードの生成が可能となる。一方トレース９１６はホットパス全体をカバーしないので、最適化の機会を失う可能性がある。また、トレース９１６については、ノード９０２、９０４が示すlinear trace1、linear trace 2からそれぞれ始まる別の長いトレースが新たに生成される可能性もあり、その場合無駄な重複を発生してしまう。このようにＴＴグラフを使用してトレースを選択することで、アップグレードのための再コンパイルに相応しいトレースを生成することが可能となる。
【００７１】
５．動作説明
次に図１０を参照して、本発明の実施の形態に係るマルチレベルのコンパイレーション処理全体の流れを説明する。図１０に示すフローチャートは、仮想マシン２０６により実行対象のプログラムが起動されることによって開始し、トレース選択エンジン２１８は、インタープリタ２０８によるプログラムの実行結果に基づき、最大長を所定長以下に制限して頻繁に実行されるパスをトレースとして選択する（ステップ１０００）。続いて、動的コンパイラ２２８は、トレース選択エンジン２１８によって出力されたトレースに対しyield pointを挿入して、低い最適化レベルでコンパイル処理を行う（ステップ１００２）。
【００７２】
続いて、実行部２１２はコードキャッシュ２１６からコンパイル済みのトレースを読み出して実行する（ステップ１００４）。実行部２１２によるコンパイル済みのトレースの実行に応答して、トレース選択エンジン２１８はＴＴグラフ（基本構造）を作成する（ステップ１００６）。続いてトレース選択エンジン２１８はタイマーベースのサンプリングを用いたプロファイリングを開始する（ステップ１００８）。続いて、トレース選択エンジン２１８はプロファイリング結果に基づきＴＴグラフを更新し、所定の条件が満たされる場合には新たなトレースを生成して、再コンパイルのため動的コンパイラ２２８に出力する（ステップ１０１０）。動的コンパイラ２２８は、新たなトレースに対し高い最適化レベルで再コンパイルを行う。更新及び再コンパイル処理の詳細は図１１及び図１２を参照して後述する。そして処理は終了する。
【００７３】
次に図１１を参照して、図１０に示すＴＴグラフの更新及び再コンパイル処理（ステップ１０１０）の詳細を説明する。図１１に示すフローチャートはタイマー割り込みにより開始し、ＴＴグラフ更新部２２１は、バーストサンプリングのためのyieldflagを設定する（ステップ１１００）。続いて、yield flagの設定に応答して、実行部２１２が次のyield point で実行を停止する（ステップ１１０４）。
【００７４】
続いて、ＴＴグラフ更新部２２１は、停止位置のyield pointがトレースの先頭に挿入されたyieldpointであるか否かを判定する（ステップ１１０６）。トレースの先頭に挿入されたyieldpointでない場合（ステップ１１０６：ＮＯ）、即ち、周期トレースのバックエッジに挿入されたyieldpointである場合、ＴＴグラフ更新部２２１は今回の実行の停止がタイマー割り込み後の最初の実行停止であるか否かを判定する（ステップ１１１８）。
【００７５】
最初の実行停止である場合（ステップ１１１８：ＹＥＳ）、ＴＴグラフ更新部２２１は、現在のトレース、即ち周期トレースの再コンパイルカウンタを１増加する（ステップ１１２０）。続いてＴＴグラフ更新部２２１は、周期トレースの再コンパイルカウンタの値が所定の閾値Ｓ１より大きいか否かを判定する（ステップ１１２２）。再コンパイルカウンタの値が所定の閾値Ｓ１より大きい場合、トレース生成部２２２は次の実行時に周期トレースの先頭アドレスを開始位置として新たなトレースを生成し、動的コンパイラ２２８は新たなトレースを高い最適化レベルで再コンパイルする（ステップ１１２４）。なお、本実施例では周期トレースと線形トレースとを対象とするため、元の周期トレースと同一のトレースが再び生成されることになるが、適用される最適化レベルは前回よりも高いことに留意されたい。ステップ１１１８で最初の実行停止でない場合、又はステップ１１２２において周期トレースの再コンパイルカウンタの値が所定の閾値Ｓ１より大きくない場合、処理は終了する。
【００７６】
一方、停止位置のyield pointがトレースの先頭に挿入されたyieldpointである場合（ステップ１１０６：ＹＥＳ）、ＴＴグラフ更新部２２１はリンクレジスタを参照して直前に実行されたトレースが判別可能か否かを判定する（ステップ１１０８）。直前に実行されたトレースが判別可能である場合（ステップ１１０８：ＹＥＳ）、ＴＴグラフ更新部２２１は、直前に実行されたトレースから現在のトレースへの遷移を示すＴＴグラフのエッジの重みを１増加する（ステップ１１１０）。
【００７７】
一方、直前に実行されたトレースが判別可能でない場合（ステップ１１０８：ＮＯ）、又はステップ１１１０の後処理はステップ１１１２へ進み、ＴＴグラフ更新部２２１は今回の実行の停止がタイマー割り込み後の最初の実行停止であるか否かを判定する。最初の実行停止である場合（ステップ１１１２：ＹＥＳ）、ＴＴグラフ更新部２２１は、ＴＴグラフを用いて再コンパイルカウンタの増加処理を行う（ステップ１１１４）。再コンパイルカウンタの増加処理の詳細は図１２を参照して後述する。
【００７８】
一方、今回の実行停止がタイマー割り込み後の最初の停止でない場合（ステップ１１１２：ＮＯ）、又は再コンパイルカウンタの増加処理の後処理はステップ１１１６へ進み、ＴＴグラフ更新部２２１は、バーストサンプリングの終了条件が満たされるか否かを判定する。終了条件の内容は既に説明済みであるためここでは省略する。バーストサンプリングの終了条件が満されないと判定された場合（ステップ１１１６：ＮＯ）、処理はステップ１１０４へ戻り一連の処理を繰り返す。一方、バーストサンプリングの終了条件が満された場合（ステップ１１１６：ＹＥＳ）、又はステップ１１２４の再コンパイルの後処理は終了する。  
【００７９】
次に図１２を参照して、図１１に示す再コンパイルカウンタの増加処理（ステップ１１１４）の詳細を説明する。図１２に示すフローチャートはステップ１２００から開始し、ＴＴグラフ更新部２２１は、現在のトレース、即ちその先頭のyieldpointで実行が停止したトレースを、現在の処理対象として選択する。続いてＴＴグラフ更新部２２１は、現在の処理対象のトレースがＴＴグラフ上で入ってくるエッジを有するか否かを判定する（ステップ１２０２）。
【００８０】
現在の処理対象のトレースが入ってくるエッジを有する場合（ステップ１２０２：ＹＥＳ）、続いてＴＴグラフ更新部２２１は、その入ってくるエッジの元のトレースが、周期トレース、再コンパイル済みトレース、又は無効化されたトレースのいずれかであるか否かを判定する（ステップ１２０４）。なお、現在の処理対象のトレースが複数の入ってくるエッジを有する場合、その各々を現在の処理対象のエッジとしてステップ１２０４以下の処理を行う。
【００８１】
元のトレースが上記３つのトレースのいずれでもない場合（ステップ１２０４：ＮＯ）、ＴＴグラフ更新部２２１は、現在の処理対象の入ってくるエッジの重みが小さいか否かを判定する（ステップ１２０６）。より具体的には、ＴＴグラフ更新部２２１は、現在の処理対象のトレースに入ってくるエッジが複数ある場合に該複数のエッジの重みの合計に対する現在の処理対象のエッジの重みの比率が所定の閾値Ｓ２より小さいか否かを判定する。また、ＴＴグラフ更新部２２１は、元のトレースが複数の出ていくエッジを有する場合に、該複数のエッジの重みの合計に対する現在の処理対象のエッジの重みの比率が所定の閾値Ｓ３より小さいか否かを判定する。
【００８２】
現在の処理対象の入ってくるエッジの重みが小さくない場合（ステップ１２０６：ＮＯ）、ＴＴグラフ更新部２２１は、元のトレースを次の現在の処理対象のトレースとし（ステップ１２０８）、ステップ１２０２の処理に戻る。一方、現在の処理対象の入ってくるエッジの重みが小さい場合（ステップ１２０６：ＹＥＳ）、現在の処理対象である入ってくるエッジについては処理を終了する。
【００８３】
また、現在の処理対象のトレースに入ってくるエッジがない場合（ステップ１２０２：ＮＯ）、又は、元のトレースが、周期トレース、再コンパイル済みトレース又は無効化済みトレースのいずれかである場合（ステップ１２０４：ＹＥＳ）、処理はステップ１２１０へ進み、ＴＴグラフ更新部２２１は、現在の処理対象のトレースの再コンパイルカウンタを１増加する。
【００８４】
続いてＴＴグラフ更新部２２１は、現在の処理対象のトレースの再コンパイルカウンタの値が所定の閾値Ｓ１より大きいか否かを判定する（ステップ１２１２）。再コンパイルカウンタの値が所定の閾値Ｓ１より大きくない場合、処理は終了する。再コンパイルカウンタの値が所定の閾値Ｓ１より大きい場合、トレース生成部２２２は次の実行時に現在処理対象のトレースの先頭アドレスを開始位置として所定長よりも長いトレースの生成を許可して新たなトレースを生成し、動的コンパイラ２２８は新たなトレースを高い最適化レベルで再コンパイルする（ステップ１２１４）。その後処理は終了する。
【００８５】
図１３は、これまで説明してきたＴＴグラフの生成及びＴＴグラフに基づく再コンパイルの擬似コードの一例である。
【００８６】
６．    実験結果
ＤａＣａｐｏベンチマークスイートを用いて本発明によるＴＴグラフに基づくマルチレベルのコンパイレーションを適用したトレースベースのＪＩＴコンパイラの性能を評価した。比較に用いた従来技術は以下の通りである。
従来技術１：長いトレースの生成を許可し、高い最適化レベルでコンパイル。アップグレードのための再コンパイルなし。
従来技術２：トレースの最大長を制限し、低い最適化レベルでコンパイル。アップグレードのための再コンパイルなし。
従来技術３：アップグレードのための再コンパイルあり。但し、ＴＴグラフを使用せずに、単に最大長の制限を緩和。
【００８７】
図１４は、従来技術と本発明とで起動時間を比較した実験結果を示す。縦軸の起動時間は１イタレーション目の実行時間である。また図に示す値はＤａＣａｐｏの全ベンチマークの平均値である。従来技術１の起動時間が長いのは、当初より高い最適化レベルでコンパイルしているためである。これに対し本発明を含む残り３つは、起動時は低い最適化レベルでコンパイルを行っているため、起動時間が短い。
【００８８】
図１５は、従来技術と本発明とでピーク性能を比較した実験結果を示す図である。縦軸は実行時間を示す。また、図に示す値はＤａＣａｐｏの全ベンチマークの平均値である。従来技術２の実行時間が長いのは、トレース長を制限し低い最適化レベルでコンパイルしているためである。またアップグレードのための再コンパイルを行いながらも従来技術３の実行時間が本発明よりも若干長くなっているのは、再コンパイルのためのトレースの選択が適切ではないため、最適化の機会を失ったり、重複したトレースを生成しているためと考えられる。
【００８９】
図１６は、従来技術と本発明とで合計コンパイル時間を比較した実験結果を示す図である。縦軸は合計コンパイル時間を示す。また、図に示す値はＤａＣａｐｏの全ベンチマークの平均値である。アップグレードのための再コンパイルを行っていないにも関わらず従来技術１の合計コンパイル時間が長いのは、長いトレースの生成を許可して高い最適化レベルでコンパイルしているためである。
【００９０】
図１４〜図１６の実験結果から、高速なスタートアップと高いピーク性能を両立させることができるのは、本発明によるＴＴグラフに基づくマルチレベルのコンパイレーションだけであることが分かる。
【００９１】
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。例えば、上記説明した実施例では、起動の高速化を図る観点からは小さく単純なコンパイル単位に区切ることが好ましいことから、コンパイル単位とするトレースは、線形トレースと、周期トレースであり、各トレースは、図３（ａ）及び図３（ｂ）に示すように、１つの入り口と１以上の出口をもつブロックとした。しかしながら、本発明は、ツリー上のトレース（分岐を含むが合流を含まない）や周期トレースと線形トレースを組み合わせたトレース、更には合流を含むような複雑なトレースなど他のトレースに対しても同様の方法により適用可能である。また上記説明した実施例では、トレースリンキング技術とbranch-and-link命令を使用して、トレース間の遷移があった場合にその直前に実行されたトレースを特定可能とした。しかしながらこれら技術や命令を使用せずに、現在のトレースから次のトレースへジャンプする際にジャンプ前のアドレスを特定のレジスタやメモリに保存する構成としたり、トレース間の遷移はトレースディスパッチャ２１４を経由する構成とし、トレースディスパッチャ２１４において必要な情報を収集するようにしたりしてもよい。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【図１】
2014075046.tif 000003
【図２】
2014075046.tif 000004
【図３】
2014075046.tif 000005
【図４】
2014075046.tif 000006
【図５】
2014075046.tif 000007
【図６】
2014075046.tif 000008
【図７】
2014075046.tif 000009
【図８】
2014075046.tif 000010
【図９】
2014075046.tif 000011
【図１０】
2014075046.tif 000012
【図１１】
2014075046.tif 000013
【図１２】
2014075046.tif 000014
【図１３】
2014075046.tif 000015
【図１４】
2014075046.tif 000016
【図１５】
2014075046.tif 000017
【図１６】
2014075046.tif 000018