gpt4 book ai didi

optimization - 优化 ifort 中的 SIGSEGV

转载 作者:行者123 更新时间:2023-12-03 17:33:04 24 4
gpt4 key购买 nike

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

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

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

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

(3)我考虑过堆栈溢出,但我现在不这么认为。我有很久以前别人编译的可执行文件,可以在我的电脑上执行。我认为这表明这不是由于系统堆栈溢出。

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

最佳答案

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

  • 试图访问数组边界之外的元素。
  • 过程调用中的实际参数和虚拟参数不匹配。

  • 两者都比较容易找到:
  • 您的编译器可以选择生成在运行时执行数组边界检查的代码。检查您的编译器文档,重建您的代码并重新运行它。如果这是问题的原因,您将收到一条错误消息,指出您的代码出错的地方。
  • 为程序中的任何子例程和函数编程显式接口(interface),或使用模块以便编译器为您生成此类接口(interface),或使用编译器选项(参见文档)在编译时检查参数类型是否匹配。

  • 此类错误(似乎)仅在优化调高时才会出现,这并不罕见。

    编辑

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

    不正确的程序显然可以毫无故障地运行多次,这并不陌生,例如,使用新的编译器版本重新编译以创建每次都崩溃的可执行文件。

    我认为,您希望仅对似乎出现段错误的子例程关闭优化,这是完全错误的。我希望我的程序在任何优化级别上都能正确执行(除了编译器错误的明确证据,这些事情并不未知)。我认为,通过关闭优化,您可以在地毯下扫除程序的一个真正问题,就像它一样。

    关于optimization - 优化 ifort 中的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447324/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com