aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/taskloop2.f90
blob: a20242f9774935563f5064c7bf9536b44fe909a2 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
! { dg-options "-O2" }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }

  integer, save :: u(1024), v(1024), w(1024), m
  integer :: i
  v = (/ (i, i = 1, 1024) /)
  w = (/ (i + 1, i = 1, 1024) /)
  !$omp parallel
  !$omp single
  call f1 (1, 1024)
  !$omp end single
  !$omp end parallel
  do i = 1, 1024
    if (u(i) .ne. 2 * i + 1) stop 1
    v(i) = 1024 - i
    w(i) = 512 - i
  end do
  !$omp parallel
  !$omp single
    call f2 (2, 1022, 17)
  !$omp end single
  !$omp end parallel
  do i = 1, 1024
    if (i .lt. 2 .or. i .gt. 1022) then
      if (u(i) .ne. 2 * i + 1) stop 2
    else
      if (u(i) .ne. 1536 - 2 * i) stop 3
    end if
    v(i) = i
    w(i) = i + 1
  end do
  if (m .ne. (1023 + 2 * (1021 * 5 + 17) + 9)) stop 4
  !$omp parallel
  !$omp single
    call f3 (1, 1024)
  !$omp end single
  !$omp end parallel 
  do i = 1, 1024
    if (u(i) .ne. 2 * i + 1) stop 5
    v(i) = 1024 - i
    w(i) = 512 - i
  end do
  if (m .ne. 1025) stop 6
  !$omp parallel
  !$omp single
    call f4 (0, 31, 1, 32)
  !$omp end single
  !$omp end parallel 
  do i = 1, 1024
    if (u(i) .ne. 1536 - 2 * i) stop 7
    v(i) = i
    w(i) = i + 1
  end do
  if (m .ne. 32 + 33 + 1024) stop 8
  !$omp parallel
  !$omp single
    call f5 (0, 31, 1, 32)
  !$omp end single
  !$omp end parallel 
  do i = 1, 1024
    if (u(i) .ne. 2 * i + 1) stop 9
  end do
  if (m .ne. 32 + 33) stop 10
contains
  subroutine f1 (a, b)
    integer, intent(in) :: a, b
    integer :: d
    !$omp taskloop simd default(none) shared(u, v, w) nogroup
    do d = a, b
      u(d) = v(d) + w(d)
    end do
    ! d is predetermined linear, so we can't let the tasks continue past
    ! end of this function.
    !$omp taskwait
  end subroutine f1
  subroutine f2 (a, b, cx)
    integer, intent(in) :: a, b, cx
    integer :: c, d, e
    c = cx
    !$omp taskloop simd default(none) shared(u, v, w) linear(d:1) linear(c:5) lastprivate(e)
    do d = a, b
      u(d) = v(d) + w(d)
      c = c + 5
      e = c + 9
    end do
    !$omp end taskloop simd
    m = d + c + e
  end subroutine f2
  subroutine f3 (a, b)
    integer, intent(in) :: a, b
    integer, target :: d
    integer, pointer :: p
    !$omp taskloop simd default(none) shared(u, v, w) private (p)
    do d = a, b
      p => d
      u(d) = v(d) + w(d)
      p => null()
    end do
    m = d
  end subroutine f3
  subroutine f4 (a, b, c, d)
    integer, intent(in) :: a, b, c, d
    integer, target :: e, f
    integer, pointer :: p, q
    integer :: g, r
    !$omp taskloop simd default(none) shared(u, v, w) lastprivate(g) collapse(2) private (r, p, q)
    do e = a, b
      do f = c, d
        p => e
        q => f
        r = 32 * e + f
        u(r) = v(r) + w(r)
        g = r
        p => null()
        q => null()
      end do
    end do
    m = e + f + g
  end subroutine f4
  subroutine f5 (a, b, c, d)
    integer, intent(in) :: a, b, c, d
    integer :: e, f, r
    !$omp taskloop simd default(none) shared(u, v, w) collapse(2) private (r)
    do e = a, b
      do f = c, d
        r = 32 * e + f
        u(r) = v(r) + w(r)
      end do
    end do
    m = e + f
  end subroutine f5
end