如何在Fortran do循环中与OpenMP同步?

时间:2019-02-22 15:28:50

标签: r parallel-processing fortran openmp

我有一个do循环,里面有两个if语句。而且我希望线程在第一个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

0 个答案:

没有答案