-qpdf1、-qpdf2

説明

profile-directed feedback (PDF) を介して最適化を調整する。サンプル・プログラムの実行から得られた結果を使用して、条件付き分岐の付近や頻繁に実行されるコード・セクションでの最適化を改善します。

構文

構文図を読む構文図をスキップする        .-nopdf2-.
        +-nopdf1-+
>>- -q--+-pdf1---+---------------------------------------------><
        '-pdf2---'
 

PDF を使用するには、以下のステップに従ってください。

  1. -qpdf1 オプションを指定して、プログラム内の一部またはすべてのソース・ファイルをコンパイルする。 少なくとも -O2 最適化オプションを指定する必要があり、また少なくとも有効な -O2 にリンクする必要があります。後で同じオプションを使用する必要があるため、ファイルのコンパイルに使用するコンパイラー・オプションには 特に注意してください。

    大きいアプリケーションでは、最適化によって得られる利益が最も大きいコードの領域に集中してください。 アプリケーションのコードのすべてを -qpdf1 オプションでコンパイルする必要は ありません。

  2. 一般的なデータ・セットを使用してプログラムを一通り実行する。 プログラムは、終了時にプロファイル情報を記録します。 プログラムは、異なるデータ・セットで複数回実行することができます。 また、プロファイル情報が累積されるため、 分岐の頻度およびコードのブロックの実行頻度が正確にカウントされます。
    重要:
    完了したプログラムの通常の実行中に使用されるデータのうち、代表的なデータを使用してください。
  3. 前と同じコンパイラー・オプションを使用してプログラムを再リンクする。 ただし、-qpdf1-qpdf2 に変更してください。 -L-l、 およびその他いくつかのオプションはリンカー・オプションであり、 それらはこの時点で変更できます。この 2 番目のコンパイルでは、累積されたプロファイル情報を使用して最適化が微調整されます。 結果として得られるプログラムにはプロファイルのオーバーヘッドが含まれないため、フルスピードで 実行されます。

中間ステップとして、-qpdf2 を使用して、 -qpdf1 パスによって作成されたオブジェクト・ファイルを、 -qpdf2 パスでソースを再コンパイルせずにリンクすることができます。これにより かなりの時間を節約し、大きなアプリケーションを最適化のために微調整することができます。 -qpdf2 パスで異なるオプションを使用すると、PDF 最適化バイナリーの異なるフレーバーを作成してテストすることができます。

最高のパフォーマンスを得るには、PDF を使用するときに、 すべてのコンパイルで -O3-O4、 または -O5 オプションを使用します。

プロファイルは、現行作業ディレクトリーに配置されるか、PDFDIR 環境変数が設定されている場合は その変数によって指定されたディレクトリーに配置されます。

コンパイルと実行の時間を節約するために、PDFDIR 環境変数を必ず絶対パスに設定してください。 そうしないと、誤ったディレクトリーからアプリケーションが実行され、プロファイル・データ・ファイルが見つからなくなる可能性があります。 これが起こると、プログラムが正しく最適化されないか、またはセグメンテーション障害によって停止する場合が あります。 PDF プロセスの終了前に PDFDIR 変数の値を変更してアプリケーションを実行した場合にも、セグメンテーション障害が 起こる場合があります。

このオプションはアプリケーション全体を 2 回コンパイルすることを要求するため、他のデバッグとチューニングの終了後、アプリケーションを実稼働環境に入れる前の最終ステップの 1 つとして使用するよう意図されています。

制約事項

以下のユーティリティー・プログラム (/opt/ibmcmp/vacpp/8.0/bin/ にある) は、PDFDIR ディレクトリーの管理に使用できます。

cleanpdf
構文図を読む構文図をスキップする>>-cleanpdf--+----------+--------------------------------------><
             '-pathname-'
 

pathname ディレクトリーからすべてのプロファイル情報を除去します。または、pathname が指定されていない場合は PDFDIR ディレクトリーから除去し、PDFDIR が設定されていない場合は現行ディレクトリーから除去します。プログラムを変更して PDF プロセスをもう一度実行する場合、プロファイル情報を除去するとランタイム・オーバーヘッドが減ります。

特定のアプリケーションの PDF プロセスが終了したときだけに cleanpdf を実行してください。そうでないと、そのアプリケーションで PDF の使用を再開したい場合、 -qpdf1 を使用してすべてのファイルをもう一度再コンパイルする必要が生じます。

 

mergepdf
構文図を読む構文図をスキップする             .-------------------------.
             V                         |
>>-mergepdf----+--------------+--input-+-- -o--output--+-----+--+-----+-><
               '- -r--scaling-'                        '- -n-'  '- -v-'
 

複数の PDF レコードを単一の PDF 出力レコードにマージします。

-r scaling
PDF レコード・ファイルの位取りの比率を指定します。この値はゼロより大でなければならず、整数または浮動小数点のいずれの値にすることもできます。 指定されない場合は、1.0 の率が想定されます。
input
PDF 入力レコード・ファイルの名前、または PDF レコード・ファイルが入っているディレクトリーの名前を指定します。
-o output
PDF 出力レコード・ファイルの名前、またはマージされた出力が書き込まれるディレクトリーの名前を指定します。
-n
これを指定すると、PDF レコード・ファイルは正規化されません。指定されていない場合は、 ユーザー定義の位取り係数を適用する前に、内部で計算された比率を基に mergepdf がレコードを正規化します。
-v
冗長モードを指定し、内部の位取りの比率とユーザー指定の位取りの比率を画面に表示します。
resetpdf
構文図を読む構文図をスキップする>>-resetpdf--+----------+--------------------------------------><
             '-pathname-'
 

前述の cleanpdf と同じ。

 

showpdf
構文図を読む構文図をスキップする>>-showpdf-----------------------------------------------------><
 

プログラム実行で実行されたすべてのプロシージャーの呼び出し数とブロック数を表示します。このコマンドを使用するには、まずコマンド行に -qpdf1-qshowpdf の両方のコンパイラー・オプションを指定してアプリケーションをコンパイルする必要があります。

簡単な例を以下に示します。

/* Set the PDFDIR variable.                     */
export PDFDIR=$HOME/project_dir

/* Compile all files with -qpdf1.               */
xlc++ -qpdf1 -O3 file1.C file2.C file3.C

/* Run with one set of input data.              */
a.out <sample.data 

/* Recompile all files with -qpdf2.             */
xlc++ -qpdf2 -O3 file1.C file2.C file3.C

/* The program should now run faster than 
   without PDF if the sample data is typical.   */

もう少し複雑な例を以下に示します。

/* Set the PDFDIR variable.                     */
export PDFDIR=$HOME/project_dir

/* Compile most of the files with -qpdf1.       */
xlc++ -qpdf1 -O3 -c file1.C file2.C file3.C

/* This file is not so important to optimize.
xlc++ -c file4.C

/* Non-PDF object files such as file4.o can be linked in.  */
xlc++ -qpdf1 -O3 file1.o file2.o file3.o file4.o

/* Run several times with different input data.            */
a.out <polar_orbit.data
a.out <elliptical_orbit.data
a.out <geosynchronous_orbit.data

/* No need to recompile the source of non-PDF object files (file4.C). */
xlc++ -qpdf2 -O3 file1.C file2.C file3.C

/* Link all the object files into the final application.   */
xlc++ -qpdf2 -O3 file1.o file2.o file3.o file4.o

以下は、-qpdf1 および -qpdf2 オブジェクトの使用例です。

/* Set the PDFDIR variable.                     */
export PDFDIR=$HOME/project_dir

/* Compile source with -qpdf1.                  */
xlc++ -c -qpdf1 -O3 file1.C file2.C

/* Link in object files.                        */
xlc++ -qpdf1 -O3 file1.o file2.o 

/* Run with one set of input data.              */
 a.out < sample.data

/* Link in the mix of pdf1 and pdf2 objects.    */
xlc++ -qpdf2 -O3 file1.o file2.o

関連情報