Как синхронизировать в цикле Фортран делать с OpenMP? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть цикл do с двумя операторами if внутри.И я хочу, чтобы потоки синхронизировались после того, как они закончили первый if, то есть я хочу убедиться, что все они завершили обновление первого оператора if, они могут начать обновлять второй.

Я пытался использовать! $ OMP BARRIER, но общее время итерации (переменная: ITER) отличалось от последовательного случая.

Вот мой цикл обновления:

DO ITER=1,ITERMAX
        DUMAX=0.0D0
         !$OMP PARALLEL PRIVATE(I,J,K,P,T_OLD), SHARED(T), REDUCTION(MAX:DUMAX)
            !$OMP DO 
            DO I=2, N-1
                DO J=2, N-1
                    ! UPDATE BLACK NODES
                    IF (MOD(I+J,2)==0) THEN
                        T_OLD=T(I,J)
                        T(I,J)=0.25*(T(I,J-1)+T(I,J+1)+T(I+1,J)+&
                                        T(I-1,J)-DX**2*S(I,J))
                        DUMAX=MAX(DUMAX, ABS(T_OLD-T(I,J)))
                    END IF
                END DO
            END DO
            !$OMP END DO
            !$OMP BARRIER
            !$OMP DO
            DO K=2,N-1
                    DO P=2,N-1
                    IF (MOD(K+P,2)==1) THEN
                        T_OLD=T(K,P)
                        T(K,P)=0.25*(T(K,P-1)+T(K,P+1)+T(K+1,P)+&
                                        T(K-1,P)-DX**2*S(K,P))
                        DUMAX=MAX(DUMAX, ABS(T_OLD-T(K,P)))
                    END IF

                END DO

            END DO
            !$OMP END DO
        !$OMP END PARALLEL 
        ! check convergence
        IF (DUMAX <= TOL) EXIT
    END DO
...