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
Line 
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
20  LOGICAL,PARAMETER :: omp_by_domain=.TRUE. 
21
22CONTAINS
23
24
25  SUBROUTINE init_omp_para
26  USE grid_param
27#ifdef CPP_USING_OMP
28  USE omp_lib
29#endif
30  IMPLICIT NONE
31  INTEGER :: ll_nb,i
32
33#ifdef CPP_USING_OMP
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
43#ifdef CPP_USING_OMP
44    omp_size=OMP_GET_NUM_THREADS()
45#endif
46!$OMP END MASTER
47!$OMP BARRIER
48#ifdef CPP_USING_OMP
49    omp_rank=OMP_GET_THREAD_NUM()
50#endif
51
52    IF (omp_by_domain) THEN
53      omp_first=.TRUE.
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   
68   
69      omp_first=.FALSE.
70      omp_last=.FALSE.
71      omp_master=.FALSE.
72   
73      IF (omp_rank==0) THEN
74        omp_first=.TRUE.
75        omp_master=.TRUE.
76      ENDIF
77   
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
91
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
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
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     
129END MODULE omp_para
130   
131   
132     
133             
134 
135   
Note: See TracBrowser for help on using the repository browser.