Ignore:
Timestamp:
10/31/14 14:52:01 (10 years ago)
Author:
ymipsl
Message:

Merging OpenMP parallisme mode : by subdomain and on vertical level.
This feature is actually experimental but may be retro-compatible with the last method based only on subdomain

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/transfert_omp.f90

    r238 r295  
    3434  END INTERFACE  
    3535 
    36   PUBLIC bcast_omp, reduce_sum_omp, allreduce_sum_omp 
     36 
     37  INTERFACE reduce_max_omp 
     38    MODULE PROCEDURE reduce_max_omp_i,reduce_max_omp_i1,reduce_max_omp_i2,reduce_max_omp_i3,reduce_max_omp_i4, & 
     39                     reduce_max_omp_r,reduce_max_omp_r1,reduce_max_omp_r2,reduce_max_omp_r3,reduce_max_omp_r4 
     40  END INTERFACE  
     41 
     42  INTERFACE allreduce_max_omp 
     43    MODULE PROCEDURE allreduce_max_omp_i,allreduce_max_omp_i1,allreduce_max_omp_i2,allreduce_max_omp_i3,allreduce_max_omp_i4, & 
     44                     allreduce_max_omp_r,allreduce_max_omp_r1,allreduce_max_omp_r2,allreduce_max_omp_r3,allreduce_max_omp_r4 
     45  END INTERFACE  
     46 
     47 
     48  PUBLIC bcast_omp, reduce_sum_omp, allreduce_sum_omp, reduce_max_omp, allreduce_max_omp 
    3749   
    3850CONTAINS 
     
    521533  END SUBROUTINE allreduce_sum_omp_r4   
    522534   
     535 
     536 
     537 
     538 
     539 
     540 
     541 
     542 
     543 
     544 
     545 
     546  SUBROUTINE reduce_max_omp_i(VarIn, VarOut) 
     547    IMPLICIT NONE 
     548   
     549    INTEGER,INTENT(IN)  :: VarIn 
     550    INTEGER,INTENT(OUT) :: VarOut 
     551    INTEGER             :: VarIn_tmp(1) 
     552    INTEGER             :: VarOut_tmp(1) 
     553     
     554    VarIn_tmp(1)=VarIn 
     555    CALL Check_buffer_i(1)    
     556    CALL reduce_max_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i) 
     557    VarOut=VarOut_tmp(1) 
     558     
     559  END SUBROUTINE reduce_max_omp_i 
     560 
     561  SUBROUTINE reduce_max_omp_i1(VarIn, VarOut) 
     562    IMPLICIT NONE 
     563   
     564    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn 
     565    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut 
     566     
     567    CALL Check_buffer_i(size(VarIn))    
     568    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     569    
     570  END SUBROUTINE reduce_max_omp_i1 
     571   
     572   
     573  SUBROUTINE reduce_max_omp_i2(VarIn, VarOut) 
     574    IMPLICIT NONE 
     575   
     576    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn 
     577    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut 
     578 
     579    CALL Check_buffer_i(size(VarIn))    
     580    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     581   
     582  END SUBROUTINE reduce_max_omp_i2 
     583 
     584 
     585  SUBROUTINE reduce_max_omp_i3(VarIn, VarOut) 
     586    IMPLICIT NONE 
     587   
     588    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn 
     589    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut 
     590     
     591    CALL Check_buffer_i(size(VarIn))    
     592    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     593   
     594  END SUBROUTINE reduce_max_omp_i3 
     595 
     596 
     597  SUBROUTINE reduce_max_omp_i4(VarIn, VarOut) 
     598    IMPLICIT NONE 
     599 
     600    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn 
     601    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut 
     602   
     603    CALL Check_buffer_i(size(VarIn))    
     604    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     605   
     606  END SUBROUTINE reduce_max_omp_i4 
     607 
     608 
     609  SUBROUTINE reduce_max_omp_r(VarIn, VarOut) 
     610    IMPLICIT NONE 
     611   
     612    REAL,INTENT(IN)  :: VarIn 
     613    REAL,INTENT(OUT) :: VarOut 
     614    REAL             :: VarIn_tmp(1) 
     615    REAL             :: VarOut_tmp(1) 
     616     
     617    VarIn_tmp(1)=VarIn 
     618    CALL Check_buffer_r(1)    
     619    CALL reduce_max_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r) 
     620    VarOut=VarOut_tmp(1) 
     621   
     622  END SUBROUTINE reduce_max_omp_r 
     623 
     624  SUBROUTINE reduce_max_omp_r1(VarIn, VarOut) 
     625    IMPLICIT NONE 
     626   
     627    REAL,INTENT(IN),DIMENSION(:)  :: VarIn 
     628    REAL,INTENT(OUT),DIMENSION(:) :: VarOut 
     629     
     630    CALL Check_buffer_r(size(VarIn))    
     631    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     632    
     633  END SUBROUTINE reduce_max_omp_r1 
     634   
     635   
     636  SUBROUTINE reduce_max_omp_r2(VarIn, VarOut) 
     637    IMPLICIT NONE 
     638   
     639    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn 
     640    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut 
     641     
     642    CALL Check_buffer_r(size(VarIn))    
     643    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     644   
     645  END SUBROUTINE reduce_max_omp_r2 
     646 
     647 
     648  SUBROUTINE reduce_max_omp_r3(VarIn, VarOut) 
     649    IMPLICIT NONE 
     650   
     651    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn 
     652    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut 
     653     
     654    CALL Check_buffer_r(size(VarIn))    
     655    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     656   
     657  END SUBROUTINE reduce_max_omp_r3 
     658 
     659 
     660  SUBROUTINE reduce_max_omp_r4(VarIn, VarOut) 
     661    IMPLICIT NONE 
     662 
     663    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn 
     664    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut 
     665   
     666    CALL Check_buffer_r(size(VarIn))    
     667    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     668   
     669  END SUBROUTINE reduce_max_omp_r4   
     670   
     671   
     672   
     673   
     674    SUBROUTINE allreduce_max_omp_i(VarIn, VarOut) 
     675    IMPLICIT NONE 
     676   
     677    INTEGER,INTENT(IN)  :: VarIn 
     678    INTEGER,INTENT(OUT) :: VarOut 
     679    INTEGER             :: VarIn_tmp(1) 
     680    INTEGER             :: VarOut_tmp(1) 
     681     
     682    VarIn_tmp(1)=VarIn 
     683    CALL Check_buffer_i(1)    
     684    CALL allreduce_max_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i) 
     685    VarOut=VarOut_tmp(1) 
     686     
     687  END SUBROUTINE allreduce_max_omp_i 
     688 
     689  SUBROUTINE allreduce_max_omp_i1(VarIn, VarOut) 
     690    IMPLICIT NONE 
     691   
     692    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn 
     693    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut 
     694     
     695    CALL Check_buffer_i(size(VarIn))    
     696    CALL allreduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     697    
     698  END SUBROUTINE allreduce_max_omp_i1 
     699   
     700   
     701  SUBROUTINE allreduce_max_omp_i2(VarIn, VarOut) 
     702    IMPLICIT NONE 
     703   
     704    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn 
     705    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut 
     706 
     707    CALL Check_buffer_i(size(VarIn))    
     708    CALL allreduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     709   
     710  END SUBROUTINE allreduce_max_omp_i2 
     711 
     712 
     713  SUBROUTINE allreduce_max_omp_i3(VarIn, VarOut) 
     714    IMPLICIT NONE 
     715   
     716    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn 
     717    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut 
     718     
     719    CALL Check_buffer_i(size(VarIn))    
     720    CALL allreduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     721   
     722  END SUBROUTINE allreduce_max_omp_i3 
     723 
     724 
     725  SUBROUTINE allreduce_max_omp_i4(VarIn, VarOut) 
     726    IMPLICIT NONE 
     727 
     728    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn 
     729    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut 
     730   
     731    CALL Check_buffer_i(size(VarIn))    
     732    CALL allreduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i) 
     733   
     734  END SUBROUTINE allreduce_max_omp_i4 
     735 
     736 
     737  SUBROUTINE allreduce_max_omp_r(VarIn, VarOut) 
     738    IMPLICIT NONE 
     739   
     740    REAL,INTENT(IN)  :: VarIn 
     741    REAL,INTENT(OUT) :: VarOut 
     742    REAL             :: VarIn_tmp(1) 
     743    REAL             :: VarOut_tmp(1) 
     744     
     745    VarIn_tmp(1)=VarIn 
     746    CALL Check_buffer_r(1)    
     747    CALL allreduce_max_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r) 
     748    VarOut=VarOut_tmp(1) 
     749   
     750  END SUBROUTINE allreduce_max_omp_r 
     751 
     752  SUBROUTINE allreduce_max_omp_r1(VarIn, VarOut) 
     753    IMPLICIT NONE 
     754   
     755    REAL,INTENT(IN),DIMENSION(:)  :: VarIn 
     756    REAL,INTENT(OUT),DIMENSION(:) :: VarOut 
     757     
     758    CALL Check_buffer_r(size(VarIn))    
     759    CALL allreduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     760    
     761  END SUBROUTINE allreduce_max_omp_r1 
     762   
     763   
     764  SUBROUTINE allreduce_max_omp_r2(VarIn, VarOut) 
     765    IMPLICIT NONE 
     766   
     767    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn 
     768    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut 
     769     
     770    CALL Check_buffer_r(size(VarIn))    
     771    CALL allreduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     772   
     773  END SUBROUTINE allreduce_max_omp_r2 
     774 
     775 
     776  SUBROUTINE allreduce_max_omp_r3(VarIn, VarOut) 
     777    IMPLICIT NONE 
     778   
     779    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn 
     780    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut 
     781     
     782    CALL Check_buffer_r(size(VarIn))    
     783    CALL allreduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     784   
     785  END SUBROUTINE allreduce_max_omp_r3 
     786 
     787 
     788  SUBROUTINE allreduce_max_omp_r4(VarIn, VarOut) 
     789    IMPLICIT NONE 
     790 
     791    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn 
     792    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut 
     793   
     794    CALL Check_buffer_r(size(VarIn))    
     795    CALL allreduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r) 
     796   
     797  END SUBROUTINE allreduce_max_omp_r4   
     798 
    523799   
    524800!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     
    7401016   
    7411017  END SUBROUTINE allreduce_sum_omp_rgen 
     1018 
     1019 
     1020 
     1021 
     1022 
     1023 
     1024  SUBROUTINE reduce_max_omp_igen(VarIn,VarOut,dimsize,Buff) 
     1025  IMPLICIT NONE 
     1026 
     1027    INTEGER,INTENT(IN) :: dimsize 
     1028    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn 
     1029    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut 
     1030    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff 
     1031 
     1032    INTEGER :: i 
     1033 
     1034  !$OMP MASTER 
     1035    Buff(:)=VarIn(1) 
     1036  !$OMP END MASTER 
     1037  !$OMP BARRIER 
     1038   
     1039  !$OMP CRITICAL      
     1040    DO i=1,dimsize 
     1041      Buff(i)=MAX(Buff(i),VarIn(i)) 
     1042    ENDDO 
     1043  !$OMP END CRITICAL 
     1044  !$OMP BARRIER   
     1045   
     1046  !$OMP MASTER 
     1047    DO i=1,dimsize 
     1048      VarOut(i)=Buff(i) 
     1049    ENDDO 
     1050  !$OMP END MASTER 
     1051  !$OMP BARRIER 
     1052   
     1053  END SUBROUTINE reduce_max_omp_igen 
     1054 
     1055  SUBROUTINE reduce_max_omp_rgen(VarIn,VarOut,dimsize,Buff) 
     1056  IMPLICIT NONE 
     1057 
     1058    INTEGER,INTENT(IN) :: dimsize 
     1059    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn 
     1060    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut 
     1061    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff 
     1062 
     1063    INTEGER :: i 
     1064 
     1065  !$OMP MASTER 
     1066    Buff(:)=VarIn(1) 
     1067  !$OMP END MASTER 
     1068  !$OMP BARRIER 
     1069   
     1070  !$OMP CRITICAL      
     1071    DO i=1,dimsize 
     1072      Buff(i)=MAX(Buff(i),VarIn(i)) 
     1073    ENDDO 
     1074  !$OMP END CRITICAL 
     1075  !$OMP BARRIER   
     1076   
     1077    DO i=1,dimsize 
     1078      VarOut(i)=Buff(i) 
     1079    ENDDO 
     1080  !$OMP BARRIER 
     1081   
     1082  END SUBROUTINE reduce_max_omp_rgen 
     1083 
     1084 
     1085 
     1086  SUBROUTINE allreduce_max_omp_igen(VarIn,VarOut,dimsize,Buff) 
     1087  IMPLICIT NONE 
     1088 
     1089    INTEGER,INTENT(IN) :: dimsize 
     1090    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn 
     1091    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut 
     1092    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff 
     1093 
     1094    INTEGER :: i 
     1095 
     1096  !$OMP MASTER 
     1097    Buff(:)=VarIn(1) 
     1098  !$OMP END MASTER 
     1099  !$OMP BARRIER 
     1100   
     1101  !$OMP CRITICAL      
     1102    DO i=1,dimsize 
     1103      Buff(i)=MAX(Buff(i),VarIn(i)) 
     1104    ENDDO 
     1105  !$OMP END CRITICAL 
     1106  !$OMP BARRIER   
     1107   
     1108    DO i=1,dimsize 
     1109      VarOut(i)=Buff(i) 
     1110    ENDDO 
     1111  !$OMP BARRIER 
     1112   
     1113  END SUBROUTINE allreduce_max_omp_igen 
     1114 
     1115  SUBROUTINE allreduce_max_omp_rgen(VarIn,VarOut,dimsize,Buff) 
     1116  IMPLICIT NONE 
     1117 
     1118    INTEGER,INTENT(IN) :: dimsize 
     1119    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn 
     1120    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut 
     1121    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff 
     1122 
     1123    INTEGER :: i 
     1124 
     1125  !$OMP MASTER 
     1126    Buff(:)=VarIn(1) 
     1127  !$OMP END MASTER 
     1128  !$OMP BARRIER 
     1129   
     1130  !$OMP CRITICAL      
     1131    DO i=1,dimsize 
     1132      Buff(i)=MAX(Buff(i),VarIn(i)) 
     1133    ENDDO 
     1134  !$OMP END CRITICAL 
     1135  !$OMP BARRIER   
     1136   
     1137    DO i=1,dimsize 
     1138      VarOut(i)=Buff(i) 
     1139    ENDDO 
     1140 
     1141  !$OMP BARRIER 
     1142   
     1143  END SUBROUTINE allreduce_max_omp_rgen 
     1144     
     1145 
     1146 
     1147 
     1148 
     1149 
     1150 
     1151 
     1152 
     1153 
     1154 
    7421155     
    7431156END MODULE transfert_omp_mod 
Note: See TracChangeset for help on using the changeset viewer.