如果我在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.非常感谢。
答案 0 :(得分:2)
Fortran程序中有两种常见的分段错误原因:
两者都比较容易找到:
这种错误(似乎)仅在优化升高时出现并不罕见。
修改强>
请注意,我并不是说优化会导致您观察到的错误,而是会导致错误影响程序的执行并变得明显。
不正确的程序运行很多次显然没有错误,例如,使用新的编译器版本进行重新编译以创建每次都崩溃的可执行文件。
我希望仅针对出现分段错误的子程序关闭优化,我建议完全是错误的。我希望我的程序能够在任何优化级别上正确执行(除了明确的编译器错误证据,这些事情并不为人所知)。我认为,通过关闭优化,你正在解决你的程序在地毯下的真正问题,就像它一样。