fdpr コマンド

項目 説明
-analyse_asm_csects アセンブリーで書かれた csects を分析します (使用するときは、-1 および -3 フェーズの両方で指定する必要があります)。
-extra_safe_analysis 手書きアセンブリー・コードを含む非標準 csects の分析を試みません (使用するときは、-1 および -3 フェーズの両方で指定する必要があります)。
-ignore_info コンパイル時に -qfdpr オプションを使用して作成された .info セクションを無視します (使用するときは、-1 および -3 フェーズの両方で指定する必要があります)。
-align バイト 頻繁に実行されるコードを、指定されたバイト数に基づいて位置合わせをします。これは、コード・プリフェッチ・バッファー率を改善することが目的です。 このオプションを省略すると、fdpr コマンドは、変数のデフォルト・バイト数を使用してコードの位置合わせを行います。
-lr_opt 頻繁に実行されるプロシージャー内のリンク・レジスターの保管と復元を除去します。
-bt_csect_anchor_removal コードに含まれるブランチ・テーブルの使用に関連したロード命令を除去します。
-dead_code_removal 到達不能コードを除去します。
-selective_inline 単一ドメイン呼び出しサイトから頻繁に呼び出される関数について、選択的インライン化を行います。
-sid_装甲 パーセント 選択的インライン最適化における支配ファクターとしてパーセンテージを設定します。 可能な範囲は、50 から 100 です (-selective_inline フラグを使用する場合のみ適用可能)。
-inline_small_funcs サイズ バイト数で指定されたサイズより小さいか等しいすべての関数をインライン化します。
-inline_hot_funcs パーセント 指定されたパーセンテージより実行頻度が大きいか等しいすべての関数をインライン化します。 入力できるパーセント範囲は、0 から 100 です。
-インライン -selective_inline を使用して -inline_small_funcs 12 を実行します。
-hco_resched (Hco_resched) 頻繁に実行されるコードの命令を、まれにしか実行されないコード域に再配置します (可能な場合)。
-dcbt_opt dcbt 命令を挿入してデータ・キャッシュのパフォーマンスを改善します。
-killed_regs 頻繁に実行される関数呼び出しの後に終了させられる (上書きされる) レジスターの保管および復元を除去します。
-tb リオーダーされたコードでトレースバック・テーブルを再構成させます。 -tb オプションを省略すると、Try & Catch メカニズムを使用する C++ アプリケーションでは、トレースバック・テーブルが自動的に復元されます。
-pc リオーダーされたコードで CSECT の境界を保持します。
-pp リオーダーされたコードで関数の境界を保持します。
-RD 静的データのリオーダーを実行します。
-dpnf 係数 データ配置正規化要因 (0 または 1)。0 を設定すると静的変数がそのサイズに無関係にリオーダーされ、1 を設定するとサイズの小さい変数から配置されます (-RD フラグを使用する場合のみ適用可能)。
-dpht しきい値 データ配置頻度しきい値 (0 または 1)。0 を設定すると静的変数が制御フローに基づいて大規模グループにリオーダーされ、1 を設定すると変数はそれぞれのアクセス頻度に基づいて非常に小規模のグループにリオーダーされます ( -RD フラグを使用する場合のみ適用可能)。
-build_dcg 拡張データ・リオーダー用の DCG (データ接続性グラフ) を作成します (-RD フラグ使用する場合のみ適用可能)。
-tocload tocload 最適化を実行します。
-reduce_toc removal_factor 除去ファクター (0 または 1) に基づいて、TOC エントリーの除去を実行します。0 を設定すると非アクセス TOC エントリーのみ除去され、1 を設定するとすべての非エクスポート TOC エントリーが除去されます。
-strip 出力ファイルをストリップします (作成されたものがある場合)。
-ptrgl_opt レジスターを介した間接呼び出し命令を直接ジャンプと置き換えることによって、最適化します。
-no_ptrgl_r11 _ptrgl CSECT の R11 ロード命令の除去を実行しません (デフォルトで -ptrgl_r11 最適化が適用されます)。
-O ブランチ予測ビットの設定、ブランチの折り畳み、および NOOP 命令の除去を行ってコードのリオーダーを実行します。 デフォルトで -O フラグが適用されます。
-O2 アグレッシブでないすべての最適化フラグをオンにします。
-O3 アグレッシブなすべての最適化フラグをオンにします。
-O4 アグレッシブなすべての最適化フラグをオンにします。

目的

ユーザー・レベルのリンク後アプリケーション・プログラムの実行時間と実メモリーの使用率を改善するためのパフォーマンス調整ユーティリティー。

構文

最も一般的な使用方法:

fdpr -p ProgramFile -x WorkloadCommand

詳細な使用法:

fdpr -p ProgramFile[-M SegNum] [-fd Fdesc] [-o OutputFile] [-armember ArchiveMemberList] [OptimizationFlags] [-map] [-disasm] [-disasm_data] [-disasm_bss] [-profcount] [-quiet] [-v] [-1 |-2|-3 | -12|-23 | -123] [-x WorkloadCommand

最適化フラグ

[ -tb (T) ] [ -PC ] [ -pp (P) ] [ -O (O) ][ -O2 ] [ -O3 ] [ -O4 ] [ -selective_inline] [ -シドファック パーセント] [ -inline_small_funcs サイズ] [ -inline_hot_funcs パーセント] [ Hco_resched (再送信)] [ -killed_regs (K) ] [ -lr_opt] [ -位置合わせ バイト数] [ -RD (R) ] [ -dpnf 因子] [ -dpht (D) しきい値] [ -build_dcg] [ -トクロアド ] [-ptrgl_opt ] [ -no_ptrgl_r11] [ -dcbt_OPT ] [ -ignore_info] [ -dead_code_removal] [ -bt_csect_anchor_removal] [ -ストリップ] [-analyse_asm_csects] [-extra_safe_analysis] [-インライン] [-reduce_toc リモート係数]

説明

fdpr コマンド (Feedback Directed Program Restructuring) は、ユーザー・レベルのアプリケーション・プログラムの実行時間と実メモリーの使用率の改良を促進できるパフォーマンス調整ユーティリティーです。 fdpr プログラムは、一般的なワークロードでプログラムを使用している 間にそのプログラムの動作に関する情報を収集することによって、プログラムの実行可能イメージ を最適化してから、そのワークロードに対して最適化された新しいバージョンのプログラム を作成します。 fdpr によって新しく作成されるプログラムは、一般に以前よりも実行が速く、実メモリーの使用量が減少します。

重要: fdpr コマンドは、拡張最適化手法をプログラムに適用します。その結果、プログラムが予期したとおりに動作しなくなる可能性があります。このツールを使用して最適化されたプログラムは十分に注意して使用する必要があり、少なくとも以下を使用して厳密に再テストする必要があります。 予期される機能を検証するために元のプログラムをテストするのに使用されたものと同じテスト・スイート。 最適化されたプログラムはサポートされません。

fdpr コマンドは、最適化実行可能プログラムを次の 3 つのフェーズで作成します。

  • フェーズ 1 (-1 フラグ): インスツルメント実行可能プログラムと空のテンプレート・プロファイル・ファイルを作成します。
  • フェーズ 2 (-2 フラグ): インスツルメント・プログラムを実行してプロファイル・データを更新します。
  • フェーズ 3 (-3 フラグ): 最適化実行可能プログラム・ファイルを生成します。
この 3 つのフェーズは、別々に実行したり、部分的にまたはすべてを組み合わせて実行できますが、 順番どおりに (つまり、-1-2-3 の順、または -12-3 の順に) 実行する必要があります。 デフォルトの設定では、3 つのフェーズすべてが実行されます。
注: フェーズ 1 で作成され、フェーズ 2 で実行されるインスツルメンテーションされた実行可能プログラムは、通常、元のプログラムの数倍の速度で実行されます。 インスツルメント化プログラムに必要な実行時間が増えるため、実行可能プログラムは実行時間を最小限に抑えるような方法で起動する必要がありますが、必要なコード領域は従来通り完全に実行されます。 また、fdpr コマンドのユーザーは、プログラムの時間に左右される部分をできる限りなくすようにしてください。

フラグ

項目 説明
-1-2-3 実行するフェーズを指定します。 デフォルトの設定は 3 つのフェーズすべて (-123) です。 各フェーズを別個に実行する場合は、連続するフェーズが必要な中間ファイルにアクセスできるように、-s フラグを使用する必要があります。 各フェーズは順番通りに (例えば、-1-2-3 の順、または -1-23 の順で)、実行されなければなりません。 -2 のフラグは、-x の起動フラグと一緒に 使用する必要があります。
-M SegNum プロファイルを作成するために共有メモリーのマップ先を指定します。 デフォルトは 0x30000000です。 最適化されるプログラム、または -x フラグで起動される ワークロード・コマンド文字列によって、競合する共有メモリー・アドレスが使用される場合は、 代替共有メモリー・アドレスを指定します。 標準的な代替値は、 0x400000000x50000000、... です。 最大 0xC0000000)。
-fd Fdesc 上記の共有メモリー領域にマップするプロファイル・ファイル に対し、どのファイル・ディスクリプター番号を使用するかを指定します。 Fdesc の デフォルトは 1999 に設定されています。
-o OutFile 最適化プログラムからの出力ファイルの名前を指定します。 デフォルトは、program.fdpr です。
-p ProgramFile 最適化の対象となる、実行可能プログラム・ファイルの名前、あるいは、 共有オブジェクト/実行可能プログラムが入っている共有オブジェクト・ファイル、 または共有ライブラリーの名前が入ります。 このプログラムは、ストリップされていない実行可能プログラムでなければなりません。
-アームメンバー ArchiveMemberList -p フラグで指定した共有アーカイブ・ファイル内の、最適化するアーカイブ・メンバーのリスト。 -armember が指定されていない場合は、アーカイブ・ファイルのすべてのメンバーが最適化されます。
-マップ それぞれの古いアドレス -> 新規アドレスをもつ基本ブロックと静的変数のマップを、 サフィックスが .mapper のファイルに出力します。
-disasm 出力の最適化インスツルメント・プログラムの逆アセンブルされたテキスト・セクションを、 サフィックスが .dis_text のファイルに出力します。
-disasm_data 出力の最適化インスツルメント・プログラムの逆アセンブルされたデータ・セクションを、サフィックスが .dis_data のファイルに出力します。
-disasm_bss 出力の最適化インスツルメント・プログラムの逆アセンブルされた bss セクションを、サフィックスが .dis_bss のファイルに出力します。
-プロファイル・カウント プロファイル作成カウンターを、サフィックスが .ncounts のファイルに出力します。
-quiet quiet 出力モード。
-v 詳細出力。
-x WorkloadCommand インスツルメント化プログラムの起動に使用するコマンドを指定します。 -x フラグの後のすべての引数は、起動のために使用されます。 したがって、-x フラグはコマンド・ラインの最後になければなりません。 -2 フラグを使用するときは、-x フラグが必要になります。

最適化フラグ

最適化

fdpr コマンドは、ブランチ予測ビットの設定、ブランチの折り畳み、コードの位置合わせ、および冗長 NOOP 命令の除去という最適化とともに、最大限レベルのコード・リオーダー最適化をデフォルトで実行します。 -pc フラグは、CSECT の境界を維持しながらコード全体をリオーダーするため、デフォルトのコード・リオーダーに比べ、パフォーマンスの改善度が小さくなる場合があります。 同様に -pp フラグも、プロシージャーの境界を維持しながらコード全体を リオーダーします。

実行可能プログラム・ファイル全体への追加最適化も、上記の最適化フラグを使用して行うことができます。

qfdpr IBM®xlコンパイラー・フラグでビルドされた実行可能ファイルには、fdprが並べ替えられたプログラムを生成するのに役立つ情報が含まれています。 -qfdpr オプションを使用してコンパイルされなかったモジュールは、記号テーブル内の コンパイラー・シグニチャーに基づいてリオーダーされます。

リオーダーするプログラムを作成するときに、静的リンクを使用すると、 さらにパフォーマンスを高めることができます。 fdpr プログラムでは 指定した実行可能プログラム内の命令がリオーダーされるだけなので、プログラムによって 呼び出される動的にリンクされた共有ライブラリー・ルーチンは最適化されません。 これらのライブラリー・ルーチンを実行可能プログラムに静的にリンクすると、 プログラム内の命令とプログラムに使用されるすべてのライブラリー・ルーチンを 最適化することができます。 静的にリンクされるプログラムを構築する方法には、このほかにも長所と短所があります。

出力ファイル

fdpr コマンドによって作成されるすべてのファイルは、 -x フラグで指定したワークロード・コマンドを実行して作成される ファイルを除き、現行ディレクトリーに保管されます。 最適化プロセスの間に、オリジナル・プログラムは名称変更されて保存され、最終フェーズが完了するとオリジナル・プログラム名に復元されるだけです。

プログラムを実行するためのスクリプトによって、プログラムの実行前に作業ディレクトリー が変更されることがあるので、fdpr コマンドによって作成される プロファイル・ファイルでは、現行ディレクトリーの完全な名前が明示的に使用されます。

fdpr コマンドによって作成または使用される ファイルは次のとおりです。

項目 説明
プログラム 最適化されるストリップされていない実行可能プログラムの名前。
プログラム.save オリジナルの実行可能プログラムの保管バージョン。
プログラム.nprof プロファイルのファイル名。
プログラム.instr プログラムのインスツルメント化バージョンの名前。
プログラム.fdpr 最適化された実行可能出力ファイルのデフォルト名。
プログラム.instr.dis_text インスツルメント・フェーズ後に -disasm フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_text 最適化フェーズ後に -disasm フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.dis_data インスツルメント・フェーズ後に -disasm_data フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_data 最適化フェーズ後に -disasm_data フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.dis_bss インスツルメント・フェーズ後に -disasm_bss フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_bss 最適化フェーズ後に -disasm_bss フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.mapper インスツルメント・フェーズ後に -map フラグによって作成されたデフォルトの ASCII フォーマットのマッピング・ファイル。
プログラム.fdpr.mapper 最適化フェーズ後に -map フラグによって作成されたデフォルトの ASCII フォーマットのマッピング・ファイル。
プログラム.ncounts -profcount フラグによって作成されたデフォルトの ASCII フォーマットのプロファイル・カウンター・ファイル。

拡張デバッグ機能

最適化されたプログラムに対してある程度のデバッグ機能を有効にするために、 FDPR は、 .text セクションで行われた変更を反映するようにシンボル・テーブルを更新します。

FDPRの再配列中に再配置されたシンボルのアドレスを指定するシンボル・テーブル内の入力フィールドは、 .text セクション内の新しいアドレスを指すように変更されます。

さらに、再配列中に関数またはファイルが分割される場合、 FDPR は、分割された関数/ファイルの新しい部分ごとに、シンボル・テーブルに新しいエントリーを作成します。 同じ機能のこのような新規部分には、以下の命名規則に従って、記号テーブル内の新しいシンボル名が付けられます。

<original function name>__fdpr_<function's part number>

コードのリオーダー後、すべての新規エントリーに接尾辞として __fdpr_ 文字列が付けられます。

例: 機能「main」は、もともとは記号テーブルに次のエントリーを持っていました。
  [Index] m   Value       Scn     Aux   Sclass    Type    Name
   [456]  m  0x00000230    2       1     0x02    0x0000   .main
コードのリオーダー後に機能 main が 3 分割されると、この機能は、次のように、記号テーブル内に 3 エントリー (分割された部分ごとに 1 つずつ) を持つことになります。
  [Index] m   Value       Scn     Aux   Sclass    Type    Name
   [456]  m  0x00000304    2       1     0x02    0x0000   .main
  [1447]  m  0x00003328    2       1     0x02    0x0000   .main__fdpr_1
  [1453]  m  0x000033b4    2       1     0x02    0x0000   .main__fdpr_2

次の各例は、fdpr コマンドの典型的な使用方法です。

  1. この例では、3 つのフェーズをすべて実行できます。 この例では以下のようにします。test1ストリップされていない実行可能ファイルです。test2呼び出すシェル・スクリプトです。test1現行作業ディレクトリーは /tmp/fdprです。
    test2 script file:
    
    # code to exercise test1
    test1 -expand 100 -root $PATH file.jpg -quit
    # the end of test2
    fdpr コマンドを (デフォルトの最適化を使用して) 次のように 実行します。
    fdpr -p test1 -x test2
    これにより、 新たにリオーダーされた実行可能ファイル test1.fdpr が生成されます。
  2. 各フェーズを一度に 1 つずつ実行するには、fdpr のフェーズ 1 を 実行します。
    fdpr -1 -p test1
    このコマンド文字列は、test1.instr という名前のインスツルメント化バージョンと、空のテンプレート・プロファイル・ファイル test1.nprof を作成します。

    フェーズ 2 を実行するには、次のように入力します。

    fdpr -2 -p test1 -x test2
    このコマンド・ストリングは、スクリプト・ファイルを実行します。test2トレース/アニメーション設定されたバージョンを実行するtest1プロファイル・データを収集します。

    フェーズ 3 を実行するには、次のように入力します。

    fdpr -3 -p test1
    これにより、もう一度、新たにリオーダーされた 実行可能ファイル test1.fdpr が生成されます。
  3. 最初の 2 つのフェーズに続けてフェーズ 3 を実行するには、次のように、フェーズ 1 と 2 を実行します。
    fdpr -12 -p test1 -x test2
    フェーズ 3 を最適化レベル 3 で実行します。
    fdpr -3 -O3 -p test1
  4. fdpr 最適化プログラムを実行中にエラーが発生した場合は、dbx コマンドを次のように使用して、どのプロシージャーでエラーが発生したかを判別できます。
    dbx program.fdpr
    これにより、次のような出力が作成されます。
    Type 'help' for help.
    reading symbolic information ...warning: no source compiled with -g
     
    [using memory image in core]
     
    Segmentation fault in proc_d at 0x10000634
    0x10000634 (???) 98640000        stb   r3,0x0(r4)
    (dbx)

    スタック・トレースバックは、プログラムが現行位置にどのように到着したかを判別するために使用するもので、次のように作成します。

    (dbx) where
    これにより、次のような出力が生成されます。
    proc_d(0x0) at 0x10000634
    proc_c(0x0) at 0x10000604
    proc_b(0x0) at 0x100005d0
    proc_a(0x0) at 0x1000059c
    main(0x2, 0x2ff7fba4) at 0x1000055c
    (dbx)
  5. また、dbx サブコマンド stepi を使用すると、 リオーダー後の実行可能プログラムの命令を次のように 1 つのステップでたどることができます。
    (dbx) stepi
    これにより、次のような出力が生成されます。
    stopped in proc_d at 0x1000061c
    0x1000061c (???) 9421ffc0       stwu   r1,-64(r1)
    (dbx)
    この例では、 dbx は、プログラムがルーチン内で停止したことを示します。proc_dアドレス0x1000061c再配列されたテキスト・セクションに表示されます。

実行の特性

ソフトウェア製品/オプション:AIX®Performance Aide/ Local Performance Analysis & Control Commands

標準準拠: なし。

ファイル

項目 説明
/usr/bin/fdpr fdpr コマンドが入っています。
プログラム 最適化されるストリップされていない実行可能プログラムの名前。
プログラム.save オリジナルの実行可能プログラムの保管バージョン。
プログラム.nprof プロファイルのファイル名。
プログラム.instr プログラムのインスツルメント化バージョンの名前。
プログラム.fdpr 最適化された実行可能出力ファイルのデフォルト名。
プログラム.instr.dis_text インスツルメント・フェーズ後に -disasm フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_text 最適化フェーズ後に -disasm フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.dis_data インスツルメント・フェーズ後に -disasm_data フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_data 最適化フェーズ後に -disasm_data フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.dis_bss インスツルメント・フェーズ後に -disasm_bss フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.fdpr.dis_bss 最適化フェーズ後に -disasm_bss フラグによって作成されたデフォルトの ASCII フォーマットの逆アセンブリー・ファイル。
プログラム.instr.mapper インスツルメント・フェーズ後に -map フラグによって作成されたデフォルトの ASCII フォーマットのマッピング・ファイル。
プログラム.fdpr.mapper 最適化フェーズ後に -map フラグによって作成されたデフォルトの ASCII フォーマットのマッピング・ファイル。
プログラム.ncounts -profcount フラグによって作成されたデフォルトの ASCII フォーマットのプロファイル・カウンター・ファイル。