Ignore:
Timestamp:
Aug 19, 2019 5:44:09 PM (22 months ago)
Author:
gronemeier
Message:

loop reordering for performance optimization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/transpose.f90

    r3832 r4171  
    2626! $Id$
    2727! loop reordering for performance optimization
    28 !
     28!
     29! 3832 2019-03-28 13:16:58Z raasch
     30! loop reordering for performance optimization
     31!
    2932! 3694 2019-01-23 17:01:49Z knoop
    3033! OpenACC port for SPEC
    31 ! 
     34!
    3235! 3241 2018-09-12 15:02:00Z raasch
    3336! unused variables removed
    34 ! 
     37!
    3538! 2718 2018-01-02 08:49:38Z maronga
    3639! Corrected "Former revisions" section
    37 ! 
     40!
    3841! 2696 2017-12-14 17:12:51Z kanani
    3942! Change in file header (GPL part)
     
    4346! 2118 2017-01-17 16:38:49Z raasch
    4447! OpenACC directives removed
    45 ! 
     48!
    4649! 2000 2016-08-20 18:09:15Z knoop
    4750! Forced header and separation lines into 80 columns
    48 ! 
     51!
    4952! 1682 2015-10-07 23:56:08Z knoop
    50 ! Code annotations made doxygen readable 
    51 ! 
     53! Code annotations made doxygen readable
     54!
    5255! 1324 2014-03-21 09:13:16Z suehring
    53 ! Bugfix: ONLY statement for module pegrid removed 
     56! Bugfix: ONLY statement for module pegrid removed
    5457!
    5558! 1320 2014-03-20 08:40:49Z raasch
     
    6063! revision history before 2012 removed,
    6164! comment fields (!:) to be used for variable explanations added to
    62 ! all variable declaration statements 
     65! all variable declaration statements
    6366!
    6467! 1318 2014-03-17 13:35:16Z raasch
     
    104107!------------------------------------------------------------------------------!
    105108 SUBROUTINE resort_for_xy( f_in, f_inv )
    106  
     109
    107110
    108111     USE indices,                                                              &
     
    116119     IMPLICIT NONE
    117120
    118      REAL(wp) ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x)  !< 
    119      REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !< 
    120 
    121 
    122      INTEGER(iwp) ::  i !< 
    123      INTEGER(iwp) ::  j !< 
    124      INTEGER(iwp) ::  k !< 
     121     REAL(wp) ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x)  !<
     122     REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !<
     123
     124
     125     INTEGER(iwp) ::  i !<
     126     INTEGER(iwp) ::  j !<
     127     INTEGER(iwp) ::  k !<
    125128!
    126129!-- Rearrange indices of input array in order to make data to be send
     
    133136#endif
    134137     DO  k = nzb_x, nzt_x
    135          DO  i = 0, nx
    136              DO  j = nys_x, nyn_x
     138         DO  j = nys_x, nyn_x
     139             DO  i = 0, nx
    137140                 f_inv(j,k,i) = f_in(i,j,k)
    138141             ENDDO
     
    159162    USE indices,                                                               &
    160163        ONLY:  nx, ny
    161        
     164
    162165    USE kinds
    163166
     
    169172    IMPLICIT NONE
    170173
    171     INTEGER(iwp) ::  i  !< 
    172     INTEGER(iwp) ::  j  !< 
    173     INTEGER(iwp) ::  k  !< 
    174     INTEGER(iwp) ::  l  !< 
    175     INTEGER(iwp) ::  ys !< 
    176  
    177     REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !< 
    178     REAL(wp) ::  f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y) !< 
    179 
    180     REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !< 
     174    INTEGER(iwp) ::  i  !<
     175    INTEGER(iwp) ::  j  !<
     176    INTEGER(iwp) ::  k  !<
     177    INTEGER(iwp) ::  l  !<
     178    INTEGER(iwp) ::  ys !<
     179
     180    REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !<
     181    REAL(wp) ::  f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y) !<
     182
     183    REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !<
    181184#if __acc_fft_device
    182185    !$ACC DECLARE CREATE(work)
     
    275278     IMPLICIT NONE
    276279
    277      REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !< 
    278      REAL(wp) ::  f_out(1:nz,nys:nyn,nxl:nxr) !< 
    279 
    280      INTEGER(iwp) ::  i !< 
    281      INTEGER(iwp) ::  j !< 
    282      INTEGER(iwp) ::  k !< 
     280     REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !<
     281     REAL(wp) ::  f_out(1:nz,nys:nyn,nxl:nxr) !<
     282
     283     INTEGER(iwp) ::  i !<
     284     INTEGER(iwp) ::  j !<
     285     INTEGER(iwp) ::  k !<
    283286!
    284287!-- Rearrange indices of input array in order to make data to be send
     
    292295     !$ACC PRESENT(f_out, f_inv)
    293296#endif
    294      DO  k = 1, nz
    295          DO  i = nxl, nxr
    296              DO  j = nys, nyn
     297     DO  i = nxl, nxr
     298         DO  j = nys, nyn
     299             DO  k = 1, nz
    297300                 f_out(k,j,i) = f_inv(j,i,k)
    298301             ENDDO
     
    329332    IMPLICIT NONE
    330333
    331     INTEGER(iwp) ::  i  !< 
    332     INTEGER(iwp) ::  j  !< 
    333     INTEGER(iwp) ::  k  !< 
    334     INTEGER(iwp) ::  l  !< 
    335     INTEGER(iwp) ::  xs !< 
    336 
    337     REAL(wp) ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !< 
    338     REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !< 
    339 
    340     REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !< 
     334    INTEGER(iwp) ::  i  !<
     335    INTEGER(iwp) ::  j  !<
     336    INTEGER(iwp) ::  k  !<
     337    INTEGER(iwp) ::  l  !<
     338    INTEGER(iwp) ::  xs !<
     339
     340    REAL(wp) ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !<
     341    REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !<
     342
     343    REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !<
    341344#if __acc_fft_device
    342345    !$ACC DECLARE CREATE(work)
     
    441444     IMPLICIT NONE
    442445
    443      REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !< 
    444      REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !< 
    445 
    446 
    447      INTEGER(iwp) ::  i !< 
    448      INTEGER(iwp) ::  j !< 
    449      INTEGER(iwp) ::  k !< 
     446     REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !<
     447     REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !<
     448
     449
     450     INTEGER(iwp) ::  i !<
     451     INTEGER(iwp) ::  j !<
     452     INTEGER(iwp) ::  k !<
    450453!
    451454!-- Rearrange indices of input array in order to make data to be send
     
    457460     !$ACC PRESENT(f_out, f_inv)
    458461#endif
    459      DO  i = 0, nx
    460          DO  k = nzb_x, nzt_x
    461              DO  j = nys_x, nyn_x
     462     DO  k = nzb_x, nzt_x
     463         DO  j = nys_x, nyn_x
     464             DO  i = 0, nx
    462465                 f_out(i,j,k) = f_inv(j,k,i)
    463466             ENDDO
     
    494497    IMPLICIT NONE
    495498
    496     INTEGER(iwp) ::  i  !< 
    497     INTEGER(iwp) ::  j  !< 
    498     INTEGER(iwp) ::  k  !< 
    499     INTEGER(iwp) ::  l  !< 
    500     INTEGER(iwp) ::  ys !< 
    501 
    502     REAL(wp) ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)  !< 
    503     REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !< 
    504 
    505     REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !< 
     499    INTEGER(iwp) ::  i  !<
     500    INTEGER(iwp) ::  j  !<
     501    INTEGER(iwp) ::  k  !<
     502    INTEGER(iwp) ::  l  !<
     503    INTEGER(iwp) ::  ys !<
     504
     505    REAL(wp) ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)  !<
     506    REAL(wp) ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx) !<
     507
     508    REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !<
    506509#if __acc_fft_device
    507510    !$ACC DECLARE CREATE(work)
     
    611614    IMPLICIT NONE
    612615
    613     INTEGER(iwp) ::  i  !< 
    614     INTEGER(iwp) ::  j  !< 
    615     INTEGER(iwp) ::  k  !< 
    616     INTEGER(iwp) ::  l  !< 
    617     INTEGER(iwp) ::  m  !< 
    618     INTEGER(iwp) ::  xs !< 
    619 
    620     REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)          !< 
    621     REAL(wp) ::  f_inv(nxl:nxr,1:nz,nys:nyn)         !< 
    622     REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !< 
    623     REAL(wp) ::  work(nnx*nny*nnz)                   !< 
     616    INTEGER(iwp) ::  i  !<
     617    INTEGER(iwp) ::  j  !<
     618    INTEGER(iwp) ::  k  !<
     619    INTEGER(iwp) ::  l  !<
     620    INTEGER(iwp) ::  m  !<
     621    INTEGER(iwp) ::  xs !<
     622
     623    REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)          !<
     624    REAL(wp) ::  f_inv(nxl:nxr,1:nz,nys:nyn)         !<
     625    REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !<
     626    REAL(wp) ::  work(nnx*nny*nnz)                   !<
    624627#if defined( __parallel )
    625628
     
    683686     IMPLICIT NONE
    684687
    685      REAL(wp) ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)  !< 
    686      REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !< 
    687 
    688      INTEGER(iwp) ::  i !< 
    689      INTEGER(iwp) ::  j !< 
    690      INTEGER(iwp) ::  k !< 
     688     REAL(wp) ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)  !<
     689     REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !<
     690
     691     INTEGER(iwp) ::  i !<
     692     INTEGER(iwp) ::  j !<
     693     INTEGER(iwp) ::  k !<
    691694
    692695!
     
    699702     !$ACC PRESENT(f_inv, f_in)
    700703#endif
    701      DO  j = 0, ny
    702          DO  k = nzb_y, nzt_y
    703              DO  i = nxl_y, nxr_y
     704     DO  k = nzb_y, nzt_y
     705         DO  i = nxl_y, nxr_y
     706             DO  j = 0, ny
    704707                 f_inv(i,k,j) = f_in(j,i,k)
    705708             ENDDO
     
    736739    IMPLICIT NONE
    737740
    738     INTEGER(iwp) ::  i  !< 
    739     INTEGER(iwp) ::  j  !< 
    740     INTEGER(iwp) ::  k  !< 
    741     INTEGER(iwp) ::  l  !< 
    742     INTEGER(iwp) ::  zs !< 
    743 
    744     REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !< 
    745     REAL(wp) ::  f_out(nxl_z:nxr_z,nys_z:nyn_z,1:nz) !< 
    746 
    747     REAL(wp), DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work !< 
     741    INTEGER(iwp) ::  i  !<
     742    INTEGER(iwp) ::  j  !<
     743    INTEGER(iwp) ::  k  !<
     744    INTEGER(iwp) ::  l  !<
     745    INTEGER(iwp) ::  zs !<
     746
     747    REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !<
     748    REAL(wp) ::  f_out(nxl_z:nxr_z,nys_z:nyn_z,1:nz) !<
     749
     750    REAL(wp), DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work !<
    748751#if __acc_fft_device
    749752    !$ACC DECLARE CREATE(work)
     
    843846     IMPLICIT NONE
    844847
    845      REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)  !< 
    846      REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !< 
    847 
    848      INTEGER(iwp) ::  i !< 
    849      INTEGER(iwp) ::  j !< 
    850      INTEGER(iwp) ::  k !< 
     848     REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)  !<
     849     REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz) !<
     850
     851     INTEGER(iwp) ::  i !<
     852     INTEGER(iwp) ::  j !<
     853     INTEGER(iwp) ::  k !<
    851854
    852855!
     
    860863#endif
    861864     DO  i = nxl, nxr
    862          DO  k = 1,nz
    863              DO  j = nys, nyn
     865         DO  j = nys, nyn
     866             DO  k = 1,nz
    864867                 f_inv(j,i,k) = f_in(k,j,i)
    865868             ENDDO
     
    896899    IMPLICIT NONE
    897900
    898     INTEGER(iwp) ::  i  !< 
    899     INTEGER(iwp) ::  j  !< 
    900     INTEGER(iwp) ::  k  !< 
    901     INTEGER(iwp) ::  l  !< 
    902     INTEGER(iwp) ::  xs !< 
    903 
    904     REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz)         !< 
    905     REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !< 
    906 
    907     REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !< 
     901    INTEGER(iwp) ::  i  !<
     902    INTEGER(iwp) ::  j  !<
     903    INTEGER(iwp) ::  k  !<
     904    INTEGER(iwp) ::  l  !<
     905    INTEGER(iwp) ::  xs !<
     906
     907    REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz)         !<
     908    REAL(wp) ::  f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x) !<
     909
     910    REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !<
    908911#if __acc_fft_device
    909912    !$ACC DECLARE CREATE(work)
     
    10061009     IMPLICIT NONE
    10071010
    1008      REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !< 
    1009      REAL(wp) ::  f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y) !< 
    1010 
    1011 
    1012      INTEGER(iwp) ::  i !< 
    1013      INTEGER(iwp) ::  j !< 
    1014      INTEGER(iwp) ::  k !< 
     1011     REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !<
     1012     REAL(wp) ::  f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y) !<
     1013
     1014
     1015     INTEGER(iwp) ::  i !<
     1016     INTEGER(iwp) ::  j !<
     1017     INTEGER(iwp) ::  k !<
    10151018
    10161019!
     
    10231026    !$ACC PRESENT(f_out, f_inv)
    10241027#endif
    1025      DO  j = 0, ny
    1026          DO  k = nzb_y, nzt_y
    1027              DO  i = nxl_y, nxr_y
     1028     DO  k = nzb_y, nzt_y
     1029         DO  i = nxl_y, nxr_y
     1030             DO  j = 0, ny
    10281031                 f_out(j,i,k) = f_inv(i,k,j)
    10291032             ENDDO
     
    10601063    IMPLICIT NONE
    10611064
    1062     INTEGER(iwp) ::  i  !< 
    1063     INTEGER(iwp) ::  j  !< 
    1064     INTEGER(iwp) ::  k  !< 
    1065     INTEGER(iwp) ::  l  !< 
    1066     INTEGER(iwp) ::  zs !< 
    1067 
    1068     REAL(wp) ::  f_in(nxl_z:nxr_z,nys_z:nyn_z,1:nz)  !< 
    1069     REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !< 
     1065    INTEGER(iwp) ::  i  !<
     1066    INTEGER(iwp) ::  j  !<
     1067    INTEGER(iwp) ::  k  !<
     1068    INTEGER(iwp) ::  l  !<
     1069    INTEGER(iwp) ::  zs !<
     1070
     1071    REAL(wp) ::  f_in(nxl_z:nxr_z,nys_z:nyn_z,1:nz)  !<
     1072    REAL(wp) ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny) !<
    10701073
    10711074    REAL(wp), DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work !<
     
    11781181    IMPLICIT NONE
    11791182
    1180     INTEGER(iwp) ::  i  !< 
    1181     INTEGER(iwp) ::  j  !< 
    1182     INTEGER(iwp) ::  k  !< 
    1183     INTEGER(iwp) ::  l  !< 
    1184     INTEGER(iwp) ::  m  !< 
    1185     INTEGER(iwp) ::  ys !< 
    1186 
    1187     REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)              !< 
    1188     REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz)             !< 
    1189     REAL(wp) ::  f_out(0:ny,nxl_yd:nxr_yd,nzb_yd:nzt_yd) !< 
    1190     REAL(wp) ::  work(nnx*nny*nnz)                       !< 
     1183    INTEGER(iwp) ::  i  !<
     1184    INTEGER(iwp) ::  j  !<
     1185    INTEGER(iwp) ::  k  !<
     1186    INTEGER(iwp) ::  l  !<
     1187    INTEGER(iwp) ::  m  !<
     1188    INTEGER(iwp) ::  ys !<
     1189
     1190    REAL(wp) ::  f_in(1:nz,nys:nyn,nxl:nxr)              !<
     1191    REAL(wp) ::  f_inv(nys:nyn,nxl:nxr,1:nz)             !<
     1192    REAL(wp) ::  f_out(0:ny,nxl_yd:nxr_yd,nzb_yd:nzt_yd) !<
     1193    REAL(wp) ::  work(nnx*nny*nnz)                       !<
    11911194
    11921195#if defined( __parallel )
Note: See TracChangeset for help on using the changeset viewer.