Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 优化ifort中的SIGSEGV_Optimization_Segmentation Fault_Fftw_Intel Fortran - Fatal编程技术网

Optimization 优化ifort中的SIGSEGV

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中使用-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下运行您的代码。是的,正如您所说。如果它超出了数组的范围,或者变量类型不匹配,那么没有优化的代码也会有问题。而且我也确信这段代码在很久以前可以被其他人正确编译和执行。我仍然怀疑这是因为编译器优化。有没有办法保护这个子程序不被优化???我希望所有其他部分都被优化编译,但不是这个子程序。我尝试在子例程中添加一些变量,但似乎没有帮助。