mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-30 19:53:46 +00:00
71 lines
1.2 KiB
Fortran
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
|