| ! { dg-do run { target vect_simd_clones } } |
| ! { dg-additional-options "-msse2" { target sse2_runtime } } |
| ! { dg-additional-options "-mavx" { target avx_runtime } } |
| |
| program fibonacci |
| implicit none |
| integer,parameter :: N=30 |
| integer :: a(0:N-1), b(0:N-1) |
| integer :: a_ref(0:N-1) |
| integer :: i |
| integer, external :: fib |
| |
| !$omp simd |
| do i = 0,N-1 |
| b(i) = i |
| end do |
| |
| !$omp simd |
| do i=0,N-1 |
| a(i) = fib(b(i)) |
| end do |
| |
| call fib_ref (a_ref, N) |
| |
| do i = 0, N-1 |
| if (a(i) .ne. a_ref(i)) stop 1 |
| end do |
| |
| end program |
| |
| recursive function fib(n) result(r) |
| !$omp declare simd(fib) inbranch |
| integer :: n, r |
| |
| if (n <= 1) then |
| r = n |
| else |
| r = fib(n-1) + fib(n-2) |
| endif |
| |
| end function fib |
| |
| subroutine fib_ref(a_ref, n) |
| integer :: n, a_ref(0:n-1) |
| |
| a_ref(0) = 0 |
| a_ref(1) = 1 |
| |
| do i = 2, n-1 |
| a_ref(i) = a_ref(i-1) + a_ref(i-2) |
| end do |
| |
| end subroutine fib_ref |