Ignore:
Timestamp:
Mar 8, 2013 11:54:10 PM (8 years ago)
Author:
raasch
Message:

New:
---

GPU porting of pres, swap_timelevel. Adjustments of openACC directives.
Further porting of poisfft, which now runs completely on GPU without any
host/device data transfer for serial an parallel runs (but parallel runs
require data transfer before and after the MPI transpositions).
GPU-porting of tridiagonal solver:
tridiagonal routines split into extermal subroutines (instead using CONTAINS),
no distinction between parallel/non-parallel in poisfft and tridia any more,
tridia routines moved to end of file because of probable bug in PGI compiler
(otherwise "invalid device function" is indicated during runtime).
(cuda_fft_interfaces, fft_xy, flow_statistics, init_3d_model, palm, poisfft, pres, prognostic_equations, swap_timelevel, time_integration, transpose)
output of accelerator board information. (header)

optimization of tridia routines: constant elements and coefficients of tri are
stored in seperate arrays ddzuw and tric, last dimension of tri reduced from 5 to 2,
(init_grid, init_3d_model, modules, palm, poisfft)

poisfft_init is now called internally from poisfft,
(Makefile, Makefile_check, init_pegrid, poisfft, poisfft_hybrid)

CPU-time per grid point and timestep is output to CPU_MEASURES file
(cpu_statistics, modules, time_integration)

Changed:


resorting from/to array work changed, work now has 4 dimensions instead of 1 (transpose)
array diss allocated only if required (init_3d_model)

pressure boundary condition "Neumann+inhomo" removed from the code
(check_parameters, header, poisfft, poisfft_hybrid, pres)

Errors:


bugfix: dependency added for cuda_fft_interfaces (Makefile)
bugfix: CUDA fft plans adjusted for domain decomposition (before they always
used total domain) (fft_xy)

File:
1 edited

Legend:

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

    r1107 r1111  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! openACC directives added,
     23! resorting data from/to work changed, work got 4 dimensions instead of 1
    2324!
    2425! Former revisions:
     
    8182    IMPLICIT NONE
    8283
    83     INTEGER ::  i, j, k, l, m, ys
     84    INTEGER ::  i, j, k, l, ys
    8485   
    85     REAL ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x),   &
    86              f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx),  &
    87              f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y),  &
    88              work(nnx*nny*nnz)
     86    REAL ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x), f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)
     87
     88    REAL, DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work
     89
     90    !$acc declare create( f_inv )
     91    REAL ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx)
     92
    8993
    9094!
     
    9397!$OMP  PARALLEL PRIVATE ( i, j, k )
    9498!$OMP  DO
     99    !$acc kernels present( f_in )
     100    !$acc loop
    95101    DO  i = 0, nx
    96102       DO  k = nzb_x, nzt_x
     103          !$acc loop vector( 32 )
    97104          DO  j = nys_x, nyn_x
    98105             f_inv(j,k,i) = f_in(i,j,k)
     
    100107       ENDDO
    101108    ENDDO
     109    !$acc end kernels
    102110!$OMP  END PARALLEL
    103111
     
    109117       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    110118       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    111        CALL MPI_ALLTOALL( f_inv(nys_x,nzb_x,0), sendrecvcount_xy, MPI_REAL, &
    112                           work(1),              sendrecvcount_xy, MPI_REAL, &
     119       !$acc update host( f_inv )
     120       CALL MPI_ALLTOALL( f_inv(nys_x,nzb_x,0),  sendrecvcount_xy, MPI_REAL, &
     121                          work(1,nzb_y,nxl_y,0), sendrecvcount_xy, MPI_REAL, &
    113122                          comm1dy, ierr )
     123       !$acc update device( work )
    114124       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    115125
    116126!
    117127!--    Reorder transposed array
    118 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, ys )
     128!$OMP  PARALLEL PRIVATE ( i, j, k, l, ys )
    119129!$OMP  DO
    120130       DO  l = 0, pdims(2) - 1
    121           m  = l * ( nxr_y - nxl_y + 1 ) * ( nzt_y - nzb_y + 1 ) * &
    122                    ( nyn_x - nys_x + 1 )
    123131          ys = 0 + l * ( nyn_x - nys_x + 1 )
     132          !$acc kernels present( f_out, work )
     133          !$acc loop
    124134          DO  i = nxl_y, nxr_y
    125135             DO  k = nzb_y, nzt_y
     136                !$acc loop vector( 32 )
    126137                DO  j = ys, ys + nyn_x - nys_x
    127                    m = m + 1
    128                    f_out(j,i,k) = work(m)
     138                   f_out(j,i,k) = work(j-ys+1,k,i,l)
    129139                ENDDO
    130140             ENDDO
    131141          ENDDO
     142          !$acc end kernels
    132143       ENDDO
    133144!$OMP  END PARALLEL
     
    140151!$OMP  PARALLEL PRIVATE ( i, j, k )
    141152!$OMP  DO
     153       !$acc kernels present( f_out )
     154       !$acc loop
    142155       DO  k = nzb_y, nzt_y
    143156          DO  i = nxl_y, nxr_y
     157             !$acc loop vector( 32 )
    144158             DO  j = 0, ny
    145159                f_out(j,i,k) = f_inv(j,k,i)
     
    147161          ENDDO
    148162       ENDDO
     163       !$acc end kernels
    149164!$OMP  END PARALLEL
    150165
     
    172187    IMPLICIT NONE
    173188
    174     INTEGER ::  i, j, k, l, m, xs
     189    INTEGER ::  i, j, k, l, xs
    175190   
    176     REAL ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x),  &
    177              f_inv(nys:nyn,nxl:nxr,1:nz),         &
    178              f_out(1:nz,nys:nyn,nxl:nxr),         &
    179              work(nnx*nny*nnz)
     191    REAL ::  f_in(0:nx,nys_x:nyn_x,nzb_x:nzt_x), f_out(1:nz,nys:nyn,nxl:nxr)
     192
     193    REAL, DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work
     194
     195    !$acc declare create( f_inv )
     196    REAL ::  f_inv(nys:nyn,nxl:nxr,1:nz)
    180197
    181198
     
    188205!
    189206!--    Reorder input array for transposition
    190 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, xs )
     207!$OMP  PARALLEL PRIVATE ( i, j, k, l, xs )
    191208!$OMP  DO
    192209       DO  l = 0, pdims(1) - 1
    193           m  = l * ( nzt_x - nzb_x + 1 ) * nnx * ( nyn_x - nys_x + 1 )
    194210          xs = 0 + l * nnx
     211          !$acc kernels present( f_in, work )
     212          !$acc loop
    195213          DO  k = nzb_x, nzt_x
    196214             DO  i = xs, xs + nnx - 1
     215                !$acc loop vector( 32 )
    197216                DO  j = nys_x, nyn_x
    198                    m = m + 1
    199                    work(m) = f_in(i,j,k)
     217                   work(j,i-xs+1,k,l) = f_in(i,j,k)
    200218                ENDDO
    201219             ENDDO
    202220          ENDDO
     221          !$acc end kernels
    203222       ENDDO
    204223!$OMP  END PARALLEL
     
    208227       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    209228       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    210        CALL MPI_ALLTOALL( work(1),          sendrecvcount_zx, MPI_REAL, &
    211                           f_inv(nys,nxl,1), sendrecvcount_zx, MPI_REAL, &
     229       !$acc update host( work )
     230       CALL MPI_ALLTOALL( work(nys_x,1,nzb_x,0), sendrecvcount_zx, MPI_REAL, &
     231                          f_inv(nys,nxl,1),      sendrecvcount_zx, MPI_REAL, &
    212232                          comm1dx, ierr )
     233       !$acc update device( f_inv )
    213234       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    214235
     
    217238!$OMP  PARALLEL PRIVATE ( i, j, k )
    218239!$OMP  DO
     240       !$acc kernels present( f_out )
     241       !$acc loop
    219242       DO  k = 1, nz
    220243          DO  i = nxl, nxr
     244             !$acc loop vector( 32 )
    221245             DO  j = nys, nyn
    222246                f_out(k,j,i) = f_inv(j,i,k)
     
    224248          ENDDO
    225249       ENDDO
     250       !$acc end kernels
    226251!$OMP  END PARALLEL
    227252#endif
     
    233258!$OMP  PARALLEL PRIVATE ( i, j, k )
    234259!$OMP  DO
     260       !$acc kernels present( f_in )
     261       !$acc loop
    235262       DO  i = nxl, nxr
    236263          DO  j = nys, nyn
     264             !$acc loop vector( 32 )
    237265             DO  k = 1, nz
    238266                f_inv(j,i,k) = f_in(i,j,k)
     
    240268          ENDDO
    241269       ENDDO
    242 !$OMP  END PARALLEL
    243 
    244 !$OMP  PARALLEL PRIVATE ( i, j, k )
    245 !$OMP  DO
     270       !$acc end kernels
     271!$OMP  END PARALLEL
     272
     273!$OMP  PARALLEL PRIVATE ( i, j, k )
     274!$OMP  DO
     275       !$acc kernels present( f_out )
     276       !$acc loop
    246277       DO  k = 1, nz
    247278          DO  i = nxl, nxr
     279             !$acc loop vector( 32 )
    248280             DO  j = nys, nyn
    249281                f_out(k,j,i) = f_inv(j,i,k)
     
    251283          ENDDO
    252284       ENDDO
     285       !$acc end kernels
    253286!$OMP  END PARALLEL
    254287
     
    276309    IMPLICIT NONE
    277310
    278     INTEGER ::  i, j, k, l, m, ys
     311    INTEGER ::  i, j, k, l, ys
    279312   
    280     REAL ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y),  &
    281              f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx), &
    282              f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x), &
    283              work(nnx*nny*nnz)
     313    REAL ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y), f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x)
     314
     315    REAL, DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work
     316
     317    !$acc declare create( f_inv )
     318    REAL ::  f_inv(nys_x:nyn_x,nzb_x:nzt_x,0:nx)
     319
    284320
    285321    IF ( numprocs /= 1 )  THEN
     
    288324!
    289325!--    Reorder input array for transposition
    290 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, ys )
     326!$OMP  PARALLEL PRIVATE ( i, j, k, l, ys )
    291327!$OMP  DO
    292328       DO  l = 0, pdims(2) - 1
    293           m  = l * ( nxr_y - nxl_y + 1 ) * ( nzt_y - nzb_y + 1 ) * &
    294                    ( nyn_x - nys_x + 1 )
    295329          ys = 0 + l * ( nyn_x - nys_x + 1 )
     330          !$acc kernels present( f_in, work )
     331          !$acc loop
    296332          DO  i = nxl_y, nxr_y
    297333             DO  k = nzb_y, nzt_y
     334                !$acc loop vector( 32 )
    298335                DO  j = ys, ys + nyn_x - nys_x
    299                    m = m + 1
    300                    work(m) = f_in(j,i,k)
     336                   work(j-ys+1,k,i,l) = f_in(j,i,k)
    301337                ENDDO
    302338             ENDDO
    303339          ENDDO
     340          !$acc end kernels
    304341       ENDDO
    305342!$OMP  END PARALLEL
     
    309346       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    310347       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    311        CALL MPI_ALLTOALL( work(1),              sendrecvcount_xy, MPI_REAL, &
    312                           f_inv(nys_x,nzb_x,0), sendrecvcount_xy, MPI_REAL, &
     348       !$acc update host( work )
     349       CALL MPI_ALLTOALL( work(1,nzb_y,nxl_y,0), sendrecvcount_xy, MPI_REAL, &
     350                          f_inv(nys_x,nzb_x,0),  sendrecvcount_xy, MPI_REAL, &
    313351                          comm1dy, ierr )
     352       !$acc update device( f_inv )
    314353       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    315354#endif
     
    321360!$OMP  PARALLEL PRIVATE ( i, j, k )
    322361!$OMP  DO
     362       !$acc kernels present( f_in )
     363       !$acc loop
    323364       DO  i = nxl_y, nxr_y
    324365          DO  k = nzb_y, nzt_y
     366             !$acc loop vector( 32 )
    325367             DO  j = 0, ny
    326368                f_inv(j,k,i) = f_in(j,i,k)
     
    328370          ENDDO
    329371       ENDDO
     372       !$acc end kernels
    330373!$OMP  END PARALLEL
    331374
     
    336379!$OMP  PARALLEL PRIVATE ( i, j, k )
    337380!$OMP  DO
     381    !$acc kernels present( f_out )
     382    !$acc loop
    338383    DO  i = 0, nx
    339384       DO  k = nzb_x, nzt_x
     385          !$acc loop vector( 32 )
    340386          DO  j = nys_x, nyn_x
    341387             f_out(i,j,k) = f_inv(j,k,i)
     
    343389       ENDDO
    344390    ENDDO
     391    !$acc end kernels
    345392!$OMP  END PARALLEL
    346393
     
    434481    IMPLICIT NONE
    435482
    436     INTEGER ::  i, j, k, l, m, zs
     483    INTEGER ::  i, j, k, l, zs
    437484   
    438     REAL ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y),  &
    439              f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny), &
    440              f_out(nxl_z:nxr_z,nys_z:nyn_z,1:nz), &
    441              work(nnx*nny*nnz)
     485    REAL ::  f_in(0:ny,nxl_y:nxr_y,nzb_y:nzt_y), f_out(nxl_z:nxr_z,nys_z:nyn_z,1:nz)
     486
     487    REAL, DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work
     488
     489    !$acc declare create( f_inv )
     490    REAL ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny)
     491
    442492
    443493!
     
    446496!$OMP  PARALLEL PRIVATE ( i, j, k )
    447497!$OMP  DO
     498    !$acc kernels present( f_in )
     499    !$acc loop
    448500    DO  j = 0, ny
    449501       DO  k = nzb_y, nzt_y
     502          !$acc loop vector( 32 )
    450503          DO  i = nxl_y, nxr_y
    451504             f_inv(i,k,j) = f_in(j,i,k)
     
    453506       ENDDO
    454507    ENDDO
     508    !$acc end kernels
    455509!$OMP  END PARALLEL
    456510
     
    464518!$OMP  PARALLEL PRIVATE ( i, j, k )
    465519!$OMP  DO
     520       !$acc kernels present( f_out )
     521       !$acc loop
    466522       DO  j = 0, ny
    467523          DO  k = nzb_y, nzt_y
     524             !$acc loop vector( 32 )
    468525             DO  i = nxl_y, nxr_y
    469526                f_out(i,j,k) = f_inv(i,k,j)
     
    471528          ENDDO
    472529       ENDDO
     530       !$acc end kernels
    473531!$OMP  END PARALLEL
    474532
     
    480538       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    481539       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    482        CALL MPI_ALLTOALL( f_inv(nxl_y,nzb_y,0), sendrecvcount_yz, MPI_REAL, &
    483                           work(1),              sendrecvcount_yz, MPI_REAL, &
     540       !$acc update host( f_inv )
     541       CALL MPI_ALLTOALL( f_inv(nxl_y,nzb_y,0),  sendrecvcount_yz, MPI_REAL, &
     542                          work(nxl_z,1,nys_z,0), sendrecvcount_yz, MPI_REAL, &
    484543                          comm1dx, ierr )
     544       !$acc update device( work )
    485545       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    486546
    487547!
    488548!--    Reorder transposed array
    489 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, zs )
     549!$OMP  PARALLEL PRIVATE ( i, j, k, l, zs )
    490550!$OMP  DO
    491551       DO  l = 0, pdims(1) - 1
    492           m  = l * ( nyn_z - nys_z + 1 ) * ( nzt_y - nzb_y + 1 ) * &
    493                    ( nxr_z - nxl_z + 1 )
    494552          zs = 1 + l * ( nzt_y - nzb_y + 1 )
     553          !$acc kernels present( f_out, work )
     554          !$acc loop
    495555          DO  j = nys_z, nyn_z
    496556             DO  k = zs, zs + nzt_y - nzb_y
     557                !$acc loop vector( 32 )
    497558                DO  i = nxl_z, nxr_z
    498                    m = m + 1
    499                    f_out(i,j,k) = work(m)
     559                   f_out(i,j,k) = work(i,k-zs+1,j,l)
    500560                ENDDO
    501561             ENDDO
    502562          ENDDO
     563          !$acc end kernels
    503564       ENDDO
    504565!$OMP  END PARALLEL
     
    528589    IMPLICIT NONE
    529590
    530     INTEGER ::  i, j, k, l, m, xs
     591    INTEGER ::  i, j, k, l, xs
    531592   
    532     REAL ::  f_in(1:nz,nys:nyn,nxl:nxr), f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x), &
    533              work(nnx*nny*nnz)
    534 
    535     !$acc declare create ( f_inv )
     593    REAL ::  f_in(1:nz,nys:nyn,nxl:nxr), f_out(0:nx,nys_x:nyn_x,nzb_x:nzt_x)
     594
     595    REAL, DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work
     596
     597    !$acc declare create( f_inv )
    536598    REAL ::  f_inv(nys:nyn,nxl:nxr,1:nz)
    537599
     
    552614       ENDDO
    553615    ENDDO
     616    !$acc end kernels
    554617!$OMP  END PARALLEL
    555618
     
    573636          ENDDO
    574637       ENDDO
     638       !$acc end kernels
    575639!$OMP  END PARALLEL
    576640
     
    582646       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    583647       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    584        CALL MPI_ALLTOALL( f_inv(nys,nxl,1), sendrecvcount_zx, MPI_REAL, &
    585                           work(1),          sendrecvcount_zx, MPI_REAL, &
     648       !$acc update host( f_inv )
     649       CALL MPI_ALLTOALL( f_inv(nys,nxl,1),      sendrecvcount_zx, MPI_REAL, &
     650                          work(nys_x,1,nzb_x,0), sendrecvcount_zx, MPI_REAL, &
    586651                          comm1dx, ierr )
     652       !$acc update device( work )
    587653       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    588654
    589655!
    590656!--    Reorder transposed array
    591 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, xs )
     657!$OMP  PARALLEL PRIVATE ( i, j, k, l, xs )
    592658!$OMP  DO
    593659       DO  l = 0, pdims(1) - 1
    594           m  = l * ( nzt_x - nzb_x + 1 ) * nnx * ( nyn_x - nys_x + 1 )
    595660          xs = 0 + l * nnx
     661          !$acc kernels present( f_out, work )
     662          !$acc loop
    596663          DO  k = nzb_x, nzt_x
    597664             DO  i = xs, xs + nnx - 1
     665                !$acc loop vector( 32 )
    598666                DO  j = nys_x, nyn_x
    599                    m = m + 1
    600                    f_out(i,j,k) = work(m)
     667                   f_out(i,j,k) = work(j,i-xs+1,k,l)
    601668                ENDDO
    602669             ENDDO
    603670          ENDDO
     671          !$acc end kernels
    604672       ENDDO
    605673!$OMP  END PARALLEL
     
    629697    IMPLICIT NONE
    630698
    631     INTEGER ::  i, j, k, l, m, zs
     699    INTEGER ::  i, j, k, l, zs
    632700   
    633     REAL ::  f_in(nxl_z:nxr_z,nys_z:nyn_z,1:nz),  &
    634              f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny), &
    635              f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y), &
    636              work(nnx*nny*nnz)
     701    REAL ::  f_in(nxl_z:nxr_z,nys_z:nyn_z,1:nz), f_out(0:ny,nxl_y:nxr_y,nzb_y:nzt_y)
     702
     703    REAL, DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work
     704
     705    !$acc declare create( f_inv )
     706    REAL ::  f_inv(nxl_y:nxr_y,nzb_y:nzt_y,0:ny)
     707
    637708
    638709!
     
    644715!
    645716!--    Reorder input array for transposition
    646 !$OMP  PARALLEL PRIVATE ( i, j, k, l, m, zs )
     717!$OMP  PARALLEL PRIVATE ( i, j, k, l, zs )
    647718!$OMP  DO
    648719       DO  l = 0, pdims(1) - 1
    649           m  = l * ( nyn_z - nys_z + 1 ) * ( nzt_y - nzb_y + 1 ) * &
    650                    ( nxr_z - nxl_z + 1 )
    651720          zs = 1 + l * ( nzt_y - nzb_y + 1 )
     721          !$acc kernels present( f_in, work )
     722          !$acc loop
    652723          DO  j = nys_z, nyn_z
    653724             DO  k = zs, zs + nzt_y - nzb_y
     725                !$acc loop vector( 32 )
    654726                DO  i = nxl_z, nxr_z
    655                    m = m + 1
    656                    work(m) = f_in(i,j,k)
     727                   work(i,k-zs+1,j,l) = f_in(i,j,k)
    657728                ENDDO
    658729             ENDDO
    659730          ENDDO
     731          !$acc end kernels
    660732       ENDDO
    661733!$OMP  END PARALLEL
     
    665737       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start' )
    666738       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    667        CALL MPI_ALLTOALL( work(1),              sendrecvcount_yz, MPI_REAL, &
    668                           f_inv(nxl_y,nzb_y,0), sendrecvcount_yz, MPI_REAL, &
     739       !$acc update host( work )
     740       CALL MPI_ALLTOALL( work(nxl_z,1,nys_z,0), sendrecvcount_yz, MPI_REAL, &
     741                          f_inv(nxl_y,nzb_y,0),  sendrecvcount_yz, MPI_REAL, &
    669742                          comm1dx, ierr )
     743       !$acc update device( f_inv )
    670744       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    671745#endif
     
    676750!$OMP  PARALLEL PRIVATE ( i, j, k )
    677751!$OMP  DO
     752       !$acc kernels present( f_in )
     753       !$acc loop
    678754       DO  k = nzb_y, nzt_y
    679755          DO  j = 0, ny
     756             !$acc loop vector( 32 )
    680757             DO  i = nxl_y, nxr_y
    681758                f_inv(i,k,j) = f_in(i,j,k)
     
    683760          ENDDO
    684761       ENDDO
     762       !$acc end kernels
    685763!$OMP  END PARALLEL
    686764
     
    691769!$OMP  PARALLEL PRIVATE ( i, j, k )
    692770!$OMP  DO
     771    !$acc kernels present( f_out )
     772    !$acc loop
    693773    DO  k = nzb_y, nzt_y
    694774       DO  i = nxl_y, nxr_y
     775          !$acc loop vector( 32 )
    695776          DO  j = 0, ny
    696777             f_out(j,i,k) = f_inv(i,k,j)
     
    698779       ENDDO
    699780    ENDDO
     781    !$acc end kernels
    700782!$OMP  END PARALLEL
    701783
Note: See TracChangeset for help on using the changeset viewer.