問題タブ [lto]
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 - GCC LTO はファイル間のデッド コードの除去を実行しますか?
関数があるとします
これを問題なくコンパイルして実行できます。機能が必要な場合は、渡すことができ、機能-D FEATURE_X
します。
ただし、別のファイルに入れたい場合はどうでしょうかdo_something
(オプションを変更するたびにそのファイルを再コンパイルする必要はありません)。それが同じファイルにあった場合、私はそれを推測します
デッドコードの削除を適切に使用して、呼び出しを削除します。これをLTOなしで別のファイルに入れると、
コードは削除されません (知る方法がありません)。では、リンク時の最適化を有効にすると、コンパイラはFEATURE_X
リンク時の値を検出し、コードが使用されているかどうかを判断し、必要に応じて削除できますか?
optimization - ltoオブジェクトとfat-ltoオブジェクトのgccの違いは何ですか
次のフラグを使用してソースコードをアセンブラするようにコンパイルしようとしました
:
1。2.3 -flto
。-flto -ffat-lto-objects
-flto -fno-fat-lto-objects
3つ目はslim
、ドキュメントに記述されているように最適化されたLTOコードを提供しますが、1つ目と2つ目の出力アセンブリファイルに違いは見られません。なぜですか?
OS:linux
コンパイラ:GCC 4.7
c++ - GCC Profile Guided Optimization (PGO) はどのような情報を収集し、どの最適化でそれを使用しますか?
有効にしたときに GCC が収集する情報-fprofile-generate
と、収集した情報を実際に使用する最適化 (-fprofile-use
フラグの設定時) はどれですか?
ここで引用が必要です。しばらく検索しましたが、文書化されたものは見つかりませんでした。
リンク時最適化 (LTO) に関する情報はプラスになります! =D
c++ - クラス メンバーと constexpr リンク時の最適化を含む C++11 列挙型
私のプロジェクトには、列挙メンバーに関連付けられた追加の属性と、列挙型に関連付けられた補助静的メソッドが必要な列挙がたくさんあります。
私の知る限り、これは標準の列挙型クラス MyItem {...} では実現できないため、プロジェクトの列挙型クラスごとに、これらの補助静的メソッドをカプセル化し、補助インスタンスのインスタンス化も行う補助クラス MyItemEnum を用意しています。そのため、追加の属性を取得するためにそれらのメソッドにアクセスできます。
以下に例を示します (可能な限り単純化されていますが、説明するすべての機能はそこにとどまっていると思います)。
MyItem.h
意味は明らかで、ここで .cpp 部分を提供する必要はないと思います... MyItem をインターフェイスで渡される引数として使用し、拡張機能にアクセスする必要がある場合は MyItemEnum を使用します。
私の最初の質問は、上記のアプローチは大丈夫ですか、それともまったく別のものを検討する必要がありますか?
私の 2 番目の質問は、constexpr を使用して実行しようとしているこの列挙の最適化に関するものです。
それはコンパイルされますが、どうやら constexpr を使用する機会がないようです。
そのため、コンパイラは Item1 がどの値でインスタンス化されたかを知りません。 リンク時の最適化中に上記の式が constexpr として評価される可能性はありますか? あるいは、私は使用することができます
これにより、constexpr コンパイル時の最適化がアクティブになりますが、場合によっては、constexpr をコンパイル時に評価できない場合、コンパイラは MyItemEnum のローカル インスタンスを作成する必要があります(単一のグローバルへの参照を使用する代わりに)。静的インスタンス) これがパフォーマンスの低下につながるのではないかと心配しています (私の実際の列挙型には単一のメンバーよりも多くの属性があるため、ローカルのインスタンス化に時間がかかることがありますか?)。これは正当な懸念ですか?
c - C: コンパイル済みコードをインラインとしてコンパイルする
かなり複雑な理由で、個別にコンパイルしてからリンクしたい一連のファイルがありますが、1 つの関数が 2 番目の関数にインラインで配置されるようにします。これは、GCC で異なるフラグを使用してコンパイルしたいためです。それを回避する方法を調べることで問題を解決できることはわかっていますが、これが可能かどうかを知りたいです。
編集1:そうでない場合、「外部」関数を、他のファイルに含めることができるアセンブリの形式にコンパイルすることは可能ですか? はい、クレイジーですがクールでもあります...
ざっと見てみると、これはオプションである可能性があります。自動でコンパイルするのは無理だと思うので、どなたかアセンブルについて教えていただけないでしょうか?基本的なARMアセンブリのみを使用しました。-S
GCC のフラグを使用しておもちゃの関数にコンパイルしました。レジスタと変数をリンクするにはどうすればよいですか? それらは常に同じ順序になりますか?この機能は高度に最適化されます。いつ抽出を開始および終了する必要がありますか? .cfi_startproc
最初と最後に含める必要があり.cfi_def_cfa 7, 8
ますか?#
編集 2:
この投稿では、gcc がこのようなリンク時の最適化を行う方法について詳しく説明してい-flto
ます。悲しいことに、これはバージョン 4.5 でのみ使用できます。これをコンパイルする必要があるマシンのルート アクセス権がないため、インストールすることもできません。別の可能な解決策は、異なるバージョンの GCC を UNIX マシンのフォルダーにインストールする方法を説明することです。
c++ - -O4 (LTO) を指定して FlasCC でコンパイルされた C++ プログラムが仮想呼び出しでハングする
FlasCC での LTO 最適化に問題があります。
-O1 を指定してコンパイルすると、swf は問題なく動作します。
ただし、-O4 を使用すると、最初は正常に実行されますが、特定の仮想関数呼び出しで 15 秒以上ハングし、Flash が停止します。
Flash ログを使用してハングの正確なポイントを追跡するために、printfs を追加しました。
printf( "Program_Step : vis init" ) でハングし、実際の Initialize() 実装には決して入りません。ポインターは IGameVisualizer *m_pVisualizer; として宣言されます。
コード:
linker - Clang のリンク時の最適化が Fedora 18 で正しく機能しない
私は clang の初心者なので、ばかげたことをしている可能性があります。しかし、ディストリビューションが提供するパッケージで -flto に対処する質問が見つからない場合は、ここで検索するなど、解決策を探すのに数時間を費やしました。この説明の詳細は Fedora 18 に固有のものですが、Ubuntu 13.04 でも同様の問題が発生しているため、Fedora に固有の問題ではありません。それは私かclangのどちらかです。
clang++ -flto
問題:リンク時の最適化の利点を得るために、単純な hello-world プログラムをコンパイルしようとしています。-flto がなければ正常に動作します。-flto を使用すると、リンクに失敗します。clang -flto -o hello hello.o -v
完全なリンカー コマンド ラインを表示するためにas を呼び出すと、次のようになります。
次の 2 つの問題があるようです。
clang++ はリンカーを として呼び出しますが、
/usr/bin/ld
これはゴールド リンカーではありません。Fedora18 は、ゴールドを としてインストールします/usr/bin/ld.gold
。/usr/local/bin/ld
からへのシンボリックリンクを作成しようとしましたが、それが/usr/bin/ld.gold
であることを確認しましたwhich ld
が/usr/local/bin/ld
、clang++ はそれを使用しません。/usr/bin/ld に固定されているようです。clang++ は、
-plugin /usr/bin/../lib/LLVMgold.so
. それは間違っています。Clang の Fedora ディストリビューションでは/usr/lib64/llvm/LLVMgold.so
.
次の調整を加えて、上記のリンカー行を手動で呼び出してみました。
に置き換え
-plugin /usr/bin/../lib/LLVMgold.so
ます-plugin /usr/lib64/llvm/LLVMgold.so
。これにより、エラー メッセージが表示されますhello.o: file not recognized: File format not recognized
。そのため、非ゴールド リンカはプラグインを認識しているように見えますが、LLVM ビットコードを含む .o を取りません。に置き換え
/usr/bin/ld
ます/usr/bin/ld.gold
。これは機能し、期待どおりに実行される実行可能ファイルを生成します。上記の両方の
--plugin
代わりに-plugin
. この変更に違いはありません。
では、clang -flto を使用するためにシステム提供のパッケージに固執することを好む人にとって最良の方法は何でしょうか? これらをオーバーライドできる構成ファイル、または文書化されていないオプションまたは環境変数があることを願っています。または、パッケージが不足していて、「yum install ...」で修正されることをお勧めします。
リンカを直接呼び出さない方がよいと思います。なぜなら、makefile は、システム オブジェクトとライブラリ (たとえば、crt1.o、crtbegin.o、crtend.o) を認識していなければならないからです。自分で clang をビルドすることもできますが、configure スクリプトには、リンカーとプラグインのパスを構成できるものは何も表示されません。
Fedora 18 を実行しています。コンピューター上のディストリビューション以外のパッケージは、Google Chrome と VMware Tools (VMWare Fusion 内のゲスト) だけです。関連する Fedora パッケージのバージョン (2013 年 4 月 29 日現在、コンピューター全体が「yum 更新」されています):
c++ - LTO と仮想デストラクタの奇妙さ c++
GCC 4.8.1 で LTO を有効にしてコンパイル/リンクするときに問題が発生します。シンボルが存在するように見えても、DLL 内のシンボルへの未定義の参照を取得します。奇妙なことに、LTO を有効にしないと、正常にコンパイルおよびリンクされます。派生クラスで定義されていない仮想デストラクタがあると、LTO が苦労するようです。
- DECLSPEC を削除すると、LTO が有効な状態でコンパイルおよび動作するようになります。
- 依存関係ウォーカーは、シンボルがそこにあることを示しています。リンク時間オプティマイザーはそれらを見つけることができないようです。
- 派生クラスで任意のタイプのデストラクタを宣言
Test
すると、機能します。 - LTO 最適化を削除しても正常に機能しますが、なぜこれが問題なのか疑問に思っています。
Test は共有ライブラリで、Main は共有ライブラリへのリンクです。
Test.h
Test.cpp
メイン.cpp
私の厄介なメイクファイルを許してください..