[Omp] Still on the barrier (fwd)

James Beyer beyerj at cray.com
Mon Mar 12 07:45:30 PDT 2007


The example you have below is trying to explain how barriers bind to 
their enclosing parallel region.  The test case nesting looks something 
like:
!$ omp parallel
    !$ omp do
        !$ omp parallel
            !$ omp barrier

In this context the barrier binds to nearest parallel region which is a 
NON-worksharing parallel region nested inside of a worksharing parallel 
region.  For implementations which support nested parallel regions each 
thread of the omp-do construct will create a new team of 'n' threads 
when the hit the nested parallel region, for implementations that do not 
support nesting the enclosed parallel-region team will consist of the 
single thread that hits the parallel construct.  These new teams will 
barrier amongst themselves, however, the individual threads from the 
omp-do will not attempt to barrier at that level, as that is not the 
current active construct.  I.E. the barrier was bound to the nested 
parallel region!

I am unsure how well I have explained this.  If someone else can explain 
it better; please do!

james

Shengyan Hong wrote:
> Every OMP member,
>      I read the example A.15 in the spec25.
> Appendix A Examples 141
>       SUBROUTINE WORK(N)
>         INTEGER N
>       END SUBROUTINE WORK
>       SUBROUTINE SUB3(N)
>       INTEGER N
>         CALL WORK(N)
> !$OMP   BARRIER
>         CALL WORK(N)
>       END SUBROUTINE SUB3
>       SUBROUTINE SUB2(K)
>       INTEGER K
> !$OMP   PARALLEL SHARED(K)
>           CALL SUB3(K)
> !$OMP   END PARALLEL
>       END SUBROUTINE SUB2
> SUBROUTINE SUB1(N)
>       INTEGER N
>         INTEGER I
> !$OMP   PARALLEL PRIVATE(I) SHARED(N)
> !$OMP     DO
>           DO I = 1, N
>             CALL SUB2(I)
>           END DO
> !$OMP   END PARALLEL
>       END SUBROUTINE SUB1
>       PROGRAM A15
>         CALL SUB1(2)
>         CALL SUB2(2)
>         CALL SUB3(2)
>       END PROGRAM A15
>       Is the barrier nested in the work sharing region? Is it possible 
> for me to insert a barrier into a barrier by the form above?
>       If I cannot do so, what should I do to test the idle time in a 
> barrier for different threads on different processors? I mention the 
> problem in detail in Sunday's email.
>       Thank you very much.
>
> ---------- Forwarded message ----------
> Date: Mon, 12 Mar 2007 08:25:41 -0500
> From: James Beyer <beyerj at cray.com>
> To: Shengyan Hong <shhong at cse.psu.edu>
> Cc: omp at openmp.org
> Subject: Re: [Omp] Still on the barrier
>
> Shengyan Hong wrote:
>>       Since you tell me that barrier can not be added into the 
>> parallel region. Now can you tell me where I can add the barrier. I 
>> think that the place of the code should have 8 threads. Right? To the 
>> end, how can I use barrier in the fortran code? Thank you very much.
>>                                               Shengyan Hong
>> _______________________________________________
>> Omp mailing list
>> Omp at openmp.org
>> http://openmp.org/mailman/listinfo/omp
>>
> Just to be clear, no one has said you can not put a barrier in a 
> parallel region.  What has been stated is that barriers may not be 
> placed in work sharing constructs.  There are at least two types of 
> parallel regions, redundant and work sharing.  Barriers are properly 
> defined in redundant code as there is a reasonable guarantee that 
> every thread in the team will hit the same barrier.  In a work sharing 
> construct like a "parallel do" does the exact opposite of a redundant 
> region.  It ensures that no two threads will ever execute the same 
> iteration of a loop which means that barriers inside of the loop will 
> not have the same semantics as barriers in redundant regions.  I hope 
> this helps a bit.
>
> One other point, semantically "may not" means you are not allowed to 
> do something.  Whereas "can not" means it is not possible to do.  As 
> far as barriers inside of work sharing constructs are concerned the 
> spec says you "may not" place them there because the program will 
> become non-compliant.  However, to say "can not" would require the a 
> compiler to flag the barrier inside of a work sharing construct as an 
> error.  There is a very fine line being drawn here, but it is an 
> important line.  It is actually very possible to write "safe" programs 
> which have barriers inside of work sharing constructs, however, it is 
> dangerous enough that the casual programmer should not attempt it.
>
> BTW, if you look at page 154 of the 2.5 spec it explicitly shows that 
> it is incorrect to place a barrier inside of an omp do construct.
> A modified version of A.20.4f follows.
> !$omp parallel default(shared)
> !$omp do
>    do i = 1,n
>       call work(i,1)
> ! the following barrier shows incorrect nesting of a barrier in a loop 
> region.
> !$omp barrier
>       call work(i,2)
>    end do
> ! the following barrier shows correct nesting of a barrier in a 
> parallel region.
> !$omp barrier
> !$omp end parallel
>
> Does this help?
>
> james


More information about the Omp mailing list