インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ここでは、アプリケーションの関数またはループ実行時間についてプロファイルする方法を説明します。このプロファイルにインストルメンテーションを使用することにより、アプリケーションのどこでサイクルが費やされているかを確認する簡単な方法がもたらされます。インテル® コンパイラーはインストルメンテーション・コードをアプリケーションに挿入して、さまざまな場所で費やされている時間を収集します。このようなデータは、最適化のチューニングや並列化対象の候補となる hotspot の識別に役立ちます。
CPU サイクルカウンターを読み取るために挿入されるプローブポイントによってオーバヘッドが異なるため、異なるレベルのインストルメンテーションが利用可能です。インストルメンテーション・レベルは、収集されるデータ量が増加する順に、次のように分類されています。
アプリケーション全体をプロファイルする必要はありませんが、すべてのインストルメント済みファイルに対して同じインストルメンテーション・レベルを使用することを推奨します。プロファイル情報が必要なすべてのファイルに対して、以下に説明するコマンドライン・オプションを使ってアプリケーションをコンパイルしてください。
インストルメント済みアプリケーションを実行すると、収集データのサマリーを含むデータファイルが作業ディレクトリーに作成されます。これらのデータファイルで、アプリケーションの各部分の時間の割合を確認します。
次のコマンドライン・コンパイラー・オプションを使用して、関数/ループの実行時間のプロファイル用にアプリケーション・コードをインストルメントします。これらのオプションのいずれかを使用してコンパイルすると、インストルメント済みプログラムが生成されます。
インストルメンテーション・レベル | Linux* および macOS* オペレーティング・システム | Windows* オペレーティング・システム | 説明 |
---|---|---|---|
関数レベル | -profile-functions | /Qprofile-functions | 関数のエントリーポイント/終了ポイントのみインストルメントします。
|
関数とループレベル | -profile-loops=<arg> | /Qprofile-loops:<arg> | 関数とループのエントリーポイント/終了ポイントをインストルメントします。
|
ループ本体レベル | -profile-loops-report=[n] | /Qprofile-loops-report:[n] | ループ本体のインストルメンテーション・レベルを制御します。
|
このインストルメンテーションは、CPU タイム・スタンプ・カウンターを使用して時間測定情報を収集しているため、これらのオプションでプロファイルできるのはシングルスレッド・アプリケーションだけです。並列コードの生成を有効にする他のコンパイラー・オプションとこれらのオプションとの併用はサポートされていません。
オプションを使用してアプリケーションをコンパイルすると、インストルメント済みプログラムが得られます。代表的なデータセットを使用してインストルメント済みプログラムを実行し、1 つ以上のデータファイルを作成します。
出力ファイルは atexit() ルーチンで登録されたルーチンにより生成され、標準の終了プロシージャーでプログラムが終了したときにのみ作成されます。2 つの出力ファイル形式が作成されます。
テキスト出力形式
2 つのテキスト出力ファイルが現在のディレクトリーに作成されます。ファイル名は loop_prof_funcs_<timestamp>.dump (関数) と loop_prof_loops_<timestamp>.dump (ループ) です。<timestamp> 値は、同じインストルメンテーション実行によるものであることを示すため、両ファイルとも同一です。
このテキストファイルは、タブ区切りであることを指定してスプレッドシートにロードできます。
関数のレポートファイルには次のカラムが含まれます。
カラムヘッダー | 説明 |
---|---|
時間 |
関数のエントリーから終了までに費やされた累積合計サイクル |
% 時間 |
関数のエントリーから終了までに費やされたサイクルの合計アプリケーション時間に占める割合 |
セルフ時間 |
関数のエントリーから終了までに費やされた累積サイクルから、他のインストルメント済み関数の呼び出しで費やされたサイクルを引いたもの 注インストルメントされていないルーチンまたはライブラリーの呼び出しに費やされた時間はこのサイクルカウント値に含まれます。 |
% セルフ時間 |
セルフ時間の合計アプリケーション時間に占める割合 |
呼び出しカウント |
関数が開始された回数 |
終了カウント |
関数の終了インストルメンテーションが呼び出された回数。例外処理の発生など、終了インストルメンテーションなしで関数外に制御が移動した場合、コールカウント値とは異なる結果になる可能性があります。 |
ループの % 時間 |
関数でのループのセルフ時間サイクルの合計アプリケーション時間に占める割合。このフィールドは、[Q]profile-loops コンパイラー・オプションを使用する場合にのみ適用されます。 |
関数 |
復号化された関数名 |
関数ファイル: 行 |
関数のコードが含まれたソースファイルと関数が開始される行番号 |
ループのレポートファイルには次のカラムが含まれます。
カラムヘッダー | 説明 |
---|---|
時間 | ループのエントリーから終了までに費やされた累積合計サイクル |
% 時間 | ループのエントリーから終了までに費やされたサイクルの合計アプリケーション時間に占める割合 |
セルフ時間 | ループのエントリーから終了までに費やされた累積サイクルから、他のインストルメント済み関数/ループの呼び出しで費やされたサイクルを引いたもの |
% セルフ時間 | セルフ時間の合計アプリケーション時間に占める割合 |
ループエントリー | ループが開始された回数 |
ループ終了 | ループの終了インストルメンテーションが呼び出された回数。例外処理の発生など、終了インストルメンテーションなしでループ外に制御が移動した場合、コールカウント値とは異なる結果になる可能性があります。 |
最小反復数 | ループの最小反復カウント。このフィールドは、[Q]profile-loops-report=2 コンパイラー・オプションを使ってインストルメンテーション・レベル = 2 を使用する場合にのみ適用されます。 |
平均反復数 | ループの平均反復カウント。このフィールドは、[Q]profile-loops-report=2 コンパイラー・オプションを使ってインストルメンテーション・レベル = 2 を使用する場合にのみ適用されます。 |
最大反復数 | ループの最大反復カウント。このフィールドは、[Q]profile-loops-report=2 コンパイラー・オプションを使ってインストルメンテーション・レベル = 2 を使用する場合にのみ適用されます。 |
関数 | ループを実行した、復号化された関数名。関数が別の関数にインライン展開されていると、ループのソースコードに記述されている関数名とは異なる場合があります。 |
関数ファイル: 行 | ループを実行した関数が含まれたソースファイル名と関数が開始される行番号 |
ループファイル: 行 | ループ本体が含まれたソースファイル名とループ本体が開始される行番号 |
XML 出力形式
INTEL_LOOP_PROF_XML_DUMP 環境変数は XML 出力ファイルの生成を制御します。INTEL_LOOP_PROF_XML_DUMP = 0 の場合、XML ファイルは作成されません。
XML 出力ファイルは、loop_prof_<timestamp>.xml というファイル名で現在のディレクトリーに書き込まれます。このファイルはデータ・ビューアー・ユーティリティーで表示できます。この XML データファイルには関数レベルとループレベルの両方のデータが含まれます。
上記の環境変数を 0 にした場合は、データ・ビューアー・ユーティリティーで使用する XML データファイルは生成されないので、ご注意ください。
このデータ・ビューアー・ユーティリティーを使用するには、Java Runtime Environment 1.6 以降がシステムにインストールされている必要があります。JRE はインテル® コンパイラーのパッケージには含まれていません。
データ・ビューアーは関数とループで収集されたデータを表形式で表示します。各カラムは並び替えることができます。また、関数やループをフィルターして、合計アプリケーション時間に対する合計しきい値 (%) またはセルフしきい値 (%) を満たす項目のみ、あるいは特定の関数に関連付けられたループのみを表示させることも可能です。
Data Viewer ユーティリティーを起動するには、コマンドラインで次のコマンドを使用します。
Windows* オペレーティング・システム:
loopprofileviewer[.bat] <データファイル>
Linux* および macOS*:
loopprofileviewer.sh <データファイル>
または
loopprofileviewer.csh <データファイル>
メインのユーザー・インターフェイスでは、関数レベルのデータが含まれる関数プロファイルが上のペインに、ループレベルのデータが含まれるループ・プロファイルが下のペインに表示されます。XML データファイルが関数レベル・インストルメンテーションのみを使用して作成された場合は、下のペインは表示されません。各ペイン間のセパレーターをドラッグしてサイズを変更するか、セパレーター・ラインにある上/下の矢印をクリックすると、各ペインのサイズを変更できます。
関数プロファイルペインとループ・プロファイルペインには、「テキスト出力形式」セクションで説明したカラムが表示されます。これらのカラムをクリックすると、そのカラムに基づいてデータが並び替えられます。
データ・ビューアー・ユーティリティーには一般的な [ファイル] および [ヘルプ] メニューのほかに、[表示] と [フィルター] メニューがあります。
[表示] メニュー
[表示] メニューでは、表で選択した行に対するソースコードを表示できます (行を選択していない場合、これらのメニューはグレイアウトされます)。[表示] メニューを使用するには、次の操作を行います。
カーソルを [関数プロファイル] ペインか [ループ・プロファイル] ペインに置いて行を右クリックすると、[表示] メニューのオプションへアクセスできます。
デフォルトでは、データ・ビューアー・ユーティリティーはロードされたデータファイルに基づいて最も関連性のあるカラムを表示します。カラムを表示/非表示にするには、[表示] > [カラムを選択] を選択します。ダイアログボックスでは、ロードされたデータファイルで利用できないカラムはグレイアウトされます。
[フィルター] メニュー
[フィルター] メニューでは、条件を満たした項目のみ表に表示するように設定できます。例えば、次のように [フィルター] メニューを使用できます。
特定の関数のループのみ表示するには、次の操作を行います。
カーソルを [関数プロファイル] ペインか [ループ・プロファイル] ペインに置いて関数を右クリックすると、[フィルター] メニューのオプションへアクセスできます。