ifort -coarray = shared产生错误的退出状态

时间:2014-09-18 11:58:47

标签: cmake fortran intel-fortran

如果我编译并运行

! 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报告测试失败?我做错了还是编译器错误?

1 个答案:

答案 0 :(得分: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调用实现了coarray,而-coarray=shared基本上将程序包装在一个包装器中,因此您不必调用mpirunmpiexec或必须运行英特尔mpd来处理MPI通信。很明显,coarray图像(MPI排名)都返回错误代码3:

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

exit status of rank 1: return code 3

是由每个MPI排名发出的,但是可执行文件本身总是以退出代码0返回。这是不是预期的行为还是我不清楚的错误,但启动MPI进程的包装器代码似乎没有& #39;查看每个等级的MPI返回码。正如评论中指出的那样,我们如何期望处理来自不同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