-qipa

説明

プロシージャー間分析 (IPA) と呼ばれる最適化のクラスをオンにしたりカスタマイズする。

コンパイル時の構文

構文図を読む構文図をスキップする>>- -qipa--+-----------------+---------------------------------><
           |    .-object---. |
           '-=--+-noobject-+-'
 

ここで、

-qipa コンパイル時オプション 説明
-qipa 以下の -qipa サブオプション のデフォルトで、プロシージャー間分析を活動化します。
  • inline=auto
  • level=1
  • missing=unknown
  • partition=medium
-qipa=object

-qipa=noobject

標準のオブジェクト・コードをオブジェクト・ファイルに入れるかどうかを指定します。

noobject サブオプションを指定すると、 最初の IPA フェーズ中にオブジェクト・コードが生成されないため、 全体のコンパイル時間を大幅に短縮することができます。

-S コンパイラー・オプションを noobject と一緒に指定した場合は、 noobject は無視されます。

コンパイルおよびリンクを同じステップで実行し、 -S もリスト・オプションもまったく指定していない場合は、 デフォルトで -qipa=noobject が暗黙指定されます。

-qipa でリンクする際に使用されるオブジェクト・ファイルのいずれかが -qipa=noobject オプションで作成された場合は、 エントリー・ポイント (実行可能プログラムのメインプログラム、 またはライブラリー用にエクスポートされた任意の関数) を含むファイルをすべて -qipa でコンパイルしなければなりません。

リンク時の構文

構文図を読む構文図をスキップする        .-noipa------------------------------------------------.
>>- -q--+-ipa--+---------------------------------------------+-+-><
               |    .-:------------------------------------. |
               |    |   .-noclonearch------------.         | |
               |    |   |               .-,----. |         | |
               |    V   |               V      | |         | |
               '-=----+-+-clonearch--=----arch-+-+-------+-+-'
                      | .-nocloneproc------------.       |
                      | |               .-,----. |       |
                      | |               V      | |       |
                      +-+-cloneproc--=----name-+-+-------+
                      |           .-,----.               |
                      |           V      |               |
                      +-exits--=----name-+---------------+
                      +-inline--+----------------------+-+
                      |         |    .-auto----------. | |
                      |         '-=--+-noauto--------+-' |
                      |              | .-,---------. |   |
                      |              | V           | |   |
                      |              +---suboption-+-+   |
                      |              +-threshold=num-+   |
                      |              | .-,----.      |   |
                      |              | V      |      |   |
                      |              '---name-+------'   |
                      |              .-,----.            |
                      |              V      |            |
                      +-noinline--=----name-+------------+
                      |                     .-,----.     |
                      |                     V      |     |
                      +-infrequentlabel--=----name-+-----+
                      |              .-,----.            |
                      |              V      |            |
                      +-isolated--=----name-+------------+
                      |           .-1-.                  |
                      +-level--=--+-0-+------------------+
                      |           '-2-'                  |
                      |          .-a.lst-.  .- short-.   |
                      +-list--=--+-------+--+--------+---+
                      |          '-name--'  '- long--'   |
                      |             .-,----.             |
                      |             V      |             |
                      +-lowfreq--=----name-+-------------+
                      |             .-unknown--.         |
                      +-missing--=--+-safe-----+---------+
                      |             +-isolated-+         |
                      |             '-pure-----'         |
                      |               .-medium-.         |
                      +-partition--=--+-small--+---------+
                      |               '-large--'         |
                      | .-nopdfname----------------.     |
                      +-+-pdfname--+-------------+-+-----+
                      |            '-=--filename-'       |
                      | .-nothreads------.               |
                      +-+-threads-+----+-+---------------+
                      |           '-=N-'                 |
                      |                 .-,----.         |
                      |                 V      |         |
                      +-+-pure----+--=----name-+---------+
                      | +-safe----+                      |
                      | '-unknown-'                      |
                      '-filename-------------------------'
 

ここで、

リンク時サブオプション 説明
-qnoipa プロシージャー間分析を非活動化します。
-qipa 以下の -qipa サブオプション のデフォルトで、プロシージャー間分析を活動化します。
  • inline=auto
  • level=1
  • missing=unknown
  • partition=medium

以下に示す 1 つ以上の形式をサブオプションに含めることもできます。

リンク時サブオプション 説明
clonearch=arch{,arch}

noclonearch

同じ命令セットの複数のバージョンが作成されるアーキテクチャーを指定します。

IPA リンク・フェーズの間、コンパイラーはデフォルト・アーキテクチャー設定をターゲットとしたプロシージャーの汎用バージョンを生成し、その後、該当する場合は、指定されたアーキテクチャー用に最適化された別のバージョンを作成します。実行時、コンパイラーはプログラムがどのアーキテクチャー上で稼働しているかを動的に判別し、それに従って実行される関数の特定のバージョンを選択します。このオプションを使用すると、プログラムは異なる PowerPC アーキテクチャーの互換性を達成することができます。

arch はコンマで区切られたアーキテクチャーのリストです。サポートされる clonearch の値は pwr4pwr5、および ppc970 です。値を指定しなかったり、無効な値や -qarch 設定と等しい値を指定すると、このオプションでは関数のバージョン管理が実行されません。

注:
  1. 複数のプラットフォーム間の互換性を保証するには、-qarch 値が、-qarch=clonearch によって指定されるアーキテクチャーのサブセットでなければなりません。
  2. -qcompact が有効な場合、-qarch=clonearch は使用不可になります。
  3. さまざまなアーキテクチャーで許可される clonearch 値について詳しくは、表 36を参照してください。
  4. -qipa=clonearch および -qarch に対してターゲット・アーキテクチャーと一致しないサブオプションが指定されている場合、コンパイラーはアプリケーションが現在稼働しているシステム上で最も一致度が高いサブオプションを基に命令を生成します。
cloneproc=name{,name}

nocloneproc=name{,name}

clonearch サブオプションによって指定されたアーキテクチャーの複製を行うための関数の名前を指定します。ここで、 name はコンマで区切られた関数名のリストです。
注:
-qipa=clonearch を指定しなかったり、 -qipa=noclonearch を指定すると、 -qipa=cloneproc=name,{name} および -qipa=nocloneproc=name,{name} は効果を持ちません。
exits=name{,name} プログラム出口を表す関数の名前を指定します。プログラム出口とは、決して戻ることができず、また IPA パス 1 でコンパイルされたプロシージャーを呼び出すことができない呼び出しのことです。
infrequentlabel=name{,name} プログラムの実行中にまれに呼ばれる可能性の高いユーザー定義ラベルのリストを指定します。
inline=auto

inline=noauto

自動インライン化だけを有効または無効にします。コンパイラーは、ユーザー指定関数をインライン化の候補として引き続き受け入れます。
inline[=suboption] -qinline コンパイラー・オプションの指定と同じです。 suboption は、 任意の有効な -qinline サブオプションです。
inline=threshold=num インライン化される関数の数の上限を指定します。ここで、num は負でない整数です。 この引数は、 inline=auto がオンになっている場合にのみインプリメントされます。
inline=name{,name} インライン化しようとする関数をコンマで区切ったリストを指定します。 関数は name によって識別されます。
noinline=name{,name} インライン化できない関数をコンマで区切ったリストを指定します。関数は name によって識別されます。
isolated=name,{name} IPA でコンパイルされない分離された 関数のリストを指定します。 分離された関数やそれらの呼び出しチェーン内の関数は、 いずれもグローバル変数を参照することができません。
level=0

level=1

level=2

プロシージャー間分析の最適化レベルを指定します。デフォルトのレベルは 1 です。有効なレベルは以下のとおりです。
  • Level 0 - 最小限のプロシージャー間分析および最適化しか行いません。
  • Level 1 - インライン化、限定された別名分析、および限定された呼び出し位置の調整をオンにします。
  • Level 2 - 完全なプロシージャー間のデータ・フローおよび別名分析を実行します。
list

list=[name] [short|long]

リンク・フェーズ中にリスト・ファイルを生成するように指定します。 リスト・ファイルには、 IPA によって実行される変換および分析をはじめ、 区画ごとにバックエンドによって生成されるオプションのオブジェクト・リストに関する情報が入り ます。 このオプションを使用して、 リスト・ファイルの名前を指定することもできます。

(-qlist-qipa=list オプションのいずれかを使用して) リストを要求したときに name が指定されていない場合は、 リスト・ファイルの名前はデフォルトで a.lst になります。

long および short サブオプションを使用して、 リスト・ファイルの詳細化や簡略化を要求することができます。short サブオプションはデフォルトで、リストのオブジェクト・ファイル・マップ、ソース・ファイル・マップ、およびグローバル・シンボル・マップの各セクションが生成されます。long サブオプションでは、short サブオプションで生成されるすべてのセクションに加えて、オブジェクト解決警告、オブジェクト参照マップ、インライナー・レポート、および区画マップのセクションが生成されます。

lowfreq=name{,name} 頻繁に呼び出されないと考えられる関数の名前を指定します。一般には、エラー処理、トレース、または初期化の関数です。これらの関数の呼び出しの最適化を小規模にすることによって、 コンパイラーが、プログラムのその他の部分がより高速に実行されるようにできる場合があります。
missing=attribute -qipa でコンパイルされず、 unknownsafeisolated、 および pure サブオプションのいずれによっても明示的に指定されていないプロシージャーのプロシージャー間の振る舞いを指定します。

以下の属性を使用して、 この情報の詳細を指定することができます。

  • safe - 直接呼び出しか関数ポインターのいずれによっても可視の (欠落していない) 関数を間接的に呼び出さない関数。
  • isolated - 可視の関数からアクセスできるグローバル変数を直接参照しない関数。 共用ライブラリーからバインドされた関数は分離された (isolated) ものと見なされます。
  • pure - 安全 (safe) かつ分離された (isolated) 関数であり、 可視の関数からアクセスできるストレージを間接的に変更しない関数。 また、純粋な (pure) 関数には、取得できる内部状態はありません。
  • unknown - デフォルトの設定。 このオプションは、不明の (unknown) 関数の呼び出しに対するプロシージャー間の 最適化の量を大幅に制限します。 欠落している関数が安全 (safe)分離された (isolated)、 または純粋な (pure) 関数として認識されないように指定します。
partition=small

partition=medium

partition=large

パス 2 中に IPA によって作成される各プログラム区画のサイズを指定します。
nopdfname

pdfname

pdfname=filename

PDF プロファイル情報を含むプロファイル・データ・ファイルの名前を指定します。filename を指定しない場合、デフォルト・ファイル名は ._pdf になります。

プロファイルは、現行作業ディレクトリーか、PDFDIR 環境変数によって指定されたディレクトリーに配置されます。 これにより、同じ PDFDIR を使用して複数の実行可能ファイルを同時に実行することが可能になります。 これは動的ライブラリー上の PDF でのチューニングに役立ちます。

nothreads

threads

threads=N

コンパイラーがコード生成に割り当てるスレッド数を指定します。

nothreads を指定することは、1 つのシリアル処理を実行することと同等です。 これがデフォルトです。

threads を指定すると、 コンパイラーが、使用可能なプロセッサーの数に応じて、使用するスレッドの数を判別できるようになります。

threads=N を指定すると、 N スレッドを使用するようプログラムに指示します。 N は 1 から MAXINT の範囲の整数値にすることができますが、 事実上 N はシステムで使用可能なプロセッサーの数に限定されます。

pure=name{,name} -qipa でコンパイルされない純粋な 関数のリストを指定します。 純粋 (pure) として指定された関数は、すべて分離された (isolated) および安全な (safe) 関数でなければならず、内部状態を変更したり、副次作用を持つことはできません (副次作用とは呼び出し元から可視のデータを変更する可能性があることと定義されています)。
safe=name{,name} -qipa を使用してコンパイルされず、プログラムの他の部分を呼び出さない安全な (safe) 関数のリストを指定します。安全な関数は、グローバル変数を変更することができますが、 -qipa でコンパイルされた関数を呼び出すことはできません。
unknown=name{,name} -qipa でコンパイルされない不明の (unknown) 関数のリストを指定します。 不明 (unknown) として指定された関数は、-qipa でコンパイルされたプログラムの他の部分を呼び出したり、グローバル変数やダミー引数を変更することができます。
filename 特別な形式のサブオプション情報を含むファイルの名前を指定します。

ファイルの形式は以下のとおりです。

# ... comment 
attribute{, attribute} = name{, name}
clonearch=arch,{arch}
cloneproc=name,{name}
missing = attribute{, attribute} 
exits = name{, name} 
lowfreq = name{, name} 
inline [ = auto | = noauto ] 
inline = name{, name} [ from name{, name}] 
inline-threshold = unsigned_int
inline-limit = unsigned_int
list [ = file-name | short | long ] 
noinline 
noinline = name{, name} [ from name{, name}]
level = 0 | 1 | 2 
prof [ = file-name ] 
noprof 
partition = small | medium | large | unsigned_int

ここで、attribute は以下のいずれかです。

  • clonearch
  • cloneproc
  • exits
  • lowfreq
  • unknown
  • safe
  • isolated
  • pure

以下のテーブルは、異なる -qarch 設定に対して許可される clonearch の値を示したものです。

表 36. 許可される clonearch 値
-qarch 設定 許可される clonearch 値
ppc、 pwr3、 ppc64、 ppcgr、 ppc64gr、 ppc64grsq pwr4、pwr5、ppc970
pwr4 pwr5、ppc970
ppc64v ppc970
pwr5、ppc970 N/A

IPA を使用するために必要なステップは、以下の通りです。

  1. IPA 分析は、コンパイルとリンクの時間を増加させる 2 パス・メカニズムを使用するため、 -qipa オプションを指定してコンパイルする前に、予備のパフォーマンス分析とチューニングを行ってください。 -qipa=noobject オプションを使用することによって、 コンパイルおよびリンクのオーバーヘッドをいくらか削減することができます。
  2. -qipa オプションは、 アプリケーション全体のコンパイルとリンクの両方のステップ、 またはできるだけ多くのステップにおいて指定します。サブオプションを使用して、 -qipa でコンパイルされない プログラムの部分に関する前提を示します。 コンパイル中に、コンパイラーはプロシージャー間分析情報を .o ファイルに保管します。リンク中には、 -qipa オプションによって、 アプリケーション全体の完全な再コンパイルが行われます。

注: コンパイル中に重大エラーが発生すると、-qipa は RC=1 を戻して終了します。パフォーマンス分析も終了します。

次のサブオプションで name を指定するときに、正規表現式構文を使用できます。

正規表現を指定するための構文規則は以下の通りです。

説明
string string で指定された任意の文字と一致します。 例えば、test は、testimonylatest、 および intestine と一致します。
^string string で指定されたパターンが行の先頭にある場合にのみ、 そのパターンと一致します。
string$ string で指定されたパターンが行の終わりにある場合にのみ、 そのパターンと一致します。
str.ing ピリオド (.) は任意の 1 文字と一致します。 例えば、t.st は、testtasttZst、 および t1st と一致します。
string¥special_char 円記号 (¥) は、特殊文字をエスケープするために使用できます。 例えば、ピリオドで終わる行を検索したい場合、 式 .$ を指定するだけで、任意の文字を少なくとも 1 つ含むすべての行が 表示されます。¥.$ を指定すると、ピリオド (.) がエスケープされ、 突き合わせでは通常の文字として扱われます。
[string] string で指定された任意の文字と一致します。 例えば、t[a-g123]st は、tast および test と 一致しますが、t-st または tAst とは一致しません。
[^string] string で指定されたどの文字とも突き合わせを行いません。 例えば、t[^a-zA-Z]st は、t1stt-st、 および t,st と一致しますが、test または tYst とは 一致しません。
string* string で指定されたパターンの 0 回以上のオカレンスと一致します。 例えば、te*st は、tsttest、 および teeeeeest と一致します。
string+ string で指定されたパターンの 1 回以上のオカレンスと一致します。 例えば、t(es)+t は、test および tesest と 一致しますが、tt とは一致しません。
string? string で指定されたパターンの 0 または 1 回の オカレンスと一致します。 例えば、te?st は、tst または test と一致します。
string{m,n} string で指定されたパターンの、m から n 回のオカレンスと一致します。 例えば、a{2}aa と一致し、b{1,4}bbbbbb、および bbbb と一致します。
string1 | string2 string1 または string2 のいずれかで 指定されたパターンと一致します。 例えば、s | o は文字 so の両方と一致します。

ファイルのセットをプロシージャー間分析でコンパイルするには、以下のように入力します。

xlc++ -c -O3 *.C -qipa
xlc++ -o product *.o -qipa 

同じファイルのセットをコンパイルして、2 番目のコンパイルの最適化と最初のコンパイル・ステップの速度を改善する方法を以下に示します。 ほとんど実行されることのない 2 つの関数 trace_errordebug_dump が存在すると想定します。

xlc++ -c -O3 *.C -qipa=noobject
xlc++ -c *.o -qipa=lowfreq=trace_error,debug_dump 

関連情報