0

我正面临 Visual C++ 编译器优化的奇怪情况。

在一个相当中等大小的 c++ 代码中,包含 10 个静态库,如果代码在优化为 On(/O1、/O2 或 /Ox)的情况下编译,则程序的运行会产生正确的输出。

但是,使用 /Od 时,程序会产生错误的输出。

我知道这个问题非常笼统,但我很欣赏任何线索可能是什么原因,或者它可能与什么相关联。

ps代码正在做有限元数值,很多浮点运算。ps 代码在 Visual Studio 2010 中。

编辑:代码的示例输出:

r(残差)的差异相当大

、无优化:

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
------------------------------------

二、优化

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

该错误被发现,它是一个未初始化的变量,看起来像已初始化!我在数值库中定义了一个(双)常数kInfinity值。其他库(fem等,它们非常依赖于numerics库)在程序开始时从numerics库中获取此值,以便稍后通过程序运行使用此值。问题是他们首先在数值库中初始化之前获取了这个值就像一场比赛。)

现在是有趣的部分:

  • 如果不进行优化,编译器会将未初始化的变量设置为“零”(这是众所周知的行为。)如果在“线性弹性材料模型”中将该值用作“屈服应力”,则表示非物理材料,即代码未能产生有趣的输出。

  • 通过优化,编译器将未初始化的变量设置为“随机”(在我的情况下非常大)数字。如果在“线弹性材料模型”中将该值用作“屈服应力”,则完美表示线弹性材料(相当物理)。

这就解释了为什么通过优化我的代码有效,但并非没有。

感谢所有的回复和分享想法。

于 2012-10-12T17:26:23.517 回答
0

很难说,但优化可以例如删除一些算术表达式并放入“优化”的表达式。通过修改包含加法、乘法等运算的算术表达式,结果会受到影响。你可以有溢出,精度损失,......

于 2012-10-11T12:32:23.300 回答