source: codes/icosagcm/trunk/src/transfert_omp.f90 @ 186

Last change on this file since 186 was 186, checked in by ymipsl, 10 years ago

Add new openMP parallelism based on distribution of domains on threads. There is no more limitation of number of threads by MPI process.

YM

File size: 16.6 KB
Line 
1MODULE transfert_omp_mod
2  PRIVATE
3 
4  INTEGER,PARAMETER :: grow_factor=1.5
5  INTEGER,PARAMETER :: size_min=1024
6 
7  CHARACTER(LEN=size_min),SAVE            :: buffer_c
8!  INTEGER,SAVE                            :: size_c=0
9  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_i
10  INTEGER,SAVE                            :: size_i=0
11  REAL,SAVE,ALLOCATABLE,DIMENSION(:)      :: buffer_r
12  INTEGER,SAVE                            :: size_r=0
13  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_l
14  INTEGER,SAVE                            :: size_l=0
15
16
17 
18 
19  INTERFACE bcast_omp
20    MODULE PROCEDURE bcast_omp_c,                                                     &
21                     bcast_omp_i,bcast_omp_i1,bcast_omp_i2,bcast_omp_i3,bcast_omp_i4, &
22                     bcast_omp_r,bcast_omp_r1,bcast_omp_r2,bcast_omp_r3,bcast_omp_r4, &
23                     bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4
24  END INTERFACE
25
26  INTERFACE reduce_sum_omp
27    MODULE PROCEDURE reduce_sum_omp_i,reduce_sum_omp_i1,reduce_sum_omp_i2,reduce_sum_omp_i3,reduce_sum_omp_i4, &
28                     reduce_sum_omp_r,reduce_sum_omp_r1,reduce_sum_omp_r2,reduce_sum_omp_r3,reduce_sum_omp_r4
29  END INTERFACE
30
31  INTERFACE allreduce_sum_omp
32    MODULE PROCEDURE allreduce_sum_omp_i,allreduce_sum_omp_i1,allreduce_sum_omp_i2,allreduce_sum_omp_i3,allreduce_sum_omp_i4, &
33                     allreduce_sum_omp_r,allreduce_sum_omp_r1,allreduce_sum_omp_r2,allreduce_sum_omp_r3,allreduce_sum_omp_r4
34  END INTERFACE
35
36  PUBLIC bcast_omp, reduce_sum_omp, allreduce_sum_omp
37 
38CONTAINS
39
40  SUBROUTINE check_buffer_i(buff_size)
41  IMPLICIT NONE
42  INTEGER :: buff_size
43
44!$OMP BARRIER
45!$OMP MASTER
46    IF (buff_size>size_i) THEN
47      IF (ALLOCATED(buffer_i)) DEALLOCATE(buffer_i)
48      size_i=MAX(size_min,INT(grow_factor*buff_size))
49      ALLOCATE(buffer_i(size_i))
50    ENDIF
51!$OMP END MASTER
52!$OMP BARRIER
53 
54  END SUBROUTINE check_buffer_i
55 
56  SUBROUTINE check_buffer_r(buff_size)
57  IMPLICIT NONE
58  INTEGER :: buff_size
59
60!$OMP BARRIER
61!$OMP MASTER
62    IF (buff_size>size_r) THEN
63      IF (ALLOCATED(buffer_r)) DEALLOCATE(buffer_r)
64      size_r=MAX(size_min,INT(grow_factor*buff_size))
65      ALLOCATE(buffer_r(size_r))
66    ENDIF
67!$OMP END MASTER
68!$OMP BARRIER
69 
70  END SUBROUTINE check_buffer_r
71 
72  SUBROUTINE check_buffer_l(buff_size)
73  IMPLICIT NONE
74  INTEGER :: buff_size
75
76!$OMP BARRIER
77!$OMP MASTER
78    IF (buff_size>size_l) THEN
79      IF (ALLOCATED(buffer_l)) DEALLOCATE(buffer_l)
80      size_l=MAX(size_min,INT(grow_factor*buff_size))
81      ALLOCATE(buffer_l(size_l))
82    ENDIF
83!$OMP END MASTER
84!$OMP BARRIER
85 
86  END SUBROUTINE check_buffer_l
87   
88!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
89!! Definition des Broadcast --> 4D   !!
90!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91
92!! -- Les chaine de charactère -- !!
93
94  SUBROUTINE bcast_omp_c(var)
95  IMPLICIT NONE
96    CHARACTER(LEN=*),INTENT(INOUT) :: Var
97   
98    CALL bcast_omp_cgen(Var,len(Var),buffer_c)
99   
100  END SUBROUTINE bcast_omp_c
101
102!! -- Les entiers -- !!
103 
104  SUBROUTINE bcast_omp_i(var)
105  IMPLICIT NONE
106    INTEGER,INTENT(INOUT) :: Var
107    INTEGER :: Var_tmp(1)
108   
109    Var_tmp(1)=Var
110    CALL check_buffer_i(1)
111    CALL bcast_omp_igen(Var_tmp,1,buffer_i)
112    Var=Var_tmp(1)
113
114  END SUBROUTINE bcast_omp_i
115
116
117  SUBROUTINE bcast_omp_i1(var)
118  IMPLICIT NONE
119    INTEGER,INTENT(INOUT) :: Var(:)
120   
121    CALL check_buffer_i(size(Var))
122    CALL bcast_omp_igen(Var,size(Var),buffer_i)
123
124  END SUBROUTINE bcast_omp_i1
125
126
127  SUBROUTINE bcast_omp_i2(var)
128  IMPLICIT NONE
129    INTEGER,INTENT(INOUT) :: Var(:,:)
130   
131    CALL check_buffer_i(size(Var))
132    CALL bcast_omp_igen(Var,size(Var),buffer_i)
133
134  END SUBROUTINE bcast_omp_i2
135
136
137  SUBROUTINE bcast_omp_i3(var)
138  IMPLICIT NONE
139    INTEGER,INTENT(INOUT) :: Var(:,:,:)
140
141    CALL check_buffer_i(size(Var))
142    CALL bcast_omp_igen(Var,size(Var),buffer_i)
143
144  END SUBROUTINE bcast_omp_i3
145
146
147  SUBROUTINE bcast_omp_i4(var)
148  IMPLICIT NONE
149    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
150   
151    CALL check_buffer_i(size(Var))
152    CALL bcast_omp_igen(Var,size(Var),buffer_i)
153
154  END SUBROUTINE bcast_omp_i4
155
156
157!! -- Les reels -- !!
158
159  SUBROUTINE bcast_omp_r(var)
160  IMPLICIT NONE
161    REAL,INTENT(INOUT) :: Var
162    REAL :: Var_tmp(1)
163   
164    Var_tmp(1)=Var
165    CALL check_buffer_r(1)
166    CALL bcast_omp_rgen(Var_tmp,1,buffer_r)
167    Var=Var_tmp(1)
168
169  END SUBROUTINE bcast_omp_r
170
171
172  SUBROUTINE bcast_omp_r1(var)
173  IMPLICIT NONE
174    REAL,INTENT(INOUT) :: Var(:)
175   
176    CALL check_buffer_r(size(Var))
177    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
178
179  END SUBROUTINE bcast_omp_r1
180
181
182  SUBROUTINE bcast_omp_r2(var)
183  IMPLICIT NONE
184    REAL,INTENT(INOUT) :: Var(:,:)
185   
186    CALL check_buffer_r(size(Var))
187    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
188
189  END SUBROUTINE bcast_omp_r2
190
191
192  SUBROUTINE bcast_omp_r3(var)
193  IMPLICIT NONE
194    REAL,INTENT(INOUT) :: Var(:,:,:)
195
196    CALL check_buffer_r(size(Var))
197    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
198
199  END SUBROUTINE bcast_omp_r3
200
201
202  SUBROUTINE bcast_omp_r4(var)
203  IMPLICIT NONE
204    REAL,INTENT(INOUT) :: Var(:,:,:,:)
205   
206    CALL check_buffer_r(size(Var))
207    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
208
209  END SUBROUTINE bcast_omp_r4
210
211 
212!! -- Les booleans -- !!
213
214  SUBROUTINE bcast_omp_l(var)
215  IMPLICIT NONE
216    LOGICAL,INTENT(INOUT) :: Var
217    LOGICAL :: Var_tmp(1)
218   
219    Var_tmp(1)=Var
220    CALL check_buffer_l(1)
221    CALL bcast_omp_lgen(Var_tmp,1,buffer_l)
222    Var=Var_tmp(1)
223
224  END SUBROUTINE bcast_omp_l
225
226
227  SUBROUTINE bcast_omp_l1(var)
228  IMPLICIT NONE
229    LOGICAL,INTENT(INOUT) :: Var(:)
230   
231    CALL check_buffer_l(size(Var))
232    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
233
234  END SUBROUTINE bcast_omp_l1
235
236
237  SUBROUTINE bcast_omp_l2(var)
238  IMPLICIT NONE
239    LOGICAL,INTENT(INOUT) :: Var(:,:)
240   
241    CALL check_buffer_l(size(Var))
242    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
243
244  END SUBROUTINE bcast_omp_l2
245
246
247  SUBROUTINE bcast_omp_l3(var)
248  IMPLICIT NONE
249    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
250
251    CALL check_buffer_l(size(Var))
252    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
253
254  END SUBROUTINE bcast_omp_l3
255
256
257  SUBROUTINE bcast_omp_l4(var)
258  IMPLICIT NONE
259    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
260   
261    CALL check_buffer_l(size(Var))
262    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
263
264  END SUBROUTINE bcast_omp_l4
265 
266
267
268
269  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
270    IMPLICIT NONE
271 
272    INTEGER,INTENT(IN)  :: VarIn
273    INTEGER,INTENT(OUT) :: VarOut
274    INTEGER             :: VarIn_tmp(1)
275    INTEGER             :: VarOut_tmp(1)
276   
277    VarIn_tmp(1)=VarIn
278    CALL Check_buffer_i(1)   
279    CALL reduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
280    VarOut=VarOut_tmp(1)
281   
282  END SUBROUTINE reduce_sum_omp_i
283
284  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
285    IMPLICIT NONE
286 
287    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
288    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
289   
290    CALL Check_buffer_i(size(VarIn))   
291    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
292   
293  END SUBROUTINE reduce_sum_omp_i1
294 
295 
296  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
297    IMPLICIT NONE
298 
299    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
300    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
301
302    CALL Check_buffer_i(size(VarIn))   
303    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
304 
305  END SUBROUTINE reduce_sum_omp_i2
306
307
308  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
309    IMPLICIT NONE
310 
311    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
312    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
313   
314    CALL Check_buffer_i(size(VarIn))   
315    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
316 
317  END SUBROUTINE reduce_sum_omp_i3
318
319
320  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
321    IMPLICIT NONE
322
323    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
324    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
325 
326    CALL Check_buffer_i(size(VarIn))   
327    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
328 
329  END SUBROUTINE reduce_sum_omp_i4
330
331
332  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
333    IMPLICIT NONE
334 
335    REAL,INTENT(IN)  :: VarIn
336    REAL,INTENT(OUT) :: VarOut
337    REAL             :: VarIn_tmp(1)
338    REAL             :: VarOut_tmp(1)
339   
340    VarIn_tmp(1)=VarIn
341    CALL Check_buffer_r(1)   
342    CALL reduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
343    VarOut=VarOut_tmp(1)
344 
345  END SUBROUTINE reduce_sum_omp_r
346
347  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
348    IMPLICIT NONE
349 
350    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
351    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
352   
353    CALL Check_buffer_r(size(VarIn))   
354    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
355   
356  END SUBROUTINE reduce_sum_omp_r1
357 
358 
359  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
360    IMPLICIT NONE
361 
362    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
363    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
364   
365    CALL Check_buffer_r(size(VarIn))   
366    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
367 
368  END SUBROUTINE reduce_sum_omp_r2
369
370
371  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
372    IMPLICIT NONE
373 
374    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
375    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
376   
377    CALL Check_buffer_r(size(VarIn))   
378    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
379 
380  END SUBROUTINE reduce_sum_omp_r3
381
382
383  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
384    IMPLICIT NONE
385
386    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
387    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
388 
389    CALL Check_buffer_r(size(VarIn))   
390    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
391 
392  END SUBROUTINE reduce_sum_omp_r4 
393 
394 
395 
396 
397    SUBROUTINE allreduce_sum_omp_i(VarIn, VarOut)
398    IMPLICIT NONE
399 
400    INTEGER,INTENT(IN)  :: VarIn
401    INTEGER,INTENT(OUT) :: VarOut
402    INTEGER             :: VarIn_tmp(1)
403    INTEGER             :: VarOut_tmp(1)
404   
405    VarIn_tmp(1)=VarIn
406    CALL Check_buffer_i(1)   
407    CALL allreduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
408    VarOut=VarOut_tmp(1)
409   
410  END SUBROUTINE allreduce_sum_omp_i
411
412  SUBROUTINE allreduce_sum_omp_i1(VarIn, VarOut)
413    IMPLICIT NONE
414 
415    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
416    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
417   
418    CALL Check_buffer_i(size(VarIn))   
419    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
420   
421  END SUBROUTINE allreduce_sum_omp_i1
422 
423 
424  SUBROUTINE allreduce_sum_omp_i2(VarIn, VarOut)
425    IMPLICIT NONE
426 
427    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
428    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
429
430    CALL Check_buffer_i(size(VarIn))   
431    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
432 
433  END SUBROUTINE allreduce_sum_omp_i2
434
435
436  SUBROUTINE allreduce_sum_omp_i3(VarIn, VarOut)
437    IMPLICIT NONE
438 
439    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
440    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
441   
442    CALL Check_buffer_i(size(VarIn))   
443    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
444 
445  END SUBROUTINE allreduce_sum_omp_i3
446
447
448  SUBROUTINE allreduce_sum_omp_i4(VarIn, VarOut)
449    IMPLICIT NONE
450
451    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
452    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
453 
454    CALL Check_buffer_i(size(VarIn))   
455    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
456 
457  END SUBROUTINE allreduce_sum_omp_i4
458
459
460  SUBROUTINE allreduce_sum_omp_r(VarIn, VarOut)
461    IMPLICIT NONE
462 
463    REAL,INTENT(IN)  :: VarIn
464    REAL,INTENT(OUT) :: VarOut
465    REAL             :: VarIn_tmp(1)
466    REAL             :: VarOut_tmp(1)
467   
468    VarIn_tmp(1)=VarIn
469    CALL Check_buffer_r(1)   
470    CALL allreduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
471    VarOut=VarOut_tmp(1)
472 
473  END SUBROUTINE allreduce_sum_omp_r
474
475  SUBROUTINE allreduce_sum_omp_r1(VarIn, VarOut)
476    IMPLICIT NONE
477 
478    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
479    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
480   
481    CALL Check_buffer_r(size(VarIn))   
482    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
483   
484  END SUBROUTINE allreduce_sum_omp_r1
485 
486 
487  SUBROUTINE allreduce_sum_omp_r2(VarIn, VarOut)
488    IMPLICIT NONE
489 
490    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
491    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
492   
493    CALL Check_buffer_r(size(VarIn))   
494    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
495 
496  END SUBROUTINE allreduce_sum_omp_r2
497
498
499  SUBROUTINE allreduce_sum_omp_r3(VarIn, VarOut)
500    IMPLICIT NONE
501 
502    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
503    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
504   
505    CALL Check_buffer_r(size(VarIn))   
506    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
507 
508  END SUBROUTINE allreduce_sum_omp_r3
509
510
511  SUBROUTINE allreduce_sum_omp_r4(VarIn, VarOut)
512    IMPLICIT NONE
513
514    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
515    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
516 
517    CALL Check_buffer_r(size(VarIn))   
518    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
519 
520  END SUBROUTINE allreduce_sum_omp_r4 
521 
522 
523!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
524!    LES ROUTINES GENERIQUES    !
525!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
526
527  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
528  IMPLICIT NONE
529   
530    CHARACTER(LEN=*),INTENT(INOUT) :: Var
531    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
532    INTEGER,INTENT(IN) :: Nb
533   
534    INTEGER :: i
535 
536  !$OMP MASTER
537      Buff=Var
538  !$OMP END MASTER
539  !$OMP BARRIER
540
541    DO i=1,Nb
542      Var=Buff
543    ENDDO
544  !$OMP BARRIER     
545 
546  END SUBROUTINE bcast_omp_cgen
547
548
549     
550  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
551  IMPLICIT NONE
552   
553    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
554    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
555    INTEGER,INTENT(IN) :: Nb
556
557    INTEGER :: i
558   
559  !$OMP MASTER
560    DO i=1,Nb
561      Buff(i)=Var(i)
562    ENDDO
563  !$OMP END MASTER
564  !$OMP BARRIER
565
566    DO i=1,Nb
567      Var(i)=Buff(i)
568    ENDDO
569  !$OMP BARRIER       
570
571  END SUBROUTINE bcast_omp_igen
572
573
574  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
575  IMPLICIT NONE
576   
577    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
578    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
579    INTEGER,INTENT(IN) :: Nb
580
581    INTEGER :: i
582   
583  !$OMP MASTER
584    DO i=1,Nb
585      Buff(i)=Var(i)
586    ENDDO
587  !$OMP END MASTER
588  !$OMP BARRIER
589
590    DO i=1,Nb
591      Var(i)=Buff(i)
592    ENDDO
593  !$OMP BARRIER       
594
595  END SUBROUTINE bcast_omp_rgen
596
597  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
598  IMPLICIT NONE
599   
600    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
601    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
602    INTEGER,INTENT(IN) :: Nb
603 
604    INTEGER :: i
605   
606  !$OMP MASTER
607    DO i=1,Nb
608      Buff(i)=Var(i)
609    ENDDO
610  !$OMP END MASTER
611  !$OMP BARRIER
612
613    DO i=1,Nb
614      Var(i)=Buff(i)
615    ENDDO
616  !$OMP BARRIER       
617
618  END SUBROUTINE bcast_omp_lgen
619 
620
621  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
622  IMPLICIT NONE
623
624    INTEGER,INTENT(IN) :: dimsize
625    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
626    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
627    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
628
629    INTEGER :: i
630
631  !$OMP MASTER
632    Buff(:)=0
633  !$OMP END MASTER
634  !$OMP BARRIER
635 
636  !$OMP CRITICAL     
637    DO i=1,dimsize
638      Buff(i)=Buff(i)+VarIn(i)
639    ENDDO
640  !$OMP END CRITICAL
641  !$OMP BARRIER 
642 
643  !$OMP MASTER
644    DO i=1,dimsize
645      VarOut(i)=Buff(i)
646    ENDDO
647  !$OMP END MASTER
648  !$OMP BARRIER
649 
650  END SUBROUTINE reduce_sum_omp_igen
651
652  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
653  IMPLICIT NONE
654
655    INTEGER,INTENT(IN) :: dimsize
656    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
657    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
658    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
659
660    INTEGER :: i
661
662  !$OMP MASTER
663    Buff(:)=0
664  !$OMP END MASTER
665  !$OMP BARRIER
666 
667  !$OMP CRITICAL     
668    DO i=1,dimsize
669      Buff(i)=Buff(i)+VarIn(i)
670    ENDDO
671  !$OMP END CRITICAL
672  !$OMP BARRIER 
673 
674    DO i=1,dimsize
675      VarOut(i)=Buff(i)
676    ENDDO
677  !$OMP BARRIER
678 
679  END SUBROUTINE reduce_sum_omp_rgen
680
681
682
683  SUBROUTINE allreduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
684  IMPLICIT NONE
685
686    INTEGER,INTENT(IN) :: dimsize
687    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
688    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
689    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
690
691    INTEGER :: i
692
693  !$OMP MASTER
694    Buff(:)=0
695  !$OMP END MASTER
696  !$OMP BARRIER
697 
698  !$OMP CRITICAL     
699    DO i=1,dimsize
700      Buff(i)=Buff(i)+VarIn(i)
701    ENDDO
702  !$OMP END CRITICAL
703  !$OMP BARRIER 
704 
705    DO i=1,dimsize
706      VarOut(i)=Buff(i)
707    ENDDO
708  !$OMP BARRIER
709 
710  END SUBROUTINE allreduce_sum_omp_igen
711
712  SUBROUTINE allreduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
713  IMPLICIT NONE
714
715    INTEGER,INTENT(IN) :: dimsize
716    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
717    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
718    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
719
720    INTEGER :: i
721
722  !$OMP MASTER
723    Buff(:)=0
724  !$OMP END MASTER
725  !$OMP BARRIER
726 
727  !$OMP CRITICAL     
728    DO i=1,dimsize
729      Buff(i)=Buff(i)+VarIn(i)
730    ENDDO
731  !$OMP END CRITICAL
732  !$OMP BARRIER 
733 
734    DO i=1,dimsize
735      VarOut(i)=Buff(i)
736    ENDDO
737
738  !$OMP BARRIER
739 
740  END SUBROUTINE allreduce_sum_omp_rgen
741   
742END MODULE transfert_omp_mod
Note: See TracBrowser for help on using the repository browser.