プロシージャー間分析 (IPA) と呼ばれる最適化のクラスをオンにしたりカスタマイズする。
>>- -qipa--+-----------------+--------------------------------->< | .-object---. | '-=--+-noobject-+-'
ここで、
-qipa コンパイル時オプション | 説明 |
---|---|
-qipa | 以下の -qipa サブオプション のデフォルトで、プロシージャー間分析を活動化します。
|
-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 サブオプション のデフォルトで、プロシージャー間分析を活動化します。
|
以下に示す 1 つ以上の形式をサブオプションに含めることもできます。
リンク時サブオプション | 説明 |
---|---|
clonearch=arch{,arch}
noclonearch |
同じ命令セットの複数のバージョンが作成されるアーキテクチャーを指定します。
IPA リンク・フェーズの間、コンパイラーはデフォルト・アーキテクチャー設定をターゲットとしたプロシージャーの汎用バージョンを生成し、その後、該当する場合は、指定されたアーキテクチャー用に最適化された別のバージョンを作成します。実行時、コンパイラーはプログラムがどのアーキテクチャー上で稼働しているかを動的に判別し、それに従って実行される関数の特定のバージョンを選択します。このオプションを使用すると、プログラムは異なる PowerPC アーキテクチャーの互換性を達成することができます。 arch はコンマで区切られたアーキテクチャーのリストです。サポートされる clonearch の値は pwr4、pwr5、および ppc970 です。値を指定しなかったり、無効な値や -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 です。有効なレベルは以下のとおりです。
|
list
list=[name] [short|long] |
リンク・フェーズ中にリスト・ファイルを生成するように指定します。
リスト・ファイルには、
IPA によって実行される変換および分析をはじめ、
区画ごとにバックエンドによって生成されるオプションのオブジェクト・リストに関する情報が入り
ます。
このオプションを使用して、
リスト・ファイルの名前を指定することもできます。
(-qlist か -qipa=list オプションのいずれかを使用して) リストを要求したときに name が指定されていない場合は、 リスト・ファイルの名前はデフォルトで a.lst になります。 long および short サブオプションを使用して、 リスト・ファイルの詳細化や簡略化を要求することができます。short サブオプションはデフォルトで、リストのオブジェクト・ファイル・マップ、ソース・ファイル・マップ、およびグローバル・シンボル・マップの各セクションが生成されます。long サブオプションでは、short サブオプションで生成されるすべてのセクションに加えて、オブジェクト解決警告、オブジェクト参照マップ、インライナー・レポート、および区画マップのセクションが生成されます。 |
lowfreq=name{,name} | 頻繁に呼び出されないと考えられる関数の名前を指定します。一般には、エラー処理、トレース、または初期化の関数です。これらの関数の呼び出しの最適化を小規模にすることによって、 コンパイラーが、プログラムのその他の部分がより高速に実行されるようにできる場合があります。 |
missing=attribute | -qipa でコンパイルされず、
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 は以下のいずれかです。
|
以下のテーブルは、異なる -qarch 設定に対して許可される clonearch の値を示したものです。
-qarch 設定 | 許可される clonearch 値 |
---|---|
ppc、 pwr3、 ppc64、 ppcgr、 ppc64gr、 ppc64grsq | pwr4、pwr5、ppc970 |
pwr4 | pwr5、ppc970 |
ppc64v | ppc970 |
pwr5、ppc970 | N/A |
IPA を使用するために必要なステップは、以下の通りです。
注: コンパイル中に重大エラーが発生すると、-qipa は RC=1 を戻して終了します。パフォーマンス分析も終了します。
次のサブオプションで name を指定するときに、正規表現式構文を使用できます。
正規表現を指定するための構文規則は以下の通りです。
式 | 説明 |
---|---|
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 の両方と一致します。 |
ファイルのセットをプロシージャー間分析でコンパイルするには、以下のように入力します。
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
関連情報