cel*_*vek 2 c++ gcc compiler-optimization fast-math
我在使用GCC for ARM时出现了一个非常奇怪的问题,并且启用了优化.在没有优化的情况下编译我的C++应用程序会生成一个可执行文件,在运行时输出预期的结果.一旦我打开优化 - 即-O1 - 我的应用程序就无法产生预期的结果.我试了几天才发现问题,但我很无能为力.我从我的代码中删除了任何未初始化的变量,我纠正了严格混叠可能导致问题但仍然没有正确结果的位置.
我正在使用GCC 4.2.0 for ARM(处理器是ARM926ej-s)并在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
Run Code Online (Sandbox Code Playgroud)
一旦我剥离-O1标志并重新编译/重新链接应用程序,我就会得到正确的输出结果.正如你从旗帜中看到我试图禁用任何优化我认为它可能会导致问题,但仍然没有运气.
有没有人对如何进一步解决这个问题有任何指示?
谢谢
一般来说,如果你说"优化打破了我的程序",你的程序就会被破坏99.9%.启用优化仅揭示代码中的错误.
您还应该轻松完成优化选项.只有在非常特殊的情况下,您才需要除标准选项-O0,-O2,-O3和-Os之外的任何其他选项.如果您觉得确实需要更多特定设置,请注意优化的口号:
测量,优化,测量.
永远不要去这里"直觉".证明某个非标准优化选项确实有效地使您的应用程序受益,并理解为什么(即,准确理解该选项的作用以及它为什么会影响您的代码).
这不是蒙住眼睛的好地方.
看看你如何使用防御性最强的选项(-O1),然后禁用六个优化,然后添加-ffast-math,让我假设你正在做这个.
好吧,也许是独眼.
但最重要的是:如果启用优化会破坏您的代码,那么很可能是代码的错误.
编辑:我刚刚在GCC手册中找到了这个:
-ffast-math:任何-O选项都不应该打开此选项,因为它可能导致程序的输出不正确,这取决于数学函数的IEEE或ISO规则/规范的精确实现.
这确实说,基本上,你-O1 -ffast-math确实可以打破正确的代码.但是,即使拿走-ffast-math会消除当前的问题,你至少应该知道原因.否则,你可能只是交换你的问题,现在有一个问题,在一个更加不方便片刻后(比如,当你的产品打破你的客户端的位置).这真的-ffast-math是问题所在,还是你发现了破坏的数学代码-ffast-math?
| 归档时间: |
|
| 查看次数: |
2918 次 |
| 最近记录: |