source: codes/icosagcm/trunk/src/omp_para.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: 2.5 KB
RevLine 
[151]1MODULE omp_para
2
3  INTEGER,SAVE :: omp_size
4  INTEGER,SAVE :: omp_rank
5!$OMP THREADPRIVATE(omp_rank)
6
7  LOGICAL,SAVE :: omp_first
8  LOGICAL,SAVE :: omp_last
9  LOGICAL,SAVE :: omp_master
10!$OMP THREADPRIVATE(omp_first, omp_last,omp_master)
11
12  INTEGER,SAVE :: ll_begin
13  INTEGER,SAVE :: ll_beginp1
14  INTEGER,SAVE :: ll_end
15  INTEGER,SAVE :: ll_endm1
16  INTEGER,SAVE :: ll_endp1
17!$OMP THREADPRIVATE(ll_begin,ll_beginp1,ll_end,ll_endm1,ll_endp1)
18  LOGICAL,SAVE :: using_openmp
19
[186]20  LOGICAL,PARAMETER :: omp_by_domain=.TRUE. 
21
[151]22CONTAINS
23
24
25  SUBROUTINE init_omp_para
26  USE grid_param
[186]27#ifdef CPP_USING_OMP
[151]28  USE omp_lib
29#endif
30  IMPLICIT NONE
31  INTEGER :: ll_nb,i
32
[186]33#ifdef CPP_USING_OMP
[151]34  using_openmp=.TRUE.
35#else
36  using_openmp=.FALSE.
37#endif
38
39  IF (using_openmp) THEN   
40!$OMP PARALLEL PRIVATE(ll_nb,i)
41 
42!$OMP MASTER
[186]43#ifdef CPP_USING_OMP
[151]44    omp_size=OMP_GET_NUM_THREADS()
45#endif
46!$OMP END MASTER
47!$OMP BARRIER
[186]48#ifdef CPP_USING_OMP
[151]49    omp_rank=OMP_GET_THREAD_NUM()
50#endif
[186]51
52    IF (omp_by_domain) THEN
[151]53      omp_first=.TRUE.
[186]54      omp_last=.TRUE.
55      IF (omp_rank==0) THEN
56        omp_master=.TRUE.
57      ELSE
58        omp_master=.FALSE.
59      ENDIF
60     
61      ll_begin=1
62      ll_beginp1=2
63      ll_end=llm
64      ll_endm1=llm-1
65      ll_endp1=llm+1
66     
67    ELSE   
[151]68   
[186]69      omp_first=.FALSE.
70      omp_last=.FALSE.
71      omp_master=.FALSE.
[151]72   
[186]73      IF (omp_rank==0) THEN
74        omp_first=.TRUE.
75        omp_master=.TRUE.
76      ENDIF
[151]77   
[186]78      IF (omp_rank==omp_size-1) omp_last=.TRUE.
79   
80      ll_end=0
81      DO i=0,omp_rank
82        ll_begin=ll_end+1
83        ll_nb=llm/omp_size
84        IF (MOD(llm,omp_size)>i) ll_nb=ll_nb+1
85        ll_end=ll_begin+ll_nb-1
86      ENDDO
87   
88      ll_beginp1=ll_begin
89      ll_endp1=ll_end
90      ll_endm1=ll_end
[151]91
[186]92      IF (omp_first) ll_beginp1=ll_begin+1
93      IF (omp_last) ll_endp1=ll_endp1+1
94      IF (omp_last) ll_endm1=ll_endm1-1
95   
96    ENDIF
[151]97!$OMP END PARALLEL
98
99   ELSE
100     omp_size=1
101     omp_rank=0
102     omp_first=.TRUE.
103     omp_last=.TRUE.
104     omp_master=.TRUE.
105     ll_begin=1
106     ll_beginp1=2
107     ll_end=llm
108     ll_endm1=llm-1
109     ll_endp1=llm+1
110   ENDIF
111   
112  END SUBROUTINE init_omp_para
113
[186]114  FUNCTION omp_in_parallel()
115#ifdef CPP_USING_OMP
116  USE omp_lib, ONLY : omp_in_parallel_=>omp_in_parallel
117#endif
118  IMPLICIT NONE
119    LOGICAL :: omp_in_parallel
120   
121#ifdef CPP_USING_OMP
122    omp_in_parallel=omp_in_parallel_()
123#else
124    omp_in_parallel=.FALSE.
125#endif
126
127  END FUNCTION  omp_in_parallel 
128     
[151]129END MODULE omp_para
130   
131   
132     
133             
134 
135   
Note: See TracBrowser for help on using the repository browser.