Parallel processing 并行(OpenMP)Fortran代码在长时间后暂停,不会给出错误

Parallel processing 并行(OpenMP)Fortran代码在长时间后暂停,不会给出错误,parallel-processing,linux-kernel,fortran,openmp,futex,Parallel Processing,Linux Kernel,Fortran,Openmp,Futex,在运行包含并行OpenMP区域的Fortran代码时,我遇到了一个问题,即在代码正常运行一段时间后(下面的代码中的计数器=~100000000),它会暂停,而不会崩溃或提供任何错误。再现此问题的代码段是: program crasher implicit none integer*8 :: limit integer*8 :: i,temp integer*8 :: counter limit=1062 counter=0 do

在运行包含并行OpenMP区域的Fortran代码时,我遇到了一个问题,即在代码正常运行一段时间后(下面的代码中的计数器=~100000000),它会暂停,而不会崩溃或提供任何错误。再现此问题的代码段是:

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
当我使用由该代码生成的进程(16个内核)的PID执行strace-p PID时,其中一个进程会产生:

...

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(v15.0.2)和gfortran(v4.8.5)编译了这两台机器,结果是一样的:一台机器工作,另一台机器做疯狂的事情


我发现一些信息表明这可能是linux内核的问题。产生错误的计算机有“Linux 2.6.32-431.23.3.el6.x86_64”和其他“Linux 3.10.0-327.18.2.el7.x86_64”。有人知道如何解决这个问题吗?

您是否尝试过使用
gdb
查看暂停期间的进程堆栈?我会从大(计数器)开始,可能会使用模和整数*8表示1000000。当您删除该选项时会发生什么$OMP并行和并行$OMP端平行?或者可能是sumtemp=sumtemp+Temp并加上减量(+:sumtemp),并且有可能应该共享Temp。您是否尝试过使用gdb查看暂停期间的进程堆栈?我将从大(计数器)开始,可能对1000000使用模和整数*8。当您删除该选项时会发生什么$OMP并行和并行$OMP端平行?或者可能是sumtemp=sumtemp+Temp并加上还原(+:sumtemp),并且可能应该共享该温度。