1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- ! { dg-do run }
- module e_55_1_mod
- integer, parameter :: N = 100000, CHUNKSZ = 10000
- real :: Y(N), Z(N)
- end module
- subroutine init ()
- use e_55_1_mod, only : Y, Z, N
- integer :: i
- do i = 1, N
- Y(i) = 0.1 * i
- Z(i) = Y(i)
- end do
- end subroutine
- subroutine check ()
- use e_55_1_mod, only : Y, Z, N
- real :: err
- real, parameter :: EPS = 0.00001
- integer :: i
- do i = 1, N
- if (Y(i) == 0.0) then
- err = Z(i)
- else if (Z(i) == 0.0) then
- err = Y(i)
- else
- err = (Y(i) - Z(i)) / Z(i)
- end if
- if (err > EPS .or. err < -EPS) call abort
- end do
- end subroutine
- real function F (z)
- !$omp declare target
- real, intent(in) :: z
- F = -z
- end function
- subroutine pipedF ()
- use e_55_1_mod, only: Z, N, CHUNKSZ
- integer :: C, i
- real :: F
- do C = 1, N, CHUNKSZ
- !$omp task
- !$omp target map(Z(C:C+CHUNKSZ-1))
- !$omp parallel do
- do i = C, C+CHUNKSZ-1
- Z(i) = F (Z(i))
- end do
- !$omp end target
- !$omp end task
- end do
- end subroutine
- subroutine pipedF_ref ()
- use e_55_1_mod, only: Y, N
- integer :: i
- real :: F
- do i = 1, N
- Y(i) = F (Y(i))
- end do
- end subroutine
- program e_55_1
- call init ()
- call pipedF ()
- call pipedF_ref ()
- call check ()
- end program
|