(57)【特許請求の範囲】
【請求項１】
プロファイリングを用いて、アプリケーション用のアプリケーション特有値を決定するためのコンピュータにより実施される方法であって、
前記コンピュータが、少なくとも１つのアプリケーション特有値を決定する対象としての１以上のアプリケーション特有パラメータをプロファイルし、プロファイルデータを収集するステップを含み、
前記収集するステップは、前記コンピュータが、インストルメンテーションビルドからインストルメンテーションバイナリを生成し、前記インストルメンテーションバイナリを用いて、１つ以上の代表的なワークロードの下でトレーニングランを実行することを含み、
前記インストルメンテーションバイナリは、プロファイル初期化関数において、ユーザにより登録された少なくとも１つのユーザ定義のコールバックルーチンを含み、
前記トレーニングランを実行することは、前記少なくとも１つのユーザ定義のコールバックルーチンを呼び出して、前記収集されるプロファイルデータにおける前記アプリケーションのための前記少なくとも１つのアプリケーション特有値を記録することを含み、
前記少なくとも１つのアプリケーション特有値を記録することは、前記プロファイルされた１以上のアプリケーション特有パラメータを平均化し、前記プロファイルされた１以上のアプリケーション特有パラメータの平均値を前記少なくとも１つのアプリケーション特有値として記録することを含み、
前記方法は、
前記コンピュータが、標準的な値プロファイル変換セットを用いて前記収集されたプロファイルデータを解析するステップと、
前記コンピュータが、前記収集されたプロファイルデータを用いてＦＤＯ（feedback-directed optimization）ビルドを生成するステップとをさらに含み、
前記ＦＤＯは、前記呼び出されたコールバックルーチンによって、前記収集されたプロファイルに記録されている前記プロファイルされたアプリケーション特有パラメータ用の前記少なくとも１つのアプリケーション特有値を利用する、方法。
【請求項２】
前記プロファイリングは、クラスごとのグローバル値のプロファイリングである、請求項１に記載の方法。
【請求項３】
前記プロファイリングは、サイトごとの値のプロファイリングである、請求項１に記載の方法。
【請求項４】
前記プロファイリングは、サイトごとのオブジェクト値のプロファイリングである、請求項１に記載の方法。
【請求項５】
クラスごとのグローバルなパラメータ値のプロファイリングをするためのコンピュータにより実施される方法であって、
前記コンピュータが、ユーザ定義のプロファイルインストルメンテーション初期化ルーチンにおいて、カウンタを初期化して１以上のパラメータ値をプロファイルし、ユーザ定義の解析コールバックルーチンとしてプロファイルハンドラ関数を登録するステップと、
前記コンピュータが、インストルメンテーションビルドからインストルメンテーションバイナリを生成するステップとを含み、
前記インストルメンテーションバイナリは、プロファイル初期化ルーチンにおいて、ユーザにより登録された少なくとも１つのユーザ定義の解析コールバックルーチンを含み、
前記方法は、
前記コンピュータが、前記インストルメンテーションバイナリを用いて、１つ以上の代表的なワークロードの下でトレーニングランを実行するステップをさらに含み、
前記トレーニングランを実行するステップは、
前記コンピュータが、前記カウンタの値を更新すべきコード位置で、前記プロファイルされたパラメータ値を更新するためにプロファイル更新関数を実行するステップと、
前記コンピュータが、前記ユーザ定義の解析コールバックルーチンとして登録された前記プロファイルハンドラ関数を実行することによって、前記プロファイルされたパラメータ値についての推奨パラメータ値を記録するステップとを含み、
前記推奨パラメータ値を記録するステップは、前記プロファイルされた１以上のパラメータ値を平均化し、前記１以上のパラメータ値の平均値を前記推奨パラメータ値として記録することを含み、
前記方法は、
前記コンピュータが、前記トレーニングランの実行中に収集されたプロファイルデータを用いてＦＤＯ（feedback-directed optimization）ビルドを生成するステップをさらに含む、方法。
【請求項６】
前記カウンタは、静的カウンタアレイ内の１つのエントリに割当てられる、請求項５に記載の方法。
【請求項７】
前記カウンタは、コンパイラ拡張を用いて、静的カウンタアレイ内に割当てられる、請求項５に記載の方法。
【請求項８】
プロファイルカウンタのアドレスは、特別な目的宣言属性を用いて指定される、請求項５に記載の方法。
【請求項９】
プロファイルの初期化関数は、特別な目的宣言属性を用いて指定される、請求項１から６のいずれか１項に記載の方法。
【請求項１０】
前記プロファイルハンドラ関数を登録するステップは、ＧＣＣインターフェイスを用いて、当該プロファイルハンドラ関数を登録するステップを含む、請求項５に記載の方法。
【請求項１１】
前記コンピュータが、ＧＣＣインターフェイスを用いて、前記プロファイルされたパラメータ値を記録するステップをさらに含む、請求項５または１０に記載の方法。
【請求項１２】
請求項１から１１のいずれか１項に記載の方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【背景技術】
【０００１】
背景
フィードバックに指向された最適化（Feedback Directed Optimization、ＦＤＯ）は、アプリケーションの性能を改善するために、アプリケーションのランタイム挙動に基づき、アプリケーションの実行を調整するように使用される技術である。また、ＦＤＯは、プロファイルにガイドされた最適化（Profile Guided Optimization、ＰＧＯ）およびプロファイルに基づいた最適化（Profile Based Optimization、ＰＢＯ）として知られている。アプリケーションを調整するために、ＦＤＯは、アプリケーションに対するプロファイリングを実行する。プロファイリングとは、アプリケーションが実行中にどのように動作するかに関する情報を収集する処理である。このプロファイル情報は、さまざまなアプリケーションの最適化に関する決定を駆動するために使用される。
【０００２】
図１に示すように、従来のフィードバックに指向された最適化は、静的インストルメンテーションを用いてエッジおよび値プロファイルを収集するデュアルビルドモデル技術である。インストルメンテーションビルド（１０１）は、インストルメント化されたバイナリ（１０２）を作成するために、コンパイラがアプリケーションのバイナリにコードを挿入することを可能にする。一般的に、挿入されたコードは、エッジをカウントするまたは値プロファイルを収集する。インストルメント化されたバイナリ（１０２）は、トレーニングラン（１０３）において、トレーニングデータの代表的なセット（１０４）に基づいて実行される。トレーニング実行の終了時に、収集されたすべてのエッジのカウント数および値の情報は、プロファイルデータベースまたはＧＣＯＶデータファイル（ＧＣＤＡ）（１０５）に書き込まれ、集約される。よって、最適化ビルド（１０６）は、生成される。この最適化ビルドにおいて、コンパイラは、生成されたプロファイルを用いて、インライン決定、命令スケジュールの取決め、基本ブロックの順序付け、関数の分割、および割当ての登録などの最適化決定を行う。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
従来のＦＤＯに関わる１つの問題として、この技術は、ＦＤＯが実行されるアプリケーションの高レベル詳細を理解していないコンパイラに依存しているということである。たとえば、コンパイラは、アプリケーション特有のアルゴリズムまたはパラメータを分かっていない。したがって、従来のフィードバックに指向された最適化は、制御フローエッジプロファイリングのような非常に限られたセットの低レベルプロファイル、または間接的な関数呼出しターゲット、文字列関数呼出しサイズおよび整列プロファイルを含む所定セットの値プロファイルしか処理できない。
【０００４】
多くの場合、ソフトウェア開発者は、アプリケーションの高レベル詳細に関する深い知識をもっている。殆どの場合、開発者は、コードの重要箇所を知っており、アプリケーションの性能を改善するために、どのパラメータを調整すべきかを知っている。しかしながら、一般的なランタイムライブラリにおいて、従来のＦＤＯ処理がユーザ定義プロファイルの最適化を可能にしていないため、これらのパラメータは、調整されていないか、または普通のアプリケーション用に調整されている。よって、一部の開発者は、特定のアプリケーションのためにコードを手動で調整する。しかしながら、手動調整は、大量の労働力を要する。発明者により認識したように、コンパイル時に自動的に行うことのできるアプリケーション性能の簡単調整を可能にするフレームワークが必要である。
【課題を解決するための手段】
【０００５】
概要
本明細書は、一般に、アプリケーション性能改善に関連する技術、特にアプリケーションのランタイム挙動に基づいて性能パラメータを自動的に調整するための方法およびシステムに関する技術を記載する。
【０００６】
一般に、本明細書に記載された発明の一局面は、プロファイリングを用いて、アプリケーション用のアプリケーション特有の推奨パラメータ値を取得するための方法に具体化されることができる。この方法は、アプリケーション特有値を取得する対象としてのパラメータの識別情報を受信するステップと、パラメータをプロファイルするための拡張コードを受信するステップと、パラメータをプロファイルし、プロファイルデータを収集するステップと、プロファイルデータを解析するステップと、解析されたプロファイルデータに基づいて、プロファイルされたパラメータ用のアプリケーション推奨パラメータ値を決定するステップとを備えてもよい。本明細書に記載された発明の第二局面は、ユーザに指向されたクラスごとのグローバル値のプロファイリングをするための方法に具体化されることができる。この方法は、ユーザ定義のプロファイルインストルメンテーション初期化ルーチンを受信するステップと、プロファイル初期化ルーチンにおいて、カウンタを初期化し、ユーザ定義の解析コールバックルーチンを登録するステップと、カウンタ値を更新すべきコード位置で、プロファイル更新関数を実行するステップと、カウンタデータを処理するおよびカウンタ値を記録するために、プロファイルハンドラメソッドを実行するステップとを備えてもよい。本明細書に記載された発明の第三局面は、ユーザに指向されたサイトごとの値のプロファイリングをするまたはユーザに指向されたサイトごとのオブジェクト値のプロファイリングをするための方法に具体化されることができる。この方法は、コンパイラの静的カウンタアレイ内でスペースをカウンタに割当てるステップと、ユーザに指向された値プロファイルインストルメンテーションサポートインターフェイスを実行することによって、カウンタタイプを使用するおよび値をプロファイルする命令を実行するステップと、最適化ビルドの間に、ユーザに指向された値プロファイル変換サポートインターフェイスを実行することによって、パラメータに対して特定値のプロファイル変換を実行するステップとを備えてもよい。
【０００７】
これら実施形態および他の実施形態は、必要に応じて、以下の特徴のうち１つ以上を含むことができる。プロファイリングは、ユーザに指向されたクラスごとのグローバル値をプロファイルしてもよく、ユーザに指向されたサイトごとの値をプロファイルしてもよく、ユーザに指向されたサイトごとのオブジェクト値をプロファイルしてもよい。パラメータをプロファイルし、プロファイルデータを収集するステップは、インストルメンテーションビルドからインストルメンテーションバイナリを生成するステップと、インストルメンテーションバイナリを用いて、１つ以上の代表的なワークロードの下でトレーニングランを実行することによって、プロファイルデータを生成するステップと、生成されたプロファイルデータを記憶するステップとをさらに含んでもよい。アプリケーション推奨パラメータ値を決定するステップは、指定されたコールバックメソッドを用いて、プロファイルデータのカスタム処理を行うことによって、パラメータの推奨値を選択するステップと、推奨値を記録するステップとをさらに含んでもよい。記録された推奨値を最適化ビルドに使用することによって、パラメータを初期化してもよい。アプリケーション推奨パラメータ値を決定するステップは、プロファイルデータを使用する最適化ビルドを実行するステップと、標準的な値プロファイル変換セットを用いて、プロファイルデータに基づき、パラメータ値を推奨値に変換するステップとをさらに含んでもよい。プロファイルされるパラメータのために、プロファイルカウンタを定義してもよい。静的カウンタアレイ内の１つのエントリをカウンタに割当ててもよい。カウンタの割当ては、カウンタを割当てるためのコンパイラ拡張を呼び出すことによって行われてもよい。ユーザに指向された値プロファイルインストルメンテーションサポートインターフェイスは、ＧＣＣビルトイン言語拡張であってもよい。ユーザに指向された値プロファイル変換サポートインターフェイスは、ＧＣＣビルトイン言語拡張であってもよい。プロファイルカウンタに特別な目的宣言属性を提供することによって、プロファイルカウンタアドレスの追跡を可能にしてもよい。特別な目的宣言属性を提供することによりプロファイルの初期化関数を指定することによって、プロファイルの初期化を可能にしてもよい。ＧＣＣインターフェイスを用いて、ユーザ定義の解析コールバックルーチンを定義してもよい。ＧＣＣインターフェイスを用いて、パラメータを記録してもよい。
【０００８】
本発明の１つ以上の実施形態の詳細は、例示のみとして提供された添付の図面および以下の説明により記載される。その他の特徴、局面および本発明の利点は、説明、図面および特許請求の範囲から明らかになるであろう。同様の参照番号および名称は、さまざまな図面において同様の要素を示す。
【図面の簡単な説明】
【０００９】
【図１】従来のフィードバックに指向された最適化ループを示すブロック図である。
【図２】ユーザに主導の、ィードバックに指向された最適化ループの例示を示すブロック図である。
【図３】アプリケーションのために、アプリケーション特有かつプロファイル主導の最適化を取得するための方法例を示すフロー図である。
【図４】ユーザに指向されたクラスごとのグローバル値のプロファイリングをするための方法例を示すフロー図である。
【図５】ユーザに指向されたクラスごとのグローバル値のプロファイリングをする実施形態のコード例を示す図である。
【図６】ユーザに指向されたサイトごとの値のプロファイリングまたはユーザ向けサイトごとのオブジェクト値のプロファイリングをするための方法例を示すフロー図である。
【図７】ユーザに指向されたサイトごとの値のプロファイリングをするための実施形態のコード例を示す図である。
【図８ａ】ベクトルサイズを事前に割当てるベクトルクラスを表す従来コードを示す図である。
【図８ｂ】ユーザに指向されたサイトごとのオブジェクト値のプロファイリングをする実施形態のコード例をを示す図である。
【図９ａ】ベクトルサイズおよび要素サイズを事前に割当てるベクトルクラスを表す従来のコードを示す図である。
【図９ｂ】ユーザに指向されたサイトごとのオブジェクト値のプロファイリングをする実施形態のコード例をを示す図である。
【図１０】例示的なコンピューティングデバイスを示すブロック図である。
【発明を実施するための形態】
【００１０】
詳細な説明
例示的な実施形態によれば、フレームワークは、図２に示すように、ソフトウェア開発者が選択されたアプリケーションの一部をプロファイルし、プロファイリング結果に基づいて、コンパイラに指示して値のプロファイル変換を実行することを可能にすることによって、ユーザに指向されかつプロファイル主導の最適化を容易にすることができる。ユーザ定義の情報は、インストルメントおよびフィードバックループの最適化コンパイルの両方に含まれてもよい。
【００１１】
プロファイリングを用いて、アプリケーション用のアプリケーション特有の推奨パラメータ値を取得するための方法例は、図３に示すように、アプリケーション特有値を取得する対象としてのパラメータの識別（３０１）から始まる。次に、アプリケーション特有パラメータをプロファイルするために、コードを拡張すべきである（３０２）。いくつかの実施形態において、拡張されるコードは、アプリケーションコードであってもよい。他の実施形態において、拡張されるコードは、アプリケーションコードに使用されるライブラリであってもよい。その後、パラメータは、アプリケーションのために特異的にプロファイルされる（３０３）。プロファイリングは、（ａ）インストルメンテーションビルドと、（ｂ）トレーニングランとの２つのステップを含むことができる。
【００１２】
インストルメンテーションビルドは、コンパイラを呼出して、必要なインストルメンテーションコードを含むバイナリを生成し、このバイナリを実行するときに、パラメータをプロファイルすることができる。このステップでは、注釈付きのパラメータをプロファイルするために、ユーザ指定の注釈を用いて、特定のインストルメンテーションを挿入することができる。
【００１３】
トレーニングランは、インストルメンテーションビルドから生成されたバイナリを使用し、１つ以上の代表的なワークロードの下でこのバイナリを実行する。このトレーニングランは、プロファイルデータを生成する。これらのプロファイルデータは、収集され、データベースまたはデータファイルに記憶される。
【００１４】
プロファイルデータの収集後、これらのプロファイルデータは、解析され、プロファイルされるパラメータ用のアプリケーション推奨パラメータ値を決定する（３０４、３０５）ことができる。
【００１５】
いくつかの場合において、ユーザは、コールバックメソッドを指定し、プロファイルデータのカスタム処理を行うことによって、パラメータの推奨値を選択することができる。この推奨値は、プロファイルデータベースまたはデータファイルに記録され、最適化ビルドに使用され、パラメータを初期化する。この処理は、最良のパラメータ値を選択するために、プロファイルデータのより複雑な特殊の取り扱いを可能にする。この場合、最適化ビルドは、トレーニングランの終了時に、ユーザのコールバックを介して選択されたパラメータ値を盲目的に適用してもよい。
【００１６】
他の場合において、最適化ビルドは、プロファイルデータを直接に使用し、コンパイラサポートライブラリから提供され得る標準的な値プロファイル変換セット、たとえばＧＣＯＶを用いて、プロファイルデータに基づき、コードを変換するまたはパラメータ値を初期化することができる。
【００１７】
ユーザに指向されたプロファイルカウンタの割当て、ユーザに指向された値のプロファイルインストルメンテーション、ユーザに指向された値のプロファイル変換、プロファイラカウンタアドレスの追跡、ユーザに指向されたプロファイルの初期化、ユーザ定義のプロファイル解析コールバックルーチンのランタイム統合、およびユーザ定義の変換決定の記録に使用されるサポートを含んでいてもよい。
【００１８】
図２に示すように、フィードバックに指向された最適化を強化するために、これらの機能は、協働してもよい。ソースコードは、特定のパラメータまたは複数のパラメータをプロファイルするために、新規インターフェイスを介してユーザによってインストルメント化されてもよい（２００）。その後、このソースコードは、新規インターフェース用のコンパイラサポートを用いて、インストルメンテーションビルドにおいてコンパイルされてもよい（２０１）。インストルメント化されたバイナリは、ユーザコールバック、新規カウンタタイプおよびメソッドを含んでいてもよい（２０２）。これらのユーザコールバック、新規カウンタタイプおよびメソッドは、その後のトレーニングランにおいて呼出すことができる（２０３）。プロファイルデータベースまたはデータファイルは、インストルメント化されたパラメータ用の値プロファイルを収集することができる（２０５）。上述したように、プロファイリングの後、ユーザコールバックメソッドを呼出すことができる。ユーザコールバックメソッドを呼出した場合、推奨パラメータ値は、プロファイルデータベースまたはデータファイルに記録され、最適化ビルドに使用され（２０６）、最適化されたバイナリを作成する（２０７）。他の場合において、最適化ビルドは、プロファイルデータを直接に解析し（２０６）、プロファイルパラメータまたはパラメータを変換することによって、最適化されたバイナリを作成する（２０７）ことができる。
【００１９】
いくつかの方法を用いて、例示的なフレームワークの機能を実現してもよい。一実施形態において、ユーザに指向されたプロファイルカウンタの割当て、ユーザに指向された値のプロファイルインストルメンテーション、およびユーザに指向された値のプロファイル変換は、ＧＮＵコンパイラコレクション（ＧＣＣ）ビルトイン関数の言語拡張であってもよい。プロファイルカウンタアドレスの追跡およびユーザに指向されたプロファイルの初期化は、特別な目的宣言属性を用いて、実現することができる。ユーザ定義のプロファイル解析コールバックルーチンのランタイム統合およびユーザ定義の変換決定の記録は、例示的なＧＣＣアプリケーションプログラミングインターフェースを用いて、実現することができる。フレームワーク用のメソッドおよびインタフェースは、ＧＣＣ用に構築された試験用区間変量ライブラリであるＧＣＯＶからの標準オブジェクトを使用することができる。例示的なフレームワークの機能の各部分についての詳細は、以下の段落に記載される。
【００２０】
ユーザに指向されたプロファイルカウンタの割当て
ユーザに指向されたプロファイルカウンタの割当てインタフェースは、インストルメンテーション時に、コンパイラを指示して、１つのエントリを指定されたカウンタ用の静的カウンタアレイに割当てるように使用することができる。例示的なユーザに指向されたプロファイルカウンタの割当て方法は、４つのパラメータ、すなわち、（１）割当てるべきカウンタのタイプ、（２）プロファイルリングされているオブジェクトへのポインタ、（３）カウンタのベースアドレスポインタフィールドの名前を表すオプションパラメータ、および（４）シーケンスＩＤを表すオプションパラメータを利用する。同一のサイトに複数の値をプロファイルする場合、カウンタのベースアドレスポインタフィールドの名前を表すオプションパラメータを使用してもよい。このパラメータは、以下でより詳細に説明する。同一のサイトに同一のタイプを有する複数の値をプロファイルする場合、シーケンスＩＤを表すオプションパラメータを使用してもよい。
【００２１】
例示的なプロファイルカウンタは、以下の本発明の思想の側面に基づいた新規ＧＣＣビルトイン言語拡張を用いて、割当てることができる。
「_builtin_vpi_alloc(GCOV_COUNTER_TYPE gt, void*this, 
const char*fname=0, gcov_unsigned seq_id=0);」
この汎用宣言において、「gt」は、カウンタタイプを表し、パラメータ「this」は、プロファイルされているオブジェクトへのポインタを表すオプションパラメータであり、パラメータ「fname」は、ベースアドレスポインタフィールドの名前を表すオプションパラメータであり、パラメータ「seq_id」は、同一のサイトに同一のタイプを有する複数の値をプロファイルする場合に使用されたオプションシーケンスＩＤである。
【００２２】
プロファイルカウンタの割当ては、「counter_array[site_index]」と呼ばれるカウンタアレイに、カウンタを割当てることができる。ＧＣＣは、プロファイルされているすべてのカウンタ値を保持するように、カウンタアレイを割当てる。ＧＣＣビルトイン言語拡張は、指定されたビルトインに必要されたカウンタのために、スペースを適切なアレイに割当てるようにコンパイラに指示することができる。たとえば、コンパイラは、ベースアドレスフィールドを以下のように初期化することができる。
「counter_base_ = &counter_array[site_index];」
この汎用割当てにおいて、カウンタベースは、カウンタがコンパイラのカウンタアレイに割当てられたことを示すインデックスのアドレスを受信する。「site_index」は、このカウンタに割当てられたインデックスを表す。
【００２３】
ユーザに指向された値プロファイルインストルメンテーション
ユーザに指向された値プロファイルは、プロファイルのトレーニング実行時に指定された値をプロファイルするコードを挿入するようにコンパイラに指示する。例示的なユーザに指向された値プロファイルインターフェイスは、４つのパラメータ、すなわち、（１）カウンタタイプ、（２）プロファイルされるパラメータまたは値、（３）プロファイルされるオブジェクトへのオプションポインタ、および（４）同一のサイトに複数の値をプロファイルする場合、カウンタのベースアドレスポインタフィールドの名前を表すオプションパラメータを利用することができる。たとえば、インストルメンテーションインタフェースは、以下の本発明の思想の側面に基づいた新規ＧＣＣビルトイン言語拡張を用いて、インスタンス化されることができる。
「void _builtin_vpi(GCOV_COUNTER_TYPE gt, gcov_type v, void *this=NULL, const char *fname = 0);」
この汎用宣言において、「gt」は、カウンタタイプを表し、「v」は、プロファイルされるパラメータまたは値である。パラメータ「this」は、プロファイルされているオブジェクトへのポインタを表すオプションパラメータであり、パラメータ「fname」は、ベースアドレスポインタフィールドのオプション名前である。
【００２４】
ユーザに指向された値プロファイル変換
ユーザに指向された値プロファイル変換は、パラメータのプロファイルデータに基づきプロファイルされるパラメータまたは値に対する変換を実行するように、コンパイラに指示する。例示的なユーザに指向された値プロファイル変換インタフェースは、４つのパラメータ、すなわち、（１）カウンタタイプ、（２）実行される変換、（３）変換を実行する対象としてのパラメータまたは値、および（４）オプションシーケンスＩＤを利用することができる。たとえば、変換インタフェースは、以下の本発明の思想の側面に基づいた新規ＧＣＣビルトイン言語拡張を用いて、インスタンス化されることができる。
「_builtin_vpt(GCOV_COUNTER_TYPE gt, GCOV_VPT_TYPE vptt, gcov_type a, gcov_unsigned seq_id = 0);」
このインタフェースを使用して、タイプ「gt」を有するカウンタからの値「a」を用いて値プロファイル変換vpttを実行するように、コンパイラに指示することができる。
【００２５】
この汎用宣言において、「gt」は、使用されるカウンタタイプを表し、「vptt」は、実行される変換のタイプを表す。パラメータ「a」は、変換するパラメータまたは値であり、「seq_id」は、シーケンスＩＤを表すオプションパラメータである。
【００２６】
プロフィールカウンタアドレスの追跡
コンパイラの注釈を用いて、新規ベースアドレスフィールドを指定することができる。この属性は、非静的フィールド宣言に適用する必要がある。たとえば、ベースアドレスフィールドの属性は、「_attribute_((gcov_counter_base));」のような特殊目的宣言属性を用いて、指定することができる。
【００２７】
カウンタ宣言は、「gcov_type *counter_base_ _attribute_((gcov_counter_base));」のように規定してもよい。
【００２８】
カウンタベース属性をカウンタ宣言に取付けることは、カウンタを割当てた直後に、カウンタに対応するベースアドレスフィールドを初期化するように、コンパイラにコードを生成させることができる。たとえば、コンパイラは、上記に説明した以下の割当てを用いて、ベースアドレスフィールドを初期化することができる。
「counter_base_ = &counter_array[site_index];」
ユーザに指向されたプロファイルの初期化
いくつかの場合において、ソフトウェア開発者は、コンパイラおよびコンパイラランタイムにより提供された所定のカウンタおよび更新シーケンスを使用したくない可能性がある。ソフトウェア開発者は、プロファイル初期化関数を実装することによって、プロファイルインストルメンテーションルーチンを初期化することができる。この関数は、インストルメンテーションビルド内の「.init」関数によって呼出された静的初期化ルーチンとして取扱うことができる。最適化ビルドにおいて、この関数は、パースされ、破棄される。例示的な実施形態において、プロファイルの初期化関数は、「_attribute _((profile_init))」のような特殊目的宣言属性を用いて指定することができる。
【００２９】
例示的なプロファイル初期化ルーチンは、「static void profile_init(void)_attribute_((profile_init);」のように宣言することができる。
【００３０】
プロファイル初期化属性を関数宣言に取付けることは、宣言された関数がプロファイル初期化を定義することをコンパイラに理解させることができる。この属性を関数宣言に適用した場合、この関数は、コンパイルされたインストルメンテーションビルド（２０１）内の「.init」関数によって呼出される静的ルーチンとして取扱われる。最適化ビルド（２０６）において、この関数は、パースされ、破棄される。
【００３１】
ユーザに指向されたプロフィール更新
ソフトウェア開発者は、コンパイラおよびコンパイラランタイムにより提供された所定のカウンタおよび更新シーケンスを使用しない場合、トレーニングランにおいてパラメータをプロファイルするときに、このパラメータの値を更新する必要がある。ソフトウェア開発者は、コード内でパラメータの値が変化する適切な場所に更新関数を呼出すことができる。「invoke」関数は、３つのパラメータ、すなわち、（１）更新関数へのポインタ、（２）ユーザ定義のカウンタ変数へのポインタ、および（３）プロファイルされるパラメータまたは値を利用することができる。方法例を以下のように定義することができる。
「void _builtin_invoke(void(*updater)(void *), void *profile_counter, gcov_type data);」
この汎用宣言において、「updater」は、ユーザにより定義された「updater」という名前を有する更新関数を指し、「profile_counter」は、ユーザ定義のカウンタ変数へのポインタであり、「data」は、プロファイルされる値またはパラメータである。インストルメンテーションビルドにおいて、このビルトインをコール「updater(profile_counter, data)」に展開することができる。最適化ビルドにおいて、このビルトインは、何もしないことがある。
【００３２】
ユーザ定義プロフィール解析コールバックルーチンのランタイム統合
ソフトウェア開発者は、パラメータ値をプロファイルおよび更新するために所定のカウンタおよび更新シーケンスを使用しない場合、収集されたプロファイルデータを処理し、各プロファイルされたパラメータのために推奨パラメータ値を記録する方法を必要とする。ソフトウェア開発者は、コールバックルーチンを定義することによって、収集されたプロファイルデータを処理し、最適化ビルドに使用する推奨パラメータ値を記録してもよい。ユーザは、このコールバックルーチンを上述したプロファイル初期化関数に登録する必要がある。コールバックルーチンを登録するために、開発者は、コールバックルーチンへのポインタを使用するレジスタインタフェースをパラメータとしてインスタンス化することができる。このインスタンス化は、上述したプロファイル初期化関数により呼出されるべきである。いくつかの実施形態において、コールバックルーチンの登録は、以下のように定義されてもよい。
「void _gcov_register_profile_handler(void (*handler) (void));」
この汎用登録関数宣言において、「*handler」は、ユーザ定義のコールバックルーチンまたはプロファイルハンドラ関数へのポインタを表す。
【００３３】
ユーザ定義の変換決定の記録
上述したように、ソフトウェア開発者は、パラメータ値をプロファイルおよび更新するために、所定のカウンタおよび更新シーケンスを使用しない場合、収集されたプロファイルデータを処理し、各プロファイルされたパラメータ用の推奨パラメータ値を記録する方法を必要とする。値の記録は、２つのパラメータ、すなわち、（１）マクロ名および（２）推奨値を利用するインターフェースを用いて行うことができる。たとえば、記録インタフェースは、以下のＡＰＩを用いて、インスタンス化されることができる。
「void _gcov_record_parameter_value(const char *macro_name, gcov_type optimal_value);」
この汎用宣言において、「macro_name」は、フィードバックに指向された最適化ビルド（２０６）内のプロファイル最適値「optimal_value」とともに更新されるソースマクロの名前を表す。パラメータ「optimal_value」は、指定されたマクロが設定される対象である推奨値を表す。このインタフェースは、最適化ビルドに使用される「macro_name」と「optimal_value」との間のマッピングを記録する。
【００３４】
フレームワークの使用
例示的なフレームワークの各々の部分を共に利用することによって、ソフトウェア開発者は、ユーザに指向されたクラスごとのグローバル値のプロファイリング、ユーザに指向されたサイトごとの値のプロファイリング、およびユーザに指向されたサイトごとのオブジェクト値のプロファイリングを含む値のプロファイリングのいくつかの異なるクラスを定義および使用することができる。
【００３５】
ユーザに指向されたクラスごとのグローバル値のプロファイリング
ユーザに指向されたクラスごとのグローバル値のプロファイリングは、アプリケーション用の特定のパラメータ値をプロファイルするおよび最適化するために使用される。このようなプロファイリングは、アプリケーションが互いに接続されていない複数のプログラムに共有されたライブラリを使用する場合、特に有益であり得る。ライブラリとは、明確に定義されたインタフェースを介して特定の挙動を定義するコードの集合である。ライブラリは、通常、異なるプログラムによって共有される。典型的なライブラリは、通常、ランタイム性能を制御するために使用される多くのパラメータを有する。しかしながら、ほとんどのライブラリにおいて、これらのパラメータは通常、調整されていないまたはこのライブラリを利用するすべてのアプリケーションではなく一部のアプリケーションのために調整されている。パラメータ値が時間の経過とともに陳腐化になる可能性があるため、ライブラリを使用する各々のアプリケーションに異なるセットのパラメータを用意することは、実用的でない。
【００３６】
このようなプロファイリングにおいて、ソフトウェア開発者は、コンパイラに独立して、パラメータカウンタを追跡する必要がある。コンパイラは、追跡する必要のあるアプリケーションの臨界値またはこれらの臨界値を追跡する方法を理解していない可能性があるため、ユーザは、パラメータカウンタを追跡しなければならない。
【００３７】
ユーザに指向されたクラスごとのグローバル値のプロファイリングを用いて、特定のアプリケーション用のアプリケーション特有のパラメータ値を得るために、ソフトウェア開発者は、ユーザに指向されたプロファイル初期化関数、登録されたユーザ定義のコールバックルーチン、ユーザ定義の更新関数、およびユーザ定義の変換決定を記録する方法を含む例示的なフレームワークのいくつかの構成部分を使用してもよい。フレームワーク構成部分を使用することによって、ソフトウェア開発者は、推奨パラメータを選択するための決定プロセスをコンパイラに基づいたフィードバックに指向された最適化ループに埋め込むことができる。
【００３８】
図４の（４０１、４０２）に示すように、ユーザに指向されたクラスごとのグローバル値のプロファイリング用の方法例は、従来の所定のカウンタおよび更新シーケンスに依存せず、ユーザによる値プロファイルカウンタタイプの指定および値プロファイルインストルメンテーションルーチンの定義から始まる。
【００３９】
パラメータをプロファイルするために、まず、ソフトウェア開発者は、カウンタを構築する。次に、ユーザは、プロファイル初期化ルーチン関数を作成する。上述したように、この関数は、プロファイルの初期化属性を関数の宣言に含めることによって、指定することができる。プロファイルの初期化属性を関数の宣言に適用した後、この関数は、インストルメンテーションビルドにおいて、「.init」関数によって呼出される静的初期化ルーチンとして取扱われる。最適化コンパイルにおいて、この関数は、パースされ、破棄される。このプロファイル初期化関数において、開発者は、カウンタを初期化することによって特定のパラメータをプロファイルすることができる。
【００４０】
インストルメンテーションの構築時に変更するようにパラメータの値を更新するために、ソフトウェア開発者は、カウンタの値を更新すべき位置で、プロファイル更新関数を実行する（４０４）。ソフトウェア開発者は、ＧＣＣビルトインの言語拡張または他のコードを用いて、指定の場所でユーザ定義のプロファイル更新関数を呼出すことができる。上述したように、呼出関数を更新関数に拡張することができる。この更新関数は、インストルメンテーションビルドの間に、プロファイルされたパラメータの値を記録する。
【００４１】
また、ソフトウェア開発者は、プロファイルハンドラ関数を作成して、最適化ビルドの間に、カウンタプロファイルデータを処理し、プロファイルされたパラメータのために決定された推奨パラメータ値を記録するようにしてもよい。このプロファイルハンドラ関数は、プロファイル初期化関数内のコールバックルーチンに登録されることができる（４０３）。また、ソフトウェア開発者は、ユーザ定義の変換決定を記録するために、上述した記録方法をインスタンス化することができる（４０５）。
【００４２】
たとえば、図５に示すように、ソフトウェア開発者は、ライブラリコードにおいて、特定のアプリケーションに推奨バッファサイズを決めたい場合がある。最初にマクロに定義されたバッファサイズのパラメータ値は、３２である（５０１）。
【００４３】
特定のアプリケーションに推奨バッファサイズを決定および設定するためには、ソフトウェア開発者は、例示的なフレームワークの性質を使用して、コードを拡張することができ、バッファをプロファイルすることができる。
【００４４】
図５に示すように、ソフトウェア開発者は、カウンタ「ProfCounter」を構築する（５０２）。次に、プロファイルの初期化属性を関数の定義に含めることによって、ユーザ定義のプロファイルインストルメンテーションルーチン関数を指定することができる。図５において、「_attribute_((profile_init))」を用いて、「profile_init」をプロファイルインストルメンテーションルーチン関数として指定する（５０３）。その後、ソフトウェア開発者は、プロファイルの初期化関数において、カウンタを初期化する。
【００４５】
その後、ソフトウェア開発者は、インストルメンテーションビルド中にパラメータの値が変更する際に、プロファイルされたパラメータの値を更新するために、更新メソッドを定義することができる。図５のバッファ例に示すように、ソフトウェア開発者は、バッファのサイズを変更するサイズ変更メソッドからプロファイル更新関数を呼出す（５０９）。この呼出しにおいて、「profile_update」は、ユーザ定義の更新関数であり、「counter_」は、ユーザ定義のカウンタ変数であり、「s」は、プロファイルされるデータ値である。インストルメンテーションビルドにおいて、この呼出しをコール「profile_update(counter_, s)」に拡張することができる。
【００４６】
その後、ソフトウェア開発者は、インストルメンテーションビルドから、プロファイルされたデータを処理し、バッファ推奨サイズを決定するプロファイルハンドラ関数を定義することができる（５０７）。このプロファイルハンドラ関数は、最適化コンパイル時に、バッファ推奨サイズをプロファイリングデータベースに記録し、メカニズムを用いてマクロを使用されるパーサーに渡す。コンパイラは、最適化ビルド処理の初期に、ＧＣＯＶデータファイル（ＧＣＤＡ）から読取ることができる。この読取処理のコードは、新規マクロパラメータのタイプを理解するように強化されることができ、ソースコードをパースするコンパイラの一部にマクロパラメータを通信することができる。この場合、マクロ「BUF_SIZE」は、最適化ビルド中において、プロファイルハンドラ関数を実行する際に、推奨パラメータ値「optimal_buffer_size」を受信する。推奨パラメータ値「optimal_buffer_size」は、記録されたすべてのバッファサイズを処理することによって決定される。たとえば、処理は、記録されたバッファサイズの平均値を計算することを含んでもよく、計算された平均値を推奨バッファサイズとして決定してもよい。
【００４７】
その後、プロファイルハンドラは、最適化ビルドの間に実行されるコールバックルーチンとして登録することができる。この例では、ソフトウェア開発者は、プロファイルハンドラ関数「profile_handler」のアドレスを登録メソッドに渡す。
【００４８】
ユーザに指向されたサイトごとの値のプロファイリング
ユーザ向けサイトごとの値のプロファイリングを用いて、たとえば、関数コールパラメータ、高価な演算のオペランドまたはループバウンド用の推奨パラメータを決定することができる。サイトごとの値のプロファイリングをするためには、インストルメンテーション部および変換部は、同一の場所にあるため、解析コールバックをする必要がない。
【００４９】
ユーザに指向されたサイトごとの値のプロファイリングをサポートするために、ソフトウェア開発者は、ユーザに指向されたプロファイルカウンタの割当て、ユーザに指向された値プロファイルのインストルメンテーション、およびプロファイリングユーザに指向された値の変換を含むフレームワーク例のいくつかの部分を使用することができる。図６に示すように、例示的なプロファイルカウンタ割当てインタフェースを用いて、インストルメンテーションの間に、静的カウンタアレイから指定されたカウンタに１つのエントリを割当てるように、コンパイラに指示することができる。
【００５０】
例示的なユーザに指向された値プロファイルインストルメンテーションサポートインターフェイスを用いて、インストルメンテーションビルドの間にパラメータの値をプロファイルする際に、カウンタタイプを使用するコードおよび値をプロファイルするコードを指示することができる(６０２)。
【００５１】
また、例示的なフレームワークは、最適化ビルドに使用することができるユーザに指向された値プロファイル変換サポートインターフェースを提供することができる（６０４）。このインタフェースを用いて、コンパイラに指示して、指定されたカウンタタイプを有するカウンタからの値を用いて特定のパラメータに値プロファイル変換を実行することができる。
【００５２】
図７は、関数「foo」を呼出す最初のパラメータに対する値のプロファイリングおよびマルチバージョン変換の例を示している。まず、パラメータをプロファイルするために、コードを拡張する。プロファイルカウンタを割当てるために、メソッドを挿入する。この例では、プロファイルカウンタは、最も頻度の高いＮ値を検出するカウンタ「_GCOV_TOPN_VAL」に割当てられる（７０２）。このユーザに指向された値プロファイルインストルメンテーションサポートインターフェイスは、コンパイラに指示して、カウンタ「_GCOV_TOPN_VAL」を用いて最も頻度の高い値「a」を検出するようにコードを構築する（７０４）。このユーザに指向された値プロファイルインストルメンテーションサポートインターフェイスは、コンパイラに指示して、カウンタ「_GCOV_TOPN_VAL」からの値「a」を用いてマルチバージョン変換「_GCOV_MULTI_VER,」を実行する（７０６）。
【００５３】
ユーザに指向されたサイトごとのオブジェクト値のプロファイリング
ユーザに指向されたサイトごとのオブジェクト値のプロファイリングを用いて、同一の静的なサイトにインスタンス化されたオブジェクトに対する値のプロファイリングおよび変換を実行することができる。ユーザに指向されたサイトごとの値のプロファイリングをサポートするためには、ソフトウェア開発者は、ユーザに指向されたプロファイルカウンタの割当て、ユーザに指向された値プロファイルのインストルメンテーション、プロファイルカウンタアドレスの追跡、およびユーザに指向された値のプロファイリング変換をを含む例示的なフレームワークのいくつかの部分を使用することができる。
【００５４】
このようなプロファイリングの方法例は、インストルメンテーションビルドのためにコードを拡張することから始まる。プロファイルカウンタのアドレスを追跡するために、コンパイラ注釈を用いて、新規ベースアドレスフィールドを指定することができる。この属性は、非静的フィールド宣言に適用する必要がある。たとえば、「_attribute_((gcov_counter_base));」のような特殊目的宣言属性を用いて、ベースアドレスフィールドの属性を指定することができる。
【００５５】
コードを挿入して、プロファイルカウンタを割当てることができる。その後、インストルメンテーションコードを挿入して、所望のパラメータまたは所望の値をプロファイルすることができる。最後に、コードを挿入して、プロファイル変換を行うことができる。
【００５６】
たとえば、図８ａは、ベクトルサイズを事前に割当てるベクトルクラスを示している。新規作成されたベクトルは、「１０」というサイズを有する。しかしながら、ベクトルの推奨サイズは、「１０」ではなくてもよい。関数「foo」内のベクトルに用意する空間量を決定決定するためおよびオブジェクトを適切に割当てるために、ソフトウェア開発者は、ユーザに指向されたサイトごとのオブジェクト値のプロファイリングを使用することができる。
【００５７】
図８ｂは、ベクトルの推奨長さを決定するために、ユーザに指向されたサイトごとのオブジェクト値のプロファイリングを実行するプロセスを示している。長さパラメータをプロファイルするために、まず、クラスを拡張しなければならない。
【００５８】
この例では、インストルメンテーションビルドのために、マクロ「ＰＲＯＦＩＬＥ＿ＧＥＮＥＲＡＴＥ」は、作成される（８０２）。図８ｂに示すように、コンパイラ注釈を用いて、新規ベースアドレスフィールド「counter_base_」をカウンタに指定する（８０２）。
【００５９】
その後、プロファイルカウンタを割当てるために、コードを挿入する。この例では、プロファイルカウンタは、標準カウンタ「_GCOV_COUNTER_AVERAGE」を用いて、プロファイルされる値のランニング合計およびカウントを保存するカウンタに割当てられる（８０４）。この例では、割当ては、プロファイルされているベクトルオブジェクトへのポインタ「this」を使用する。
【００６０】
次のステップでは、ベクトルの最終長さを記録するインストルメンテーションコードを挿入する。コードが消去点でベクトルに必要される最終長さを判明するため、ベクトルの最終長さは、ベクトル消去関数（vector destructor）において決定される。図８ｂに示すように、ユーザ定義の値プロファイルインストルメンテーションサポートインターフェイスは、コンパイラに指示して、長さのランニング合計およびカウントを保存するように、標準タイプのカウンタ「_GCOV_COUNTER_AVERAGE」を用いてコードをインストルメント化する（８０８）。
【００６１】
プロファイルにベクトル最終長さの値を与えるためのインストルメンテーションコードを挿入した後、ベクトルの推奨長さを決定するために、コードを挿入してベクトル長さのパラメータに対する変換を実行する必要がある。変換は、最適化ビルド中に、インスツルメンテーションビルドから受け取ったプロファイリングデータを用いて行われる。図８ｂに示すように、ユーザに指向された値プロファイル変換サポートインタフェースは、コンパイラに指示して、トレーニングランの間に、ＧＣＯＶ標準平均変換「_GCOV_AVERAGE_VAL」を用いて長さに対する平均化、および標準カウンタ「_GCOV_COUNTER_AVERAGE」から受け取った値「ｎ」に対する平均化を行う（８０６）。
【００６２】
その後、長さの平均値は、プロファイルデータベースまたはＧＣＤＡファイルに送信され、インストルメンテーションサイトで作成されたベクトルインスタンスの推奨長さパラメータとして使用される。コンパイラが新規ベクトルのためにコードを生成するたびに、ビルトインは、このベクトルのサイズをプロファイルデータからの平均値に設定するように、コンパイラに指示することができる。このようなプロファイリングおよび最適化は、変換を実行するプロファイル変換サイトまたは変換箇所がコード内の多くの場所にインライン化されているという事実を活用している。その結果、コンテキスト依存のインラインサイト特異的プロファイルは、各インラインサイトに収集され、変換され得る。この場合、アプリケーションコードに亘って異なる場所でインスタンス化されたベクトルは、ライブラリのデフォルト値ではなく、異なるプロファイルに基づく長さの値を得ることができる。
【００６３】
ユーザに指向されたサイトごとのオブジェクト値のプロファイリングの追加例は、図９ａおよび９ｂに示されている。これらの例は、図８ａおよび８ｂを参照して上記に説明した例の後続である。ベクトルの長さを決定することに加えて、挿入操作の開始時に事前割当てるスペースの量を決定することができる。通常、挿入操作は、１つの要素のベクトルの長さを一回で増加するが、これにより増加した量が不十分である可能性がある。図９ａは、従来のベクトルコードを示している。
【００６４】
図９ｂは、拡張されたコードを示している。この拡張されたコードは、ベクトルの推奨長さおよび挿入操作の開始時に事前割当てられるべきスペースの量を決定するために、ユーザに指向されたサイトごとのオブジェクト値のプロファイリングを行う処理を自動にすることができる。
【００６５】
この例において、インストルメンテーションビルドのために、マクロ「PROFILE_GENERATE」を作成する。ベクトル長さ用および挿入サイズ用の２つのカウンタが定義される。各カウンタは、新規ベースアドレスフィールドを指定するために使用されるコンパイラ注釈を用いて、定義される。図９ｂは、「counter_base_constr_」および「counter_base_insert_」に加えたコンパイラ注釈「_attribute_((gcov_counter_base))」を示している（９０２）。
【００６６】
その後、コードを挿入して、プロファイルのカウンタを割当てる。ベクトル長さのカウンタをインスタンス化した後、挿入サイズのカウンタをインスタンス化する。ランタイム合計およびカウントを保持するに、両方のカウンタは、標準のＧＣＯＶカウンタタイプ「_GCOV_COUNTER_AVERAGE」を有する（９０４）。この例において、両方の割当ては、プロファイルされているベクトルオブジェクトへのポインタ「this」を使用している。オプションパラメータ「fname」を使用して、マクロに定義されたたベースアドレスのポインタフィールド名「counter_base_constr_」および「counter_base_insert_」を区別する。適切なカウンタを初期化するために、フィールド名を使用するが、インストルメンテーションビルドを実行していない場合、構文解析エラーを回避するために、使用されたフィールド名は、文字列である。このオプションパラメータは、同一のサイトに複数の値をプロファイルする場合、必要である。本例と同様の場合、すなわち、同一タイプを有する複数の値を同一のサイトにプロファイルする場合に、追加のオプションパラメータ「seq_id」は、使用される。本例の場合、シーケンスＩＤは、それぞれ１および２に設定されている。
【００６７】
次のステップでは、ユーザに指向された値プロファイルのインストルメンテーションコードを挿入して、ベクトルの最終長さの値をプロファイルする。コードが消去点でベクトルに必要された最終長さを判明するため、ベクトルの最終長さは、ベクトル消去関数において決定される。図９ｂに示すように、インストルメンテーションサポートインターフェイスは、コンパイラに指示して、ベクトルの現在長さを記録するように、コードをインストルメント化する。
【００６８】
また、プロファイルにベクトルに挿入された要素の挿入長さの値を与えるために、インスツルメンテーションコードを挿入する必要がある（９０８）。挿入長さは、ベクトルの挿入関数により決定することができる。図９ｂに示すように、インストルメンテーションサポートインターフェイスは、コンパイラに指示して、挿入長さを記録するように、コードをインストルメント化する。フィールド名は、適切なカウンタに適切な更新値を生成するために、ユーザに指向された値プロファイルインストルメンテーションサポートインターフェース両方の用途に使用される。インストルメンテーションビルドを実行していない場合、構文解析エラーを回避するために、使用されたフィールド名は、文字列である。
【００６９】
ベクトルの最終長さおよびベクトルに挿入された要素の挿入長さの値をプロファイルするために、ユーザに指向された値プロファイルインストルメンテーションコードを挿入した後、コードを挿入して値プロファイル変換を実行する必要がある（９１０）。図９ｂに示すように、一方のユーザに指向された値変換サポートインタフェースは、コンパイラに指示して、ＧＣＯＶ標準平均変換「_GCOV_AVERAGE_VAL」を用いて長さに対する平均化、およびシーケンスＩＤ「１」を有するカウンタ「_GCOV_COUNTER_AVERAGE」からの値「ｎ」に対する平均化を行う。他方の値変換サポートインタフェースは、コンパイラに指示して、シーケンスＩＤ「２」を有するカウンタタイプ「_GCOV_COUNTER_AVERAGE」からの挿入長さの値を用いて、挿入長さに対する平均化を行う。シーケンスＩＤタグは、変換サイトを正しい割当てサイトに関連付けるために使用され、よって、プロファイルデータベースまたはＧＣＤＡファイルからの適切なカウンタ値は、正しい最適化決定に使用される。
【００７０】
その後、これらの平均値は、プロファイルデータベースまたはＧＣＤＡファイルに送信され、ベクトルの推奨長さパラメータおよび挿入要素の推奨事前割当サイズとして使用される。このようなプロファイリングおよび最適化は、変換を実行するプロファイル変換サイトまたは変換箇所がコード内の多くの場所にインライン化されているという事実を活用している。その結果、コンテキスト依存のインラインサイト特異的プロファイルは、各インラインサイトに収集され、変換され得る。この場合、アプリケーションコードに亘って異なる場所でインスタンス化されたベクトルは、ライブラリのデフォルト値ではなく、プロファイルに基づく異なる長さの値を得ることができる。追加的には、事前割当てサイズは、サイトごとに決定されてもよい。
【００７１】
本発明の思想の側面を示す他の例は、割り算または掛け算および値プロファイリングループの反復限界のような高価な値プロファイリング操作を含む。
【００７２】
例示的フレームワークを用いて、アプリケーション特有のプロファイル情報に基づき、たとえばＳＴＬおよびメモリアロケータのようなライブラリをアプリケーションごとに調整することができる。このような性能調整は、非常に大きな性能の改善および機械の節約につながる。本発明のフレームワークは、ＦＤＯフレームワークに完全に統合することによって、アプリケーションの調整を自動化することができ、パラメータが古くなる可能性を排除する。また、例示的なフレームワークを用いて、メモリの消耗およびメモリの断片化などのような性能低下に関連する目的のために、コードの挙動を調整することができる。
【００７３】
図１０は、ユーザに指向されかつプロファイル主導の最適化を作成するために配置された例示的なコンピュータ（１０００）のハイレベルブロック図である。非常に基本的な構成（１００１）において、コンピューティングデバイス（１０００）は、一般的に、１つ以上のプロセッサ（１０１０）と、システムメモリ（１０２０）とを含む。メモリバス（１０３０）を使用して、プロセッサ（１０１０）とシステムメモリ（１０２０）との間の通信を行うことができる。
【００７４】
所望の構成に応じて、プロセッサ（１０１０）は、任意種類のマイクロプロセッサ（μＰ）、マイクロコントローラ（μＣ）およびデジタル信号プロセッサ（ＤＳＰ）、またはそれらの任意の組合せを含むことができるが、これらに限定されない。プロセッサ（１０１０）は、たとえばレベル１のキャッシュ（１０１１）およびレベル２のキャッシュ（１０１２）などの１レベル以上のキャッシュと、プロセッサコア（１０１３）と、レジスタ（１０１４）とを含むことができる。プロセッサコア（１０１３）は、算術論理ユニット（ＡＬＵ）、浮動小数点ユニット（ＦＰＵ）、デジタル信号処理コア（ＤＳＰコア）、またはそれらの任意の組合せを含むことができる。メモリコントローラ（１０１６）は、プロセッサ（１０１０）とともに使用することができる。いくつかの実現例において、メモリコントローラ（１０１５）は、プロセッサ（１０１０）の内部部品であってもよい。
【００７５】
所望の構成に応じて、システムメモリ（１０２０）は、任意種類の揮発性メモリ（ＲＡＭなど）、不揮発性メモリ（たとえば、ＲＯＭ、フラッシュメモリなど）、またはこれらの任意の組合わせ含むことができるが、これらに限定されない。システムメモリ（１０２０）は、一般的には、オペレーティングシステム（１０２１）、１つ以上のアプリケーション（１０２２）、およびプログラムデータ（１０２４）を含む。アプリケーション（１０２２）は、アプリケーション用のアプリケーション特有のプロファイル駆動最適化を作成および取得するためのメソッドを含むことができる。プログラムデータ（１０２４）は、１つ以上の処理装置によって実行されると、コードを最適化するメソッド（１０２３）を実行する命令を記憶する。いくつかの実施形態において、アプリケーション（１０２２）は、プログラムデータ（１０２４）を用いて、オペレーティングシステム（１０２１）上で動作するように、配置されることができる。
【００７６】
コンピューティングデバイス（１０００）は、基本的な構成（１００１）と任意必要の機器およびインターフェイスとの間の通信を容易にするために、追加の特徴または機能および追加のインタフェースを備えることができる。
【００７７】
システムメモリ（１０２０）は、コンピュータ記憶媒体の一例である。コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）または他の光記憶媒体、磁気カセット、磁気テープ、磁気ディスクまたは他の磁気記憶媒体、または所望の情報を記憶するために使用することができ、コンピューティングデバイス（１０００）によりアクセスされることができる任意の記憶媒体を含むことができるが、これらに限定されない。このようなコンピュータ記憶媒体は、コンピューティングデバイス（１０００）の一部であってもよい。
【００７８】
コンピューティングデバイス（１０００）は、小型のポータブル（またはモバイル）電子装置、たとえば携帯電話、スマートフォン、携帯データ端末（ＰＤＡ）、携帯メディアプレーヤ装置、タブレットコンピュータ（タブレット）、無線ウェブ閲覧装置、携帯ヘッドセット装置、アプリケーション特有装置、または上記の機能のいずれかを含むハイブリッド装置の一部として実装することができる。コンピューティングデバイス（１０００）は、ラップトップコンピュータおよび非ラップトップコンピュータの両方を含むパーソナルコンピュータとして実装することができる。
【００７９】
以上の詳細な記載では、ブロック図、フローチャートおよび／または実施例を用いて、デバイスおよび／またはプロセスのさまざまな実施形態を説明している。これらのブロック図、フローチャートおよび／または例が１つ以上の機能および／または動作を含む限り、そのようなブロック図、フローチャートまたは実施例に含まれた各機能および／または各動作を、広範囲のハードウェア、ソフトウェアおよびファームウェア、またはそれらの実質的に任意の組合わせによって個々におよび／または集合的に実現することができることは、当業者に理解されるであろう。一実施形態において、本明細書に記載の主体のいくつかの部分は、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）または他の集積部材を介して、若しくはウェブサービスとして実装することができる。しかしながら、当業者は、本明細書に開示された実施形態のいくつかの局面は、全体的にまたは部分的に、１つ以上のコンピュータ上で実行される１つ以上のコンピュータプログラムとして、１つ以上のプロセッサ上で実行される１つ以上のプログラムとして、ファームウェアまたは実質的にこれらの任意の組合わせとして集積回路上で等価的に実現することができることを認識するのであろう。また、当業者であれば、本開示を照らして、回路を設計することおよび／またはソフトウェアおよび／またはファームウェア用のコードを作成することはできるであろう。さらに、当業者であれば、本明細書に記載の主体の原理は、さまざまな形のプログラム製品として配布可能であり、配布を実際に担持するために使用された非一時的信号担持媒体の種類にに関係なく、本明細書に記載の主体の例示的な実施形態が適用することを理解するのであろう。非一時的信号担持媒体の例としては、フロッピー（登録商標）ディスク、ハードディスクドライブ、コンパクトディスク（ＣＤ）、デジタルビデオディスク（ＤＶＤ）、デジタルテープおよびコンピュータメモリなどの記録可能型媒体、デジタルおよび／またはアナログ通信媒体などの透過型媒体（たとえば、光ファイバケーブル、導波路、有線通信リンク、無線通信リンク）を含むが、これらに限定されない
本明細書に使用された実質的にすべての単数形および／または複数形の用語に関して、当業者であれば、文脈および／またはアプリケーションに対して適切であるように、複数形から単数形におよび／または単数形から複数形に変換することができる。明瞭にするために、さまざまな単数／複数の変換を本明細書に明示的に記載してもよい。
【００８０】
このように、本発明の主体の特定の実施形態は、説明されてきた。他の実施形態は、添付された特許請求の範囲に含まれる。いくつかの場合において、特許請求の範囲に記載の動作は、異なる順序で実行されても望ましい結果を達成することができる。また、添付図面に示されたプロセスは、望ましい結果を達成するために、必ずしも示された特定の順序または連番で実行される必要がない。いくつかの実現例において、マルチタスクおよび並列処理が有利である可能性もある。
【図１】
0006275819.tif 000002
【図２】
0006275819.tif 000003
【図３】
0006275819.tif 000004
【図４】
0006275819.tif 000005
【図５】
0006275819.tif 000006
【図６】
0006275819.tif 000007
【図７】
0006275819.tif 000008
【図８ａ】
0006275819.tif 000009
【図８ｂ】
0006275819.tif 000010
【図９ａ】
0006275819.tif 000011
【図９ｂ】
0006275819.tif 000012
【図１０】
0006275819.tif 000013