問題タブ [pgo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
95 参照

gcc - PGO はソース コードにどのように適用されますか? CFG にどのように影響しますか?

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

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

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

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

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

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

0 投票する
1 に答える
710 参照

llvm - llvm 3.5 以降の llvm ツールを使用してプログラムをプロファイリングする方法は?

llvm ツールを使用して、小さなプログラムのブロック レベルのプロファイルを生成することを検討しています。古いバージョンでは、これは実行するのと同じくらい簡単だったようです:

LLVM の新しいバージョンではプロファイリングはどのように行われますか?

0 投票する
1 に答える
155 参照

intel - 大規模プログラムの LBR

Intel プロセッサの Last Branch Record 機能。多くの分岐がある大規模なプログラムに適していますか? はいの場合、Haswell の場合、16 個の MSR レジスタを使用するだけでパス全体を見つけるにはどうすればよいですか?

0 投票する
1 に答える
1371 参照

c++ - Clang++ PGO: 空の .profraw


Clang Profile Guided Optimization の問題について助けを求めています。私は clang++-3.7 を使用していますが、問題は clang++-3.6 でもまだ存在します。
ダミーコードで PGO を実行しようとすると、すべて問題ありません。

  • -fprofile-instr-generate でコンパイルします:
    clang++ -o test -fprofile-instr-generate dummy.cpp
  • 実行可能ファイル「test」を起動すると、default.profraw ファイルが生成されます
  • llvm-profdata merge でプロファイルをマージできます
  • 最後に、.profdata で -fprofile-instr-use を使用して、プロファイル統合でコンパイルできます
  • しかし、より大きなプロジェクトでは、いくつかの問題があります。Makefile とスクリプトを使用してプロセスを自動化していますが、操作の流れは次のとおりです。

  • オブジェクト ファイルを作成するクラスを含むソースをコンパイルし ます

    std=c++0x -O3 -flto -fprofile-instr-generate src/foo2.cpp -o obj/foo2.o
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src /foo3.cpp -o obj/foo3.o
  • 次に、オブジェクトをリンクします:
    clang++ -O3 -flto -fprofile-instr-generate obj/foo1.o obj/foo2.o obj/foo3.o -o foobar.out
  • この時点で問題があります: トレーニング インスタンスで foobar.out を実行しようとすると、生成された .profraw は常に空です (実行速度は通常であり、pgo の作成時のように遅くはありません)。プロファイル統合を使用してコンパイルすると (.profraw ファイルのマージ後)、コンパイラは常に、プロジェクト内の各 foo*.cpp ファイルに対して「警告: ファイル foo*.cpp で使用できるプロファイル データがありません」という警告を出します。

    問題がどこにあるかを理解しようとするのを手伝ってくれる人はいますか? 前もって感謝します!

  • 0 投票する
    1 に答える
    267 参照

    clang - Clang: PGO のカバレッジでコンパイルするときに -O0 を渡す必要がありますか

    そのため、clang 3.8 で大きな C++ プログラムをコンパイルしています。PGO (プロファイルに基づく最適化) を利用したい。インストルメンテーションでコンパイルする方法を使用して、プロファイルを生成したいと考えています。

    -fprofile-instr-generate --coverage現在、コンパイラと--coverageリンカーに渡しています。

    -O0したがって、次のコンパイル中にコンパイラがバイナリからの呼び出しを適切にマップバックできるように、合格するのが最適かどうかが問題になります。それともそれは不要ですか?

    0 投票する
    1 に答える
    1474 参照

    linux - パフォーマンスを考慮して Chrome/Chromium をコンパイルする

    私は現在、Chromium のローカル ビルドを実行することの潜在的な長所と短所を比較検討しています。

    これまでソースから Chromium をビルドしたことはありませんが、これが巨大なプロジェクトであり、コンパイル要件が大きく、時間がかかることは理解しています。

    私は以前にこのアイデアに手を出しましたが、理由はパフォーマンスに集中していました。具体的には:

    • Chromium は Profile Guided Optimization から多くの恩恵を受けることができますか?
    • GCC ネイティブ CPU 最適化を使用して Chromium をビルドすると、一般的なバイナリ ビルドを使用する場合よりも、パフォーマンスがわずかに向上するだけではありませんか? (特にハスウェル アーチとブロードウェル アーチの場合)
    • Chromium をローカルでビルドするときの全体的なパフォーマンスまたはメモリ効率を改善するために他にできることはありますか?

    当時、少し調べた結果、これは努力する価値がないという結論に達しました。

    数年前に Firefox の PGO ビルドを実行したことを覚えていますが、Firefox は依然として PGO ビルドの実行を適切にサポートしているようです。ただし、Chromium の場合は、もっと複雑なようです。

    Chromium は、PGO ビルドをネイティブでサポートしているようです。残念ながら、そのサポートは完全に Windows 固有のようです。他のオペレーティング システム用の PGO ビルドはサポートされておらず、Chromium 独自のビルドの複雑さを考えると、この支援なしに PGO ビルドを試みる価値はないように思われました。

    Linux でこれを試みて成功した人を他の誰かが知っているなら、私はその結果に非常に興味があります。

    GCC の CPU 最適化に関しては、ここで提供される利点はほとんどの場合わずかであると理解していますが、Chromium がいかに複雑であるかを考えると、ほとんどのアプリケーションよりも多くの利点が得られる可能性が高いと思われます。

    GCC の最適化だけに取り組む価値はないかもしれませんが、もう一度これを行うことを検討している理由は、パッチを利用して VA-API を有効にすることもできるからです: https://aur.archlinux.org/packages /クロム-vaapi/

    最後に、ハードウェア アクセラレーションによるビデオ デコーディングのサポートを得ることは、ここで努力する価値があるかもしれません。今、私が興味を持っているのは、これを行うときのパフォーマンスに関する考慮事項です。

    tl;dr

    • ネイティブ CPU 最適化を使用してローカルでコンパイルされた Chromium のビルドを使用する場合、パフォーマンスに目に見える違いがあると期待できますか?
    • Chromium を使用した PGO は Linux で実行できますか? もしそうなら、実際のプロファイリングを行う最善の方法は何ですか?
    0 投票する
    0 に答える
    798 参照

    c++ - CMake 3.7でPGO依存関係をどのように表現しますか?

    Clang 3.9 のプロファイルに基づく最適化機能を使用して構築している C++ プログラムがあります。これが起こるはずのことです:

    1. インストルメンテーションを有効にしてプログラムをビルドします。
    2. そのプログラムを実行して、プロファイル データを含むファイルを作成します: prof.raw.
    3. 私は新しいファイルllvm-profdataに変換するために使用します.prof.rawprof.data
    4. いくつかの変更を加えて、同じプログラムの新しいビルドを作成します。
      • 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します-fprofile-use=prof.data
      • 実行可能ファイルをリンクするときにも指定します-fprofile-use

    これには Gnu Makefile があり、うまく機能します。その Makefile を CMake (3.7、しかしアップグレードできます) に移植しようとしている今、私の問題が発生します。(少なくとも)Unix Makefilesジェネレーターで動作するソリューションが必要ですが、理想的にはすべてのジェネレーターで動作します。

    CMake では、2 つの実行可能ターゲットを定義しました:foo-genfoo-use:

    • を実行するfoo-genと、ファイルが作成されprof.rawます。
    • からadd_custom_command作成するルールを作成するために使用します。prof.dataprof.raw

    私の問題は、依存している各オブジェクト ファイルが file に依存していることを CMake に伝える方法がわからないことfoo-useですprof.data

    • 私が持っていた最も有望なアイデアは、(1) が依存するすべての.oファイルを列挙する方法を見つけ、 foo-use(2) それらの各ファイルを反復処理して、それぞれを.o呼び出すことadd_dependencyでした。

      このアプローチの問題は、CMakeLists.txt ファイルで、実行可能ファイルが依存するオブジェクト ファイルのリストを列挙する慣用的な方法が見つからないことです。これはCMake の未解決の問題である可能性があります

    • で使用される各ファイルにプロパティset_source_files_propertiesを設定し、そのプロパティのリストに追加することも検討しました。OBJECT_DEPENDS.cppfoo-useprof.data

      これ(AFAICT)の問題は、私の.cppファイルのそれぞれが2つの異なる.oファイルを作成するために使用されることfoo-genですfoo-use.oリンクされるファイルに、foo-useこのコンパイル時の依存関係を持たせたいprof.data。ただし、.oリンク先のファイルは、コンパイル時に に依存してはfoo-genなりませprof.data

      そして、私の知る限り、プロパティが現在の対象であるかどうかに応じて、2 つの値のいずれかを持つようにset_source_files_properties設定することはできません。OBJECT_DEPENDSfoo-genfoo-use

    これを機能させるためのクリーンな(ish)方法に関する提案はありますか?

    0 投票する
    0 に答える
    148 参照

    c++ - /USEPROFILE を使用すると、VS2015 で /GENPROFILE を使用するよりもはるかに遅いのはなぜですか?

    ご存知のように、最初に /GENPROFILE を使用してプロジェクトをビルドし、トレーニングのために実行してから、コマンドを /USEPROFILE に切り替えて最適化されたバンドルをビルドする必要があります。

    各時間コスト関数の時間を出力したところ、/USEPROFILE よりも /GENPROFILE ステージの方が高速であることがわかりました。実際、前のものは後者よりもパフォーマンスをはるかに上回っています。なぜこれが起こったのですか?コンパイラがトレーニング済みの pgd ファイルを使用している場合、トレーニング済みの pgd ファイルを使用する最終的な .exe が遅いのはなぜですか?