У меня есть цикл 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