質問

最適化をオンにして、ARMにGCCを使用して本当に奇妙な問題を抱えています。最適化なしでC ++アプリケーションをコンパイルすると、実行時に予想される結果が出力される実行可能ファイルが生成されます。最適化をオンにするとすぐに、つまり-O1-私のアプリケーションは期待される結果を生成できません。私は問題を見つけるために数日間試しましたが、私は無知です。コードから初期化された変数を排除し、厳密なエイリアシングが問題を引き起こす可能性のあるスポットを修正しましたが、それでも適切な結果はありません。

ARM(プロセッサはARM926EJ-S)にGCC 4.2.0を使用し、Montavista Linuxディストリビューションでアプリを実行しています。

以下は私が使用しているフラグです:

-O1 -fno-unroll-loops fno-merge-constants -fno-omit-frame-pointer -fno-toplevel-reorder \
-fno-defer-pop -fno-function-cse -Wuninitialized -Wstrict-aliasing=3 -Wstrict-overflow=3 \
-fsigned-char -march=armv5te -mtune=arm926ej-s -ffast-math

-o1フラグを削除して、アプリケーションを再コンパイル/再リンクするとすぐに、適切な出力結果が得られます。旗からわかるように、最適化を無効にしようとしたように、問題を引き起こすかもしれないが、それでも運がないと思いました。

この問題にさらに取り組む方法について、誰かが何かを持っていますか?

ありがとう

役に立ちましたか?

解決

一般的に言えば、「最適化が私のプログラムを破る」と言うと、それはあなたの99.9%です プログラム それは壊れています。最適化のみを有効にします 発見 コードの障害。

また、最適化オプションを簡単に進める必要があります。非常に特定の状況でのみ、標準オプション-O0、-O2、-O3、およびおそらく-OSを超えて他のものが必要になります。あなたがあなたを感じたら 行う それよりも具体的な設定が必要であり、最適化のマントラに注意してください。

測定、最適化、測定。

一度もない ここで「ガット感」で行きます。特定の非標準最適化オプションがアプリケーションに大きな利益をもたらすことを証明してください。 理由を理解してください (つまり、そのオプションが何をするか、そしてそれがあなたのコードに影響する理由を正確に理解してください)。

これは目隠しされたものをナビゲートするのに適した場所ではありません。

そして、最も防御的なオプション(-O1)の使用方法を確認し、半ダースの最適化を無効にし、 それから -fast -mathを追加して、あなたが現在それをやっていると仮定するように導きます。

まあ、おそらく片目。

しかし、一番下の行は次のとおりです。最適化を有効にすると、コードが破損すると、コードの過失である可能性が高いです。

編集: GCCマニュアルでこれを見つけました:

-ffast-math: :このオプションは、IEEEまたは数学関数のISOルール/仕様の正確な実装に依存するプログラムの出力が誤っている可能性があるため、-Oオプションによってオンにされることはありません。

これは、基本的に、あなたのことを言っています -O1 -ffast-math 確かに壊れる可能性があります 正しい コード。ただし、たとえ奪っても -ffast-math 現在の問題を削除してください、少なくともアイデアを持っている必要があります どうして. 。それ以外の場合は、単に問題を交換するだけです より不便な瞬間に問題があります 後で (製品がクライアントの場所で壊れるときなど)。本当か -ffast-math それが問題でした、またはあなたは数学コードを破っていますか 覆われていない-ffast-math?

他のヒント

-ffast-math 可能であれば避けるべきです。使用するだけです -O1 とりあえず、他のすべての最適化スイッチをドロップします。それでも問題が発生している場合は、デバッグを開始します。

コードを見ることなく、「おそらくバグがある」よりも具体的になるのは難しいです。

最適化を可能にすることを可能にする2つのシナリオがあり、プログラムのセマンティクスを変更します。

  • コンパイラにはバグがあります
  • コードにバグがあります。

後者はおそらく最も可能性が高いでしょう。具体的には、おそらくプログラムのどこかで未定義の行動に依存しています。あなたは、あなたが使用してコンパイルするときにたまたま真実であることに頼っています これ コンパイラオン これ コンピュータ これらは コンパイラフラグですが、言語では保証されていません。したがって、最適化を有効にすると、GCCはその動作を維持する義務がありません。

コードを見せてください。または、物事がうまくいかなくなるまでデバッガーでそれを踏み出します。

私はこれ以上具体的になることはできません。それは、ぶら下がっているポインター、未知の変数、エイリアシングルールの破壊、または未定義の結果をもたらす多くのことの1つを実行するだけであるかもしれません( i = i++)

最小限のテストケースを作成してみてください。 プログラムを書き直し、エラーに影響しないものを削除します。プロセスで自分でバグを発見する可能性がありますが、そうでない場合は、1スクリーンの例プログラムが必要なはずです できる 役職。

ちなみに、 もしも, 、他の人が推測しているように、そうです -ffast-math それはあなたのトラブルを引き起こします(つまり、Justでコンパイルします -O1 正常に動作します)、それからあなたはそこにいくつかの数学がある可能性がありますあなたはとにかく書き直す必要があります。それは少し単純化されていますが、 -ffast-math 数学的な数値を抽象化できるように、コンパイラが計算を本質的に並べ替えることを許可します - 実際のハードウェアでそうすることで、浮動小数点数は正確ではないため、わずかに異なる結果を引き起こす可能性があります。そのような浮遊点の詳細に依存することは、意図的ではない可能性があります。

バグを理解したい場合は、いずれにしても最小限のテストケースが重要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top