【发布时间】:2020-10-01 01:01:21
【问题描述】:
我们正在将我们系统中的 intel 编译器版本从 v14 更改为 v18,通过运行测试,我们注意到 O3 在某些情况下会产生不正确的结果,而相同的代码在 O3 和 v14 上运行正确。我想知道这两个版本之间的优化有什么区别,以及如何获得通过在每个版本中使用 O3 激活的标志的完整列表。提前感谢大家的帮助和建议。
【问题讨论】:
-
除了
O3,您还使用了哪些标志?当您将O2与 v18 一起使用时,您的测试是否通过了? -
终于有一群懂测试的了!我很佩服。恭喜。现在,我想,是时候让您的团队审查需求并确定他们认为需要 O3 的原因了。也许您的测试可以确认(或不能)较少/较低的优化总是避免“不正确的结果”,如果是这样,也许结果足够快(同时是正确的)。
-
另外,请注意,您可以隔离有问题的结果,以便在较低/较慢的优化级别进行编译。所有其余的代码都可以完全优化。如果您的测试继续有效,则此方法可能是解决您发现的问题的合理首次尝试。
-
@Dai 我没有检查过 O2 但 O0 很好
-
@2785528 不幸的是,时间差异很大,不接受非优化编译。此外,正如我所说,O3 的 v14 工作得非常好,我们没有任何问题。由于代码用于解决物理问题,我们可以验证最终结果,O3 v18 的不稳定性问题没有任何意义。
标签: c++ c compiler-optimization icc compiler-flags