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/omp_para.F90

    r151 r186  
    1818  LOGICAL,SAVE :: using_openmp 
    1919 
     20  LOGICAL,PARAMETER :: omp_by_domain=.TRUE.  
     21 
    2022CONTAINS 
    2123 
     
    2325  SUBROUTINE init_omp_para 
    2426  USE grid_param 
    25 #ifdef CPP_USING_OPENMP 
     27#ifdef CPP_USING_OMP 
    2628  USE omp_lib 
    2729#endif 
     
    2931  INTEGER :: ll_nb,i 
    3032 
    31 #ifdef CPP_USING_OPENMP 
     33#ifdef CPP_USING_OMP 
    3234  using_openmp=.TRUE. 
    3335#else 
     
    3941   
    4042!$OMP MASTER 
    41 #ifdef CPP_USING_OPENMP 
     43#ifdef CPP_USING_OMP 
    4244    omp_size=OMP_GET_NUM_THREADS() 
    4345#endif 
    4446!$OMP END MASTER 
    4547!$OMP BARRIER 
    46 #ifdef CPP_USING_OPENMP 
     48#ifdef CPP_USING_OMP 
    4749    omp_rank=OMP_GET_THREAD_NUM() 
    4850#endif 
    49     omp_first=.FALSE. 
    50     omp_last=.FALSE. 
    51     omp_master=.FALSE. 
     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     
    5268     
    53     IF (omp_rank==0) THEN 
    54       omp_first=.TRUE. 
    55       omp_master=.TRUE. 
     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     
    5696    ENDIF 
    57      
    58     IF (omp_rank==omp_size-1) omp_last=.TRUE. 
    59      
    60     ll_end=0 
    61     DO i=0,omp_rank 
    62       ll_begin=ll_end+1 
    63       ll_nb=llm/omp_size 
    64       IF (MOD(llm,omp_size)>i) ll_nb=ll_nb+1 
    65       ll_end=ll_begin+ll_nb-1 
    66     ENDDO 
    67      
    68     ll_beginp1=ll_begin 
    69     ll_endp1=ll_end 
    70     ll_endm1=ll_end 
    71  
    72     IF (omp_first) ll_beginp1=ll_begin+1 
    73     IF (omp_last) ll_endp1=ll_endp1+1 
    74     IF (omp_last) ll_endm1=ll_endm1-1 
    75  
    7697!$OMP END PARALLEL 
    7798 
     
    91112  END SUBROUTINE init_omp_para 
    92113 
    93    
     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       
    94129END MODULE omp_para 
    95130     
Note: See TracChangeset for help on using the changeset viewer.