基本的なGPU処理の指示。デフォルトではCPU-GPU間のメモリコピーを常に行うため速くならない。
!$acc kernels do j = 1, jm do i = 1, im b(i,j) = a(i,j) ** 2 enddo enddo !$acc end kernels
CPU,GPU間のメモリコピーを明示する。(これがないと失敗する場合がある?)
!$acc data copyin(a), copyout(b) ! 配列a をCPUからGPUへコピー
!$acc kernels
do j = 1, jm
do i = 1, im
b(i,j) = a(i,j) ** 2
enddo
enddo
!$acc end kernels
!$acc end data ! 配列b をGPUからCPUへコピー
袖領域の処理。
!$acc data copyin(a), copyout(b)
!$acc kernels
do j = 1, jm
do i = 2, im
b(i,j) = a(i,j)
enddo
enddo
!$acc end kernels
!$acc kernels
b(1,1:jm) = 0.d0
!$acc end kernels
!$acc end data
2次元配列計算を含むk-loopを3次元並列化する場合
!$acc parallel private(work1,work2) "private"でk毎にwork1,work2を割り当て, kernels にすべきか? do k = 1, km ... !$acc loop do j = 1, jm do i = 1, im work1(i,j) = a(i,j,k) enddo enddo !$acc loop do j = 1, jm do i = 1, im work2(i,j) = work1(i,j) enddo enddo !$acc loop do j = 1, jm do i = 1, im b(i,j,k) = work2(i,j) enddo enddo enddo !$acc end parallel