0
|
1 program lastprivate
|
|
2 integer :: i, k
|
|
3 common /c/ i, k
|
|
4 !$omp parallel num_threads (4)
|
|
5 call test1
|
|
6 !$omp end parallel
|
131
|
7 if (i .ne. 21 .or. k .ne. 20) STOP 1
|
0
|
8 !$omp parallel num_threads (4)
|
|
9 call test2
|
|
10 !$omp end parallel
|
131
|
11 if (i .ne. 64 .or. k .ne. 61) STOP 2
|
0
|
12 !$omp parallel num_threads (4)
|
|
13 call test3
|
|
14 !$omp end parallel
|
131
|
15 if (i .ne. 14 .or. k .ne. 11) STOP 3
|
0
|
16 call test4
|
|
17 call test5
|
|
18 call test6
|
|
19 call test7
|
|
20 call test8
|
|
21 call test9
|
|
22 call test10
|
|
23 call test11
|
|
24 call test12
|
|
25 contains
|
|
26 subroutine test1
|
|
27 integer :: i, k
|
|
28 common /c/ i, k
|
|
29 !$omp do lastprivate (i, k)
|
|
30 do i = 1, 20
|
|
31 k = i
|
|
32 end do
|
|
33 end subroutine test1
|
|
34 subroutine test2
|
|
35 integer :: i, k
|
|
36 common /c/ i, k
|
|
37 !$omp do lastprivate (i, k)
|
|
38 do i = 7, 61, 3
|
|
39 k = i
|
|
40 end do
|
|
41 end subroutine test2
|
|
42 function ret3 ()
|
|
43 integer :: ret3
|
|
44 ret3 = 3
|
|
45 end function ret3
|
|
46 subroutine test3
|
|
47 integer :: i, k
|
|
48 common /c/ i, k
|
|
49 !$omp do lastprivate (i, k)
|
|
50 do i = -10, 11, ret3 ()
|
|
51 k = i
|
|
52 end do
|
|
53 end subroutine test3
|
|
54 subroutine test4
|
|
55 integer :: j, l
|
|
56 !$omp parallel do lastprivate (j, l) num_threads (4)
|
|
57 do j = 1, 20
|
|
58 l = j
|
|
59 end do
|
131
|
60 if (j .ne. 21 .or. l .ne. 20) STOP 4
|
0
|
61 end subroutine test4
|
|
62 subroutine test5
|
|
63 integer :: j, l
|
|
64 l = 77
|
|
65 !$omp parallel do lastprivate (j, l) num_threads (4) firstprivate (l)
|
|
66 do j = 7, 61, 3
|
|
67 l = j
|
|
68 end do
|
131
|
69 if (j .ne. 64 .or. l .ne. 61) STOP 5
|
0
|
70 end subroutine test5
|
|
71 subroutine test6
|
|
72 integer :: j, l
|
|
73 !$omp parallel do lastprivate (j, l) num_threads (4)
|
|
74 do j = -10, 11, ret3 ()
|
|
75 l = j
|
|
76 end do
|
131
|
77 if (j .ne. 14 .or. l .ne. 11) STOP 6
|
0
|
78 end subroutine test6
|
|
79 subroutine test7
|
|
80 integer :: i, k
|
|
81 common /c/ i, k
|
|
82 !$omp parallel do lastprivate (i, k) num_threads (4)
|
|
83 do i = 1, 20
|
|
84 k = i
|
|
85 end do
|
131
|
86 if (i .ne. 21 .or. k .ne. 20) STOP 7
|
0
|
87 end subroutine test7
|
|
88 subroutine test8
|
|
89 integer :: i, k
|
|
90 common /c/ i, k
|
|
91 !$omp parallel do lastprivate (i, k) num_threads (4)
|
|
92 do i = 7, 61, 3
|
|
93 k = i
|
|
94 end do
|
131
|
95 if (i .ne. 64 .or. k .ne. 61) STOP 8
|
0
|
96 end subroutine test8
|
|
97 subroutine test9
|
|
98 integer :: i, k
|
|
99 common /c/ i, k
|
|
100 k = 77
|
|
101 !$omp parallel do lastprivate (i, k) num_threads (4) firstprivate (k)
|
|
102 do i = -10, 11, ret3 ()
|
|
103 k = i
|
|
104 end do
|
131
|
105 if (i .ne. 14 .or. k .ne. 11) STOP 9
|
0
|
106 end subroutine test9
|
|
107 subroutine test10
|
|
108 integer :: i, k
|
|
109 common /c/ i, k
|
|
110 !$omp parallel num_threads (4)
|
|
111 !$omp do lastprivate (i, k)
|
|
112 do i = 1, 20
|
|
113 k = i
|
|
114 end do
|
|
115 !$omp end parallel
|
131
|
116 if (i .ne. 21 .or. k .ne. 20) STOP 10
|
0
|
117 end subroutine test10
|
|
118 subroutine test11
|
|
119 integer :: i, k
|
|
120 common /c/ i, k
|
|
121 !$omp parallel num_threads (4)
|
|
122 !$omp do lastprivate (i, k)
|
|
123 do i = 7, 61, 3
|
|
124 k = i
|
|
125 end do
|
|
126 !$omp end parallel
|
131
|
127 if (i .ne. 64 .or. k .ne. 61) STOP 11
|
0
|
128 end subroutine test11
|
|
129 subroutine test12
|
|
130 integer :: i, k
|
|
131 common /c/ i, k
|
|
132 k = 77
|
|
133 !$omp parallel num_threads (4)
|
|
134 !$omp do lastprivate (i, k) firstprivate (k)
|
|
135 do i = -10, 11, ret3 ()
|
|
136 k = i
|
|
137 end do
|
|
138 !$omp end parallel
|
131
|
139 if (i .ne. 14 .or. k .ne. 11) STOP 12
|
0
|
140 end subroutine test12
|
|
141 end program lastprivate
|