プロシージャー間分析 (IPA) と呼ぶクラスの最適化をオンにしたりカスタマイズしたりする。
>>- -qipa--+-----------------+--------------------------------->< | .-object---. | '-=--+-noobject-+-'
ここで、
-qipa のコンパイル時のオプション 説明 -qipa 以下の -qipa suboption のデフォルトで、プロシージャー間分析を活動化します。
- 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--+---------------------------------------------+-+->< | .-:------------------------------------. | | | .-,----. | | | V 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-------------------------'
ここで、
-qipa のリンク時のオプション 説明 -qnoipa プロシージャー間分析を非活動化します。 -qipa 以下の -qipa suboption のデフォルトで、プロシージャー間分析を活動化します。
- inline=auto
- level=1
- missing=unknown
- partition=medium
以下に示す 1 つ以上の形式をサブオプションに含めることもできます。複数のサブオプションはコンマで区切ります。
リンク時のサブオプション 説明 exits=name{,name} プログラム出口を表す関数の名前を指定します。プログラム出口は、戻ることができず、 IPA パス 1 でコンパイルされたプロシージャーを呼び出すこともできない呼び出しです。 inline=auto
inline=noauto
自動インラインだけを有効にしたり無効にしたりします。コンパイラーは、ユーザーが指定した関数をインラインの候補として引き続き受け入れます。 inline[=suboption] -qinline コンパイラー・オプションの指定と同じです。 suboption は、任意の有効な -qinline サブオプションです。 inline=threshold=num インライン化する関数の数の上限を指定します。ただし、num は負でない整数です。この引き数は、 inline=auto がオンになっている場合にのみインプリメントされます。 inline=name{,name} インラインしようとする関数をコンマで区切ったリストを指定します。関数は name によって識別されます。 noinline=name{,name} インラインしなければならない関数をコンマで区切ったリストを指定します。関数は name によって識別されます。 infrequentlabel=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 サブオプションはデフォルトであり、リストの Object File Map、Source File Map、および Global Symbols Map セクションが生成されます。long サブオプションでは、 short サブオプションで生成されるすべてのセクションに加えて、 Object Resolution Warnings、Object Reference Map、Inliner Report、および Partition Map セクションが生成されます。
lowfreq=name{,name} 頻繁に呼び出されないと考えられる関数の名前を指定します。一般には、エラー処理、トレース、または初期化の関数です。これらの関数の呼び出しの最適化を小規模にすることによって、コンパイラーが、プログラムのその他の部分がより高速に実行されるようにできる場合があります。 missing=attribute -qipa でコンパイルされず、 unknown、safe、isolated、および 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 の範囲の任意の整数値にすることができますが、効率上、ユーザーのシステム上で使用可能なプロセッサーの数に限定されます。
pure=name{,name} -qipa でコンパイルされない純粋な 関数のリストを指定します。 純粋 として指定された関数は、すべて分離された および安全な 関数でなければならず、内部状態を変更したり、副次作用を持ったりしてはなりません。ここで、副次作用は、呼び出し元に対して可視のデータのいずれかを変更する可能性があることと定義します。 safe=name{,name} -qipa でコンパイルされず、プログラムのほかのパートを呼び出さない 安全な 関数のリストを指定します。安全な関数は、グローバル変数を変更することができますが、 -qipa でコンパイルされた関数を呼び出すことはできません。 unknown=name{,name} -qipa でコンパイルされない不明の 関数のリストを指定します。 不明 として指定したすべての関数は、 -qipa でコンパイルされるプログラムの他の部分を呼び出したり、グローバル変数およびダミー引き数を変更したりすることができます。 filename 特別な形式のサブオプション情報を含むファイルの名前を指定します。
ファイルの形式は以下のとおりです。
# ... comment attribute{, attribute} = 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 は以下のいずれかです。
- exits
- lowfreq
- unknown
- safe
- isolated
- pure
このオプションは、プロシージャー間分析 (IPA) と認識されているクラスの最適化をオンにしたりカスタマイズしたりします。
次のサブオプションで name を指定するとき、正規表現構文を使用できます。
- exits
- inline、noinline
- isolated
- lowfreq
- pure
- safe
- unknown
正規表現を指定するための構文規則については以下で説明します。
式 説明 string string で指定された任意の文字と一致します。例えば、test は、testimony、latest、および intestine と一致します。 ^string string で指定されたパターンが行の先頭にある場合にのみ、そのパターンと一致します。 string$ string で指定されたパターンが行の終わりにある場合にのみ、そのパターンと一致します。 str.ing ピリオド (.) は任意の 1 文字と一致します。例えば、t.st は、test、tast、tZst、および t1st と一致します。 string¥special_char 円記号 (¥) は、特殊文字をエスケープするために使用できます。例えば、ピリオドで終わる行を検索したい場合、式 .$ を指定するだけで、任意の文字を少なくとも 1 つ含むすべての行が表示されます。¥.$ を指定すると、ピリオド (.) がエスケープされ、突き合わせでは通常の文字として扱われます。 [string] string で指定された任意の文字と一致します。例えば、t[a-g123]st は、tast および test と一致しますが、t-st または tAst とは一致しません。 [^string] string で指定されたどの文字とも突き合わせを行いません。例えば、t[^a-zA-Z]st は、t1st、t-st、および t,st と一致しますが、test または tYst とは一致しません。 string* string で指定されたパターンの 0 回以上のオカレンスと一致します。例えば、te*st は、tst、test、および 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} は b、bb、bbb、および bbbb と一致します。 string1 | string2 string1 または string2 のいずれかで指定されたパターンと一致します。例えば、s | o は文字 s と o の両方と一致します。
IPA を使用するために必要なステップは、以下のとおりです。
注: コンパイル中に重大エラーが起こった場合は、-qipa は RC=1 を戻して終了します。パフォーマンス分析も終了します。
ファイルのセットをプロシージャー間分析でコンパイルするには、以下を入力します。
xlc++ -c -O3 *.C -qipa xlc++ -o product *.o -qipa
同じファイルのセットをコンパイルして、 2 番目のコンパイルの最適化および最初のコンパイル・ステップの速度を改善する方法を以下に示します。ほとんど実行されることのない 2 つの関数 trace_error および debug_dump が存在するとしています。
xlc++ -c -O3 *.C -qipa=noobject xlc++ -c *.o -qipa=lowfreq=trace_error,debug_dump