【问题标题】:ifort -coarray=shared produces incorrect exit statusifort -coarray=shared 产生不正确的退出状态
【发布时间】:2014-09-18 11:58:47
【问题描述】:

如果我编译并运行

! main.f90
  print*, 1/0
end program

使用ifort 然后我得到一个除以零的错误,退出状态为 2 (echo $?),正如预期的那样。但是,如果我使用ifort -coarray=shared 编译,那么我仍然会收到错误,但现在退出状态为 0。问题是 CTest 无法捕获错误。这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(testing Fortran)
enable_testing()
add_executable(main EXCLUDE_FROM_ALL main.f90)
add_test(main main)
add_custom_target(check COMMAND ctest DEPENDS main)

如果我运行make check,那么输出是

100% tests passed, 0 tests failed out of 1

即使测试实际上失败了。如果我删除 -coarray=shared 或使用 gfortran,那么我会得到正确的输出

0% tests passed, 1 tests failed out of 1

如何让 CTest 报告测试失败?我做错了什么还是这是一个编译器错误?

【问题讨论】:

  • 我在您的帖子中没有看到任何问题,甚至没有问号。如果您认为这是一个错误,英特尔网站上有官方错误报告论坛和支持系统。
  • 我添加了一个问题,要清楚。我对 CMake 还很陌生,所以在不确定的情况下将上述内容报告为编译器错误时应该小心。
  • 如果你直接从 shell 运行你的 main 可执行文件,你会得到什么错误代码?
  • 从 shell 中我得到一个以“forrtl:严重(71):整数除以零......”开头的错误。但是,退出代码仍然是 0。
  • 在 CMake/CTest 中,您可以设置测试属性以检查测试的返回状态之外的其他内容,例如在输出中找到某个正则表达式时失败/通过。如果您为损坏的示例发布 crest —verbose 的输出,我们可以帮助您对 CMakeLists.txt 进行适当的修改。正如 Steve 所指出的,Fortran 中并没有真正的标准化返回状态,尤其是对于 SPMD 程序。

标签: cmake fortran intel-fortran


【解决方案1】:

我正在使用示例代码使用 ifort 14.0.1 进行测试

program test
  implicit none
  print *, 1/0
end program

我无法完全复制您的初始返回值3。在我的测试中echo $? 的结果是71,这与运行时错误抛出的消息相关(注意:gfortran 甚至不会编译示例):

forrtl: severe (71): integer divide by zero

不过,我正在从 coarray 版本复制您的返回代码 0。这里发生的事情有点复杂,因为 ifort 通过 MPI 调用实现 coarrays 并且 -coarray=shared 基本上将您的程序包装在一个包装器中,因此您不必调用 mpirunmpiexec 或必须运行英特尔的 @987654330 @ 处理 MPI 通信。很明显,coarray 图像(MPI 等级)都返回错误代码 3:

application called MPI_Abort(comm=0x84000000, 3) - process 4

exit status of rank 1: return code 3

由每个 MPI 等级发出,但可执行文件本身总是返回退出代码 0。我不清楚这是预期的行为还是错误,但启动 MPI 进程的包装器代码似乎没有不要查看每个等级的 MPI 返回代码。正如 cmets 中所指出的,我们如何期望处理来自不同 mpi 等级的不同返回值?看来你没有做错什么。

将此与普通 MPI 示例进行对比:

program mpitest
  use mpi
  implicit none
  integer :: rank, msize, merror, mstatus(MPI_STATUS_SIZE)
  call MPI_INIT(merror)
  call MPI_COMM_SIZE(MPI_COMM_WORLD, msize, merror)
  call MPI_COMM_RANK(MPI_COMM_WORLD, rank, merror)
  print *, 1/0
  call MPI_FINALIZE(merror)
end program

编译

mpiifort -o testmpi testmpi.f90

并运行为(mpd 正在运行):

mpirun -np 4 ./testmpi

这产生了一个严重的运行时错误 71,对于每个等级的整数除以零,但错误代码会传播回 shell:

$ echo $?
71

【讨论】:

  • 我也有这样的感觉,虽然每个图像都返回正确的退出代码,但代码不知何故不会通过包装器可执行文件传播。我将把这个问题带到英特尔论坛。
  • 如果图像 1 以状态 3 退出,图像 2 以状态 4 退出,您希望返回到 shell 的内容是什么?我会评论说,casey 的 MPI 示例是不可比较的,因为可以向 MPI 询问错误状态。 Fortran 没有传播甚至返回的退出状态的概念。 (您可以询问特定操作的状态。)现在,Fortran 标准确实“建议”使用 ERROR STOP 将值作为进程退出状态提供,我看到我们不这样做。也许如果一张图像以异常方式结束,我们可以将其状态作为特征传播。
  • 感谢您的解释,这对我来说很有意义。问题是我目前正在为软件包编写测试,并且使用 coarrays 测试总是通过(除非它们无法编译)。理想情况下,如果任何图像出现问题,退出代码应该不为零(在我的实际程序中,控制流遇到错误停止)。如果我想不出别的,我想我会串行运行测试。
  • 我已经要求开发人员看看 ERROR STOP 是否至少可以传播停止代码。标准“建议”发生这种情况。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多