【问题标题】:fortran error backtrace leads to a where loopfortran 错误回溯导致 where 循环
【发布时间】:2018-05-24 02:15:50
【问题描述】:

我正在编写大型 fortran 代码,在使用快速选项进行编译之前(为了在大型数据库上执行测试),我通常使用“警告”选项进行编译,以便检测和回溯所有问题。

所以使用gfortran -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -Wall -fcheck=all -ftrapv -g2 编译,我得到以下错误:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
 #0  0x7fec64cdfef7 in ???
 #1  0x7fec64cdf12d in ???
 #2  0x7fec6440e4af in ???
 #3  0x7fec64a200b4 in ???
 #4  0x7fec649dc5ce in ???
 #5  0x4cf93a in __f_mod_MOD
    at /f_mod.f90:132
 #6  0x407d55 in main_loop_
    at main.f90:419
 #7  0x40cf5c in main_prog
    at main.f90:180
 #8  0x40d5d3 in main
    at main.f90:68

而代码 f_mod.f90:132 的部分包含一个 where 循环:

! Compute s parameter
do i = 1, Imax
   where (dprim .ne. 1.0)
      s(:,:,:, :) = s(:,:,:, :) +vprim(:,:,:, i,:)*dprim(:,:,:, :)*dprim(:,:,:, :)/(1.0 -dprim(:,:,:, :))
   endwhere
enddo

但我在这里没有看到任何错误。所有其他位置都是通往这部分的子程序的调用。当然,由于这是一个 SIGFPE 错误,所以我在编译 gfortran -g1 时必须在执行时遇到问题。 (我在 linux 上使用 gfortran 6.4.0)

此外,此错误会随着代码的完全不同部分的修改而出现和消失。因此,问题来自这个 where 循环?或者来自其他地方并且回溯是错误的?如果是这种情况,我该如何找到这个错误?

编辑:

因为,我无法在一个最小的例子中重现这个错误(他们正在工作),我认为问题出在其他地方。但是如何在大代码中找到问题呢?

【问题讨论】:

  • 请发布实际消息和堆栈跟踪并尝试隔离minimal reproducible example
  • “此外,这个错误会随着代码的完全不同部分的修改而出现和消失。” 这看起来很可疑,更需要真正的 MCVE。
  • 我用完整的消息和回溯编辑了我的问题。但我无法生成 MCVE 也无法隔离问题。这就是我来寻求帮助的原因。我知道在没有 MCVE 时提供帮助并不容易,但我的想法已经不多了。
  • 我会扩展 WHERE 语句。掩蔽可能会隐藏您的问题。至少要调试代码。
  • 打印 where 语句中使用的不同数组的实际大小(即打印形状,最好还打印 lbounds 和 ubounds)?

标签: fortran gfortran sigfpe


【解决方案1】:

由于代码因 SIGFPE 而死,请使用每个单独的 可能的陷阱来了解它是否是 FE_DIVBYZERO、FE_INVALID、 FE_OVERFLOW 或 FE_UNDERFLOW。如果是下溢,则更改 你的面具到'1 - dprim .ne。 0'。

PS:当整个数组引用时不要使用数组节表示法 可以改用。

PPS:您可能希望在外部计算 dprim*drpim / (1 - dprim) 循环不变,因为它是循环不变的。

【讨论】:

  • 我不确定这是否能回答问题。 OP 做错了什么?
  • @Vladimir,无法访问代码,只能猜测 SIGFPE 的原因。如果 OP 执行 -ffpe-trap=invalid,则会在表达式中捕获 NaN。 OP 现在可以查找 s、dprim、vprim 之一如何获得 NaN 值。同样,我怀疑 SIGFPE 是由 -ffpe-trap=underflow 引起的。在没有访问代码的情况下,我怀疑 OP 是否真的需要担心陷入下溢,因为 gfortran 支持逐渐取消溢出,除非使用 IEEE 模块来更改掩码。
  • 是否下溢打印算术运算错误?无论如何,这就是我的观点,当没有人知道真正的答案时,为什么要回答呢?你只是冒险投反对票或举报。
  • SIGFPE 的错误信息来自操作系统,而不是 gfortran,所以不知道。我唯一的兴趣是帮助 OP 了解他/她的问题。我认为“不要使用你不理解的选项”是不恰当的回应。
  • @RN,鉴于 Vladimir 反对我向您提供有关如何隔离问题的想法,因此我不愿提供任何其他帮助。问问自己下溢是否是我的算法的实际问题?如果否,则从 -ffpe-trap= 中删除标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多