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
|