Ignore:
Timestamp:
Dec 18, 2018 12:31:28 PM (5 years ago)
Author:
knoop
Message:

OpenACC port for SPEC

File:
1 edited

Legend:

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

    r3241 r3634  
    2525! -----------------
    2626! $Id$
     27! OpenACC port for SPEC
     28!
     29! 3241 2018-09-12 15:02:00Z raasch
    2730! preprocessor switches for variables that are required on NEC only
    2831!
     
    156159        ONLY:  fft_method, message_string
    157160       
     161    USE cuda_fft_interfaces
     162       
    158163    USE indices,                                                               &
    159164        ONLY:  nx, ny, nz
    160165       
    161 #if defined( __fftw )
     166#if defined( __cuda_fft )
     167    USE ISO_C_BINDING
     168#elif defined( __fftw )
    162169    USE, INTRINSIC ::  ISO_C_BINDING
    163170#endif
     
    210217    REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE ::  trig_yf  !<
    211218   
     219#elif defined( __cuda_fft )
     220    INTEGER(C_INT), SAVE ::  plan_xf  !<
     221    INTEGER(C_INT), SAVE ::  plan_xi  !<
     222    INTEGER(C_INT), SAVE ::  plan_yf  !<
     223    INTEGER(C_INT), SAVE ::  plan_yi  !<
     224
    212225#endif
    213226
     
    298311       ENDIF
    299312
     313#if defined( _OPENACC ) && defined( __cuda_fft )
     314       fft_method = 'system-specific'
     315#endif
     316
    300317       IF ( fft_method == 'system-specific' )  THEN
    301318
     
    346363          CALL ZDFFTM( 0, ny+1, nz1, sqr_dny, work_y, ny+4, work_y, ny+4,      &
    347364                       trig_yb, worky, 0 )
     365#elif defined( __cuda_fft )
     366          CALL CUFFTPLAN1D( plan_xf, nx+1, CUFFT_D2Z, (nyn_x-nys_x+1) * (nzt_x-nzb_x+1) )
     367          CALL CUFFTPLAN1D( plan_xi, nx+1, CUFFT_Z2D, (nyn_x-nys_x+1) * (nzt_x-nzb_x+1) )
     368          CALL CUFFTPLAN1D( plan_yf, ny+1, CUFFT_D2Z, (nxr_y-nxl_y+1) * (nzt_y-nzb_y+1) )
     369          CALL CUFFTPLAN1D( plan_yi, ny+1, CUFFT_Z2D, (nxr_y-nxl_y+1) * (nzt_y-nzb_y+1) )
    348370#else
    349371          message_string = 'no system-specific fft-call available'
     
    425447#elif defined( __nec )
    426448       REAL(wp), DIMENSION(6*(nx+1)) ::  work2  !<
     449#elif defined( __cuda_fft )
     450       COMPLEX(dp), DIMENSION(0:(nx+1)/2,nys_x:nyn_x,nzb_x:nzt_x) ::           &
     451          ar_tmp  !<
     452       !$ACC DECLARE CREATE(ar_tmp)
    427453#endif
    428454
     
    726752             ENDDO
    727753             !$OMP END PARALLEL
     754
     755          ENDIF
     756
     757#elif defined( __cuda_fft )
     758
     759          IF ( forward_fft )  THEN
     760
     761             !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp)
     762             CALL CUFFTEXECD2Z( plan_xf, ar, ar_tmp )
     763             !$ACC END HOST_DATA
     764
     765             !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) &
     766             !$ACC PRESENT(ar, ar_tmp)
     767             DO  k = nzb_x, nzt_x
     768                DO  j = nys_x, nyn_x
     769
     770                   DO  i = 0, (nx+1)/2
     771                      ar(i,j,k)      = REAL( ar_tmp(i,j,k), KIND=wp )  * dnx
     772                   ENDDO
     773
     774                   DO  i = 1, (nx+1)/2 - 1
     775                      ar(nx+1-i,j,k) = AIMAG( ar_tmp(i,j,k) ) * dnx
     776                   ENDDO
     777
     778                ENDDO
     779             ENDDO
     780
     781          ELSE
     782
     783             !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) &
     784             !$ACC PRESENT(ar, ar_tmp)
     785             DO  k = nzb_x, nzt_x
     786                DO  j = nys_x, nyn_x
     787
     788                   ar_tmp(0,j,k) = CMPLX( ar(0,j,k), 0.0_wp, KIND=wp )
     789
     790                   DO  i = 1, (nx+1)/2 - 1
     791                      ar_tmp(i,j,k) = CMPLX( ar(i,j,k), ar(nx+1-i,j,k),        &
     792                                             KIND=wp )
     793                   ENDDO
     794                   ar_tmp((nx+1)/2,j,k) = CMPLX( ar((nx+1)/2,j,k), 0.0_wp,     &
     795                                                 KIND=wp )
     796
     797                ENDDO
     798             ENDDO
     799
     800             !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp)
     801             CALL CUFFTEXECZ2D( plan_xi, ar_tmp, ar )
     802             !$ACC END HOST_DATA
    728803
    729804          ENDIF
     
    10011076#elif defined( __nec )
    10021077       REAL(wp), DIMENSION(6*(ny+1)) ::  work2  !<
     1078#elif defined( __cuda_fft )
     1079       COMPLEX(dp), DIMENSION(0:(ny+1)/2,nxl_y:nxr_y,nzb_y:nzt_y) ::           &
     1080          ar_tmp  !<
     1081       !$ACC DECLARE CREATE(ar_tmp)
    10031082#endif
    10041083
     
    12781357
    12791358          ENDIF
     1359#elif defined( __cuda_fft )
     1360
     1361          IF ( forward_fft )  THEN
     1362
     1363             !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp)
     1364             CALL CUFFTEXECD2Z( plan_yf, ar, ar_tmp )
     1365             !$ACC END HOST_DATA
     1366
     1367             !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) &
     1368             !$ACC PRESENT(ar, ar_tmp)
     1369             DO  k = nzb_y, nzt_y
     1370                DO  i = nxl_y, nxr_y
     1371
     1372                   DO  j = 0, (ny+1)/2
     1373                      ar(j,i,k)      = REAL( ar_tmp(j,i,k), KIND=wp )  * dny
     1374                   ENDDO
     1375
     1376                   DO  j = 1, (ny+1)/2 - 1
     1377                      ar(ny+1-j,i,k) = AIMAG( ar_tmp(j,i,k) ) * dny
     1378                   ENDDO
     1379
     1380                ENDDO
     1381             ENDDO
     1382
     1383          ELSE
     1384
     1385             !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i,j,k) &
     1386             !$ACC PRESENT(ar, ar_tmp)
     1387             DO  k = nzb_y, nzt_y
     1388                DO  i = nxl_y, nxr_y
     1389
     1390                   ar_tmp(0,i,k) = CMPLX( ar(0,i,k), 0.0_wp, KIND=wp )
     1391
     1392                   DO  j = 1, (ny+1)/2 - 1
     1393                      ar_tmp(j,i,k) = CMPLX( ar(j,i,k), ar(ny+1-j,i,k),        &
     1394                                             KIND=wp )
     1395                   ENDDO
     1396                   ar_tmp((ny+1)/2,i,k) = CMPLX( ar((ny+1)/2,i,k), 0.0_wp,     &
     1397                                                 KIND=wp )
     1398
     1399                ENDDO
     1400             ENDDO
     1401
     1402             !$ACC HOST_DATA USE_DEVICE(ar, ar_tmp)
     1403             CALL CUFFTEXECZ2D( plan_yi, ar_tmp, ar )
     1404             !$ACC END HOST_DATA
     1405
     1406          ENDIF
     1407
    12801408#endif
    12811409
Note: See TracChangeset for help on using the changeset viewer.