Ignore:
Timestamp:
01/09/14 09:56:11 (11 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/domain.f90

    r174 r186  
    5858  END TYPE t_domain 
    5959 
     60  INTEGER,SAVE :: ndomain 
     61  INTEGER,SAVE :: ndomain_glo 
     62 
    6063  TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain(:) 
    61   INTEGER :: ndomain 
    6264  TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain_glo(:) 
    63   INTEGER :: ndomain_glo 
    64  
    65   INTEGER,ALLOCATABLE,SAVE :: domglo_rank(:) 
    66   INTEGER,ALLOCATABLE,SAVE :: domglo_loc_ind(:) 
    67   INTEGER,ALLOCATABLE,SAVE :: domloc_glo_ind(:) 
    68    
     65 
     66  INTEGER,ALLOCATABLE,SAVE :: domglo_rank(:)  ! size : ndomain_glo : mpi rank assigned to a domain  
     67  INTEGER,ALLOCATABLE,SAVE :: domglo_loc_ind(:) ! size : ndomain_glo : corresponding local indice for a global domain indice 
     68  INTEGER,ALLOCATABLE,SAVE :: domloc_glo_ind(:) ! size : ndomain : corresponding global indice for a local domain indice 
     69 
     70  LOGICAL, ALLOCATABLE, SAVE :: assigned_domain(:) ! size : ndomain : is an omp task is assigned to this domain 
     71!$OMP THREADPRIVATE(assigned_domain) 
     72     
    6973CONTAINS 
    7074 
     
    423427      ENDIF 
    424428    ENDDO 
     429 
     430!$OMP PARALLEL 
     431    CALL assign_domain_omp 
     432!$OMP END PARALLEL 
     433         
    425434     
    426435  END SUBROUTINE  assign_domain       
    427      
     436    
     437  SUBROUTINE assign_domain_omp 
     438  USE omp_para 
     439  USE mpipara 
     440  IMPLICIT NONE 
     441    INTEGER :: nb_domain 
     442    INTEGER :: rank, ind, i 
     443 
     444    ALLOCATE(assigned_domain(ndomain)) 
     445     
     446    ind=0 
     447    DO rank=0,omp_size-1 
     448      nb_domain=ndomain/omp_size 
     449      IF ( rank < MOD(ndomain,omp_size) ) nb_domain=nb_domain+1 
     450     
     451      DO i=1,nb_domain 
     452       ind=ind+1 
     453       IF (rank==omp_rank) THEN  
     454         assigned_domain(ind)=.TRUE. 
     455         PRINT *,"Rank ",mpi_rank," task ",rank," local domain : ",ind," global domain ",domloc_glo_ind(ind) 
     456       ELSE 
     457         assigned_domain(ind)=.FALSE. 
     458       ENDIF   
     459      ENDDO 
     460     
     461    ENDDO 
     462     
     463  END SUBROUTINE assign_domain_omp 
     464     
     465 
    428466           
    429467  SUBROUTINE compute_domain 
Note: See TracChangeset for help on using the changeset viewer.