-O3最適化を使用したGNU / Linuxのコンパイル


18

GNUツールとLinuxカーネルを-O3gcc最適化オプションでコンパイルすると、奇妙で​​ファンキーなバグが発生すると言われています。本当ですか?誰もがそれを試しましたか、それは単なるデマですか?


また興味深いことに-O0、まったくサポートされていません!stackoverflow.com/questions/29151235/...
チロSantilli新疆改造中心法轮功六四事件

回答:



17

-O3 いくつかの欠点があります:

  1. まず第一に、-O2またはよりも遅いコードを生成することがよくあります-Os。ループのアンロールが原因で長いコードが生成される場合がありますが、実際にはコードのキャッシュパフォーマンスが低下するために遅くなる場合があります。
  2. 言われたように、それは時々間違ったコードを生成します。最適化のエラーまたはコードのエラー(厳密なエイリアスの無視など)が原因である可能性があります。カーネルコードは時々「スマート」である必要があるため、カーネル開発者が何らかのエラーを犯した可能性もあります。その時点で安定していたgcc 4.5でカーネルをコンパイルすると、ユーザースペースユーティリティのクラッシュなど、さまざまな奇妙な問題が発生しました。さまざまなバグのため、カーネルといくつかの選択されたユーザースペースユーティリティにgcc 4.4を使用しています。同じことが適用され-O3ます。
  3. Linuxカーネルに大きな利点はないと思います。カーネルは大量の計算を行わず、アセンブリを使用して最適化されます。-O3flagは、コンテキスト切り替えのコストやI / Oの速度を変更しません。全体的なパフォーマンスの<0.1%の高速化は価値があるとは思いません。

6
Linuxは-fno-strict-aliasingでコンパイルされます。Linusはgccが愚かで過度に制限的であると考えているためです。それを参照してください)。mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.htmlを
Spudd86

@ Spudd86:彼は、それらが明らかにコードを読む人間やコンパイラーのためではないことを意味したのですか?私が言ったように、カーネルはユーザースペースプログラムがしてはいけない賢いことを時々する必要があります。ユーザースペースにとって意味のあるもの(一部の領域では重度の最適化)は、カーネルにとっては意味がないかもしれません(さまざまな場所での大量のスマートコード+ボトルネック)。
マチェイピエチョカ

1
彼が言ったことはユーザースペースにも当てはまりません。
-Spudd86

1
@ Spudd86:それに私は同意しません。このような「明白な」ことを見つけるのにコンパイラーを「十分にスマート」にすることは簡単ではありません。したがって、唯一の可能な方法は、a)スローコード(HPCなどの一部のユースケースでは受け入れられない)のみを生成する、および/またはプログラマーにコードを手動で最適化するように強制するb)ルールをより厳しくして「ダンバー」を許可する最適化を行うコンパイラ-C標準で採用されているルート。
マチェイピエチョトカ

6

最適化レベルを変更すると、ツールチェーンの大部分(特にglibc)が完全にコンパイルされないことに注意してください。ビルドシステムは、ほとんどの健全なディストリビューションでこれらのセクションの-O設定を無視するように設定されています。

簡単に言えば、特定の基本的なライブラリとOSの機能は、多くの場合高速になるものではなく、実際にコードが実行することに依存しています。特に-fgcse-after-reload(-O3で有効化)は奇妙な問題を引き起こす可能性があります。


5

過去10年間、私は-O3 -march=nativeグローバルに1000以上のパッケージを使用して複数のGentooシステムを実行してきましたが、これらの神話上の安定性の問題にまだ遭遇していません-O3。CPUを集中的に使用するアプリケーション(数学/科学アプリなど)のベンチマークは-O3、より高速なコードを生成することを一貫して示しています。大部分のデスクトップアプリCFLAGSはIOバウンドであるため、とにかくそれほど重要ではありませんが、CPUバウンドであるサーバー側のものにとっては非常に重要です。


3

-O3は、レジスタの使用、スタックフレームとの相互作用、および関数の再入に関する特定の仮定が真である場合にのみ安全ないくつかの積極的な最適化を使用します。使用(カーネルとそのドライバーモジュールの一部の非常に低レベルの部分にあるように)。


それはあなたが実際にベンチマークを思い付くとVSそれをテストする必要があり、常に速くはありません言うまでもありません-O2天候やない、それは痛いか助け知っている
Spudd86

0

ほとんどのアプリケーションで-O3およびその他の最適化ノブを使用することで回避できますが(速度が向上する可能性があります)、カーネル自体またはそのビルドに必要なツールチェーン(コンパイラ、binutils、等。)。

考えてみてください:raidおよびext3サブシステムの5%のパフォーマンス向上は、システムクラッシュまたは潜在的なデータ損失や破損の価値がありますか?

再生中のQuakeポートまたはDVDコレクションをdivxファイルにリッピングするために使用するオーディオ/ビデオコーデックに必要なすべてのノブを微調整します。おそらく改善が見られます。無駄にする時間がなくて、データを失うのを我慢できない限り、カーネルを混乱させないでください。


3
私はそれが価値があるかどうか、安全かどうか、またはなぜこれを行うべきではないのかを尋ねていません。私が尋ねているのは事実であり、実際のアプリケーションで本当にバグを生成しますか?そう証明された..
uray
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.