JP2015090647A - ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム - Google Patents
ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム Download PDFInfo
- Publication number
- JP2015090647A JP2015090647A JP2013230952A JP2013230952A JP2015090647A JP 2015090647 A JP2015090647 A JP 2015090647A JP 2013230952 A JP2013230952 A JP 2013230952A JP 2013230952 A JP2013230952 A JP 2013230952A JP 2015090647 A JP2015090647 A JP 2015090647A
- Authority
- JP
- Japan
- Prior art keywords
- computer
- execution
- executed
- address
- return address
- 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
- Debugging And Monitoring (AREA)
Abstract
【課題】ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善する。
【解決手段】プロファイル対象のプログラム実行中におけるハードウェア割り込みに応答して、割り込みハンドラを起動し、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換える(S500)。割り込みハンドラによる処理が終わると、上記メソッドの実行を再開し、メソッドの終わりにおいて所定のプロファイル・コードを呼び出す(S502)。所定のプロファイル・コードが実行した後(S504)、保存しておいた戻り先アドレスへジャンプし、プロファイル対象のプログラムの実行を継続する。
【選択図】図5
【解決手段】プロファイル対象のプログラム実行中におけるハードウェア割り込みに応答して、割り込みハンドラを起動し、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換える(S500)。割り込みハンドラによる処理が終わると、上記メソッドの実行を再開し、メソッドの終わりにおいて所定のプロファイル・コードを呼び出す(S502)。所定のプロファイル・コードが実行した後(S504)、保存しておいた戻り先アドレスへジャンプし、プロファイル対象のプログラムの実行を継続する。
【選択図】図5
Description
本発明は、ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善のための技術に関し、より詳細には、プログラムに挿入されたyield pointに基づくプロファイラの精度を改善する技術に関する。
最初に、Java(登録商標)Just-In-Time(以下、JITという)コンパイラについて説明する。
Java(登録商標)とは、サン・マイクロシステムズ社(SunMicrosystems Inc.)によって開発されたオブジェクト指向のプログラミング言語である。Java(登録商標) プログラミング言語で記述されたプログラムは、Java(登録商標)バイトコードコンパイラによってバイトコード(byte code)と呼ばれる形式のプログラムに変換され、Java(登録商標)仮想計算機(virtual machine)(以下、JVMともいう)によって実行される。Java(登録商標)仮想計算機は、実際の計算機上で稼動するプログラムであり、計算機毎のプロセッサおよびオペレーティング・システムの違いを吸収して、単一のJava(登録商標) プログラミング言語による実行環境を異なる種類の計算機上で提供する。
バイトコード形式のプログラムは、JVMが稼動するいかなる計算機においても実行することができる。しかし、JVMはバイトコードを1命令ずつ解釈して実行するため、プログラムの実行が遅いという問題がある。この問題に対して、JVMはバイトコードの実行中に、バイトコード形式のプログラムを機械語命令形式のプログラムにコンパイルし、得られた機械語命令形式のプログラムを実際の計算機上で直接実行することでプログラムの実行速度を向上する。このように、バイトコードから機械語への変換をプログラムの実行時に行うコンパイラを、Java(登録商標)JITコンパイラと呼ぶ。この方式は、プログラムの実行中にJITコンパイルを行うため、プログラムの実行時間に加えてJITコンパイルの時間が必要になるが、機械語形式による実行が高速であるため、JVMのみによるバイトコードの実行より遥かに高速である。一般にJava(登録商標)JITコンパイラは、Java(登録商標)プログラミング言語における手続きであるメソッド(method) を単位として、Java(登録商標)プログラムがメソッドを呼び出す直前にJITコンパイルを行う。また、JITコンパイルにかかる時間を減らすため、JVMはプログラム中で頻繁に実行されるメソッドだけをJITコンパイルする。
そして、メソッドベースのJITコンパイラでは頻繁に実行されるメソッドを見つけるために、タイマーやパフォーマンスカウンタ等のハードウェア割り込みを用いるサンプリング・プロファイラが利用されている(例えば、特許文献1を参照)。ハードウェア割り込みを用いるサンプリングでは安全な位置で実行を停止させるために、メソッドの先頭、ループのバックエッジにyield point (async check point) が挿入される。そして実行時にタイマー割り込みが起きるとフラグが設定され、スレッドが次のyield pointに達したときに止まる必要があることが示される。なお停止した位置がメソッドの先頭に挿入されたyield pointである場合は、1段のスタックウォークを行ってメソッドの呼び出し元を特定し、呼び出し元にタイマーティック(timer tick)があたったとして実行時間がチャージされる。
ところで上述したyield pointに基づくプロファイルでは、メソッドの呼び出しとループを含まないメソッドについては、どれだけ実行時間を使っても、サンプリングがあたらないという問題がある。そのため、サンプリングが全く当たらないということがないように、メソッドを抜けるすべてのリターン(return)にyield pointを挿入することが考えられる。しかしながら、すべてのリターンにyield pointを入れるとなると、プロファイルの精度を上げことは可能となるが、コードサイズの増加や、ハードウェア割り込みの有無に関係なく条件分岐が入ってしまうことによる性能の低下が起こる問題がある。
なお、以下に示す先行技術文献のリストにおいて、特許文献2、3は本発明の先行技術調査でみつかった文献である。
特許文献2は、プリエンプション処理を要求してきた緊急性の高い緊急プロセスがある場合には、当該緊急プロセスを即座に実行することを課題とし、緊急プロセスにプリエンプション要求情報が設定され、且つ、現在周期起床プロセスの実行中である場合には、割り込みにより実行を中断された周期起床プロセスへのリターンアドレスを上記スタックへ退避させ、リターンアドレスとして上記プリエンプション要求情報が設定された緊急プロセスのアドレスを設定すると共に、上記プリエンプション要求情報が設定された緊急プロセスの最後に上記スタックに格納されたリターンアドレスを獲得してリターンする命令を記述し、当該プリエンプション要求情報が設定された緊急プロセスを実行した後、上記スタックに退避させたリターンアドレスに基づいて上記実行を中断された周期起床プロセスを実行させる技術を開示する。しかしながら特許文献2の技術では、割り込みがかかった直後に緊急プロセスが実行されるので、安全な位置で停止させて実行する必要のあるプロファイルに特許文献2に記載の技術を適用することはできない。
特許文献3は、動作中である分析対象プログラムに影響を及ぼさずに分析対象プログラムの実行を追跡してデバギングするか、プロファイリングすることができるプログラムの動的分析方法及びその装置を提供することを目的とし、関数を構成する命令語は、例外命令語に取り替えられる前にあらかじめ保存されて、例外命令語が実行された後には、保存された元の命令語を復旧して実行することによって、関数の実行に影響を及ぼさないようにする技術を開示する。しかしながら特許文献3の技術では、静的に決まる特定のメソッドのリターンに処理を追加するため、すべてのリターンにyield pointを入れるのと何ら変わりなく、yield pointに基づくプロファイラに特許文献3の技術を適用したとしても、コードサイズの増加の問題が生ずるだけである。
この発明は、上記の問題点を解決するためになされたものであって、ハードウェア割り込みを用いるサンプリング・プロファイラにおいて、yield pointを挿入することによる性能の低下を防ぎつつ、安全な位置でサンプリングが行われるようにすることのできる技術を提供することを目的とする。
上記課題を解決するために、本発明の1態様によれば、以下のようなコンピュータの処理により、ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善するための方法が提供される。この精度改善方法は、(a)前記コンピュータが、前記ハードウェア割り込みに応答して、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換えるステップと、(b)前記コンピュータが、再開された前記メソッドの実行の終わりにおいて、前記所定のプロファイル・コードを実行するステップと、(c)前記コンピュータが、前記所定のプロファイル・コードの実行の終わりにおいて保存しておいた前記戻り先アドレスへジャンプするステップとを含む。
好ましくは、ステップ(a)において、前記コンピュータは更に、前記ハードウェア割り込みの発生時点において実行中の命令のアドレスと、ステップ(a)において書き換えを行ったメモリアドレスとを保存する。
より好ましくは、ステップ(b)における前記所定のプロファイル・コードの実行は、前記コンピュータが所定のプロファイル処理を実行し、該所定のプロファイル処理の結果を前記ハードウェア割り込みの発生時点において実行中の前記命令のアドレスに関連付けるステップを含む。
更に好ましくは、前記コンピュータが実行するプログラムは、メソッドの先頭及びループのバックエッジにおいてyield pointを含む。
そして好ましくは、ステップ(b)は、前記メソッドの実行を再開後、かつ前記所定のプロファイル・コードの実行前においてyield pointで実行が停止したことに応答して、前記コンピュータが、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ(a)において保存されている情報を削除するステップを含む。
また好ましくは、ステップ(a)は、前記コンピュータが、前記ハードウェア割り込みの発生時点における実行中の命令がコンパイル済みのコードであるか否かを判定するステップと、実行中の命令がコンパイル済みのコードではないと判定することに応答して、前記戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするステップを含む。
また好ましくは、ステップ(c)は、前記所定のプロファイル・コード実行の終わりにおいて、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ(a)において保存されている情報を削除するステップを更に含み、ステップ(a)は、前記コンピュータが、前記ハードウェア割り込みに応答して、前記戻り先アドレスを退避させる前に、前回保存された情報が残っているか否かを判定し、前記前回保存された情報が残っていると判定することに応答して、前記戻り先アドレスを復帰し、前記前回保存された情報を削除するステップを含む。
また好ましくは上記ステップ(a)において、前記コンピュータは、前記戻り先アドレスを、レジスタに保存された現在のスタックポインタの情報と、前記実行中のメソッドのメタデータから取得できるオフセット情報とより算出される保存場所から取得する。
また好ましくは、ステップ(a)において、前記コンピュータは、前記戻り先アドレスがスタックに保存されていない場合に、リンクレジスタから戻り先アドレスを取得する。
また好ましくは、前記コンピュータが実行するプログラムにおいてyield pointを含まないメソッドは、yield pointを含まないことを示す情報をそのメタデータに有し、前記コンピュータは、ステップ(a)〜ステップ(c)の一連の処理を、yield pointを含まないメソッドに対してのみ実行する。
以上、ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法として本発明を説明したが、本発明は、上記説明したサンプリング・プロファイラの精度改善方法の各ステップをコンピュータに実行させるためのサンプリング・プロファイラの精度改善プログラムとして把握することもできる。また、そのようなサンプリング・プロファイラの精度改善プログラムを、1以上のコンピュータにインストールすることにより実現されるサンプリング・プロファイラの精度改善システムとして把握することもできる。
本発明によれば、ハードウェア割り込みに応答して、動的に実行中のメソッドからの戻り先アドレスが所定のプロファイル・コードのアドレスに書き換えられ、その後メソッドの実行が再開され、その処理の終わりにおいて所定のプロファイル・コードが実行されるので、yield pointを挿入する必要なしに、安全な位置で実行を停止してプロファイルすることが可能となる。また、ハードウェア割り込みが起こった場合にのみそのような書換えを行うので、サンプリングの必要がなくなりハードウェア割り込みを止めた際のパフォーマンス劣化も防ぐことが可能となる。本発明のその他の効果については、各実施の形態の記載から理解される。
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
図1は、本発明を実施するのに好適なコンピュータ・システム100のハードウェア構成の一例を示す。コンピュータ・システム100は、バス106に接続されたメインCPU(中央処理装置)102とメイン・メモリ104を含んでいる。CPU102は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ又はSempron(商標)が使用されうる。メイン・メモリ104は好ましくは、1GB以上の容量、より好ましくは、2GB以上の容量をもつものであってよい。
バス106には、ディスプレイ・コントローラ108を介して、ディスプレイ110、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ110は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。
バス106にはまた、SATA又はIDEコントローラ112を介して、ディスク114、例えばシリコン・ディスク又はハードディスクが接続されうる。バス106にはまた、SATA又はIDEコントローラ112を介して、任意的に、ドライブ116、例えばCD、DVDまたはBDドライブが接続されうる。バス106にはさらに、任意的に、キーボード・マウスコントローラ118又はUSBバス(図示せず)を介して、キーボード120及びマウス122が接続されうるが、本発明を実施する上では必要ない。
ディスク114には、オペレーティング・システム、J2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)を提供するプログラム、その他のプログラム及びデータが、メイン・メモリ104にロード可能なように記憶されている。
オペレーティング・システムは、例えば、LINUX(登録商標)、マイクロソフト・コーポレーションが提供するWindows(登録商標)オペレーティング・システム、アップル・コンピュータ・インコーポレイテッドが提供するMacOS(登録商標)若しくはiOS(登録商標)、X Window System備えるUNIX(登録商標)系システム(たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション(登録商標)が提供するAIX(登録商標)でありうる。
上記ディスク114には更に、オペレーティング・システムと協働してCPU102に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記ディスク114には、コンピュータ・システム100にインストールされ、コンピュータ・システム100を本発明の実施形態によるサンプリング・プロファイラの精度改善システムとして機能させるサンプリング・プロファイラの精度改善生成プログラム、及びそれら関連データを記録することができる。なお、本発明に係るサンプリング・プロファイラの精度改善プログラムは、プロファイラ及びシグナルハンドラ若しくはハードウェア割り込みハンドラの機能として実装可能である。
上記コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。ドライブ116は、必要に応じて、CD-ROM、DVD-ROMまたはBDからプログラムをディスク114にインストールするために使用されうる。
通信インタフェース126は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース126は、通信コントローラ124を介してバス106に接続され、コンピュータ・システム100を通信回線128に物理的に接続する役割を担い、コンピュータ・システム100のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線LAN環境に基づくもの、又は、無線LAN環境、例えば、IEEE802.11a/b/g/nなどのWi-Fi規格に基づくものであってもよい。
以上から、本発明の実施態様において使用されるコンピュータ・システム100は、特定のオペレーティング・システム環境に限定されるものではないことを理解することができるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
次に、図3を参照して、従来のyield pointに基づくプロファイルにおいて、yield pointの入れ方によってプロファイルの精度が変化することを説明する。
図3(a)は、プログラムに含まれるメソッドの先頭とループのバックエッジにyield pointを挿入するほか、ループとメソッドコールを含まないメソッドについてはバイトコードのサイズが300を超えるメソッドについてのみそのリターン位置にyield pointを入れた場合(以下、まとめて「標準のyield pointの入れ方」という)における、メソッドごとの最適化レベルとハードウェア割り込みの当たった割合とを示す図である。一方、図3(b)は、同一のプログラムに対し、メソッドの先頭とループのバックエッジにyield pointを挿入するほか、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れた場合における、メソッドごとの最適化レベルとハードウェア割り込みの当たった割合とを示す図である。
図3(a)、(b)において、最適化レベルの高さは、scorching>very-hot>hotである。図3(a)を見ると、標準のyield pointの入れ方では、メソッド300、302、304の割り込みの当たった割合は、メソッド306のそれよりも高いにも関わらず、それらの最適化レベルはメソッド306の最適化レベルよりも低い。このことから、標準のyield pointの入れ方では、割り込みが多くあたってもyield pointがヒットしないメソッドが存在することになり、プロファイラの精度に問題があることが分かる。一方、図3(b)を見ると、同じメソッド300、302、304の最適化レベルはいずれも一番高いscorchingとなっている。このことから、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れることでプロファイラの精度があがることが分かる。
しかしながら上述したように、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れるとなると、コードサイズの増加や、ハードウェア割り込みの有無にかかわらず条件分岐が入ってしまうことによる性能の低下が起こる。図4(a)、(b)はそれぞれ、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れた場合における実行性能の低下と、コンパイル済みコードサイズの増加とを示す。図4(a)、(b)の横軸はいずれもDacapoベンチマークスイートの各プログラム名を示す。また、図4(a)の縦軸は、標準のyield pointの入れ方における実行性能を1とした相対的な実行性能を示す。同様に、図4(b)の縦軸は、標準のyield pointの入れ方におけるコンパイル済みコードサイズを1とした相対的なコードサイズを示す。
そこで本発明者は、挿入するyield pointの数を増やすことなくプロファイラの精度をあげる手法について鋭意検討を行い、その結果、ハードウェア割り込みに応答して、実行中のメソッドの戻り先アドレスを所定のプロファイル・コードのアドレスに動的に書き換えることで、yield pointを挿入することなしに安全な位置においてプロファイルできることを見出し、本発明に至った。以下、図2、図5〜図7を参照して本発明を詳細に説明する。
図2は、図1に示すコンピュータ・システム100のソフトウェアの構成の一例を示す図である。CPU102は、ディスク114からオペレーティング・システム、Java(登録商標)仮想マシン(VM)、本発明の実施形態によるサンプリング・プロファイラの精度改善プログラム、動的コンパイラをメイン・メモリ104に読み出し実行することにより、オペレーティング・システム208、仮想マシン214、プロファイラ232、及び動的コンパイラ226をメイン・メモリ104に展開する。CPU102はまたパフォーマンス監視部(performance monitoring unit: PMU)206を有する。なお、以下に説明する実施例では、サンプリングに利用するハードウェア割込をパフォーマンスカウンタとするが、これに限定されず、例えばハードウェア割込はタイマーであってもよい。
PMU206は、CPU102内部の挙動について指定されたイベントの発生を監視し、内部カウンタによりイベントの発生をカウントしたり、カウント値が閾値に達したときに指定された処理を行ったりする、最近のプロセッサが一般的に備えている機能である。監視対象の代表的なものとしては、CPU102の実行サイクル数、実行命令数、分岐予測ミス数、データキャッシュミス数などがある。本実施例においては頻繁に実行されるメソッドをサンプリングするためにPMU206の機能が利用される。
オペレーティング・システム208は、CPU102やメモリの管理など、コンピュータ・システム100が有する基本的な機能を提供するソフトウェアである。オペレーティング・システム208はまた、実行された命令をサンプリングするために後述するプロファイラ232により用いられる割り込みハンドラ210を有する。なお、本実施例では割り込みハンドラ210を利用する場合について説明するが、以下に説明する割り込みハンドラ210の機能は、割込みハンドラ210からの通知を受けるシグナルハンドラの機能として実装してもよい。シグナルハンドラはユーザ空間のソフトウェアであるため実装が容易であるという利点がある。
割り込みハンドラ210は、PMU206によるハードウェア割り込みに応答して起動されると、ハードウェア割り込み時点で後述する実行部216により実行中であったメソッド(以下、単に「実行中のメソッド」ともいう)からの戻り先アドレスを取得して保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換える。これにより、メソッドの呼び出しとループを含まないメソッドにハードウェア割り込みが当たった場合でも、そのメソッドのリターンにおいて、即ち安全な位置において所定のプロファイルが必ず実行されることになる。割り込みハンドラ210の処理が終わると、メソッドの実行が再開される。なお、本実施例では、プロファイル対象のプログラムには従来通りメソッドの先頭及びループのバックエッジにおいてyield pointが挿入されており、従来のyield pointに基づくプロファイルも行われるものとする。
割り込みハンドラ210はまた、PMU206によるハードウェア割り込みの発生時点において実行中の命令のアドレスと、書き換えを行ったメモリアドレスとを、上記実行中のメソッドからの戻り先アドレスと共にスレッドローカルなメモリ領域に保存する。これら情報は、後述するプロファイラ232によって使用され、かつ、使用後において上記メモリ領域から削除される。そのためメソッドのリターンにおいて所定のプロファイル・コードが実行される限り、次に割り込みハンドラ210が起動された際には上記スレッドローカルなメモリ領域には何も残っていないはずである。前回保存された情報が残っている場合、割り込みハンドラ210は最初に上記メモリアドレスを参照して戻り先アドレスを復帰させ、その後前回保存されたものの使用されなかった情報を削除する。
また、実行中のメソッドからの戻り先アドレスは次のように取得してよい。即ち、割り込みハンドラ210は、レジスタに保存された現在のスタックポインタの情報と、実行中のメソッドのメタデータから取得できるスタックポインタからのオフセット情報を取得し、戻り先アドレスの格納位置(スタック内の位置)を算出する。或いは、戻り先アドレスがスタックに保存されていない場合は、割り込みハンドラ210はリンクレジスタから戻り先アドレスを取得してよい。
なお、上述した戻り先アドレスの書き換えによる所定のプロファイル・コードの実行は、従来のyield pointに基づくプロファイルと重複して行うことは避けるべきであり、従って、メソッドの呼び出しとループを含まないメソッドに限定して行うのが好ましい。そこで、各メソッドのメタデータにyield pointの有無を示す1ビットの情報を用意し、割り込みハンドラ210は、該1ビットがyield pointが含まれないことを示す場合にのみ、戻り先アドレスの書換えを行うのが好ましい。なお上記1ビットは、例えばプロファイル対象のプログラムのコンパイル時において設定可能である。
また、バイトコードからコンパイル済みコードに実行が戻る際にはyieldフラグのチェックがなされる。そしてyieldフラグが設定されている場合には後述するプロファイラ232が適切に呼び出される。このような状況では従来のyield pointに基づくプロファイルを優先させるのが好ましく、戻り先アドレスの書き換えによる不必要なプロファイル実行は避けるべきである。そこで、割り込みハンドラ210は、ハードウェア割り込みの発生時点において実行中の命令がコンパイル済みのコードであるか否かを判定し、実行中の命令がコンパイル済みのコードではないと判定した場合には、上述した戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするのが好ましい。なお、実行中の命令がコンパイル済みのコードであるか否かは、実行中の命令アドレスが、後述する仮想マシン214によって管理されるコード・キャッシュ224に保存されているか否かによって判定できる。
仮想マシン214は、バイトコードの低速実行(interpret)、およびコンパイル済みコードの実行を行うエミュレータである。仮想マシン214は、実行部216とディスパッチャ222とを含み、実行部216は、インタープリタ218と、コンパイル済みコード実行部220とを含んで構成される。
ディスパッチャ222は、後述する動的コンパイラ226が生成したコンパイル済みコードを保存するメモリ領域であるコード・キャッシュ224を参照して、次に実行するバイトコードアドレスから始まるコンパイル済みコードがコード・キャッシュ224に保存されている否かを判定する。インタープリタ218は、コンパイル済みコードが存在しない場合に、処理対象のバイトコードを低速に実行する。コンパイル済みコード実行部220は、コンパイル済みコードが存在する場合、コード・キャッシュ224からコンパイル済みコードを取得して実行する。
プロファイラ232は、任意のプロファイル処理を行い、次の2つの場合に呼び出される。1つは、従来のプロファイラ呼び出しであり、yield pointでプログラムが停止した際にyieldフラグがセットされている場合に呼び出される。また1つは、本発明による新しい呼び出しであり、メソッドのリターン位置において割り込みハンドラ210により書き換えがなされている場合に呼び出される。いずれの位置も安全な位置であるため、プロファイラ232はスタックウォークによりメソッドの呼び出し元など必要な情報を取得できる。もちろんプロファイラ232により取得されるプロファイル情報はこれに限定されず、例えば、value profilingとしてメソッドの戻り値などを取得することも可能である。なお、プロファイラ232によるプロファイル処理そのものは、本発明の要旨ではないため詳細な説明は省略する。
プロファイラ232はまた、メソッドのリターン位置において呼び出される場合、プロファイル処理の結果を、割り込みハンドラ210がスレッドローカルなメモリ領域に保存しておいた命令のアドレスに関連付けて格納する。プロファイラ232は更に、プロファイル処理の後、上記メモリ領域に保存されているメモリアドレスを参照して戻り先アドレスを復帰させ、その後、割り込みハンドラ210によってメモリ領域に保存されている情報を削除する。
なお、yield pointに基づいてプロファイラ232が呼び出される場合に、上記メモリ領域に戻り先アドレス等の情報が保存されている場合があり得る。これは、上述した割り込みハンドラ210の処理が終了してメソッドが再開された後、かつメソッドのリターン位置での所定のプロファイリング・コードの呼び出し前において、yield pointでプロファイル対象のプログラムの実行が停止することにより起こり得る。この場合、プロファイラ232は2度呼び出されることになり無駄が生ずる。そこで、yield pointに基づいてプロファイラ232が呼び出される場合においてメモリ領域に戻り先アドレス等の情報が保存されている場合には、戻り先アドレスを復帰させ、かつ、全ての情報を削除するものとする。
なお、プロファイラ232は、CPU102が上記所定のプロファイル・コードをメイン・メモリ104に読み出し実行することにより実現されることに留意されたい。
動的コンパイラ226は、プロファイラ232によるプロファイル結果に基づいて、プロファイル対象のプログラム内の次にコンパイル対象とすべきプログラム領域に対して最適化処理を施して実行時コンパイルを行うコンパイラである。動的コンパイラ226は、最適化部228と、コード生成部230とを含んで構成される。
最適化部228は、プロファイリング結果に基づき例えば実行頻度の高いプログラム領域に対してインライニング等の最適化処理を行う。コード生成部232は、最適化部230により出力された最適化済みのコードをネイティブコードに変換し、コード・キャッシュ224に格納する。
次に、図5〜7を参照して、本発明の実施形態に係るサンプリング・プロファイラの精度改善システムの動作について説明する。図5は、本発明の実施の形態に係る精度改善処理全体の流れの一例を示すフローチャートである。図6は、図5に示すフローチャートのステップ504の処理の詳細な流れを示すフローチャートである。図7は、プロファイラによる処理の概要を示すフローチャートである。
図5に示すフローチャートは、ハードウェア割り込みによって割り込みハンドラ210が起動されることにより開始し、ステップ500において割り込みハンドラ210は、ハードウェア割り込み時点において実行部216により実行されていたメソッドからの戻り先アドレスを取得して、これを所定のプロファイル・コードのアドレスに書き換える。割り込みハンドラ210の処理の詳細は、図6を参照して後述する。
割り込みハンドラ210による処理が終わると、ハードウェア割り込みによって停止されていたメソッドの実行が実行部216により再開され、メソッドの実行の終わりにおいて所定のプロファイル・コードが呼び出される(ステップ502)。呼び出されたプロファイラ232は、所定のプロファイル処理を実行し、最後に、保存されていた戻り先アドレスへジャンプする(ステップ504)。プロファイラ232の処理の詳細は、図7を参照して後述する。そして処理は終了する。
図6に示すフローチャートはステップ600で開始し、ハードウェア割り込みに応答して起動された割り込みハンドラ210は、ハードウェア割り込み時に実行部216により実行中であったメソッドが動的コンパイラ226によりコンパイルされたコンパイル済みのコードであるか否かを判定する。コンパイル済みのコードでない場合(ステップ600:NO)、上述したように実行中のメソッドはyield pointに基づくプロファイルの対象となると予測されるので、割り込みハンドラ210はyieldフラグを設定し(ステップ602)、処理を終了する。
実行中のメソッドがコンパイル済みのコードである場合(ステップ600:YES)、続いて割り込みハンドラ210は、実行中のメソッドがyield pointを含むか否かを判定する(ステップ604)。実行中のメソッドがyield pointを含む場合(ステップ604:YES)、実行中のメソッドはyield pointに基づくプロファイルの対象となるので、割り込みハンドラ210はyieldフラグを設定して(ステップ602)、処理を終了する。
実行中のメソッドがyield pointを含まない場合(ステップ604:NO)、続いて割り込みハンドラ210は、スレッドローカルなメモリ領域に前回保存された情報が残っているか否かを判定する(ステップ606)。前回保存された情報が残っている場合(ステップ606:YES)、割り込みハンドラ210は、書き換えを行ったメモリアドレスを参照して戻り先アドレスを復帰させ、その後保存された情報を削除する(ステップ608)。
前回保存された情報が残っていない場合(ステップ606:NO)又はステップ608から処理はステップ610へ進み、割り込みハンドラ210は、実行中のメソッドからの戻り先アドレスを取得してスレッドローカルなメモリ領域に保存する。続いて割り込みハンドラ210は、ハードウェア割り込み時に実行中の命令のアドレスと、書換えをおこなったメモリアドレスとを、上記メモリ領域に更に保存する(ステップ612)。そして処理は終了する。
図7に示すフローチャートはステップ700で開始し、呼び出されたプロファイラ232は、呼び出された理由に関わらず所定のプロファイル処理を実行する。続いてプロファイラ232は、yieldフラグが設定されているか否かを判定する(ステップ702)。yieldフラグが設定されている場合(ステップ702:YES)、即ち、今回のプロファイラ232呼び出しがyield pointに基づく呼び出しである場合、続いてプロファイラ232は、上記メモリ領域に情報が保存されているか否かを判定する(ステップ704)。上記メモリ領域に情報が保存されている場合(ステップ704:YES)、重複して所定のプロファイル処理がなされないように、プロファイラ232は、書き換えられたメモリアドレスを参照して戻り先アドレスを復帰させ上記メモリ領域に保存されている情報を削除する(ステップ706)。その後処理は終了する。一方、上記メモリ領域に情報が保存されていない場合(ステップ704:NO)、そのまま処理は終了する。
一方、yield フラグが設定されていない場合(ステップ702:NO)、即ち、今回のプロファイラ232呼び出しが戻り先アドレスの書き換えに基づく呼び出しである場合、処理はステップ706へ進み、プロファイラ232は、書き換えられたメモリアドレスを参照して戻り先アドレスを復帰させ、上記メモリ領域に保存されている情報を削除した後、復帰された戻り先アドレスへジャンプする。そして処理は終了する。
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。
Claims (12)
- コンピュータの処理により、ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善するための方法であって、
(a)前記コンピュータが、前記ハードウェア割り込みに応答して、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換えるステップと、
(b)前記コンピュータ(実行部)が、再開された前記メソッドの実行の終わりにおいて、前記所定のプロファイル・コードを実行するステップと、
(c)前記コンピュータが、前記所定のプロファイル・コードの実行の終わりにおいて保存しておいた前記戻り先アドレスへジャンプするステップと、
を含む方法。 - ステップ(a)において、前記コンピュータは更に、前記ハードウェア割り込みの発生時点において実行中の命令のアドレスと、ステップ(a)において書き換えを行ったメモリアドレスとを保存する、請求項1に記載の方法。
- ステップ(b)における前記所定のプロファイル・コードの実行は、前記コンピュータが所定のプロファイル処理を実行し、該所定のプロファイル処理の結果を前記ハードウェア割り込みの発生時点において実行中の前記命令のアドレスに関連付けるステップを含む、請求項2に記載の方法。
- 前記コンピュータが実行するプログラムは、メソッドの先頭及びループのバックエッジにおいてyield pointを含む、請求項3に記載の方法。
- ステップ(b)は、前記メソッドの実行を再開後、かつ前記所定のプロファイル・コードの実行前においてyield pointで実行が停止したことに応答して、前記コンピュータが、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ(a)において保存されている情報を削除するステップを含む、請求項4に記載の方法。
- ステップ(a)は、前記コンピュータが、前記ハードウェア割り込みの発生時点における実行中の命令がコンパイル済みのコードであるか否かを判定するステップと、実行中の命令がコンパイル済みのコードではないと判定することに応答して、前記戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするステップを含む、請求項4に記載の方法。
- ステップ(b)は、前記所定のプロファイル・コード実行の終わりにおいて、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ(a)において保存されている情報を削除するステップを更に含み、ステップ(a)は、前記コンピュータが、前記ハードウェア割り込みに応答して、前記戻り先アドレスを退避させる前に、前回保存された情報が残っているか否かを判定し、前記前回保存された情報が残っていると判定することに応答して、前記戻り先アドレスを復帰し、前記前回保存された情報を削除するステップを含む、請求項4に記載の方法。
- ステップ(a)において、前記コンピュータは、前記戻り先アドレスを、レジスタに保存された現在のスタックポインタの情報と、前記実行中のメソッドのメタデータから取得できるオフセット情報とより算出される保存場所から取得する、請求項1に記載の方法。
- ステップ(a)において、前記コンピュータは、前記戻り先アドレスがスタックに保存されていない場合に、リンクレジスタから戻り先アドレスを取得する、請求項8に記載の方法。
- 前記コンピュータが実行するプログラムにおいてyield pointを含まないメソッドは、yield pointを含まないことを示す情報をそのメタデータに有し、前記コンピュータは、ステップ(a)〜ステップ(c)の一連の処理を、yield pointを含まないメソッドに対してのみ実行する、請求項1に記載の方法。
- コンピュータに、請求項1乃至10のいずれか一項に記載の方法の各ステップを実行させるためのサンプリング・プロファイラの精度を改善するためのプログラム。
- 請求項1乃至10のいずれかに一項に記載の方法の各ステップを実行するように適合された手段を備える、サンプリング・プロファイラの精度を改善するためのシステム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2013230952A JP2015090647A (ja) | 2013-11-07 | 2013-11-07 | ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2013230952A JP2015090647A (ja) | 2013-11-07 | 2013-11-07 | ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2015090647A true JP2015090647A (ja) | 2015-05-11 |
Family
ID=53194125
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2013230952A Pending JP2015090647A (ja) | 2013-11-07 | 2013-11-07 | ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2015090647A (ja) |
-
2013
- 2013-11-07 JP JP2013230952A patent/JP2015090647A/ja active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9104433B2 (en) | Trace generation method, trace generation device, trace generation program product, and multi-level compilation using trace generation method | |
Froyd et al. | Low-overhead call path profiling of unmodified, optimized code | |
KR100589798B1 (ko) | 중지동안 바이트 코드 최적화 장치 및 방법 | |
KR102112081B1 (ko) | 언어 가상 머신에서 고-사용 중간 코드를 식별하는 방법 및 디바이스 | |
JP6138142B2 (ja) | 被管理ランタイムのためのハードウェア・ベース・ランタイム計装機構 | |
KR101438990B1 (ko) | 시스템 테스트 방법 | |
JPH11272476A (ja) | バイトコードされたプログラムを動的に最適化するための方法及び装置 | |
KR20090098500A (ko) | 가상 머신의 유휴 구간 검사 장치 및 방법, 그리고 그방법을 수행하기 위한 컴퓨터 프로그램 | |
US20060059486A1 (en) | Call stack capture in an interrupt driven architecture | |
EP3123339A1 (en) | Low-overhead detection of unauthorized memory modification using transactional memory | |
JP2015513373A (ja) | ランタイム・インストルメンテーション報告 | |
JP2007272692A (ja) | プロファイリングプログラムおよびプロファイリング方法 | |
US8756603B2 (en) | Virtual machine stage detection | |
JP6080602B2 (ja) | 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム | |
JP2014059750A (ja) | フォールトトレラントシステム | |
Rashid et al. | Integrated analysis of cache related preemption delays and cache persistence reload overheads | |
JP2014038408A (ja) | 同時マルチスレッディング機能をもったプロセッサのパイプラインにおけるストール削減方法、削減装置及び削減プログラム | |
JP4330429B2 (ja) | プロファイル情報の取得装置及び方法 | |
JP6217008B2 (ja) | 電子機器、制御方法、及び、プログラム | |
Hughes et al. | Reducing the impact of task overruns in resource-constrained embedded systems in which a time-triggered software architecture is employed | |
JP2015090647A (ja) | ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法、システム、及びプログラム | |
JP2005215816A (ja) | ハードウェアモニタを用いた性能プロファイリング方法 | |
Niu et al. | Eliminate the overhead of interrupt checking in full-system dynamic binary translator | |
US8091077B1 (en) | System and method for handling rare events by modification of executable code | |
JP5901835B2 (ja) | アボート削減方法、アボート削減装置、及びアボート削減プログラム |