/[MITgcm]/MITgcm/eesupp/src/barrier.F
ViewVC logotype

Annotation of /MITgcm/eesupp/src/barrier.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.14 - (hide annotations) (download)
Tue Aug 4 18:01:37 2009 UTC (14 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62v, checkpoint62u, checkpoint62t, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint62c, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62w, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint63g, checkpoint64, checkpoint65, checkpoint62, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint65o, checkpoint62b, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint61v, checkpoint61w, checkpoint61u, checkpoint61z, checkpoint61x, checkpoint61y, HEAD
Changes since 1.13: +48 -48 lines
changed to pass when compiling with strick checking of arguments across S/R

1 jmc 1.14 C $Header: /u/gcmpack/MITgcm/eesupp/src/barrier.F,v 1.13 2005/11/08 15:53:41 cnh Exp $
2 cnh 1.9 C $Name: $
3 cnh 1.1
4     #include "CPP_EEOPTIONS.h"
5    
6 cnh 1.9 CBOP
7     C !ROUTINE: BARRIER_INIT
8    
9     C !INTERFACE:
10 cnh 1.1 SUBROUTINE BARRIER_INIT
11 adcroft 1.6 IMPLICIT NONE
12 cnh 1.4
13 cnh 1.9 C !DESCRIPTION:
14     C *=====================================================================*
15 edhill 1.11 C | SUBROUTINE BARRIER\_INIT
16 cnh 1.9 C | o Setup global barrier data structures.
17     C *=====================================================================*
18     C | Initialise global barrier data structures that can be used in
19     C | conjunction with MPI or that can also be used to create
20     C *=====================================================================*
21    
22     C !USES:
23     C == Global variables ==
24 cnh 1.4 #include "SIZE.h"
25 cnh 1.1 #include "EEPARAMS.h"
26     #include "EESUPPORT.h"
27     #include "BARRIER.h"
28    
29 cnh 1.9 C !LOCAL VARIABLES:
30     C == Local Variables ==
31     C I :: Loop counter
32 cnh 1.1 INTEGER I
33 cnh 1.9 CEOP
34 cnh 1.1
35     DO I=1,nThreads
36     key1(1,I) = INVALID
37     key2(1,I) = INVALID
38     key3(1,I) = INVALID
39     door1 = SHUT
40     door2 = SHUT
41     door3 = SHUT
42 cnh 1.12 bCount(I) = 0
43 cnh 1.13 masterSet(I) = 0
44 cnh 1.1 ENDDO
45    
46     RETURN
47     END
48 cnh 1.9
49     CBOP
50     C !ROUTINE: BARRIER
51    
52     C !INTERFACE:
53 cnh 1.1 SUBROUTINE BARRIER( myThid )
54     IMPLICIT NONE
55 cnh 1.4
56 cnh 1.9 C !DESCRIPTION:
57     C *==========================================================*
58 jmc 1.14 C | SUBROUTINE BARRIER
59     C | o Barrier routine that uses "busy waiting".
60 cnh 1.9 C *==========================================================*
61 jmc 1.14 C | This routine provides a pure fortran mechanism to
62     C | synchronise multiple threads in a multi-threaded code.
63     C | No thread can leave this routine before all the threads
64     C | have entered it.
65     C | Notes
66     C | =====
67     C | The door and key variables are assumed to have been
68     C | initialized once an initial state of key = INVALID
69     C | and door = SHUT.
70     C | We use the routine FOOL\_THE\_COMPILER to stop compilers
71     C | generating code which might simply set and test a
72     C | register value. Shared-memory systems only maintain
73     C | coherency over process caches and not registers.
74     C | Also we have to be a bit careful regarding sequential
75     C | consistency - or lack of it. At the moment the code
76     C | assumes a total store order memory model, which some
77     C | machines do not have! However, I have yet to find a
78     C | problem with this I think because the tolerances in
79     C | terms of memory ordering i.e. a little bit of reordering
80     C | probably will not break the barrier mechanism!
81     C | On non-cache coherent systems e.g. T3E we need to use
82     C | a library function to do barriers.
83     C | Note - The PANIC tests can be removed for working code
84     C | I have left them in without an ifdef option
85     C | because without them programming errors can
86     C | lead to infinitely spinning code. If you are
87     C | confident that your code is OK then removing
88     C | them may increase performance. Do not remove these
89     C | lines to make your code "work" If the code is
90     C | stopping in these PANIC blocks then something is
91     C | wrong with your program and it needs to be fixed.
92 cnh 1.9 C *==========================================================*
93    
94     C !USES:
95     C == Global variables ==
96 cnh 1.4 #include "SIZE.h"
97 cnh 1.1 #include "EEPARAMS.h"
98     #include "EESUPPORT.h"
99     #include "BARRIER.h"
100    
101 cnh 1.9 C !INPUT PARAMETERS:
102     C == Routine arguments ==
103 cnh 1.1 INTEGER myThid
104    
105 cnh 1.9 C !LOCAL VARIABLES:
106 cnh 1.1 C === Local variables ===
107 jmc 1.14 C nDone :: Counter for number of threads that have
108 cnh 1.9 C completed a section.
109     C I :: Loop counter
110 cnh 1.1 INTEGER nDone
111     INTEGER I
112 cnh 1.9 CEOP
113 cnh 1.1
114     CcnhDebugStarts
115 cnh 1.3 C WRITE(myThid,*) ' Barrier entered '
116 cnh 1.1 CcnhDebugEnds
117    
118 cnh 1.12 #ifdef USE_OMP_THREADING
119     C$OMP BARRIER
120     bCount(myThid) = bCount(myThid) + 1
121 cnh 1.13 IF ( masterSet(myThid) .NE. 0 ) THEN
122 jmc 1.14 PRINT *, 'BARRIER called for master reg myThid == ',
123 cnh 1.13 & myThid, masterSet(myThid)
124     ENDIF
125 cnh 1.12 Cdbg C$OMP BARRIER
126     Cdbg DO I=2, nThreads
127     Cdbg IF (bCount(I) .NE. bCount(1) ) THEN
128     Cdbg PRINT *, bCount(1:nThreads)
129     Cdbg CALL SYSTEM('sleep 1')
130     Cdbg PRINT *, bCount(1:nThreads)
131     Cdbg PRINT *, bCount(1:nThreads)
132     Cdbg PRINT *, bCount(1:nThreads)
133     Cdbg PRINT *, bCount(1:nThreads)
134     Cdbg STOP ' barrier out of sync '
135     Cdbg ENDIF
136     Cdbg ENDDO
137     Cdbg C$OMP BARRIER
138     RETURN
139     #endif
140    
141 cnh 1.1 C-- Check that thread number is expected range
142     IF ( myThid .LT. 1 .OR. myThid .GT. nThreads ) THEN
143 heimbach 1.8 WRITE(*,*) '!!!!!!! PANIC !!!!!!! CATASTROPHIC ERROR'
144 jmc 1.14 WRITE(*,*) '!!!!!!! PANIC !!!!!!! in S/R BARRIER myThid = ',
145 cnh 1.5 & myThid, ' nThreads = ', nThreads
146 cnh 1.1 STOP 'ABNROMAL END: S/R BARRIER'
147     ENDIF
148    
149     C-- When every threads key1 is valid thread 1 will open door1.
150     IF ( key1(1,myThid) .EQ. VALID ) THEN
151 heimbach 1.8 WRITE(*,*) '!!!!!!! PANIC !!!!!!! CATASTROPHIC ERROR'
152 jmc 1.14 WRITE(*,*) '!!!!!!! PANIC !!!!!!! in S/R BARRIER myThid = ',
153 cnh 1.5 & myThid, ' key1 already validated'
154 cnh 1.1 STOP 'ABNROMAL END: S/R BARRIER'
155     ENDIF
156     key1(1,myThid) = VALID
157    
158     IF ( myThid .eq. 1 ) THEN
159     10 CONTINUE
160     nDone = 0
161     DO I=1,nThreads
162     if ( key1(1,I) .EQ. VALID ) nDone = nDone+1
163     ENDDO
164 jmc 1.14 CALL FOOL_THE_COMPILER( key1(1,1) )
165 cnh 1.1 IF ( nDone .LT. nThreads ) GOTO 10
166     door1 = OPEN
167     ELSE
168     11 CONTINUE
169     CALL FOOL_THE_COMPILER( door1 )
170     IF ( door1 .NE. OPEN ) GOTO 11
171     ENDIF
172     C-- Invalidate keys for door1 here as it is now open
173     key1(1,myThid) = INVALID
174    
175     CcnhDebugStarts
176     C IF ( myThid .EQ. 1 ) THEN
177 heimbach 1.8 C WRITE(*,*) ' DOOR1 Opened '
178 cnh 1.1 C ENDIF
179     CcnhDebugEnds
180    
181     C-- I can now shut door3 because I know everyone has reached
182 adcroft 1.10 C-- door1. I can not shut door1 because I do not know if everyone
183 cnh 1.1 C-- has "gone" through the door yet. Nobody has yet reached
184     C-- door3 because they have to go through door2 first.
185     IF ( myThid .EQ. 1 ) THEN
186     door3 = SHUT
187     ENDIF
188    
189     C-- When every threads key2 is valid thread 1 will open door2.
190     C Notes
191     C =====
192 jmc 1.14 C I think that to work with any memory model ( i.e. relaxed,
193 cnh 1.1 C partial store, total store) the variables key1, key2 and key3
194     C might need to be set to invalid by thread 1.
195 jmc 1.14 C
196 cnh 1.1 IF ( key2(1,myThid) .EQ. VALID ) THEN
197 heimbach 1.8 WRITE(*,*) '!!!!!!! PANIC !!!!!!! CATASTROPHIC ERROR'
198 jmc 1.14 WRITE(*,*) '!!!!!!! PANIC !!!!!!! in S/R BARRIER myThid = ',
199 cnh 1.5 & myThid, ' key2 already validated'
200 cnh 1.1 STOP 'ABNROMAL END: S/R BARRIER'
201     ENDIF
202     key2(1,myThid) = VALID
203     C
204     IF ( myThid .eq. 1 ) THEN
205     20 CONTINUE
206     nDone = 0
207     DO I=1,nThreads
208     if ( key2(1,I) .EQ. VALID ) nDone = nDone+1
209     ENDDO
210 jmc 1.14 CALL FOOL_THE_COMPILER( key2(1,1) )
211 cnh 1.1 IF ( nDone .LT. nThreads ) GOTO 20
212     door2 = OPEN
213     ELSE
214     21 CONTINUE
215     CALL FOOL_THE_COMPILER( door2 )
216     IF ( door2 .NE. OPEN ) GOTO 21
217     ENDIF
218    
219     C-- Invalidate keys for door2 here as it is now open
220     key2(1,myThid) = INVALID
221    
222     C-- I can now shut door1 because I know everyone has reached
223 adcroft 1.10 C-- door2. I can not shut door2 because I do not know if everyone
224 cnh 1.1 C-- has "gone" through the door yet. Nobody has yet reached
225     C-- door1 because they have to go through door3 first.
226     IF ( myThid .EQ. 1 ) THEN
227     door1 = SHUT
228     ENDIF
229 jmc 1.14
230    
231 cnh 1.1 C-- When every threads key3 is valid thread 1 will open door3.
232     IF ( key3(1,myThid) .EQ. VALID ) THEN
233 heimbach 1.8 WRITE(*,*) '!!!!!!! PANIC !!!!!!! CATASTROPHIC ERROR'
234 jmc 1.14 WRITE(*,*) '!!!!!!! PANIC !!!!!!! in S/R BARRIER myThid = ',
235 cnh 1.5 & myThid, ' key3 already validated'
236 cnh 1.1 STOP 'ABNROMAL END: S/R BARRIER'
237     ENDIF
238     key3(1,myThid) = VALID
239     C
240     IF ( myThid .eq. 1 ) THEN
241     30 CONTINUE
242     nDone = 0
243     DO I=1,nThreads
244     if ( key3(1,I) .EQ. VALID ) nDone = nDone+1
245     ENDDO
246 jmc 1.14 CALL FOOL_THE_COMPILER( key3(1,1) )
247 cnh 1.1 IF ( nDone .LT. nThreads ) GOTO 30
248     door3 = OPEN
249     ELSE
250     31 CONTINUE
251     CALL FOOL_THE_COMPILER( door3 )
252     IF ( door3 .NE. OPEN ) GOTO 31
253     ENDIF
254    
255     C-- Invalidate keys for door3 here as it is now open
256     key3(1,myThid) = INVALID
257    
258     C-- I can now shut door2 because I know everyone has reached
259 adcroft 1.10 C-- door3. I can not shut door3 because I do not know if everyone
260 cnh 1.1 C-- has "gone" through the door yet. Nobody has yet reached
261     C-- door2 because they have to go through door1 first.
262     IF ( myThid .EQ. 1 ) THEN
263     door2 = SHUT
264     ENDIF
265    
266     CcnhDebugStarts
267 cnh 1.3 C WRITE(myThid,*) ' Barrier exited '
268 cnh 1.1 CcnhDebugEnds
269 jmc 1.14
270 cnh 1.1 RETURN
271     END
272 cnh 1.13
273     CBOP
274     SUBROUTINE BARRIER_MS( myThid )
275     IMPLICIT NONE
276    
277     C !USES:
278     C == Global variables ==
279     #include "SIZE.h"
280     #include "EEPARAMS.h"
281     #include "EESUPPORT.h"
282     #include "BARRIER.h"
283     INTEGER myThid
284    
285     masterSet(myThid) = masterSet(myThid) + 1
286    
287     RETURN
288     END
289     SUBROUTINE BARRIER_MU( myThid )
290     IMPLICIT NONE
291    
292     C !USES:
293     C == Global variables ==
294     #include "SIZE.h"
295     #include "EEPARAMS.h"
296     #include "EESUPPORT.h"
297     #include "BARRIER.h"
298     INTEGER myThid
299    
300     masterSet(myThid) = masterSet(myThid) - 1
301    
302     RETURN
303     END

  ViewVC Help
Powered by ViewVC 1.1.22