MRI.COM

OpenACCメモリ管理

CPUの処理も想定される、予報変数 dprog の処理

module mymod

real(8),save :: dprog(im,jm)

!$acc declare create( dprog )  GPUメモリに dprog を割り当て

contains

subroutine read_restart

call history__read_restarti( rs_t, dprog )  CPU上でファイル読み込み

!$acc update device( dprog )  GPUメモリを更新 (必要なら)

end subroutine read_restart

subroutine calc

!$acc update device( dprog )
!$acc kernels present( dprog, dcoef )
dprog(i,j,k) = dcoef(i,j,k) * dprog(i,j,k)
!$acc end kernels
!$acc update host( dprog ) CPUメモリを更新

end subroutine calc

iniで立ち上げる配列 dcoef の処理

module mymod

real(8),save :: dcoef(im,jm)

!$acc declare create( dcoef )  GPUメモリに dcoef を割り当て

contains

subroutine ini

call io__read_file('coef.d', dcoef )  CPU上でファイル読み込み

!$acc update device( dcoef )  GPUメモリ上の dcoef を更新

end subroutine ini

subroutine calc

!$acc kernels present( dcoef )  "present" で指定された配列はCPU-GPU間でメモリコピーを行わない
aout(i,j,k) = dcoef(i,j,k) * ain(i,j,k)
!$acc end kernels

end subroutine calc

CPUに持ってこない、サブルーチン内のローカル変数 dtemp の処理。

subroutine calc
real(8) :: dtemp(im,jm,km)

!$acc enter data create( dtemp )  割り当て

!$acc kernels present( dtemp )
dtemp(i,j,k) = ain(i,j,k)
!$acc end kernels

!$acc kernels present( dtemp )
aout(i,j,k) = dtemp(i,j,k)
!$acc end kernels

!$acc exit data delete( dtemp ) 開放

end subroutine