JP2014164379A - 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム - Google Patents

実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム Download PDF

Info

Publication number
JP2014164379A
JP2014164379A JP2013032961A JP2013032961A JP2014164379A JP 2014164379 A JP2014164379 A JP 2014164379A JP 2013032961 A JP2013032961 A JP 2013032961A JP 2013032961 A JP2013032961 A JP 2013032961A JP 2014164379 A JP2014164379 A JP 2014164379A
Authority
JP
Japan
Prior art keywords
inlined
size
determining
computer
code
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.)
Granted
Application number
JP2013032961A
Other languages
English (en)
Other versions
JP6080602B2 (ja
Inventor
Takuya Nakaike
卓也 仲池
Hiroshi Inoue
拓 井上
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 JP2013032961A priority Critical patent/JP6080602B2/ja
Priority to US14/186,136 priority patent/US9383980B2/en
Publication of JP2014164379A publication Critical patent/JP2014164379A/ja
Application granted granted Critical
Publication of JP6080602B2 publication Critical patent/JP6080602B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4443Inlining

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

【課題】実フットプリントを算出する技術及び該技術を用いて算出した実フットプリントを用いてインラインするメソッドを決定する技術を提供する。
【解決手段】コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを作成し、HPMを用いて実行された命令をサンプリングし、マップを用いて、サンプリングした命令を該命令が属するメソッドにマップし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として算出し、算出した各メソッドの実フットプリントに基づきインラインするメソッドを決定する。
【選択図】図7

Description

本発明は、オーバーヘッドを抑えつつ実フットプリントを算出する技術に関する。本発明はまた、そのようにして算出する実フットプリントを用いてインラインするメソッドを決定する技術に関する。
インライニングは、メソッドや関数等の定義されたコードを、それを呼び出した箇所に展開して直接埋め込む手法であり、最も効果的なコンパイラ最適化の1つである。インライニングによって、コール/リターンのオーバーヘッドの削減、最適化範囲の拡大、コードの空間的局所性の向上といった効果が得られる。しかし上記のようなメリットがある一方で、過剰にインラインを行うと、キャッシュミスやコンパイル時間の増加といったデメリットも生ずる。そこでインライニングを抑制する仕組みが必要となる。
そのような仕組みの1つとして閾値を用いてインライニングを抑制する技術を開示する従来技術が存在する(例えば、非特許文献1〜5、特許文献1〜2を参照)。この従来技術では、インライニングによる効果とコストとのトレードオフが考慮されて両者のバランスを取るようにインライニングの閾値が決定される。しかしながら、決定された閾値はインライン後の静的フットプリント、即ち、実際には実行されないコードを含むフットプリントに対して適用されるため、実フットプリント、即ち実際に実行されるコードのサイズを効率的に削減できない。例えば、コードの一部のみが実行される静的フットプリントの大きいメソッドがインラインされず、そのメソッドの呼び出しオーバーヘッドのために性能が低下する可能性がある。
また、機械学習により最適なインライニング閾値を算出する技術を開示する従来技術も存在する(非特許文献6を参照)。この技術は、コンパイラ開発者が最適なインライニング閾値を求める際には有益である。しかしながら、機械学習は計算コストが高いため、実行時コンパイラに適用するのは難しい。
更に、インストルメント化されたコードをプログラムに挿入して、呼び出しの順序や呼び出しの頻度についてのプロファイル情報を収集し、収集したプロファイル情報を用いて再コンパイル時に効率的なインライニングを行う技術を開示する従来技術も存在する(例えば、非特許文献7〜9、特許文献2、3を参照)。
更にまた、プログラムの実行トレースに基づきプログラムの共通部分を抽出し、実際に実行される命令の回数に基づいて共通部分を1つにまとめるか否かを決定する技術を開示する従来技術も存在する(特許文献3を参照)。
更にまた、命令の実行頻度を基にしてインライニング後の実フットプリントを見積もる技術を開示する従来技術も存在する(非特許文献10、11を参照)。この従来技術では、インストルメント化されたコードをプログラムに挿入してループ内の基本ブロックの1繰り返しごとの平均実行回数が取得される。そして基本ブロック内の命令数とその実行頻度とを用いて、ループの実フットプリントが求められる。
しかしながら、インストルメント化されたコードをプログラムに挿入する手法や、実行トレースを用いる手法は、プロファイルのオーバーヘッドが高く、実行時コンパイラに適用することは難しい。
なお、非特許文献12は、本発明において利用するハードウェア・パフォーマンス・モニター(Hardware Performance Monitor: HPM)の機能を説明する背景技術として列挙するものである。また、非特許文献13は、HPMベースのプロファイラの一例を開示する背景技術として列挙するものである。
特開平6−202875号公報 特開2010−140344号公報 特開2007−18254号公報
A. Ayers, R. Gottlieb, and R. Schooler, "Aggressive Inlining", Proceedingsof the ACM SIGPLAN Conference on Programming Language Design andImplementation, 1997. M. Arnold, S. Fink, V. Sarkar, and P. Sweeney, "A comparative study ofstatic and dynamic heuristics for inlining", ACM SIGPLAN Workshop on Dynamicand Adaptive Compilation and Optimization, 2000. O. Beohm, D. Citron, G. Harber, M. Klausner, and R. Levin, "AggressiveFunction Inlining with Global Code Reordering", IBM Research Report, H-0247(H0611-009), Nov. 2006. P. P. Chang, S. A. Mahlke, W. Y. Chen, and W. W. Hwu, "Profile-guidedautomatic inline expansion for C programs", Software Practice and Experience22(5), 349-369, May 1992. P. Zhao and J. N. Amaral, "To Inline or Not to Inline ? EnhancedInlining Decision", 16th Workshop on Languages and Compilers for ParallelComputing, 2003. J. Cavazos and M. F. P. O’Boyle, "Automatic Tuning of InliningHeuristics", Proceedings of the 2005 ACM/IEEE SC Conference, 2005. K. Hazelwood and D. Grove, "Adaptive Online Context-Sensitive Inlining",Proceedings of the international symposium on Code generation and optimization:feedbackdirectedandruntime optimization, 2003. M. Arnold,M. Hind, and B. G. Ryder, "Online feedbackdirected optimization of Java.", Proceedingsof the 17th ACM SIGPLAN conference on Object-oriented programming,systems,languages, and applications, 2002. T. Suganuma, T. Yasue, M. Kawahito, H. Komatsu, and T. Nakatani, "Designand Evaluation of Dynamic Optimizations for a Java Just-In-Time Compiler", ACMTransactionsonProgramming Languages and Systems, Vol. 27, No. 4, pages 732 - 785, July 2005. D. R. Chakrabarti and S. Liu, "Inline Analysis: Beyond SelectionHeuristics", Proceedings of the International Symposium on Code Generation andOptimization, 2006. S. McFarling, "Procedure merging with instruction caches", Processdingsof the ACM SIGPLAN Conference on Programming Language Design andImplementation, 1991 H. Inoue and T. Nakatani, "How a Java VM Can Get More from a HardwarePerformance Monitor", Proceedings of the ACM SIGPLAN International Conferenceon Object- Oriented Programming, Systems, Languages, and Applications, 2009. OProfile-A System Profiler for Linux. [online]、2013年8月28日、[平成25年2月21日検索]、インターネット〈URL:http://oprofile.sourceforge.net/about/〉
この発明は、上記の問題点を解決するためになされたものであって、オーバーヘッドを抑えつつ実際に実行されるコードのサイズである実フットプリントを算出する技術、及び算出した実フットプリントに基づきインラインするのに適したメソッドを決定する技術を提供することを目的とする。
上記目的を達成する本発明は、次のような、コンピュータ処理により、メソッドの実フットプリントを算出する方法により実現される。そのような実フットプリント算出方法は、コンピュータが、コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを作成するステップと、前記コンピュータが、ハードウェア・パフォーマンス・カウンタを用いて実行された命令をサンプリングするステップと、前記コンピュータが、前記マップを用いて、サンプリングした命令を該命令が属するメソッドにマップし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として算出するステップとを含む。
上記目的を達成する本発明はまた、次のような、コンピュータ処理により、インラインするメソッドを決定する方法により実現される。そのようなインラインするメソッドの決定方法は、上述した実フットプリント算出方法により、コンピュータが、各メソッドの実フットプリントを算出するステップと、前記コンピュータが、算出した各メソッドの実フットプリントに基づきインラインするメソッドを決定するステップとを含む。
好ましくは、前記マップは、コンパイル済みコードに含まれる各命令と、該命令が属するインラインされたメソッドとの対応関係を示す。そして前記インラインするメソッドを決定するステップは、前記コンピュータが、算出した各メソッドの実フットプリントに基づきインラインされたメソッドの中からインライニングを解除するメソッドを決定するステップを含む。
より好ましくは、前記各メソッドの実フットプリントを算出するステップは、前記コンピュータが、前記メソッドがインラインされて生成された各コンテキストのサイズを、該コンテキストを構成する命令の中で一度でもサンプリングされた命令の総数として算出するステップと、前記コンピュータが、前記メソッドに対応する複数のコンテキストのサイズの合計を前記メソッドの総実フットプリントとして算出するステップとを含む。そして前記インラインするメソッドを決定するステップは、前記コンピュータが、各メソッドの総実フットプリントに基づきインラインされたメソッドの中からインライニングを解除するメソッドを決定するステップを含む。
更に好ましくは、前記インラインするメソッドを決定するステップは、前記コンピュータが、各メソッドについて、該メソッドの総実フットプリントから、前記メソッドに対応する複数のコンテキストのサイズのうち最大のサイズを差し引いた値を削減値として求めるステップと、前記コンピュータが、前記コンパイル済みコードのサイズが目標のコードサイズ以下になるまで、前記各メソッドの削減値をその値の大きい順に前記コンパイル済みコードのサイズから差し引くステップと、前記コンピュータが、前記削減値を差し引かれたメソッドを、インライニングを解除するメソッドとして決定するステップとを含む。
更にまた好ましくは、前記インラインするメソッドを決定するステップは、前記コンピュータが、前記各メソッドの前記削減値を該メソッドに対応する複数のコンテキストのうちサイズが0でないコンテキストの数で割って利益値とするステップを含む。そして前記コンピュータは、前記各メソッドの削減値を前記コンパイル済みコードのサイズから差し引く順番を、前記各メソッドの前記利益値の大きい順とする。
更にまた好ましくは、前記インラインするメソッドを決定するステップは、前記コンピュータが、サイズが0でないコンテキストを複数有さないメソッドを、インライニングを解除するメソッドの対象から除外するステップを含む。これに代えて、或いはこれに加えて、前記インラインするメソッドを決定するステップは、前記コンピュータが、ルートメソッドとしてコンパイルされるメソッドに含まれるメソッドを、インライニングを解除するメソッドの対象から除外するステップを更に含む、請求項6に記載の方法。
また好ましくは、前記インラインするメソッドを決定するステップは、前記コンピュータが、前記目標のコードサイズを、過去に算出された前記各メソッドの総実フットプリントの合計値の中で最大の合計値に所定の削減率を掛けた値として算出するステップを含む。
また好ましくは、前記方法は、前記コンピュータが、前記コンパイル済みコードのサイズが前記目標のコードサイズよりも小さい場合に、インラインするメソッドを決定するための一連のステップの実行を一定期間休止するステップを更に含む。
また好ましくは、前記方法は、前記コンピュータが、前記サンプリングした命令を格納するキャッシュライン数をカウントするステップと、前記キャッシュライン数が所定の閾値より小さいことを条件に、インラインするメソッドを決定するための一連のステップの実行を一定期間休止するステップとを更に含む。
なお、これまでメソッドの実フットプリントを算出する方法、及び、インラインするメソッドを決定する方法として本発明を説明した。しかし本発明は、これら方法をコンピュータに実行させるための実フットプリント算出プログラム、及び、インラインするメソッドを決定するためのインライン対象決定プログラムとして把握することもできる。また本発明は、そのようなプログラムをコンピュータにインストールすることによって実現される実フットプリント算出装置/システム、及び、インラインするメソッドを決定するための装置/システムとして把握することもできる。
本発明は、コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを予め作成しておくことで、ハードウェア・パフォーマンス・カウンタを用いて実行された命令をサンプリングした際に、サンプリングした命令をこれが属するメソッドにマップすることを可能とし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として算出する。結果、本発明によれば、HPMベースのプロファイリングを利用して、オーバーヘッドを抑えつつ実フットプリントを見積もることができる。また本発明は、該算出方法により求めた実フットプリントに基づきインラインするメソッドを決定するので、実際に実行されるコードのサイズを効率的に削減できる。本願発明のその他の効果については、各実施の形態の記載から理解される。
本発明の実施形態に係るコンピュータ・システム100のハードウェア構成の一例を示す。 図2(a)は、本発明の実施形態に係るインライン対象決定のメカニズムの概要を示す図である。図2(b)は、本発明の実施形態に係るインライン対象決定プログラムのソフトウェア構成を説明する図である。 図3(a)は、マップを構成する4種のデータ構造間の関係を説明する図である。図3(b)は、インラインされたメソッド間の階層関係の一例を示す図である。 図4(a)は、インライニング・コンテキスト330と、メソッドサイズ・デスクリプタ340のデータ構造を示す図である。図4(b)は、実フットプリントを算出する関数countSizeの擬似コードの一例を示す図である。 図5(a)は、インラインしない利益を算出する関数computeBenefitの擬似コードの一例を示す図である。図5(b)は、インラインしないメソッドを選択する関数selectUninliningTargetの擬似コードの一例を示す図である。 動的コンパイラ228による処理のフローチャートの一例を示す図である。 プロファイラ220による処理全体のフローチャートの一例を示す図である。 図8(a)は、実フットプリント算出処理全体のフローチャートの一例を示す図である。図8(b)は、関数countSizeの処理のフローチャートの一例を示す図である。 関数selectUninliningTargetsの処理のフローチャートの一例を示す図である。 図10(a)は、従来技術と本発明とで相対的なスループットを比較した実験結果を示す図である。図10(b)は、従来技術と本発明とで相対的な命令キャッシュミスを比較した実験結果を示す図である。 図11(a)は、従来技術と本発明とで相対的なコンパイル時間を比較した実験結果を示す図である。図11(b)は、本発明のオーバーヘッドを測定した実験結果を示す図である。
以下、本発明の実施形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
図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(登録商標)、XWindow Systemが備えるUNIX(登録商標)系システム(たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション(登録商標)が提供するAIX(登録商標))でありうる。
上記ディスク114には更に、オペレーティング・システムと協働してCPU102に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記ディスク114には、コンピュータ・システム100にインストールされ、コンピュータ・システム100を本発明の実施形態による実フットプリント算出装置/システムとして機能させる実フットプリント算出プログラム、コンピュータ・システム100を本発明の実施形態によるインライン対象決定装置/システムとして機能させるインライン対象決定プログラム、及びそれら関連データを記録することができる。
上記実フットプリント算出プログラムは、マップ作成モジュールと、割り込みハンドラと、見積りモジュールとを含む。これらプログラム及びモジュールは、CPU102に働きかけて、コンピュータ・システム100を、各々後述するマップ作成部234と、割り込みハンドラ206と、見積り部224としてそれぞれ機能させる。また、上記インライン対象決定プログラムは、実フットプリント算出プログラムの上記構成要素に加えて、選択モジュールを含む。これらプログラム及びモジュールは、CPU102に働きかけて、コンピュータ・システム100を、各々後述するマップ作成部234と、割り込みハンドラ206と、見積り部224と、選択部226としてそれぞれ機能させる。
上記コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。ドライブ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は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
図2(a)は、本発明のインライン対象決定メカニズムの概要を示す図である。コンパイラは、インライニングを含む様々な最適化を行ってコードを生成し(1)、コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを作成する(2)。続いてアプリケーションによりコンパイル済みのコードが実行され(3)、その間プロファイラは、ハードウェア・パフォーマンス・カウンタを用いて実行されている命令をサンプリングする。そしてプロファイラは、作成されたマップを参照して、サンプリングした命令を該命令が属するメソッドにマップし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として見積もる(4)。プロファイラは、見積もった実フットプリントに基づきインライニングを解除すべきメソッドを決定することでインラインすべきメソッドを決定し、コンパイラにインライニング解除のための再コンパイルを指示する(5)。以下、図2(b)を参照して各構成要素を詳細に説明する。
図2(b)は、図1に示すコンピュータ・システム100のソフトウェアの構成の一例を示す図である。CPU102は、ディスク114からJava(登録商標)仮想マシン(VM)と、本発明の実施形態に係る実フットプリント算出プログラムをその一部とするインライン対象決定プログラムを含むプログラムとをメイン・メモリ104に読み出し実行することにより、オペレーティング・システム204、仮想マシン210、プロファイラ220、及び動的コンパイラ228をメイン・メモリ104に展開する。CPU102はまたパフォーマンス監視部(performance monitoring unit: PMU)202を有する。
PMU202は、CPU102内部の挙動について指定されたイベントの発生を監視し、内部カウンタによりイベントの発生をカウントしたり、カウント値が閾値に達したときに指定された処理を行ったりする、最近のプロセッサが一般的に備えている機能である。監視対象の代表的なものとしては、CPU102の実行サイクル数、実行命令数、分岐予測ミス数、データキャッシュミス数などがある。本発明においては実行された命令をサンプリングするために、後述するプロファイラ220によりPMU202の機能が利用される。
オペレーティング・システム204は、CPU102やメモリの管理など、コンピュータ・システム100が有する基本的な機能を提供するソフトウェアである。オペレーティング・システム204はまた、実行された命令をサンプリングするために後述するプロファイラ220により用いられる割り込みハンドラ206を有する。割り込みハンドラによる処理の詳細は、プロファイラ220に関連して後述する。
仮想マシン210は、バイトコードの低速実行(interpret)、およびコンパイル済みコードの実行を行うエミュレータである。仮想マシン206は、実行部212とディスパッチャ218とを含み、実行部212は、インタープリタ214と、コンパイル済みコード実行部216とを含んで構成される。
ディスパッチャ218は、後述する動的コンパイラ228が生成したコンパイル済みコードを保存するメモリ領域であるコード・キャッシュ236を参照して次に実行するバイトコードアドレスから始まるコンパイル済みコードがコード・キャッシュ236に保存されている否かを判定する。インタープリタ214は、コンパイル済みコードが存在しない場合に、処理対象のバイトコードを低速に実行する。コンパイル済みコード実行部216は、コンパイル済みコードが存在する場合、コード・キャッシュ236からコンパイル済みコードを取得して実行する。
プロファイラ220は、2種類のプロファイリングを行うプロファイラであり、それぞれのプロファイリングの結果に基づきインラインすべきメソッドを選択し、選択したメソッド情報を次にコンパイル対象とすべきプログラム領域の情報と共に後述する動的コンパイラ228に対し出力する。そのようなプロファイラ220は、検出部222と、見積り部224と、選択部226とを含んで構成される。
検出部222は、実行プログラムの起動直後の一定期間、実行部212により頻繁に実行されるプログラム領域を検出する第1のプロファイリングを行い、第1のプロファイリングの結果を選択部226に対して出力する。選択部226は、頻繁に実行されるプログラム領域からそこに含まれるメソッドを探索し、その静的フットプリントと許容される単一メソッドのコードサイズとを比較して、インライン対象とするメソッドを選択する。選択部226によりインライン対象として選択されたメソッドと頻繁に実行されるプログラム領域についての情報は、後述する動的コンパイラ228に対して出力される。なお、許容される単一メソッドのコードサイズは、インライニングによるメリットとデメリットとのバランスを考慮して予め設定されるコードサイズである。なお、静的フットプリントに基づくインラインするメソッドの選択は、上記方法に限定されず、他の方法によってもよい。但し、第1のプロファイリングの結果に基づくインライニングでは、より積極的にインライニングを行うことが好ましい。
見積り部224は、ハードウェア・パフォーマンス・カウンタを用いて実行された命令をサンプリングし、サンプリングした命令を該命令が属するメソッドにマップし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として算出する、第2のプロファイリングを行う。ここで上記マッピングは、コンパイル済みコードに含まれる各命令がどのインラインされたメソッドに属するかを示すマップを参照して行われ、該マップは、後述する動的コンパイラ228によって作成される。マッピングの詳細は、図4(a)、(b)、及び、図8(a)、(b)を参照して後述する。また、第2のプロファイリングの結果は選択部226に対して出力され、選択部226は、算出された各メソッドの実フットプリントに基づきインラインするメソッドを選択する。
実行された命令のサンプリングは具体的には次のようにして行う。即ち、見積り部224は、PMU202に対し監視したいハードウェア・イベントとして実行命令数が所定の閾値を超えるイベントを指定する。見積り部224はまた、PMU202に対し実行命令数が指定した所定の閾値に達したときに、割り込みハンドラ206を起動するように指定する。これにより、PMU202は、実行命令数をカウントするカウンタが所定の閾値を超えると割り込みを生成し、生成された割り込みにより起動された割り込みハンドラ206は、PMU202から報告を受けた割り込みを起こした命令のアドレスをバッファ208に格納する。見積り部224は、システムコールによりサンプリングを開始し、その後バッファ208が割り込みを起こした命令のアドレスで一杯になるまでブロックされる。ブロックが解除されると見積り部224は、サンプリング結果をバッファ208から取得する。
また実フットプリントの見積りはより具体的には次のようにして行われる。即ち、見積り部224は、メソッドがインラインされて生成された各コンテキストのサイズを、該コンテキストを構成する命令の中で一度でもサンプリングされた命令の総数として算出する。また見積り部224は、上記メソッドに対応する複数のコンテキストのサイズの合計を上記メソッドの総実フットプリントとして算出する。見積り部224はこのメソッドの総実フットプリントを、メソッドの実フットプリントとして扱う。そして選択部226は、各メソッドの総実フットプリントに基づきインラインされたメソッドの中からインライニングを解除するメソッドを決定することにより、インラインするメソッドを選択する。
各メソッドの総実フットプリントに基づきインライニングを解除するメソッドの選択は具体的には次のようにして行う。まず選択部226は、各メソッドについて、該メソッドの総実フットプリントから、該メソッドに対応する複数のコンテキストの各サイズのうち最大のサイズを差し引き、この値を、該メソッドをインライニングの対象から除外した場合に全体のコードサイズから削減される削減値として求める。ここで、総実フットプリントから最大のコンテキストのサイズを差し引くのは、インライニングされているメソッドは、該メソッドがコンパイルされた際に生成されるコンテキストを含むからである。即ち、あるメソッドをインライニングの対象から除外したとしても、そのルートメソッドについてのコードサイズは残るためである。
次に選択部226は、各メソッドの削減値を該メソッドに対応する複数のコンテキストのうちサイズが0でないコンテキストの数、即ちアクティブなコンテキストの数で割り、この値を、該メソッドをインライニングの対象から除外することにより得られる利益の大きさを示す利益値とする。ここで、各メソッドの削減値を対応するアクティブなコンテキストの数で割るのは、該メソッドをインライニングの対象から除外するために再コンパイルするそのコストを考慮に入れるためである。これはまた、コール/リターンのオーバーヘッドによるデメリットがコードサイズの削減によるメリットよりも相対的に大きくなる小さなサイズのメソッドをアンインライニング対象から除外することにも繋がる。
そして選択部226は、コンパイル済みコードのサイズが目標のコードサイズ以下になるまで、コンパイル済みコードのサイズから各メソッドの削減値をその利益値の大きい順に差し引き、最終的に残ったメソッドをインラインするメソッドとして選択する。言い換えると、選択部226は、その削減値をコンパイル済みコードのサイズから差し引いたメソッドを、インライニングを解除するメソッドとして決定する。なお、選択部226は、アクティブなコンテキストを複数有さないメソッドを、インライニングを解除するメソッドの対象から除外する。これは、アクティブなコンテキストをたった1つしか有さないメソッドは重複したコードを持たないことを意味するためである。また選択部226は、ルートメソッドとしてコンパイルされるメソッドに含まれるメソッドを、インライニングを解除するメソッドの対象から除外する。これは、過剰なインライニングの解除により、コードの呼び出し回数が増加しパス長が長くなることを防ぐためである。なお、目標のコードサイズは、過去に算出された各メソッドの総実フットプリントの合計値の中で最大の合計値に所定の削減率(一例として0.9)を掛けた値として算出してよい。
上記見積り部224による第2のプロファイリング及び第2プロファイリングの結果に基づく選択部226によるアンインライニング対象の選択は、動的コンパイラ228による最初のコンパイル後所定の間隔で定期的に行う。但し、コンパイル済みコードのサイズが目標のコードサイズよりも小さい場合は、上記見積り部224及び選択部226による一連の処理の実行を一定期間休止してよい。これに代えて又はこれに加えて、見積り部224は、サンプリングした命令を格納するキャッシュライン数をカウントし、キャッシュライン数が所定の閾値より小さいことを条件に、上記見積り部224及び選択部226による一連の処理の実行を一定期間休止してよい。
動的コンパイラ228は、プロファイラ220により出力される2種類のプロファイリング結果それぞれに基づき、次にコンパイル対象とすべきプログラム領域に対してインライニングを含む最適化処理を施して実行時コンパイルを行うコンパイラである。動的コンパイラ226は、最適化部228と、コード生成部230と、マップ作成部232とを含んで構成される。
最適化部228は、最初のコンパイル時においては、第1のプロファイリング結果に基づき実行頻度の高いプログラム領域に対してインライニングを含む最適化処理を行う。最適化部228はまた、最初のコンパイル後においては、第2のプロファイリング結果に基づきインラインされたメソッドをアンインライニングする処理を行う。コード生成部232は、最適化部230により出力された最適化済みのコードをネイティブコードに変換し、コード・キャッシュ236に格納する。
マップ作成部234は、コンパイル時において、コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを作成する。上述したように、マップ作成部234により作成されたマップは、サンプリングした命令を該命令が属するメソッドにマップするマッピングのために、ランタイム時に見積り部224により使用される。ここで、図3(a)、(b)を参照して、マップ作成部234により作成されるマップの一例を説明する。
図3(a)に示すように、マップ作成部234は、キャッシュライン・アレイ(cache line array)310、コード・アレイ(codearray)320、インライニング・コンテキスト(inlining contex) 330、メソッドサイズ・デスクリプタ(method-size descriptor)340の4種類のデータ構造によってマップを構成し、それぞれのインスタンスをコンパイル時に生成する。キャッシュライン・アレイ310とコード・アレイ320のペアは、単一のコンパイル済みメソッドに該メソッドのアドレス・レンジを介してリンクされる。このためある命令がサンプリングされた場合、対応するアレイのペアの各エントリの識別は、その命令のアドレスが、それらアレイのペアにリンクされるメソッドのアドレス・レンジ内に存在するか否かを判定することにより行う。以下図3(a)を参照して個々のデータ構造について説明するが、具体例として図中記載するMethod A, B,Cそれぞれの間には、図3(b)に示す階層関係が成り立っているものとする。即ち、Method A内でMethodBが1回呼び出され、MethodB内でMethodCが2回呼び出されているものとする。
キャッシュライン・アレイ310は、アクセスされたキャッシュライン数の合計をカウントするために使用するものである。各エントリは、1ビットフィールド302を有し、以下の式(1)、(2)によって計算されるキャッシュラインのオフセット(Cache line offset)により索引付けされる。サンプリングされた命令に対応するエントリの1ビットフィールドの値が0の場合、アクセスされたキャッシュラインの合計数が1増加され、かつ、同一命令についての重複したカウントを避けるためにそのフィールドは値1に設定される。
Cache line offset = Code offset>> log2(Size of a cache line) - (1)
Code offset = instruction address - Code start address - (2)
コード・アレイ320は、メソッドごとの実行された命令数の合計をカウントするために使用するものである。各エントリは、コンパイル済みメソッドに含まれる1命令に対応し、上記式(2)によって計算されるコード・オフセット(Code offset)により索引付けされる。各エントリは、インラインされているコンテキストを指すポインタを格納するフィールド304と、対応する命令が実行されたか否かを示すアクセス・ビット・フィールド306とを有する。アクセス・ビット・フィールド306は、同一命令についての重複したカウントを避けながら少なくとも一回実行された命令の合計数をカウントするために、該エントリへの最初のアクセス時に設定される。
インライニング・コンテキスト330は、インラインしているコンテキストを表し、図4(a)に示すデータ構造402を有する。データ構造402の詳細については後述する。インライニング・コンテキスト330の各インスタンスは、メソッドがインラインされるとき、又はコンパイルされるときに生成され、対応するメソッドサイズ・デスクリプタ340のインスタンスに関連付けられる。インライニング・コンテキスト330の各インスタンスを指すポインタは、そのインラインされたメソッド内の命令に対応するコード・アレイ320のエントリ内に格納される。メソッドが複数のコールサイトでインラインされる場合、1のメソッドに対し複数のインライニング・コンテキストのインスタンスが生成されることに留意されたい。
メソッドサイズ・デスクリプタ340は、インラインされたメソッドのサイズを算出するために使用するものであり、図4(a)に示すデータ構造404を有する。メソッドサイズ・デスクリプタ340の各インスタンスは、メソッドに1対1に対応してメソッドごとユニークである。
ここで図4(a)を参照して、インライニング・コンテキスト330のデータ構造402と、メソッドサイズ・デスクリプタ340のデータ構造404とを説明する。図4(a)に示すデータ構造402は、int型のsizeと、データ構造Contextの参照型のparentと、データ構造MethodSizeの参照型のmtdとから構成される。インライニング・コンテキスト330のインスタンスが生成されると、size は値0で初期化され、図4(b)を参照して後述するように、最終的にコンテキストのサイズがそのコンテキストを構成する命令の中で一度でもサンプリングされた命令の総数として設定される。一方、parentには、親の関係にあるインライニング・コンテキスト330のインスタンスへのポインタが格納され、また、mtdにはメソッドサイズ・デスクリプタ340の対応するインスタンスへのポインタが格納される。
なお、インライニング・コンテキスト330のsizeに関して、コンテキストを構成する命令は、対応するインラインされたメソッドに属する命令と、該メソッドにインラインされた他のメソッドに属する命令の両方を含むことに留意されたい。例えば、図3(a)及び(b)に示す例を用いて説明すると、メソッドCはメソッドBにインラインされていることから、コンテキスト2のサイズは、コンテキスト3及び4に含まれる実行された命令の数を含む。以下では、インライニング・コンテキスト330の任意のエントリのsizeやparentを、該エントリが表すコンテキストのsizeやparentと記載することもあることに留意されたい。
図4(a)に示すデータ構造404は、int型のsize、maxSize、numActve、及びnumContextsと、データ構造Contextの配列型のcontextsとから構成される。メソッドサイズ・デスクリプタ340のインスタンスが生成されると、size、maxSize、numActve、及びnumContextsはそれぞれ値0で初期化される。そして、図4(b)を参照して後述するように、sizeには最終的にそのメソッドに対応する複数のコンテキストのサイズの合計として算出される総実フットプリントが設定される。またmaxSizeには、最終的にメソッドに対応する複数のコンテキストのサイズのうち最大のサイズが設定される。またnumActiveには、最終的にメソッドに対応する複数のコンテキストのうち、サイズが0でないコンテキスト、即ちアクティブなコンテキストの数が設定される。またnumContextsには、最終的にメソッドに対応するコンテキストの数、即ち該メソッドを呼び出すコールサイトのうち、メソッドがインラインされたコールサイトの数が設定される。またcontextsには、そのメソッドに対応する全てのコンテキストが設定される。以下では、メソッドサイズ・デスクリプタ340の任意のエントリのsizeやmaxSizeやnumActveを、該エントリが表すメソッドのsizeやmaxSizeやnumActveと記載することもあることに留意されたい。
次に図4(b)を参照して、上記説明した4種類のデータ構造により構成されるマップを用いた実フットプリントの算出方法を説明する。図4(b)は、実フットプリントを算出する関数countSizeの擬似コードの一例を示す図である。関数countSizeは、ランタイム時に見積り部224によってサンプリングされた命令を該命令が属するメソッドにマップする際に呼び出される。即ち見積り部224は、サンプリングされた命令を取得すると、上述した式(2)を用いてその命令のアドレスから対応するコード・アレイ320のエントリを識別する。そして、見積り部224は、識別したコード・アレイ320のエントリのアクセス・ビットが設定されていないことを条件に、そのコード・アレイ320のエントリのポインタから辿られるインライニング・コンテキスト330のインスタンスに対して関数countSizeを呼び出して実フットプリントをカウントする。
関数countSizeが呼び出されると、まず、引数として渡されたポインタが指すインライニング・コンテキスト330のエントリ(以下、単に「現在のコンテキスト」という)のsizeが0であるか否かが確認され、0である場合に、対応するメソッドサイズ・デスクリプタ340のエントリ(以下、単に「対応するメソッド」という)のnumActiveの値が1増加される。また、現在のコンテキストのsizeと対応するメソッドのsizeをそれぞれ1増加される。続いて、現在のコンテキストのsizeが、対応するメソッドのmaxSizeと比較して大きい場合に、そのmaxSizeの値が現在のコンテキストのsizeで更新される。最後に、現在のコンテキストのsizeを、その親であるコンテキストのsizeに加算するために、親のインライニング・コンテキスト330のエントリのポインタを引数として再帰的に関数countSizeが呼び出される。
次に図5(a)、(b)を参照して、メソッドサイズ・デスクリプタ340を用いてアンインラインすべき対象メソッドを選択する方法を説明する。図5(a)は、インラインしない利益を算出する関数computeBenefitの擬似コードの一例を示す。また、図5(b)は、インラインしないメソッドを選択する関数selectUninliningTargetの擬似コードの一例を示す図である。関数computeBenefit及び関数selectUninliningTargetは、実行された命令がサンプリングされている間、選択部226により所定の間隔で定期的に呼び出される。関数computeBenefitは呼び出されると、引数として渡されたポインタが指すメソッドサイズ・デスクリプタ340のエントリが表すメソッドの利益値を返す。このメソッドの利益値は、メソッドのsizeからメソッドのmaxsizeを差し引き、これをメソッドのnumActiveで割ることにより算出される。
関数selectUninliningTargetは呼び出されると、まず、過去に算出された各メソッドの総実フットプリントの合計値の中で最大の合計値(maxSize)に所定の削減率(targetReductionRatio)を掛けることでターゲットとすべき目標サイズ(targetSize)を算出する。また、現在のコードサイズから目標サイズ(targetSize)を差し引いて目標削減量(reducedTarget)を求め、これが0以下であれば処理を終了し、0以下でなければインラインされたメソッドを、関数computeBenefitにより求めた利益値の大きい順に並べ替える。また削減サイズ(reducedSize)を0で初期化する。そして、並べ替えたインラインされたメソッドから順に1のメソッドを取り出し、取り出した現在のメソッドのアクティブなコンテキスト数(numActive)が1より大きいことを条件に、現在のメソッドをインラインしないメソッドに登録し、かつ、削減サイズ(reducedSize)に現在のメソッドの削減値を加算する。かかる処理を、削減サイズ(reducedSize)が目標削減量(reducedTarget)より大きくなるまで、又は次のインラインされたメソッドがなくなるまで繰り返す。
次に図6〜図9を参照して、動的コンパイラ228及びプロファイラ220の動作を説明する。図6は、動的コンパイラ228による処理のフローチャートの一例を示す図である。図7は、プロファイラ220による処理全体のフローチャートの一例を示す図である。図8(a)は、プロファイラ220による実フットプリント算出処理全体のフローチャートの一例を示す図である。図8(b)は、関数countSizeの処理のフローチャートの一例を示す図である。図9は、関数selectUninliningTargetsの処理のフローチャートの一例を示す図である。
図6に示すフローチャートは、プロファイラ220によって第1のプロファイリングが終了し、動的コンパイラ228が第1のプロファイリングの結果としてインライン対象のメソッドと頻繁に実行されるプログラム領域についての情報を取得することにより開始される。ステップ500において、動的コンパイラ228は、頻繁に実行されるプログラム領域に対し、インライニングを含む最適化処理を行う。続いて、動的コンパイラ228は、最適化処理済みのコードをコンパイルし、ネイティブコードを生成する(ステップ602)。
続いて動的コンパイラ228は、生成したコードに含まれる各命令と、インラインされたメソッドとの対応を示すマップを作成する(ステップ604)。続いて動的コンパイラ228は、再コンパイルのリクエストがあったか否かを判定する(ステップ606)。該判定は、再コンパイルのリクエストを受けるまで繰り返される(ステップ606:NO)。一方、再コンパイルのリクエストがあった場合(ステップ606:YES)、動的コンパイラ228は、プロファイラ220から第2のプロファイリングの結果として、アンインライン対象のメソッドについての情報を取得し、アンインライン対象のメソッドについてインライニングを解除する処理を行う(ステップ608)。その後動的コンパイラ228は、インライニング解除の最適化処理済みのコードに対し再コンパイルを行い、ネイティブコードを生成する(ステップ610)。その後プロファイラはステップ606へ戻って一連の処理を繰り返す。
図7に示すフローチャートは、第1のプロファイリング結果に基づきコンパイルされたコードの実行中及び第2のプロファイル結果に基づき再コンパイルされたコードの実行中に所定の間隔で定期的に開始される。ステップ700において、プロファイラ220は全てのカウンタを初期化する。続いてプロファイラ220は、ハードウェア・パフォーマンス・カウンタを用いて実行された命令をサンプリングする(ステップ702)。続いてプロファイラ220は、動的コンパイラ228によって作成されたマップを用いて、サンプリングされた命令をインラインされたメソッド及びキャッシュラインにそれぞれマッピングし、インラインされたメソッドの実フットプリントとアクセスされたキャッシュライン数を算出する(ステップ704)。算出処理の詳細は図8(a)及び(b)を参照して後述する。続いてプロファイラ220は、命令が十分にサンプリングされたか否かを判定する(ステップ706)。命令が十分にサンプリングされていないと判定した場合(ステップ706:NO)、プロファイラ220は、ステップ702の処理へ戻る。
一方、命令が十分にサンプリングされたと判定した場合(ステップ706:YES)、プロファイラ220はネイティブコードの目標とすべき目標サイズ(targetSize)を算出する(ステップ708)。上述したように、目標サイズは、過去に算出した各メソッドの総実フットプリントの合計値の最大値に所定の削減率を掛けることによって求めることができる。但し、最初のサンプリングにおいては、目標サイズは、現在のネイティブコードのサイズに所定の削減率を掛けた値とする。続いてプロファイラ220は、現在のネイティブコードのサイズから目標サイズを引くことにより、目標削減量(reducedTarget)を算出する(ステップ710)。
続いてプロファイラ220は、目標削減量(reducedTarget)の値が0以下であるか否かを判定する(ステップ712)。目標削減量(reducedTarget)の値が0以下である場合(ステップ712:YES)、続いてプロファイラ220は、アクセスされたキャッシュライン数が所定の閾値以下であるか否かを判定する(ステップ714)。アクセスされたキャッシュライン数が所定の閾値以下である場合(ステップ714:YES)、プロファイラ220は処理を終了する。一方、目標削減量(reducedTarget)の値が0より大きい場合(ステップ712:NO)、又はアクセスされたキャッシュライン数が所定の閾値より大きい場合(ステップ714:NO)、プロファイラ220はステップ716の処理へ進み、インラインされているメソッドの実フットプリントに基づいてインライニングを解除すべきメソッドを選択し、その後処理を終了する。
図8(a)に示すフローチャートは、図7に示すフローチャートのステップ704の処理の詳細を示す。処理はステップ800で開始し、プロファイラ220は、サンプリングされた次の命令があるか否かを判定する。サンプリングされた次の命令が存在しない場合(ステップ800:NO)、プロファイラ220は処理を終了する。一方、サンプリングされた次の命令がある場合(ステップ800:YES)、続いてプロファイラ220は、上述した式(1)及び(2)を用いてサンプリングされた命令のアドレスからキャッシュライン・オフセットを算出し、対応するキャッシュライン・アレイのエントリを識別する(ステップ802)。
続いてプロファイラ220は、識別したエントリの1ビットフィールドの値が0であるか否かを判定する(ステップ804)。識別したエントリの1ビットフィールドの値が0である場合(ステップ804:YES)、続いてプロファイラ220は、アクセスされたキャッシュラインの合計値を1増加し、その後識別したエントリの1ビットフィールドの値を1に設定する(ステップ806)。一方識別したエントリの1ビットフィールドの値が0でない場合(ステップ804:NO)、またはステップ806から、プロファイラ220はステップ808の処理へ進み、上述した式(2)を用いてサンプリングされた命令のアドレスからコード・オフセットを算出し、これを用いて対応するコード・アレイのエントリを識別し、サンプリングされた命令に対応するインラインしているコンテキストへのポインタを取得する。続いてプロファイラ220は、ステップ808で取得したポインタを引数として、関数countSizeを呼び出し(ステップ810)、その後ステップ800の処理に戻る。関数countSizeの処理の詳細は図8(b)を参照して後述する。
図8(b)に示すフローチャートは、図8(a)に示すフローチャートのステップ810の処理の詳細を示す。処理はステップ820で開始し、プロファイラ220は、引数として渡されたポインタが指すインライニング・コンテキスト330のエントリが表すコンテキストを現在のコンテキストとし、現在のコンテキストのsizeが0であるか否かを判定する。続いてプロファイラ220は、現在のコンテキストに対応するインラインされたメソッドのnumActiveを1増加する(ステップ822)。
続いてプロファイラ220は、現在のコンテキストのsize及び対応するインラインされたメソッドの現在のsizeをそれぞれ1増加する(ステップ824)。続いてプロファイラ220は、現在のコンテキストのsizeが対応するインラインされたメソッドのmaxSizeより大きいか否かを判定し(ステップ826)、現在のコンテキストのsizeが対応するインラインされたメソッドのmaxSizeよりも大きい場合(ステップ826:YES)、対応するインラインされたメソッドのmaxSizeを現在のコンテキストのsizeで更新する(ステップ828)。
現在のコンテキストのsizeが対応するインラインされたメソッドのmaxSize以下の場合(ステップ826:NO)、又はステップ828から、プロファイラ220はステップ830へ処理を進め、現在のコンテキストに親の関係にあるコンテキストが存在するか否かを判定する。親の関係にあるコンテキストが存在する場合(ステップ830:YES)、プロファイラ220は、親のコンテキストを指すポインタを引数として関数countSizeを再帰的に呼び出す(ステップ832)。親の関係にあるコンテキストが存在しない場合(ステップ830:NO)、又はステップ832の後プロファイラ220は処理を終了する。
図9に示すフローチャートは、図7に示すフローチャートのステップ716の処理の詳細を示す。処理はステップ900で開始し、プロファイラ220は、インラインされている各メソッドについて、該メソッドをインライニングの対象から除外することにより得られる利益の大きさを示す利益値を上述した方法により算出する。続いてプロファイラ220は、算出した利益値の大きい順にインラインされているメソッドを並べ替える(ステップ902)。続いてプロファイラ220は、削減サイズ(reduceSize)を0で初期化する。
続いてプロファイラ220は、利益値の大きい順に並べ替えられたインラインされているメソッドの中に処理すべき次のメソッドMがあるか否かを判定する(ステップ906)。処理すべき次のメソッドMがある場合(ステップ906:YES)、プロファイラ220はこれを現在のメソッドMとして、現在のメソッドMのnumActiveが1よりも大きいか否かを判定する(ステップ908)。現在のメソッドMのnumActiveが1以下の場合(ステップ908:NO)、プロファイラ220はステップ906へ戻って一連の処理を繰り返す。一方、現在のメソッドMのnumActiveが1よりも大きい場合(ステップ908:YES)、続いてプロファイラ220は、現在のメソッドMをインラインしないメソッドとして登録する(ステップ910)。
続いてプロファイラ220は、現在のメソッドMのsize(総実フットプリント)から、現在のメソッドMに対応するコンテキストのsizeの中で最大のsizeを引いた値を、削減サイズ(reduceSize)に加算する(ステップ912)。続いてプロファイラ220は、削減サイズ(reduceSize)が、図7のステップ710で求めた目標削減量(reducedTarget)以上であるか否かを判定する(ステップ914)。削減サイズ(reduceSize)が目標削減量(reducedTarget)より小さい場合(ステップ914:NO)、プロファイラ220はステップ906へ戻って一連の処理を繰り返す。一方、削減サイズ(reduceSize)が目標削減量(reducedTarget)以上である場合(ステップ914:YES)、又は、ステップ906において処理すべき次のメソッドMがない場合(ステップ906:NO)、プロファイラ220は処理を終了する。
次に図10及び図11を参照して本発明の実験結果について説明する。実験の条件は以下の通りである。
・実装対象
IBM (商標)Java(商標)Just-in-Time(JIT) コンパイラ 64ビット
・プラットフォーム
2コア、3.84GHzのPower7(商標)プロセッサ、AIX(商標)6.1オペレーティング・システム
・使用したベンチマーク
SPECjvm2008に含まれる実フットプリントの大きいCC(compiler.compiler)、CS(compiler.sunflow)、XML(xml.transform)と、DT(DayTrader/WebSphere 8.5)
・本発明を適用するプロファイラの動作
Java(商標)仮想マシンの起動から360秒、通常のコンパイルがある程度終了するのを待つ
60秒間命令をサンプリングした後、各メソッドの実フットプリントを算出する
総実フットプリントの10%の削減を目標とする
・比較対象
AggInl:サーバのように長時間実行されるアプリケーション用の積極的なインライニング閾値を使用
NoInl:インライニングを行わない
Normlnl:クライアントアプリケーション向けの標準的なインライニング閾値を使用
AggInl + UnInl:本発明
AggInl + Prof:本発明のプロファイラのみを稼動(オーバーヘッド測定用)
AggInl + HPM:本発明のHPMのカウンタのみを稼動(オーバーヘッド測定用)
図10(a)は、従来技術と本発明とで相対的なスループットを比較した実験結果を示す。なお、以下に説明する4つのグラフはいずれもAggInlの値をベースとしており、図10(a)のグラフは、コンパイル終了後のピーク性能を比較している。図10(a)のグラフが示すように、本発明の手法を適用した場合は、平均で2%、最大2.7%(DT)の性能向上がみられる。ウェブアプリケーション上で動作するDTにおいて最大の性能向上が見られたことから、本発明の手法は長時間実行されるアプリケーションに適しているといえる。また、標準的なインライニング閾値を使用するNormlnlでは、CSを除き性能の改善が見られない。このことから、サイズの大きなアプリケーションではインライニング閾値を下げることで性能を改善するのは難しいといえる。
図10(b)は、従来技術と本発明とで相対的な命令キャッシュミスを比較した実験結果を示す。本発明の手法では、積極的なインライニング閾値を使ってインライニングを行った後、インライニングを解除して総実フットプリントを10%の削減しているため、平均で10%、最大で16%(XML)L2命令キャッシュミスが減少している。なお、インライニングを行わないNoInlや、標準的なインライニング閾値を使用するNormlnlは、本発明の手法よりも低いキャッシュミスを示している。しかし、図10(a)に関して説明したように、Normlnlでは、CSを除き性能の改善が見られない。これはキャッシュミスが低くても、標準的なインライニング閾値を使用することからパス長が増加し、その結果性能が低下したためと考えられる。
図11(a)は、従来技術と本発明とで相対的なコンパイル時間を比較した実験結果を示す。また、図11(b)は、本発明のオーバーヘッドを測定した実験結果を示す。本発明の手法では、積極的なインライニング閾値を使ってインライニングを行った後、インライニングを解除するためのプロファイリングや再コンパイルを行うため、平均で30%のコンパイル時間の増加と、平均で11%のプロファイリングオーバーヘッドが見られる。しかしながら上述したように、本発明の手法は長時間実行されるアプリケーションに適しており、このようなアプリケーションを対象とすれば、コンパイル時間の増加は大きな問題とならない。例えば負荷の低いときにコンパイルを行うことができる。また、プロファイラのオーバーヘッドは、命令のサンプリング頻度を減少させる(即ち、サンプリング時間を増加させる)ことにより、実フットプリント測定の精度を落とすことなく、削減することが可能である。なお、実験では、実施時間短縮のためにHPMによる命令のサンプリング頻度を最大にしており、そのためオーバーヘッドが大きくなっている。なお、最適化終了後においてはプロファイラは活動しないため、オーバーヘッドはなくなる。
以上、実施形態を用いて本願発明の説明をしたが、本願発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更又は改良を加えることが可能であることが当業者に明らかである。以上のように、上記の実施形態に変更又は改良を加えた形態も当然に本発明の技術的範囲に含まれる。
なお、特許請求の範囲、明細書、及び図面中において示した装置、システム、プログラム、及び方法における動作、手順、ステップ、及び段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り任意の順序で実現しうることに留意すべきである。また、前の処理の出力を後の処理で用いる場合でも、前の処理と後の処理の間に他の処理が入ることは可能である場合があること、又は間に他の処理が入るように記載されていても前の処理を後の処理の直前に行うよう変更することも可能である場合があることも留意されたい。特許請求の範囲、明細書、及び図面中の動作フローに関して、便宜上「まず、」、「次に、」、「続いて、」等を用いて説明したとしても、この順で実施することが必須であることを必ずしも意味するとは限らない。

Claims (15)

  1. コンピュータ処理により、メソッドの実フットプリントを算出する方法であって、
    コンピュータが、コンパイル済みコードに含まれる各命令がどのメソッドに属するかを示すマップを作成するステップと、
    前記コンピュータが、ハードウェア・パフォーマンス・カウンタを用いて実行された命令をサンプリングするステップと、
    前記コンピュータが、前記マップを用いて、サンプリングした命令を該命令が属するメソッドにマップし、各メソッドの実フットプリントを、該メソッドに属する命令の中で一度でもサンプリングされた命令の総数として算出するステップと、
    を含む方法。
  2. コンピュータ処理により、インラインするメソッドを決定する方法であって、
    前記コンピュータが、請求項1に記載の方法により各メソッドの実フットプリントを算出するステップと、
    前記コンピュータが、算出した各メソッドの実フットプリントに基づきインラインするメソッドを決定するステップと、を含む方法。
  3. 前記マップは、コンパイル済みコードに含まれる各命令と、該命令が属するインラインされたメソッドとの対応関係を示し、前記インラインするメソッドを決定するステップは、前記コンピュータが、算出した各メソッドの実フットプリントに基づきインラインされたメソッドの中からインライニングを解除するメソッドを決定するステップを含む、請求項2に記載の方法。
  4. 前記各メソッドの実フットプリントを算出するステップは、前記コンピュータが、前記メソッドがインラインされて生成された各コンテキストのサイズを、該コンテキストを構成する命令の中で一度でもサンプリングされた命令の総数として算出するステップと、前記コンピュータが、前記メソッドに対応する複数のコンテキストのサイズの合計を前記メソッドの総実フットプリントとして算出するステップとを含み、前記インラインするメソッドを決定するステップは、前記コンピュータが、各メソッドの総実フットプリントに基づきインラインされたメソッドの中からインライニングを解除するメソッドを決定するステップを含む、請求項3に記載の方法。
  5. 前記インラインするメソッドを決定するステップは、前記コンピュータが、各メソッドについて、該メソッドの総実フットプリントから、前記メソッドに対応する複数のコンテキストのサイズのうち最大のサイズを差し引いた値を削減値として求めるステップと、前記コンピュータが、前記コンパイル済みコードのサイズが目標のコードサイズ以下になるまで、前記各メソッドの削減値をその値の大きい順に前記コンパイル済みコードのサイズから差し引くステップと、前記コンピュータが、前記削減値を差し引かれたメソッドを、インライニングを解除するメソッドとして決定するステップとを含む、請求項4に記載の方法。
  6. 前記インラインするメソッドを決定するステップは、前記コンピュータが、前記各メソッドの前記削減値を該メソッドに対応する複数のコンテキストのうちサイズが0でないコンテキストの数で割って利益値とするステップを更に含み、前記各メソッドの削減値を前記コンパイル済みコードのサイズから差し引く順番を、前記各メソッドの前記利益値の大きい順とする、請求項5に記載の方法。
  7. 前記インラインするメソッドを決定するステップは、前記コンピュータが、サイズが0でないコンテキストを複数有さないメソッドを、インライニングを解除するメソッドの対象から除外するステップを更に含む、請求項6に記載の方法。
  8. 前記インラインするメソッドを決定するステップは、前記コンピュータが、ルートメソッドとしてコンパイルされるメソッドに含まれるメソッドを、インライニングを解除するメソッドの対象から除外するステップを更に含む、請求項6に記載の方法。
  9. 前記インラインするメソッドを決定するステップは、前記コンピュータが、前記目標のコードサイズを、過去に算出された前記各メソッドの総実フットプリントの合計値の中で最大の合計値に所定の削減率を掛けた値として算出するステップを更に含む、請求項5に記載の方法。
  10. 前記コンピュータが、前記コンパイル済みコードのサイズが前記目標のコードサイズよりも小さい場合に、インラインするメソッドを決定するための一連のステップの実行を一定期間休止するステップを更に含む、請求項5に記載の方法。
  11. 前記コンピュータが、前記サンプリングした命令を格納するキャッシュライン数をカウントするステップと、前記キャッシュライン数が所定の閾値より小さいことを条件に、インラインするメソッドを決定するための一連のステップの実行を一定期間休止するステップとを更に含む、請求項4に記載の方法。
  12. 請求項2乃至11のいずれかに一項に記載の方法の各ステップを前記コンピュータに実行させる、インラインするメソッドを決定するためのプログラム。
  13. 請求項2乃至11のいずれかに一項に記載の方法の各ステップを実行するように適合された手段を備える、インライニング対象決定装置。
  14. 請求項1に記載の方法の各ステップを前記コンピュータに実行させる、実フットプリント算出プログラム。
  15. 請求項1に記載の方法の各ステップを実行するように適合された手段を備える、実フットプリント算出装置。
JP2013032961A 2013-02-22 2013-02-22 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム Expired - Fee Related JP6080602B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2013032961A JP6080602B2 (ja) 2013-02-22 2013-02-22 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム
US14/186,136 US9383980B2 (en) 2013-02-22 2014-02-21 Determining a method to inline using an actual footprint calculation

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013032961A JP6080602B2 (ja) 2013-02-22 2013-02-22 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム

Publications (2)

Publication Number Publication Date
JP2014164379A true JP2014164379A (ja) 2014-09-08
JP6080602B2 JP6080602B2 (ja) 2017-02-15

Family

ID=51389624

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013032961A Expired - Fee Related JP6080602B2 (ja) 2013-02-22 2013-02-22 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム

Country Status (2)

Country Link
US (1) US9383980B2 (ja)
JP (1) JP6080602B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102015215392A1 (de) 2014-08-12 2016-03-03 Yazaki Corporation Befestigungsaufbau eines elektronischen Bauteils

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6572610B2 (ja) * 2015-04-28 2019-09-11 富士通株式会社 情報処理装置、コンパイル方法およびコンパイルプログラム
US10001979B2 (en) * 2015-11-25 2018-06-19 International Business Machines Corporation Avoiding guard test invalidation for virtual and interface calls
US10261765B1 (en) * 2018-03-09 2019-04-16 Oracle International Corporation Enhancing program execution using optimization-driven inlining
US10795593B2 (en) * 2018-09-10 2020-10-06 Intel Corporation Technologies for adjusting the performance of data storage devices based on telemetry data
US11157252B2 (en) 2019-04-30 2021-10-26 International Business Machines Corporation Assessment of the benefit of post-inlining program transformation in inlining decisions

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09128246A (ja) * 1995-10-30 1997-05-16 Fujitsu Ltd コンパイラ装置
JPH1040112A (ja) * 1996-07-24 1998-02-13 Nec Corp 動的情報利用型プログラム最適化装置
US20040205409A1 (en) * 2003-03-28 2004-10-14 Gansha Wu Inlining with stack trace cache-based dynamic profiling
JP2005215816A (ja) * 2004-01-28 2005-08-11 Hitachi Ltd ハードウェアモニタを用いた性能プロファイリング方法

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06202875A (ja) 1992-12-28 1994-07-22 Nec Corp インライン展開による最適化を行うコンパイラ
CA2102089C (en) 1993-10-29 1999-05-25 David M. Gillies Recompilation of computer programs for enhanced optimization
JPH10312291A (ja) 1997-05-13 1998-11-24 Toshiba Corp コンパイラ装置
JPH10326193A (ja) 1997-05-26 1998-12-08 Hitachi Ltd インライン展開関数の最適化のためのコンパイル方法
JP3492207B2 (ja) 1998-07-16 2004-02-03 Necマイクロシステム株式会社 組み込みソフトウェアの動的解析方法
US6161217A (en) 1998-09-14 2000-12-12 Sun Microsystems, Inc. Accurate method for inlining virtual calls
JP2001005673A (ja) 1999-06-21 2001-01-12 Hitachi Ltd 最適化方法
JP3642772B2 (ja) 2002-09-25 2005-04-27 三菱電機株式会社 コンピュータ装置及びプログラム実行方法
JP2007018254A (ja) 2005-07-07 2007-01-25 Toshiba Corp 言語処理装置
JP2010140344A (ja) 2008-12-12 2010-06-24 Toshiba Corp コンパイルシステム及びコンパイル方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09128246A (ja) * 1995-10-30 1997-05-16 Fujitsu Ltd コンパイラ装置
JPH1040112A (ja) * 1996-07-24 1998-02-13 Nec Corp 動的情報利用型プログラム最適化装置
US20040205409A1 (en) * 2003-03-28 2004-10-14 Gansha Wu Inlining with stack trace cache-based dynamic profiling
JP2005215816A (ja) * 2004-01-28 2005-08-11 Hitachi Ltd ハードウェアモニタを用いた性能プロファイリング方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102015215392A1 (de) 2014-08-12 2016-03-03 Yazaki Corporation Befestigungsaufbau eines elektronischen Bauteils

Also Published As

Publication number Publication date
JP6080602B2 (ja) 2017-02-15
US9383980B2 (en) 2016-07-05
US20140245274A1 (en) 2014-08-28

Similar Documents

Publication Publication Date Title
JP6080602B2 (ja) 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム
Curtsinger et al. Coz: Finding code that counts with causal profiling
US9104433B2 (en) Trace generation method, trace generation device, trace generation program product, and multi-level compilation using trace generation method
US6971091B1 (en) System and method for adaptively optimizing program execution by sampling at selected program points
KR101942518B1 (ko) 2 패스 자동화된 애플리케이션 인스트루먼테이션
US8024719B2 (en) Bounded hash table sorting in a dynamic program profiling system
US8307375B2 (en) Compensating for instrumentation overhead using sequences of events
US8271999B2 (en) Compensating for instrumentation overhead using execution environment overhead
Liu et al. Pinpointing data locality bottlenecks with low overhead
JP5496849B2 (ja) プロファイル計装方法、プログラム及びコンパイラ
Bond et al. Continuous path and edge profiling
Li et al. DJXPerf: Identifying memory inefficiencies via object-centric profiling for Java
Ibrahim et al. Characterizing the relation between Apex-Map synthetic probes and reuse distance distributions
US8136103B2 (en) Combining static and dynamic compilation to remove delinquent loads
Prokopec et al. On evaluating the renaissance benchmarking suite: Variety, performance, and complexity
Brock et al. PAYJIT: space-optimal JIT compilation and its practical implementation
Majo et al. Integrating profile caching into the hotspot multi-tier compilation system
Qawasmeh et al. Open source task profiling by extending the openmp runtime api
Lim et al. Identifying optimization opportunities within kernel execution in GPU codes
Gurumani et al. Execution characteristics of SPEC CPU2000 benchmarks: Intel C++ vs. Microsoft VC++
Radhakrishnan et al. Execution characteristics of just-in-time compilers
Kulkarni et al. JIT compilation policy on single-core and multi-core machines
Wimmer et al. Phase detection using trace compilation
He et al. Efficient dynamic program monitoring on multi-core systems
Zhai et al. Detecting performance variance for parallel applications without source code

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160209

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20161214

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170117

R150 Certificate of patent or registration of utility model

Ref document number: 6080602

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees