12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- ! { dg-do run }
- interface
- subroutine bar (q)
- integer :: q(19:)
- end subroutine
- end interface
- integer :: q(7:15)
- q(:) = 5
- call bar (q)
- end
- subroutine bar (q)
- use iso_c_binding, only: c_ptr, c_loc, c_int
- integer :: a, b, c, d(2:3,4:5), q(19:), h, k, m, n, o, p
- integer(c_int), target :: e(64)
- type (c_ptr) :: f, g(64)
- logical :: l
- a = 1
- b = 2
- c = 3
- d = 4
- l = .false.
- f = c_loc (e)
- call foo
- contains
- subroutine foo
- use iso_c_binding, only: c_sizeof
- !$omp simd linear(a:2) linear(b:1)
- do a = 1, 20, 2
- b = b + 1
- end do
- !$omp end simd
- if (a /= 21 .or. b /= 12) call abort
- !$omp simd aligned(f : c_sizeof (e(1)))
- do b = 1, 64
- g(b) = f
- end do
- !$omp end simd
- !$omp parallel
- !$omp single
- !$omp taskgroup
- !$omp task depend(out : a, d(2:2,4:5))
- a = a + 1
- d(2:2,4:5) = d(2:2,4:5) + 1
- !$omp end task
- !$omp task depend(in : a, d(2:2,4:5))
- if (a /= 22) call abort
- if (any (d(2:2,4:5) /= 5)) call abort
- !$omp end task
- !$omp end taskgroup
- !$omp end single
- !$omp end parallel
- b = 10
- !$omp target data map (tofrom: a, d(2:3,4:4), q) map (from: l)
- !$omp target map (tofrom: b, d(2:3,4:4))
- l = .false.
- if (a /= 22 .or. any (q /= 5)) l = .true.
- if (lbound (q, 1) /= 19 .or. ubound (q, 1) /= 27) l = .true.
- if (d(2,4) /= 5 .or. d(3,4) /= 4) l = .true.
- l = l .or. (b /= 10)
- a = 6
- b = 11
- q = 8
- d(2:3,4:4) = 9
- !$omp end target
- !$omp target update from (a, q, d(2:3,4:4), l)
- if (a /= 6 .or. l .or. b /= 11 .or. any (q /= 8)) call abort
- if (any (d(2:3,4:4) /= 9) .or. d(2,5) /= 5 .or. d(3,5) /= 4) call abort
- a = 12
- b = 13
- q = 14
- d = 15
- !$omp target update to (a, q, d(2:3,4:4))
- !$omp target map (tofrom: b, d(2:3,4:4))
- if (a /= 12 .or. b /= 13 .or. any (q /= 14)) l = .true.
- l = l .or. any (d(2:3,4:4) /= 15)
- !$omp end target
- a = 0
- b = 1
- c = 100
- h = 8
- m = 0
- n = 64
- o = 16
- if (l) call abort
- !$omp target teams distribute parallel do simd if (.not.l) device(a) &
- !$omp & num_teams(b) dist_schedule(static, c) num_threads (h) &
- !$omp & reduction (+: m) safelen (n) schedule(static, o)
- do p = 1, 64
- m = m + 1
- end do
- !$omp end target teams distribute parallel do simd
- if (m /= 64) call abort
- !$omp end target data
- end subroutine foo
- end subroutine bar
|