如果我编译并运行
! 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报告测试失败?我做错了还是编译器错误?
答案 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
基本上将程序包装在一个包装器中,因此您不必调用mpirun
,mpiexec
或必须运行英特尔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