source: codes/icosagcm/trunk/src/parallel/mpipara.F90 @ 1019

Last change on this file since 1019 was 1019, checked in by ymipsl, 4 years ago

On Jean-zay supercomputer with omnipath network, OpenACC need to be initialized before the MPI initialization wich can be a problem to select GPU device. This is a specifc hook for Jean Zay using slurm or reading an environment variable to retrive the local rank of the process.

YM

File size: 7.0 KB
Line 
1MODULE mpipara
2
3  INTEGER,SAVE :: mpi_rank
4  INTEGER,SAVE :: mpi_size
5  INTEGER,SAVE :: mpi_threading_mode
6 
7  INTEGER,SAVE :: comm_icosa
8  INTEGER,SAVE :: ierr
9  LOGICAL,SAVE :: using_mpi
10  LOGICAL,SAVE :: is_mpi_root
11  LOGICAL,SAVE :: is_mpi_master
12  INTEGER,SAVE :: mpi_master
13 
14  INTEGER,SAVE :: id_mpi ! id for profiling
15
16   INTERFACE allocate_mpi_buffer
17    MODULE PROCEDURE allocate_mpi_buffer_r2, allocate_mpi_buffer_r3,allocate_mpi_buffer_r4
18  END INTERFACE allocate_mpi_buffer
19
20  INTERFACE free_mpi_buffer
21    MODULE PROCEDURE free_mpi_buffer_r2, free_mpi_buffer_r3, free_mpi_buffer_r4
22  END INTERFACE free_mpi_buffer
23
24  PRIVATE :: getin
25
26CONTAINS
27
28  SUBROUTINE getin(name,value) ! Copied from getin.f90 to avoid circular dependency
29  USE ioipsl, ONLY : getin_=>getin
30  USE transfert_omp_mod
31  USE omp_para
32  IMPLICIT NONE
33    CHARACTER(LEN=*) :: name
34    CHARACTER(LEN=*) :: value
35
36!$OMP MASTER   
37    CALL getin_(name,value)
38    IF(is_mpi_root) PRINT *,'GETIN ',TRIM(name),' = ', TRIM(value)
39!$OMP END MASTER
40    IF (omp_in_parallel()) CALL bcast_omp(value)
41  END SUBROUTINE getin
42
43  SUBROUTINE init_mpipara
44  USE mpi_mod
45#ifdef CPP_USING_XIOS
46  USE xios
47#endif
48  USE abort_mod
49  USE openacc_mod
50  IMPLICIT NONE
51    CHARACTER(LEN=256) :: required_mode_str
52    INTEGER :: required_mode
53
54    using_mpi=.FALSE.
55#ifdef CPP_USING_MPI
56    using_mpi=.TRUE. 
57#endif
58   
59    CALL set_openacc_device
60
61    IF (using_mpi) THEN
62   
63      required_mode_str='funneled'
64      CALL getin('mpi_threading_mode',required_mode_str)
65     
66      SELECT CASE(TRIM(required_mode_str))
67        CASE ('single')
68          required_mode=MPI_THREAD_SINGLE
69        CASE ('funneled')
70          required_mode=MPI_THREAD_FUNNELED
71        CASE ('serialized')
72          required_mode=MPI_THREAD_SERIALIZED
73        CASE ('multiple')
74          required_mode=MPI_THREAD_MULTIPLE
75        CASE DEFAULT
76          PRINT*,'Bad selector for variable mpi_threading_mode  : <', TRIM(required_mode_str),  &
77                 '>  => options are <single>, <funneled>, <serialized>, <multiple>'
78          STOP
79      END SELECT
80     
81      IF (required_mode==MPI_THREAD_SERIALIZED .OR. required_mode==MPI_THREAD_MULTIPLE) THEN
82        CALL abort_acc("mpi_threading_mode /= 'single' .AND. mpi_threading_mode /= 'funneled'")
83      ENDIF
84
85      IF (required_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD required'
86      IF (required_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED required'
87      IF (required_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED required'
88      IF (required_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE required'
89
90      CALL MPI_INIT_THREAD(required_mode,mpi_threading_mode,ierr)
91     
92      IF (mpi_threading_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD provided'
93      IF (mpi_threading_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED provided'
94      IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED provided'
95      IF (mpi_threading_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE provided'
96
97      IF (mpi_threading_mode > required_mode) mpi_threading_mode=required_mode
98
99      IF (mpi_threading_mode==MPI_THREAD_SINGLE) THEN
100         PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD used : Warning : openMP is not garanted to work'
101      ENDIF
102      IF (mpi_threading_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED used'
103      IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED used'
104      IF (mpi_threading_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE used'
105         
106#ifdef CPP_USING_XIOS
107      CALL xios_initialize("icosagcm",return_comm=comm_icosa)
108#else
109     comm_icosa=MPI_COMM_WORLD
110#endif
111      CALL MPI_COMM_SIZE(comm_icosa,mpi_size,ierr)
112      CALL MPI_COMM_RANK(comm_icosa,mpi_rank,ierr)
113      PRINT *, 'MPI Process ', mpi_rank, '/', mpi_size
114    ELSE
115      comm_icosa=-1
116      mpi_size=1
117      mpi_rank=0
118    ENDIF
119   
120    mpi_master=0
121    IF (mpi_rank==0) THEN
122      is_mpi_root=.TRUE.
123      is_mpi_master=.TRUE.
124    ELSE
125      is_mpi_root=.FALSE.
126      is_mpi_master=.FALSE.
127    ENDIF
128   
129
130    CALL set_openacc_device(mpi_size, mpi_rank)
131    PRINT *, 'GPU device ', openacc_device_id
132
133  END SUBROUTINE  init_mpipara
134
135  SUBROUTINE finalize_mpipara
136  USE mpi_mod
137#ifdef CPP_USING_XIOS
138  USE xios
139#endif
140  IMPLICIT NONE
141   
142#ifdef CPP_USING_XIOS
143      CALL xios_finalize
144#endif
145    IF (using_mpi) CALL MPI_FINALIZE(ierr)
146   
147   END SUBROUTINE  finalize_mpipara
148   
149
150  SUBROUTINE allocate_mpi_buffer_r2(buffer,length)
151  USE ISO_C_BINDING
152  USE mpi_mod
153  USE prec
154  IMPLICIT NONE
155    REAL(rstd), POINTER :: buffer(:)
156    INTEGER,INTENT(IN)  :: length
157
158    TYPE(C_PTR)         :: base_ptr
159    INTEGER(KIND=MPI_ADDRESS_KIND) :: real_size,lb,size
160    INTEGER :: ierr
161   
162    CALL MPI_Type_get_extent(MPI_REAL8, lb, real_size, ierr)
163    size=length*real_size
164   
165    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
166    CALL C_F_POINTER(base_ptr, buffer, (/ length /))
167
168  END SUBROUTINE allocate_mpi_buffer_r2
169
170  SUBROUTINE free_mpi_buffer_r2(buffer)
171  USE ISO_C_BINDING
172  USE mpi_mod
173  USE prec
174  IMPLICIT NONE
175    REAL(rstd), POINTER :: buffer(:)
176
177    CALL MPI_FREE_MEM(buffer,ierr)
178
179   END SUBROUTINE free_mpi_buffer_r2
180
181  SUBROUTINE allocate_mpi_buffer_r3(buffer,length,dim3)
182  USE ISO_C_BINDING
183  USE mpi_mod
184  USE prec
185    IMPLICIT NONE
186    REAL(rstd), POINTER :: buffer(:,:)
187    INTEGER,INTENT(IN)  :: length
188    INTEGER,INTENT(IN)  :: dim3
189
190    TYPE(C_PTR)         :: base_ptr
191    INTEGER(KIND=MPI_ADDRESS_KIND) :: real_size,lb,size
192    INTEGER :: ierr
193   
194    CALL MPI_Type_get_extent(MPI_REAL8, lb, real_size, ierr)
195    size=length*real_size*dim3
196   
197    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
198    CALL C_F_POINTER(base_ptr, buffer, (/ length,dim3 /))
199   
200  END SUBROUTINE allocate_mpi_buffer_r3
201
202  SUBROUTINE free_mpi_buffer_r3(buffer)
203  USE ISO_C_BINDING
204  USE mpi_mod
205  USE prec
206  IMPLICIT NONE
207    REAL(rstd), POINTER :: buffer(:,:)
208
209    CALL MPI_FREE_MEM(buffer,ierr)
210
211  END SUBROUTINE free_mpi_buffer_r3
212
213  SUBROUTINE allocate_mpi_buffer_r4(buffer,length,dim3,dim4)
214  USE ISO_C_BINDING
215  USE mpi_mod
216  USE prec
217  IMPLICIT NONE
218    REAL(rstd), POINTER :: buffer(:,:,:)
219    INTEGER,INTENT(IN)  :: length
220    INTEGER,INTENT(IN)  :: dim3
221    INTEGER,INTENT(IN)  :: dim4
222
223    TYPE(C_PTR)         :: base_ptr
224    INTEGER(KIND=MPI_ADDRESS_KIND) :: real_size,lb,size
225    INTEGER :: ierr
226   
227    CALL MPI_Type_get_extent(MPI_REAL8, lb, real_size, ierr)
228    size=length*real_size*dim3*dim4
229   
230    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
231    CALL C_F_POINTER(base_ptr, buffer, (/ length, dim3, dim4 /))
232   
233   END SUBROUTINE allocate_mpi_buffer_r4
234
235  SUBROUTINE free_mpi_buffer_r4(buffer)
236  USE ISO_C_BINDING
237  USE mpi_mod
238  USE prec
239  IMPLICIT NONE
240    REAL(rstd), POINTER :: buffer(:,:,:)
241
242    CALL MPI_FREE_MEM(buffer,ierr)
243
244  END SUBROUTINE free_mpi_buffer_r4
245   
246   
247     
248END MODULE mpipara
Note: See TracBrowser for help on using the repository browser.