0

最近、私は PGO の関連トピックを検索しており、それらがソース コードにどのように適用され、あるアプリケーションが次々と適用されているのか疑問に思い始めました。

たとえば、GCC や CLang で PGO 最適化を有効にすると、すべての最適化 (インライン化、仮想呼び出しスペキュレーション、デッド コード分離など) が適用されますよね!?

それらがすべてソースコードに適用されていなくても、いくつかは適用されているとしましょう。すると、順次適用されるのではないでしょうか?

では、CFG (コントロール フロー グラフ) を変更して、基本ブロックの周波数が失われるようにすることはできますか?

たとえば、「A」という名前の PGO の後に「B」という名前の PGO が適用され、「A」がソース コードを変更して基本ブロック周波数の一部が失われた場合、「B」はどのように適用されるか (両方が PGO であると仮定) BB周波数に依存します)?

(下手な英語でごめんなさい)

4

1 に答える 1

1

PGO およびその他のほとんどの最適化は、ソース コードには適用されず、中間コードに適用されます。ソースコード自体はそのままです。ただし、生成されたバイナリ コードは (うまくいけば) 最適化されます。

PGO の目的は、インライン化、仮想呼び出しスペキュレーション、ほとんど実行されないコードの分離など、従来の最適化の有効性を向上させることです。したがって、それらはすべてまだ適用されています。ご想像のとおり、それらはある順番で適用されます。

これらの最適化の一部は、コードの CFG を変更します。ただし、コンパイラは、中間コード内の位置が変更された場合でも、プロファイリングされた元の基本ブロックを追跡します。PGO では、コンパイラは基本ブロックを削除しません。ただし、コンパイラは、基本ブロックを同じままにするか、その場所を変更するか、基本ブロックを複数の基本ブロックに拡張するか、新しい基本ブロックを挿入することができます。何をするにしても、元のプロファイリングされた基本ブロックとそれらの実行統計を追跡して、さらなる最適化でプロファイルの利用方法を知ることができます。新しい基本ブロックが挿入されている場合は、プロファイルを使用せずに通常どおり最適化されます。

于 2015-10-19T10:36:12.407 に答える