Retro68/gcc/libgomp/testsuite/libgomp.fortran/examples-4/async_target-1.f90
2017-04-10 13:32:00 +02:00

71 lines
1.2 KiB
Fortran

! { 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