インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

関数またはループの実行時間のプロファイル

ここでは、アプリケーションの関数またはループ実行時間についてプロファイルする方法を説明します。このプロファイルにインストルメンテーションを使用することにより、アプリケーションのどこでサイクルが費やされているかを確認する簡単な方法がもたらされます。インテル® コンパイラーはインストルメンテーション・コードをアプリケーションに挿入して、さまざまな場所で費やされている時間を収集します。このようなデータは、最適化のチューニングや並列化対象の候補となる hotspot の識別に役立ちます。

CPU サイクルカウンターを読み取るために挿入されるプローブポイントによってオーバヘッドが異なるため、異なるレベルのインストルメンテーションが利用可能です。インストルメンテーション・レベルは、収集されるデータ量が増加する順に、次のように分類されています。

アプリケーション全体をプロファイルする必要はありませんが、すべてのインストルメント済みファイルに対して同じインストルメンテーション・レベルを使用することを推奨します。プロファイル情報が必要なすべてのファイルに対して、以下に説明するコマンドライン・オプションを使ってアプリケーションをコンパイルしてください。

インストルメント済みアプリケーションを実行すると、収集データのサマリーを含むデータファイルが作業ディレクトリーに作成されます。これらのデータファイルで、アプリケーションの各部分の時間の割合を確認します。

インストルメント済みプログラムを取得するコンパイラー・オプション

次のコマンドライン・コンパイラー・オプションを使用して、関数/ループの実行時間のプロファイル用にアプリケーション・コードをインストルメントします。これらのオプションのいずれかを使用してコンパイルすると、インストルメント済みプログラムが生成されます。

インストルメンテーション・レベル Linux* および macOS* オペレーティング・システム Windows* オペレーティング・システム 説明
関数レベル -profile-functions /Qprofile-functions 関数のエントリーポイント/終了ポイントのみインストルメントします。
  • インストルメンテーション・コールを関数のエントリーポイントと終了ポイントに挿入して、関数内で費やされたサイクルを収集します。
  • データ収集はシングルスレッド・アプリケーションでのみサポートされます。
  • インストルメント済みアプリケーションの実行から得られた収集データは、現在の作業ディレクトリーに loop_prof_funcs_<timestamp>.dump ファイルとして置かれます。
関数とループレベル -profile-loops=<arg> /Qprofile-loops:<arg> 関数とループのエントリーポイント/終了ポイントをインストルメントします。
  • <arg> 引数にはインストルメントするループの種類を指定できます。<arg> は次のいずれかの値を指定してください。
    • inner: 内側のループのインストルメント
    • outer: 外側のループのインストルメント
    • all: 内側のループと外側のループ両方のインストルメント
  • インストルメンテーション・コールを関数のエントリーポイントと終了ポイント、および <arg> 引数でリストされたインストルメント可能なループの前後に挿入します。

    ループによってはインストルメントできない場合もあります。

  • データ収集はシングルスレッド・アプリケーションでのみサポートされます。
  • インストルメント済みアプリケーションの実行から得られた収集データは、現在の作業ディレクトリーに loop_prof_funcs_<timestamp>.dump (関数データ)、loop_prof_loops_<timestamp>.dump (ループデータ) ファイルとしてそれぞれ置かれます。

    インストルメンテーションは、多くのコンパイラー変換の後に行われます。そのため、コンパイラーによって再構築されたループや複製されたループは、生成されるレポートで複数回表示されることがあります。また、関数は他の関数にインライン展開されることもあり、これにより、同じループが複数の関数にリストされることもあります。

ループ本体レベル -profile-loops-report=[n] /Qprofile-loops-report:[n] ループ本体のインストルメンテーション・レベルを制御します。
  • n=1 を指定すると、ループのエントリーと終了でサイクルカウントを収集します。これは、n が指定されなかった場合のデフォルト値です。
  • n=2 を指定すると、ループの反復カウントを収集するための追加のインストルメンテーションが挿入され、ループの最小/最大、平均の反復カウントが計算されます。このようなインストルメンテーションは、インストルメント済みアプリケーションのオーバーヘッドを大きくします。

    • インストルメンテーションは、コンパイラー変換の後に行われます。そのため、ループ反復回数は生成されたループ形式に基づいています。これは、アンロールされていたり、オリジナルのソースの形式とは異なる場合があります。
    • このオプションは、[Q]profile-loops オプションとともに指定された場合のみ有効です。[Q]profile-loops オプションの修飾子として動作します。

このインストルメンテーションは、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 データファイルが関数レベル・インストルメンテーションのみを使用して作成された場合は、下のペインは表示されません。各ペイン間のセパレーターをドラッグしてサイズを変更するか、セパレーター・ラインにある上/下の矢印をクリックすると、各ペインのサイズを変更できます。

関数プロファイルペインとループ・プロファイルペインには、「テキスト出力形式」セクションで説明したカラムが表示されます。これらのカラムをクリックすると、そのカラムに基づいてデータが並び替えられます。

データ・ビューアー・ユーティリティーには一般的な [ファイル] および [ヘルプ] メニューのほかに、[表示][フィルター] メニューがあります。

[表示] メニュー

[表示] メニューでは、表で選択した行に対するソースコードを表示できます (行を選択していない場合、これらのメニューはグレイアウトされます)。[表示] メニューを使用するには、次の操作を行います。

  1. [関数プロファイル] ペインで 1 行を選択します。
  2. 選択した関数のソースコードを表示するには、[表示] > [選択した関数の関数ソース] をクリックします。
  3. [ループ・プロファイル] ペインで 1 行を選択します。
  4. 選択した関数のソースコードを表示するには、[表示] > [選択したループの関数ソース] をクリックします。
  5. 選択したループのソースコードを表示するには、[表示] > [選択したループのループソース] をクリックします。

表示されるソースコードは、インストルメンテーション・コンパイルの実行時にファイルをコンパイルしたディレクトリーにある、ファイルの現在のバージョンです。

カーソルを [関数プロファイル] ペインか [ループ・プロファイル] ペインに置いて行を右クリックすると、[表示] メニューのオプションへアクセスできます。

デフォルトでは、データ・ビューアー・ユーティリティーはロードされたデータファイルに基づいて最も関連性のあるカラムを表示します。カラムを表示/非表示にするには、[表示] > [カラムを選択] を選択します。ダイアログボックスでは、ロードされたデータファイルで利用できないカラムはグレイアウトされます。

[フィルター] メニュー

[フィルター] メニューでは、条件を満たした項目のみ表に表示するように設定できます。例えば、次のように [フィルター] メニューを使用できます。

  1. アプリケーション時間の 1.0 % 以上を示す関数のみを [関数プロファイル] ペインに表示させるには、[フィルター] > [関数プロファイル] > [セルフ時間 > 1.00%] を選択します。
  2. % 時間または % セルフ時間をフィルターする際に使用するデフォルトのしきい値を変更するには、[フィルター] > [しきい値を設定] を選択します。

特定の関数のループのみ表示するには、次の操作を行います。

  1. [関数プロファイル] ペインの [関数] カラムで関数を選択します。
  2. 選択した関数のループを表示するには、[フィルター] > [ループ・プロファイル] > [選択した関数のループを表示] をクリックします。

カーソルを [関数プロファイル] ペインか [ループ・プロファイル] ペインに置いて関数を右クリックすると、[フィルター] メニューのオプションへアクセスできます。