プロファイル指示フィードバックの使用

プロファイル指示フィードバック (PDF) を使用すると、アプリケーションのパフォーマンスを通常の使用例に合うように調整することができます。コンパイラーは、分岐の頻度やコード・ブロックの実行の頻度の分析に基づいて、アプリケーションを最適化します。このプロセスは、アプリケーション全体を 2 度コンパイルする必要があるため、他のデバッグやチューニングが終了してから、アプリケーションを実稼働させる前の最後の段階の一部として使用されるようになっています。

次の図は、PDF プロセスを表しています。

図 2. プロファイル指示フィードバック

プロファイル指示フィードバック

まず、-qpdf1 オプションを指定して (最小最適化レベル -0 を使用) プログラムをコンパイルします。これにより、コンパイル済みプログラムをユーザーが通常使用するのと同じ方法で使用して、プロファイル・データが生成されます。次に、-qpdf2 オプションを使用して、プログラムをもう一度コンパイルします。これで、 qipa=level=0 が呼び出され、プログラムはプロファイル・データに基づいて最適化されます。

アプリケーションのすべてのコードを -qpdf1 オプションでコンパイルしなくても、 PDF プロセスの恩恵は受けられます。大規模アプリケーションでは、最適化の効果が最もよく現れるコード領域に集中することもできます。

-qpdf オプションを使用するには、次のようにします。

  1. アプリケーションの一部またはすべてのソース・ファイルを、-qpdf1 および最小最適化レベル -O を指定してコンパイルする。
  2. 標準的なデータ・セットを 1 つ以上使用して、アプリケーションを実行する。ここで重要なのは、そのアプリケーションで実際に使用されるデータを代表するようなデータを使用することです。アプリケーションの終了時には、現行作業ディレクトリーまたは PDFDIR 環境変数で指定したディレクトリー内の PDF ファイルに、プロファイル情報が書き込まれます。
  3. -qpdf2 を指定してアプリケーションをコンパイルする。

次のようにすれば、PDF ファイルをさらに制御することができます。

  1. アプリケーションの一部またはすべてのソース・ファイルを、-qpdf1 および最小最適化レベル -O を指定してコンパイルする。
  2. 標準的なデータ・セットを 1 つ以上使用して、アプリケーションを実行する。これによって、現行ディレクトリーに PDF ファイルが作成されます。
  3. PDFDIR 環境変数で指定したディレクトリーを変更して、別のディレクトリーに PDF ファイルを作成する。
  4. -qpdf1 を指定してアプリケーションを再コンパイルする。
  5. ステップ 3 と 4 を必要なだけ繰り返す。
  6. mergepdf ユーティリティーを使用して、 PDF ファイルを連結する。例えば、時間の 53%、32%、15% にそれぞれ発生する使用パターンを表す 3 つの PDF ファイルを作成する場合は、次のコマンドが使用してください。

      mergepdf -r 53 path1  -r 32 path2  -r 15 path3
    
  7. -qpdf2 を指定してアプリケーションをコンパイルする。

関数呼び出しおよびブロック統計についてさらに詳しい情報を収集するには、次のようにします。

  1. -qpdf1 -qshowpdf -O を指定して、アプリケーションをコンパイルする。
  2. 標準的なデータ・セットを 1 つ以上使用して、アプリケーションを実行する。アプリケーションは、より詳細なプロファイル情報を PDF ファイルに書き込みます。
  3. showpdf ユーティリティーを使用して、 PDF ファイル内の情報を表示する。

PDF ディレクトリー内の情報を消去するには、 cleanpdf ユーティリティーまたは resetpdf ユーティリティーを使用します。

pdf および showpdf によるコンパイルの例

次の例は、showpdf ユーティリティーで PDF を使用して、「Hello World」アプリケーションの呼び出しおよびブロック統計を表示する方法を示したものです。

プログラム・ファイル hello.c のソースは次のとおりです。

#include <stdio.h>
void HelloWorld()
{
printf("Hello World");
}
main()
{
HelloWorld();
return 0;
}
 
  1. ソース・ファイルをコンパイルする。

    xlc -qpdf1 -qshowpdf -O hello.c
     
    
  2. その結果できる実行可能ファイル a.out を実行する。
  3. showpdf ユーティリティーを実行して、その実行可能ファイルに対する呼び出し数およびブロック数を表示する。

    showpdf
     
    

結果は以下のようになります。

HelloWorld(4):  1 (hello.c)
 
Call Counters:
5 | 1  printf(6)
 
Call coverage = 100% ( 1/1 )
 
Block Counters:
3-5 | 1
6 |
6 | 1
 
Block coverage = 100% ( 2/2 )
 
-----------------------------------
main(5):  1 (hello.c)
 
Call Counters:
10 | 1  HelloWorld(4)
 
Call coverage = 100% ( 1/1 )
 
Block Counters:
8-11 | 1
11 |
 
Block coverage = 100% ( 1/1 )
 
Total Call coverage = 100% ( 2/2 )
Total Block coverage = 100% ( 3/3 )
 
IBM Copyright 2003