MRI.COM

ループの並列化

基本

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