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