C $Header: /u/gcmpack/MITgcm/eesupp/inc/BAR2.h,v 1.4 2004/03/27 03:51:50 edhill Exp $
C $Name: $
C
CBOP
C !ROUTINE: BAR2.h
C !INTERFACE:
C include "BAR2.h"
C !DESCRIPTION:
C *==========================================================*
C | BAR2.h
C | o Globals used by BAR2 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 BAR2\_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 BAR2( myThid )
C | where myThid is myThreadId
C | on CRAY, NEC FBAR will just do C\$DIR BARRIER
C | or CALL BARRIER or the like.
C | on T3E FBAR does CALL BARRIER(...) or something
C | need to check this.
C *==========================================================*
CEOP
COMMON /BAR2_BUFFER_I/
& BAR2_level,
& BAR2_barrierCount,
& BAR2_spinsCount, BAR2_spinsMax, BAR2_spinsMin
INTEGER BAR2_level(cacheLineSize/4,MAX_NO_THREADS)
INTEGER BAR2_barrierCount(cacheLineSize/4,MAX_NO_THREADS)
INTEGER BAR2_spinsCount(cacheLineSize/4,MAX_NO_THREADS)
INTEGER BAR2_spinsMax(cacheLineSize/4,MAX_NO_THREADS)
INTEGER BAR2_spinsMin(cacheLineSize/4,MAX_NO_THREADS)
COMMON /BAR2_L/ bar2CollectStatistics
LOGICAL bar2CollectStatistics