SIGSEGV在优化的ifort中

时间:2013-01-21 21:15:03

标签: optimization segmentation-fault sigsegv fftw intel-fortran

如果我在ifort中使用-O0进行编译,程序可以正常运行。但只要我打开优化选项,如-O,-O3,-fast,就会出现SIGSEGV分段错误。

在名为maketable()的子例程中发生此错误。以下是现象:

(1)我在这个子程序中调用fftw库。如果我评论关于fftw的句子,它就可以了。但我认为这不是fftw的错,因为我也在这段代码的其他地方使用fftw,它们很好。

(2)fftw在循环中调用,当程序崩溃时循环可以运行几次。段错误不会在第一次进入循环时发生。

(3)我认为堆栈溢出,但我现在不这么认为。我很久以前就有其他人编写的可执行文件了,可以在我的电脑上执行。我认为这表明它不是由于系统堆栈溢出造成的。

ifort的版本是10.0,fftw的版本是fftw-2.1.5。 cpu类型是intel xeon 5130.非常感谢。

1 个答案:

答案 0 :(得分:2)

Fortran程序中有两种常见的分段错误原因:

  1. 试图访问数组范围之外的元素。
  2. 过程调用中的实际和伪参数不匹配。
  3. 两者都比较容易找到:

    1. 您的编译器可以选择生成在运行时执行数组边界检查的代码。检查编译器文档,重新构建代码并重新运行它。如果这是问题的原因,您将收到一条错误消息,指出代码出错的位置。
    2. 为程序中的任何子程序和函数编写显式接口,或者使用模块以便编译器为您生成此类接口,或使用编译器选项(请参阅文档)检查参数类型是否在编译时匹配。 / LI>

      这种错误(似乎)仅在优化升高时出现并不罕见。

      修改

      请注意,我并不是说优化会导致您观察到的错误,而是会导致错误影响程序的执行并变得明显。

      不正确的程序运行很多次显然没有错误,例如,使用新的编译器版本进行重新编译以创建每次都崩溃的可执行文件。

      我希望仅针对出现分段错误的子程序关闭优化,我建议完全是错误的。我希望我的程序能够在任何优化级别上正确执行(除了明确的编译器错误证据,这些事情并不为人所知)。我认为,通过关闭优化,你正在解决你的程序在地毯下的真正问题,就像它一样。