1

运行包含并行 OpenMP 区域的 Fortran 代码时,我遇到了一个问题,即在代码运行良好一段时间后(下面代码中的 counter=~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,使用此代码生成的进程(16 个核心)的 PI​​D,其中一个会产生:

...

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”。有谁知道如何解决/解决这个问题?

4

0 回答 0