| ! { dg-do run } |
| ! { dg-additional-options "-msse2" { target sse2_runtime } } |
| ! { dg-additional-options "-mavx" { target avx_runtime } } |
| |
| module SIMD1_mod |
| contains |
| subroutine init (a, a_ref, b, c, n, ioff_ptr) |
| double precision :: a(*), a_ref(*), b(*), c(*) |
| integer :: n, i, s |
| integer, pointer :: ioff_ptr |
| |
| s = -1 |
| do i = 1, n |
| a(i) = i * i * s |
| a_ref(i) = a(i) |
| b(i) = i + i |
| end do |
| |
| do i = 1, n+ioff_ptr |
| c(i) = i * 3 |
| end do |
| |
| end subroutine |
| |
| subroutine check (a, b, n) |
| integer :: i, n |
| double precision, parameter :: EPS = 0.0000000000001 |
| double precision :: diff, a(*), b(*) |
| do i = 1, n |
| diff = a(i) - b(i) |
| if (diff > EPS .or. -diff > EPS) stop 1 |
| end do |
| end subroutine |
| |
| subroutine star(a, a_ref, b, c, n, ioff_ptr) |
| double precision :: a(*), a_ref(*), b(*), c(*) |
| integer :: n, i |
| integer, pointer :: ioff_ptr |
| |
| call init (a, a_ref, b, c, n, ioff_ptr) |
| |
| !$omp simd |
| do i = 1,n |
| a(i) = a(i) * b(i) * c(i+ioff_ptr) |
| end do |
| |
| do i = 1,n |
| a_ref(i) = a_ref(i) * b(i) * c(i+ioff_ptr) |
| end do |
| |
| call check (a, a_ref, n) |
| |
| end subroutine |
| end module |
| |
| program SIMD1 |
| use SIMD1_mod, only : star |
| double precision :: a(128), a_ref(128), b(128), c(144) |
| integer, pointer:: ioff_ptr |
| integer, target:: offset |
| |
| offset = 16 |
| ioff_ptr => offset |
| |
| call star (a, a_ref, b, c, 128, ioff_ptr) |
| |
| end program |