基本的な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