Ignore:
Timestamp:
01/09/14 09:56:11 (10 years ago)
Author:
ymipsl
Message:

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:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/mpipara.F90

    r171 r186  
    33  INTEGER,SAVE :: mpi_rank 
    44  INTEGER,SAVE :: mpi_size 
     5  INTEGER,SAVE :: mpi_threading_mode 
    56   
    67  INTEGER,SAVE :: comm_icosa 
     
    1314  END INTERFACE allocate_mpi_buffer 
    1415 
     16  INTERFACE free_mpi_buffer 
     17    MODULE PROCEDURE free_mpi_buffer_r2, free_mpi_buffer_r3, free_mpi_buffer_r4 
     18  END INTERFACE free_mpi_buffer 
     19 
    1520CONTAINS 
    1621 
    1722  SUBROUTINE init_mpipara 
    1823  USE mpi_mod 
     24  USE getin_mod 
    1925#ifdef CPP_USING_XIOS 
    2026  USE xios 
    2127#endif 
    2228  IMPLICIT NONE 
     29    CHARACTER(LEN=256) :: required_mode_str 
     30    INTEGER :: required_mode 
    2331 
    2432    using_mpi=.FALSE. 
     
    2836     
    2937    IF (using_mpi) THEN 
    30       CALL MPI_INIT(ierr) 
    31  
     38     
     39      required_mode_str='multiple' 
     40      CALL getin('mpi_threading_mode',required_mode_str) 
     41       
     42      SELECT CASE(TRIM(required_mode_str)) 
     43        CASE ('single') 
     44          required_mode=MPI_THREAD_SINGLE 
     45        CASE ('funneled') 
     46          required_mode=MPI_THREAD_FUNNELED 
     47        CASE ('serialized') 
     48          required_mode=MPI_THREAD_SERIALIZED 
     49        CASE ('multiple') 
     50          required_mode=MPI_THREAD_MULTIPLE 
     51        CASE DEFAULT 
     52          PRINT*,'Bad selector for variable mpi_threading_mode  : <', TRIM(required_mode_str),  & 
     53                 '>  => options are <single>, <funneled>, <serialized>, <multiple>' 
     54          STOP 
     55      END SELECT 
     56       
     57 
     58      IF (required_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD required' 
     59      IF (required_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED required' 
     60      IF (required_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED required' 
     61      IF (required_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE required' 
     62 
     63       
     64      CALL MPI_INIT_THREAD(MPI_THREAD_MULTIPLE,mpi_threading_mode,ierr) 
     65       
     66      IF (mpi_threading_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD provided' 
     67      IF (mpi_threading_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED provided' 
     68      IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED provided' 
     69      IF (mpi_threading_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE provided' 
     70 
     71      IF (mpi_threading_mode > required_mode) mpi_threading_mode=required_mode 
     72 
     73      IF (mpi_threading_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD used' 
     74      IF (mpi_threading_mode==MPI_THREAD_FUNNELED)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_FUNNELED used' 
     75      IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) PRINT*,'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED used' 
     76      IF (mpi_threading_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE used' 
     77           
    3278#ifdef CPP_USING_XIOS 
    3379      CALL xios_initialize("icosagcm",return_comm=comm_icosa) 
     
    79125    CALL C_F_POINTER(base_ptr, buffer, (/ length /)) 
    80126 
    81    END SUBROUTINE allocate_mpi_buffer_r2 
     127  END SUBROUTINE allocate_mpi_buffer_r2 
     128 
     129  SUBROUTINE free_mpi_buffer_r2(buffer) 
     130  USE ISO_C_BINDING 
     131  USE mpi_mod 
     132  USE prec 
     133  IMPLICIT NONE 
     134    REAL(rstd), POINTER :: buffer(:) 
     135 
     136    CALL MPI_FREE_MEM(buffer,ierr) 
     137 
     138   END SUBROUTINE free_mpi_buffer_r2 
    82139 
    83140  SUBROUTINE allocate_mpi_buffer_r3(buffer,length,dim3) 
     
    100157    CALL C_F_POINTER(base_ptr, buffer, (/ length,dim3 /)) 
    101158     
    102    END SUBROUTINE allocate_mpi_buffer_r3 
     159  END SUBROUTINE allocate_mpi_buffer_r3 
     160 
     161  SUBROUTINE free_mpi_buffer_r3(buffer) 
     162  USE ISO_C_BINDING 
     163  USE mpi_mod 
     164  USE prec 
     165  IMPLICIT NONE 
     166    REAL(rstd), POINTER :: buffer(:,:) 
     167 
     168    CALL MPI_FREE_MEM(buffer,ierr) 
     169 
     170  END SUBROUTINE free_mpi_buffer_r3 
    103171 
    104172  SUBROUTINE allocate_mpi_buffer_r4(buffer,length,dim3,dim4) 
     
    123191     
    124192   END SUBROUTINE allocate_mpi_buffer_r4 
     193 
     194  SUBROUTINE free_mpi_buffer_r4(buffer) 
     195  USE ISO_C_BINDING 
     196  USE mpi_mod 
     197  USE prec 
     198  IMPLICIT NONE 
     199    REAL(rstd), POINTER :: buffer(:,:,:) 
     200 
     201    CALL MPI_FREE_MEM(buffer,ierr) 
     202 
     203  END SUBROUTINE free_mpi_buffer_r4 
    125204    
    126205END MODULE mpipara 
Note: See TracChangeset for help on using the changeset viewer.