0

VisualC++コンパイラの最適化で奇妙な状況に直面しています。

10個の静的ライブラリを危険にさらす中規模のc++コードでは、最適化をオン(/ O1、/ O2、または/ Ox)にしてコードをコンパイルすると、プログラムを実行すると正しい出力が生成されます。

ただし、/ Odを使用すると、プログラムは誤った出力を生成します。

私はこの質問が非常に一般的であることを知っていますが、原因が何であるか、またはそれが何に関連している可能性があるかについての手がかりを感謝します。

psコードはFEM数値を実行しているため、浮動小数点演算の多くが実行されます。psコードはVisualStudio2010にあります。

編集:コードの出力例:

r(残差)の差はかなり大きい

I.最適化なし:

Solver. time: 0.12, iteration: 1
Solver.
------------------------------------
determining values:
         dg.            0
         limit of dg.   0.897278
         dr.            7675.3
         limit of dr.   45.3704
         r.             7675.3
         limit of r.    453.704
         dx.            0.122164
         limit of dx.   8.97278e-005
------------------------------------

II。最適化あり:

Solver. time: 0.12, iteration: 1
Solver.
------------------------------------
determining values:
         dg.            0
         limit of dg.   0.897278
         dr.            5894.53
         limit of dr.   45.3704
         r.             5894.53
         limit of r.    453.704
         dx.            0.122164
         limit of dx.   8.97278e-005
------------------------------------

psコード自体のサンプルを提供することはできませんが、bcsコードのどこから問題が発生しているのかは実際にはわかりません。

4

2 に答える 2

1

バグが明らかになりました。初期化されたように見える変数が初期化されていませんでした。数値ライブラリで(double) 定数kInfinity値を定義しました。他のライブラリ (数値ライブラリに大きく依存しているfemなど) は、数値ライブラリからプログラムの開始時にこの値を取得し、後でプログラムの実行を通じてこの値を使用しました。問題は、最初に数値ライブラリで初期化されるにこの値を取得したことです (これは競合状況のようなものでした)。

次に興味深い部分です。

  • 最適化を行わない場合、コンパイラは初期化されていない変数を「ゼロ」に設定します (非常によく知られた動作です)。そのような値が「線形弾性材料モデル」で「降伏応力」として使用される場合、それは非物理的な材料を意味し、コードを意味します興味深い出力を生成できません。

  • 最適化により、コンパイラは初期化されていない変数を「乱数」(私の場合は非常に大きい)に設定しました。そのような値が「線形弾性材料モデル」で「降伏応力」として使用される場合、それは完全に線形弾性材料を意味します (かなり物理的です)。

これは、最適化によって私のコードが機能したが、それなしでは機能しなかった理由を説明しています。

すべての返信と考えの共有に感謝します。

于 2012-10-12T17:26:23.517 に答える
0

It is difficult to say, but optimization could for example remove some arithmetic expressions and put "optimized" ones. By modifying the arithmetic expressions containing operations like addition, multiplication and so on, the results are influenced. You can have overflow, precision loss, ...

于 2012-10-11T12:32:23.300 に答える