如何在仅使用优化编译时出现NaN时,如何开始调试数字代码?

时间:2012-04-13 13:13:38

标签: debugging floating-point compiler-optimization scientific-computing compiler-options

在以下情况下开始调试数字代码的一般策略是什么:

  • 使用激进的优化标志编译的代码,在输出中生成偶然的NaN和Inf。
  • -g编译的代码(暗示-O0)与调试器一起运行,不再产生NaN和Inf?

在这种情况下,我正在使用Portland Group C ++编译器pgCC,并使用了优化选项

-w -fast -O3 -Mipa=fast -Mfprelaxed -Minline=levels:10

然后只是

-w -g

用于调试版本。但我确信g++也可能出现类似的情况。

编辑:添加打印语句不是一个非常诱人的选项,因为代码不是由我编写的,它是几千行,并且我不知道缩小搜索范围; NaN可能来自任何地方。

3 个答案:

答案 0 :(得分:3)

我会尝试查看是否可以启用浮点异常like done here,然后查看是否存在某些信令nan引发的异常。编译器中可能有一些编译器标志用于启用这些异常。

除此之外我还会进行手动二分查找。也就是说,编写一个转储所有变量的函数。然后将程序分成两半,而不是通过代码行,而是通过实际运行的程序,并将其隔离。换句话说,卷起袖子进去。

编辑:这可能不适用于您的情况,因为我给你的链接非常具体。但也许它会给你一些线索。或者您可以在免费的MS编译器上尝试代码?

答案 1 :(得分:2)

Portland Group编译器为指令提供了一些选项 - Mfprelaxed;我会尝试逐一设置这些,看看哪些有所作为。您可能只想从编译中删除此指令。

答案 2 :(得分:2)

我想指出,在g ++的情况下,-g标志不会抑制优化(也就是说,它并不意味着-O0)。包含调试信息的优化可执行文件更难调试,但肯定可以这样做。