C $Header: /u/gcmpack/MITgcm/eesupp/inc/BARRIER.h,v 1.7 2005/11/08 15:53:41 cnh Exp $
C $Name: $
CBOP
C !ROUTINE: BARRIER.h
C !INTERFACE:
C include "BARRIER.h"
C !DESCRIPTION:
C *==========================================================*
C | BARRIER.h
C | o Globals used by Fortran barrier routine.
C *==========================================================*
C | These variables support a simple Fortran shared memory
C | barrier routine. They do busy waiting, that is the
C | thread that is waiting sits in a tight loop reading
C | some memory location and waiting for all other threads.
C | On some systems this is sometimes a good method to use.
C | On the T3E memory is not shared so the routine should
C | use the T3E "eureka" barriers. On CRAY and NEC there are
C | hardware barriers that are accessed through a compiler
C | directives. Finally proper multi-threading compilers
C | support barrier compile directives - sometimes these
C | are good, sometimes they are lousy.
C | The barrier mechanism is used as follows
C | 1. In the single-threaded part of the code
C | CALL FBAR\_INIT
C | on CRAY, NEC this routine does nothing
C | on T3E there is no single-threaded code
C | but there may be barrier initialisation -
C | need to check.
C | 2. When we need to synchronize everybody just
C | CALL FBAR( myThid )
C | where myThid is myThreadId
C | on CRAY, NEC FBAR will just do C\$DIR BARRIER
C | or the like.
C | on T3E FBAR does CALL BARRIER(...) or something
C | need to check this.
C *==========================================================*
CEOP
COMMON / BARRIER_COMMON / key1, key2, key3,
& door1, door2, door3,
& bCount, masterSet
INTEGER key1(lShare4,MAX_NO_THREADS)
INTEGER key2(lShare4,MAX_NO_THREADS)
INTEGER key3(lShare4,MAX_NO_THREADS)
INTEGER door1
INTEGER door2
INTEGER door3
INTEGER VALID
PARAMETER ( VALID = 1 )
INTEGER INVALID
PARAMETER ( INVALID = 0 )
INTEGER OPEN
PARAMETER ( OPEN = 1 )
INTEGER SHUT
PARAMETER ( SHUT = 0 )
INTEGER bCount(MAX_NO_THREADS)
INTEGER masterSet(MAX_NO_THREADS)