aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/simd4.f90
blob: a81bc5e3472d7aec9b3c0835df31df3c8af3a85a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
! { dg-do run }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }

  integer :: a(1024), b(1024), k, m, i, s, t
  k = 4
  m = 2
  t = 1
  do i = 1, 1024
    a(i) = i - 513
    b(i) = modulo (i - 52, 39)
    if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
  end do
  s = foo (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) stop 1
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 2
    else
      if (b(i).ne.(modulo (i - 52, 39))) stop 3
    end if
    a(i) = i - 513
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 4
  k = 4
  m = 2
  t = 1
  s = bar (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) stop 5
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 6
    else
      if (b(i).ne.(modulo (i - 52, 39))) stop 7
    end if
    a(i) = i - 513
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 8
  k = 4
  m = 2
  t = 1
  s = baz (b)
  do i = 1, 1024
    if (a(i).ne.((i - 513) * b(i))) stop 9
    if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
      if (b(i).ne.(modulo (i - 52, 39) - 39)) stop 10
    else
      if (b(i).ne.(modulo (i - 52, 39))) stop 11
    end if
  end do
  if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) stop 12
contains
  function foo (p)
    integer :: p(1024), u, v, i, s, foo
    s = 0
    !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
    !$omp & lastprivate(u, v) schedule (static, 32)
    do i = 1, 1024
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    !$omp end parallel do simd
    if (i.ne.1025) stop 13
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 14
    foo = s
  end function foo
  function bar (p)
    integer :: p(1024), u, v, i, s, bar
    s = 0
    !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
    !$omp & lastprivate(u, v) schedule (dynamic, 32)
    do i = 1, 1024, t
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    !$omp endparalleldosimd
    if (i.ne.1025) stop 15
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 16
    bar = s
  end function bar
  function baz (p)
    integer :: p(1024), u, v, i, s, baz
    s = 0
    !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
    !$omp & lastprivate(u, v) linear(i : t) schedule (static, 8)
    do i = 1, 1024, t
      a(i) = a(i) * p(i)
      u = p(i) + k
      k = k + m + 1
      v = p(i) + k
      s = s + p(i) + k
    end do
    if (i.ne.1025) stop 17
    if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) stop 18
    baz = s
  end function baz
end