Optimization 优化ifort中的SIGSEGV
如果我在ifort中使用-O0编译,程序可以正确运行。但只要我打开优化选项,比如-O,-O3,-fast,就会出现SIGSEGV分段错误 此错误发生在名为maketable()的子例程中。以下是现象: (1) 我在这个子程序中调用fftw库。如果我评论关于fftw的句子,就可以了。但我认为这不是fftw的错,因为我在这段代码的其他地方也使用了fftw,它们很好 (2) fftw在循环中被调用,当程序崩溃时,循环可以运行多次。SEGFULT不会在第一次进入回路时发生 (3) 我考虑过堆栈溢出,但我现在不这么认为。我有别人很久以前编写的可执行文件,它可以在我的计算机上执行。我认为这表明这不是由于系统堆栈溢出造成的Optimization 优化ifort中的SIGSEGV,optimization,segmentation-fault,fftw,intel-fortran,Optimization,Segmentation Fault,Fftw,Intel Fortran,如果我在ifort中使用-O0编译,程序可以正确运行。但只要我打开优化选项,比如-O,-O3,-fast,就会出现SIGSEGV分段错误 此错误发生在名为maketable()的子例程中。以下是现象: (1) 我在这个子程序中调用fftw库。如果我评论关于fftw的句子,就可以了。但我认为这不是fftw的错,因为我在这段代码的其他地方也使用了fftw,它们很好 (2) fftw在循环中被调用,当程序崩溃时,循环可以运行多次。SEGFULT不会在第一次进入回路时发生 (3) 我考虑过堆栈溢出,但我
ifort的版本是10.0,fftw的版本是fftw-2.1.5。cpu类型为英特尔至强5130。非常感谢。Fortran程序中出现分段错误有两种常见原因:
我认为,您希望仅在出现分段错误时关闭子例程的优化是完全错误的。我希望我的程序在任何优化级别上都能正确执行(除了编译器错误的明显证据外,这类事情并非未知)。我认为,通过关闭优化功能,您正在掩盖您的程序的真正问题。尝试在valgrind下运行您的代码。是的,正如您所说。如果它超出了数组的范围,或者变量类型不匹配,那么没有优化的代码也会有问题。而且我也确信这段代码在很久以前可以被其他人正确编译和执行。我仍然怀疑这是因为编译器优化。有没有办法保护这个子程序不被优化???我希望所有其他部分都被优化编译,但不是这个子程序。我尝试在子例程中添加一些变量,但似乎没有帮助。