Changeset 3690 for palm/trunk/SOURCE


Ignore:
Timestamp:
Jan 22, 2019 10:56:42 PM (6 years ago)
Author:
knoop
Message:

Enabled OpenACC usage without using the cudaFFT library.
Added respective palmtest build configuration and testcase.

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r3655 r3690  
    253253       REAL(wp), DIMENSION(1:nz,nys:nyn,nxl:nxr) ::  ar      !<
    254254       REAL(wp), DIMENSION(nys:nyn,nxl:nxr,1:nz) ::  ar_inv  !<
     255
     256#define __acc_fft_device ( defined( _OPENACC ) && ( defined ( __cuda_fft ) ) )
     257#if __acc_fft_device
    255258       !$ACC DECLARE CREATE(ar_inv)
     259#endif
    256260
    257261       REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE ::  ar1      !<
     
    265269
    266270       IF ( .NOT. poisfft_initialized )  CALL poisfft_init
     271
     272#if !__acc_fft_device
     273       !$ACC UPDATE HOST(ar)
     274#endif
    267275
    268276#ifndef _OPENACC
     
    705713
    706714       ENDIF
     715#endif
     716
     717#if !__acc_fft_device
     718       !$ACC UPDATE DEVICE(ar)
    707719#endif
    708720
  • palm/trunk/SOURCE/transpose.f90

    r3657 r3690  
    9191! Initial revision
    9292!
     93
     94#define __acc_fft_device ( defined( _OPENACC ) && ( defined ( __cuda_fft ) ) )
     95
    9396!------------------------------------------------------------------------------!
    9497! Description:
     
    122125    !$OMP  PARALLEL PRIVATE ( i, j, k )
    123126    !$OMP  DO
     127#if __acc_fft_device
    124128     !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    125129     !$ACC PRESENT(f_inv, f_in)
     130#endif
    126131     DO  i = 0, nx
    127132         DO  k = nzb_x, nzt_x
     
    171176
    172177    REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !<
     178#if __acc_fft_device
    173179    !$ACC DECLARE CREATE(work)
     180#endif
    174181
    175182
     
    180187!--    Transpose array
    181188       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     189
     190#if __acc_fft_device
    182191#ifndef __cuda_aware_mpi
    183192       !$ACC UPDATE HOST(f_inv)
     
    185194       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    186195#endif
     196#endif
     197
    187198       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    188199       CALL MPI_ALLTOALL( f_inv(nys_x,nzb_x,0),  sendrecvcount_xy, MPI_REAL, &
    189200                          work(1,nzb_y,nxl_y,0), sendrecvcount_xy, MPI_REAL, &
    190201                          comm1dy, ierr )
     202
     203#if __acc_fft_device
    191204#ifndef __cuda_aware_mpi
    192205       !$ACC UPDATE DEVICE(work)
     
    194207       !$ACC END HOST_DATA
    195208#endif
     209#endif
     210
    196211       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    197212
     
    202217       DO  l = 0, pdims(2) - 1
    203218          ys = 0 + l * ( nyn_x - nys_x + 1 )
     219#if __acc_fft_device
    204220          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    205221          !$ACC PRESENT(f_out, work)
     222#endif
    206223          DO  i = nxl_y, nxr_y
    207224             DO  k = nzb_y, nzt_y
     
    221238!$OMP  PARALLEL PRIVATE ( i, j, k )
    222239!$OMP  DO
     240#if __acc_fft_device
    223241       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    224242       !$ACC PRESENT(f_out, f_inv)
     243#endif
    225244       DO  k = nzb_y, nzt_y
    226245          DO  i = nxl_y, nxr_y
     
    266285    !$OMP  PARALLEL PRIVATE ( i, j, k )
    267286    !$OMP  DO
     287#if __acc_fft_device
    268288     !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    269289     !$ACC PRESENT(f_out, f_inv)
     290#endif
    270291     DO  k = 1, nz
    271292         DO  i = nxl, nxr
     
    315336
    316337    REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !<
     338#if __acc_fft_device
    317339    !$ACC DECLARE CREATE(work)
     340#endif
    318341
    319342
     
    330353       DO  l = 0, pdims(1) - 1
    331354          xs = 0 + l * nnx
     355#if __acc_fft_device
    332356          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    333357          !$ACC PRESENT(work, f_in)
     358#endif
    334359          DO  k = nzb_x, nzt_x
    335360             DO  i = xs, xs + nnx - 1
     
    345370!--    Transpose array
    346371       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     372
     373#if __acc_fft_device
    347374#ifndef __cuda_aware_mpi
    348375       !$ACC UPDATE HOST(work)
     
    350377       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    351378#endif
     379#endif
     380
    352381       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    353382       CALL MPI_ALLTOALL( work(nys_x,1,nzb_x,0), sendrecvcount_zx, MPI_REAL, &
    354383                          f_inv(nys,nxl,1),      sendrecvcount_zx, MPI_REAL, &
    355384                          comm1dx, ierr )
     385
     386#if __acc_fft_device
    356387#ifndef __cuda_aware_mpi
    357388       !$ACC UPDATE DEVICE(f_inv)
     
    361392       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    362393#endif
     394#endif
    363395
    364396    ELSE
     
    368400!$OMP  PARALLEL PRIVATE ( i, j, k )
    369401!$OMP  DO
     402#if __acc_fft_device
    370403       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    371404       !$ACC PRESENT(f_inv, f_in)
     405#endif
    372406       DO  i = nxl, nxr
    373407          DO  j = nys, nyn
     
    415449    !$OMP  PARALLEL PRIVATE ( i, j, k )
    416450    !$OMP  DO
     451#if __acc_fft_device
    417452     !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    418453     !$ACC PRESENT(f_out, f_inv)
     454#endif
    419455     DO  i = 0, nx
    420456         DO  k = nzb_x, nzt_x
     
    464500
    465501    REAL(wp), DIMENSION(nyn_x-nys_x+1,nzb_y:nzt_y,nxl_y:nxr_y,0:pdims(2)-1) ::  work !<
     502#if __acc_fft_device
    466503    !$ACC DECLARE CREATE(work)
     504#endif
    467505
    468506
     
    476514       DO  l = 0, pdims(2) - 1
    477515          ys = 0 + l * ( nyn_x - nys_x + 1 )
     516#if __acc_fft_device
    478517          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    479518          !$ACC PRESENT(work, f_in)
     519#endif
    480520          DO  i = nxl_y, nxr_y
    481521             DO  k = nzb_y, nzt_y
     
    491531!--    Transpose array
    492532       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     533
     534#if __acc_fft_device
    493535#ifndef __cuda_aware_mpi
    494536       !$ACC UPDATE HOST(work)
     
    496538       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    497539#endif
     540#endif
     541
    498542       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    499543       CALL MPI_ALLTOALL( work(1,nzb_y,nxl_y,0), sendrecvcount_xy, MPI_REAL, &
    500544                          f_inv(nys_x,nzb_x,0),  sendrecvcount_xy, MPI_REAL, &
    501545                          comm1dy, ierr )
     546
     547#if __acc_fft_device
    502548#ifndef __cuda_aware_mpi
    503549       !$ACC UPDATE DEVICE(f_inv)
     
    505551       !$ACC END HOST_DATA
    506552#endif
     553#endif
     554
    507555       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    508556#endif
     
    514562!$OMP  PARALLEL PRIVATE ( i, j, k )
    515563!$OMP  DO
     564#if __acc_fft_device
    516565       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    517566       !$ACC PRESENT(f_inv, f_in)
     567#endif
    518568       DO  i = nxl_y, nxr_y
    519569          DO  k = nzb_y, nzt_y
     
    641691    !$OMP  PARALLEL PRIVATE ( i, j, k )
    642692    !$OMP  DO
     693#if __acc_fft_device
    643694     !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    644695     !$ACC PRESENT(f_inv, f_in)
     696#endif
    645697     DO  j = 0, ny
    646698         DO  k = nzb_y, nzt_y
     
    690742
    691743    REAL(wp), DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work !<
     744#if __acc_fft_device
    692745    !$ACC DECLARE CREATE(work)
     746#endif
    693747
    694748
     
    700754!$OMP  PARALLEL PRIVATE ( i, j, k )
    701755!$OMP  DO
     756#if __acc_fft_device
    702757       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    703758       !$ACC PRESENT(f_out, f_inv)
     759#endif
    704760       DO  j = 0, ny
    705761          DO  k = nzb_y, nzt_y
     
    717773!--    Transpose array
    718774       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     775
     776#if __acc_fft_device
    719777#ifndef __cuda_aware_mpi
    720778       !$ACC UPDATE HOST(f_inv)
     
    722780       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    723781#endif
     782#endif
     783
    724784       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    725785       CALL MPI_ALLTOALL( f_inv(nxl_y,nzb_y,0),  sendrecvcount_yz, MPI_REAL, &
    726786                          work(nxl_z,1,nys_z,0), sendrecvcount_yz, MPI_REAL, &
    727787                          comm1dx, ierr )
     788
     789#if __acc_fft_device
    728790#ifndef __cuda_aware_mpi
    729791       !$ACC UPDATE DEVICE(work)
     
    731793       !$ACC END HOST_DATA
    732794#endif
     795#endif
     796
    733797       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    734798
     
    739803       DO  l = 0, pdims(1) - 1
    740804          zs = 1 + l * ( nzt_y - nzb_y + 1 )
     805#if __acc_fft_device
    741806          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    742807          !$ACC PRESENT(f_out, work)
     808#endif
    743809          DO  j = nys_z, nyn_z
    744810             DO  k = zs, zs + nzt_y - nzb_y
     
    785851    !$OMP  PARALLEL PRIVATE ( i, j, k )
    786852    !$OMP  DO
     853#if __acc_fft_device
    787854    !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    788855    !$ACC PRESENT(f_in, f_inv)
     856#endif
    789857     DO  k = 1,nz
    790858         DO  i = nxl, nxr
     
    834902
    835903    REAL(wp), DIMENSION(nys_x:nyn_x,nnx,nzb_x:nzt_x,0:pdims(1)-1) ::  work !<
     904#if __acc_fft_device
    836905    !$ACC DECLARE CREATE(work)
     906#endif
    837907
    838908
     
    844914!$OMP  PARALLEL PRIVATE ( i, j, k )
    845915!$OMP  DO
     916#if __acc_fft_device
    846917       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    847918       !$ACC PRESENT(f_out, f_inv)
     919#endif
    848920       DO  k = 1, nz
    849921          DO  i = nxl, nxr
     
    861933!--    Transpose array
    862934       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     935
     936#if __acc_fft_device
    863937#ifndef __cuda_aware_mpi
    864938       !$ACC UPDATE HOST(f_inv)
     
    866940       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    867941#endif
     942#endif
     943
    868944       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    869945       CALL MPI_ALLTOALL( f_inv(nys,nxl,1),      sendrecvcount_zx, MPI_REAL, &
    870946                          work(nys_x,1,nzb_x,0), sendrecvcount_zx, MPI_REAL, &
    871947                          comm1dx, ierr )
     948
     949#if __acc_fft_device
    872950#ifndef __cuda_aware_mpi
    873951       !$ACC UPDATE DEVICE(work)
     
    875953       !$ACC END HOST_DATA
    876954#endif
     955#endif
     956
    877957       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    878958
     
    883963       DO  l = 0, pdims(1) - 1
    884964          xs = 0 + l * nnx
     965#if __acc_fft_device
    885966          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    886967          !$ACC PRESENT(f_out, work)
     968#endif
    887969          DO  k = nzb_x, nzt_x
    888970             DO  i = xs, xs + nnx - 1
     
    9331015    !$OMP  PARALLEL PRIVATE ( i, j, k )
    9341016    !$OMP  DO
     1017#if __acc_fft_device
    9351018    !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    9361019    !$ACC PRESENT(f_out, f_inv)
     1020#endif
    9371021     DO  k = nzb_y, nzt_y
    9381022         DO  j = 0, ny
     
    9821066
    9831067    REAL(wp), DIMENSION(nxl_z:nxr_z,nzt_y-nzb_y+1,nys_z:nyn_z,0:pdims(1)-1) ::  work !<
     1068#if __acc_fft_device
    9841069    !$ACC DECLARE CREATE(work)
     1070#endif
    9851071
    9861072!
     
    9961082       DO  l = 0, pdims(1) - 1
    9971083          zs = 1 + l * ( nzt_y - nzb_y + 1 )
     1084#if __acc_fft_device
    9981085          !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    9991086          !$ACC PRESENT(work, f_in)
     1087#endif
    10001088          DO  j = nys_z, nyn_z
    10011089             DO  k = zs, zs + nzt_y - nzb_y
     
    10111099!--    Transpose array
    10121100       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'start', cpu_log_nowait )
     1101
     1102#if __acc_fft_device
    10131103#ifndef __cuda_aware_mpi
    10141104       !$ACC UPDATE HOST(work)
     
    10161106       !$ACC HOST_DATA USE_DEVICE(work, f_inv)
    10171107#endif
     1108#endif
     1109
    10181110       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    10191111       CALL MPI_ALLTOALL( work(nxl_z,1,nys_z,0), sendrecvcount_yz, MPI_REAL, &
    10201112                          f_inv(nxl_y,nzb_y,0),  sendrecvcount_yz, MPI_REAL, &
    10211113                          comm1dx, ierr )
     1114
     1115#if __acc_fft_device
    10221116#ifndef __cuda_aware_mpi
    10231117       !$ACC UPDATE DEVICE(f_inv)
     
    10251119       !$ACC END HOST_DATA
    10261120#endif
     1121#endif
     1122
    10271123       CALL cpu_log( log_point_s(32), 'mpi_alltoall', 'stop' )
    10281124#endif
     
    10331129!$OMP  PARALLEL PRIVATE ( i, j, k )
    10341130!$OMP  DO
     1131#if __acc_fft_device
    10351132       !$ACC PARALLEL LOOP COLLAPSE(3) PRIVATE(i,j,k) &
    10361133       !$ACC PRESENT(f_inv, f_in)
     1134#endif
    10371135       DO  k = nzb_y, nzt_y
    10381136          DO  j = 0, ny
  • palm/trunk/SOURCE/tridia_solver_mod.f90

    r3655 r3690  
    101101! the beginning, i.e. routine split is called within tridia_init.
    102102!
     103
     104#define __acc_fft_device ( defined( _OPENACC ) && ( defined ( __cuda_fft ) ) )
     105
    103106!
    104107! Description:
     
    173176       CALL split
    174177
     178#if __acc_fft_device
    175179       !$ACC ENTER DATA &
    176180       !$ACC COPYIN(ddzuw(0:nz-1,1:3)) &
    177181       !$ACC COPYIN(tri(nxl_z:nxr_z,nys_z:nyn_z,0:nz-1,1:2))
     182#endif
    178183
    179184    END SUBROUTINE tridia_init
     
    297302
    298303          REAL(wp), DIMENSION(nxl_z:nxr_z,nys_z:nyn_z,0:nz-1)   ::  ar1 !<
     304#if __acc_fft_device
    299305          !$ACC DECLARE CREATE(ar1)
     306#endif
    300307
    301308!
    302309!--       Forward substitution
     310#if __acc_fft_device
    303311          !$ACC PARALLEL PRESENT(ar, ar1, tri) PRIVATE(i,j,k)
     312#endif
    304313          DO  k = 0, nz - 1
     314#if __acc_fft_device
    305315             !$ACC LOOP COLLAPSE(2)
     316#endif
    306317             DO  j = nys_z, nyn_z
    307318                DO  i = nxl_z, nxr_z
     
    316327             ENDDO
    317328          ENDDO
     329#if __acc_fft_device
    318330          !$ACC END PARALLEL
     331#endif
    319332
    320333!
     
    323336!--       by zero appearing if the pressure bc is set to neumann at the top of
    324337!--       the model domain.
     338#if __acc_fft_device
    325339          !$ACC PARALLEL PRESENT(ar, ar1, ddzuw, tri) PRIVATE(i,j,k)
     340#endif
    326341          DO  k = nz-1, 0, -1
     342#if __acc_fft_device
    327343             !$ACC LOOP COLLAPSE(2)
     344#endif
    328345             DO  j = nys_z, nyn_z
    329346                DO  i = nxl_z, nxr_z
     
    338355             ENDDO
    339356          ENDDO
     357#if __acc_fft_device
    340358          !$ACC END PARALLEL
     359#endif
    341360
    342361!
     
    346365          IF ( ibc_p_b == 1  .AND.  ibc_p_t == 1 )  THEN
    347366             IF ( nys_z == 0  .AND.  nxl_z == 0 )  THEN
     367#if __acc_fft_device
    348368                !$ACC PARALLEL LOOP PRESENT(ar)
     369#endif
    349370                DO  k = 1, nz
    350371                   ar(nxl_z,nys_z,k) = 0.0_wp
Note: See TracChangeset for help on using the changeset viewer.