問題タブ [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.
gcc - PGO はソース コードにどのように適用されますか? CFG にどのように影響しますか?
最近、私は PGO の関連トピックを検索しており、それらがソース コードにどのように適用され、あるアプリケーションが次々と適用されているのか疑問に思い始めました。
たとえば、GCC や CLang で PGO 最適化を有効にすると、すべての最適化 (インライン化、仮想呼び出しスペキュレーション、デッド コード分離など) が適用されますよね!?
それらがすべてソースコードに適用されていなくても、いくつかは適用されているとしましょう。すると、順次適用されるのではないでしょうか?
では、CFG (コントロール フロー グラフ) を変更して、基本ブロックの周波数が失われるようにすることはできますか?
たとえば、「A」という名前の PGO の後に「B」という名前の PGO が適用され、「A」がソース コードを変更して基本ブロック周波数の一部が失われた場合、「B」はどのように適用されるか (両方が PGO であると仮定) BB周波数に依存します)?
(下手な英語でごめんなさい)
llvm - llvm 3.5 以降の llvm ツールを使用してプログラムをプロファイリングする方法は?
llvm ツールを使用して、小さなプログラムのブロック レベルのプロファイルを生成することを検討しています。古いバージョンでは、これは実行するのと同じくらい簡単だったようです:
LLVM の新しいバージョンではプロファイリングはどのように行われますか?
intel - 大規模プログラムの LBR
Intel プロセッサの Last Branch Record 機能。多くの分岐がある大規模なプログラムに適していますか? はいの場合、Haswell の場合、16 個の MSR レジスタを使用するだけでパス全体を見つけるにはどうすればよいですか?
c++ - Clang++ PGO: 空の .profraw
Clang Profile Guided Optimization の問題について助けを求めています。私は clang++-3.7 を使用していますが、問題は clang++-3.6 でもまだ存在します。
ダミーコードで PGO を実行しようとすると、すべて問題ありません。
clang++ -o test -fprofile-instr-generate dummy.cpp
しかし、より大きなプロジェクトでは、いくつかの問題があります。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
問題がどこにあるかを理解しようとするのを手伝ってくれる人はいますか? 前もって感謝します!
clang - Clang: PGO のカバレッジでコンパイルするときに -O0 を渡す必要がありますか
そのため、clang 3.8 で大きな C++ プログラムをコンパイルしています。PGO (プロファイルに基づく最適化) を利用したい。インストルメンテーションでコンパイルする方法を使用して、プロファイルを生成したいと考えています。
-fprofile-instr-generate --coverage
現在、コンパイラと--coverage
リンカーに渡しています。
-O0
したがって、次のコンパイル中にコンパイラがバイナリからの呼び出しを適切にマップバックできるように、合格するのが最適かどうかが問題になります。それともそれは不要ですか?
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 で実行できますか? もしそうなら、実際のプロファイリングを行う最善の方法は何ですか?
c++ - CMake 3.7でPGO依存関係をどのように表現しますか?
Clang 3.9 のプロファイルに基づく最適化機能を使用して構築している C++ プログラムがあります。これが起こるはずのことです:
- インストルメンテーションを有効にしてプログラムをビルドします。
- そのプログラムを実行して、プロファイル データを含むファイルを作成します:
prof.raw
. - 私は新しいファイル
llvm-profdata
に変換するために使用します.prof.raw
prof.data
- いくつかの変更を加えて、同じプログラムの新しいビルドを作成します。
- 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します
-fprofile-use=prof.data
。 - 実行可能ファイルをリンクするときにも指定します
-fprofile-use
。
- 各 .cpp ファイルを .o ファイルにコンパイルするときは、コンパイラ フラグを使用します
これには Gnu Makefile があり、うまく機能します。その Makefile を CMake (3.7、しかしアップグレードできます) に移植しようとしている今、私の問題が発生します。(少なくとも)Unix Makefilesジェネレーターで動作するソリューションが必要ですが、理想的にはすべてのジェネレーターで動作します。
CMake では、2 つの実行可能ターゲットを定義しました:foo-gen
とfoo-use
:
- を実行する
foo-gen
と、ファイルが作成されprof.raw
ます。 - から
add_custom_command
作成するルールを作成するために使用します。prof.data
prof.raw
私の問題は、依存している各オブジェクト ファイルが file に依存していることを CMake に伝える方法がわからないことfoo-use
ですprof.data
。
私が持っていた最も有望なアイデアは、(1) が依存するすべての
.o
ファイルを列挙する方法を見つけ、foo-use
(2) それらの各ファイルを反復処理して、それぞれを.o
呼び出すことadd_dependency
でした。このアプローチの問題は、CMakeLists.txt ファイルで、実行可能ファイルが依存するオブジェクト ファイルのリストを列挙する慣用的な方法が見つからないことです。これはCMake の未解決の問題である可能性があります。
で使用される各ファイルにプロパティ
set_source_files_properties
を設定し、そのプロパティのリストに追加することも検討しました。OBJECT_DEPENDS
.cpp
foo-use
prof.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_DEPENDS
foo-gen
foo-use
これを機能させるためのクリーンな(ish)方法に関する提案はありますか?
c++ - /USEPROFILE を使用すると、VS2015 で /GENPROFILE を使用するよりもはるかに遅いのはなぜですか?
ご存知のように、最初に /GENPROFILE を使用してプロジェクトをビルドし、トレーニングのために実行してから、コマンドを /USEPROFILE に切り替えて最適化されたバンドルをビルドする必要があります。
各時間コスト関数の時間を出力したところ、/USEPROFILE よりも /GENPROFILE ステージの方が高速であることがわかりました。実際、前のものは後者よりもパフォーマンスをはるかに上回っています。なぜこれが起こったのですか?コンパイラがトレーニング済みの pgd ファイルを使用している場合、トレーニング済みの pgd ファイルを使用する最終的な .exe が遅いのはなぜですか?