Параллельный (OpenMP) код Fortran останавливается после долгого времени без выдачи ошибки

Запустив код Fortran, содержащий параллельную область OpenMP, я столкнулся с проблемой, заключающейся в том, что после некоторого времени, когда код работает нормально (счетчик =~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". У кого-нибудь есть идеи как это исправить / обойти?

0 ответов

Другие вопросы по тегам