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