运行包含并行OpenMP区域的Fortran代码,我遇到了一个问题,即在代码运行一段时间后(在下面的代码中计数器= ~1,000,000,000),它会停止而不会崩溃或提供任何错误。重现问题的代码片段是:
program crasher
implicit none
integer*8 :: limit
integer*8 :: i,temp
integer*8 :: counter
limit=1062
counter=0
do
counter=counter+1
!$OMP PARALLEL &
!$OMP DEFAULT(none) &
!$OMP PRIVATE(i,temp) &
!$OMP SHARED(limit)
!$OMP DO
do i=1,limit
temp=0
enddo
!$OMP END DO
!$OMP END PARALLEL
if (mod(counter,100000).eq.0) then
write(6,'(A,I0)') "Number of runs: ",counter
endif
enddo
end program
当我执行strace -p PID
时,使用此代码生成的进程的PID(16个核心),其中一个产生:
...
futex(0x7f4617a91a00, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f4617a91a44, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 461, {1489578049, 907892000}, ffffffff^C) = -1 ETIMEDOUT (Connection timed out)
...
一遍又一遍,即使在其他进程停止做任何事情之后。在不同的机器上运行相同的代码,上面的strace输出不会出现,代码运行正常。以串行方式运行代码,它在两台机器上运行良好。
我已经使用ifort(v 15.0.2)以及gfortran(v 4.8.5)编译了两台机器上的结果相同:一台机器工作,另一台机器工作疯狂。
我发现了一些可能与linux内核有关的信息。产生错误的机器有“Linux 2.6.32-431.23.3.el6.x86_64”另一个“Linux 3.10.0-327.18.2.el7.x86_64”。有没有人知道如何解决/解决这个问题?