1! RUN: %S/test_symbols.sh %s %t %flang_fc1 -fopenmp 2! REQUIRES: shell 3 4! 2.15.1.1 Predetermined rules for associated do-loops index variable 5! a) The loop iteration variable(s) in the associated do-loop(s) of a do, 6! parallel do, taskloop, or distribute construct is (are) private. 7! b) The loop iteration variable in the associated do-loop of a simd construct 8! with just one associated do-loop is linear with a linear-step that is the 9! increment of the associated do-loop. 10! c) The loop iteration variables in the associated do-loops of a simd 11! construct with multiple associated do-loops are lastprivate. 12! d) A loop iteration variable for a sequential loop in a parallel or task 13! generating construct is private in the innermost such construct that 14! encloses the loop. 15! - TBD 16 17! All the tests assume that the do-loops association for collapse/ordered 18! clause has been performed (the number of nested do-loops >= n). 19 20! Rule a) 21! TODO: nested constructs (k should be private too) 22!DEF: /test_do (Subroutine) Subprogram 23subroutine test_do 24 implicit none 25 !DEF: /test_do/a ObjectEntity REAL(4) 26 real a(20,20,20) 27 !DEF: /test_do/i ObjectEntity INTEGER(4) 28 !DEF: /test_do/j ObjectEntity INTEGER(4) 29 !DEF: /test_do/k ObjectEntity INTEGER(4) 30 integer i, j, k 31!$omp parallel 32 !REF: /test_do/i 33 i = 99 34!$omp do collapse(2) 35 !DEF: /test_do/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 36 do i=1,5 37 !DEF: /test_do/Block1/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 38 do j=6,10 39 !REF: /test_do/a 40 a(1,1,1) = 0. 41 !DEF: /test_do/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 42 do k=11,15 43 !REF: /test_do/a 44 !REF: /test_do/Block1/k 45 !REF: /test_do/Block1/Block1/j 46 !REF: /test_do/Block1/Block1/i 47 a(k,j,i) = 1. 48 end do 49 end do 50 end do 51!$omp end parallel 52end subroutine test_do 53 54! Rule a) 55!DEF: /test_pardo (Subroutine) Subprogram 56subroutine test_pardo 57 implicit none 58 !DEF: /test_pardo/a ObjectEntity REAL(4) 59 real a(20,20,20) 60 !DEF: /test_pardo/i ObjectEntity INTEGER(4) 61 !DEF: /test_pardo/j ObjectEntity INTEGER(4) 62 !DEF: /test_pardo/k ObjectEntity INTEGER(4) 63 integer i, j, k 64!$omp parallel do collapse(2) private(k) ordered(2) 65 !DEF: /test_pardo/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 66 do i=1,5 67 !DEF: /test_pardo/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 68 do j=6,10 69 !REF: /test_pardo/a 70 a(1,1,1) = 0. 71 !DEF: /test_pardo/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 72 do k=11,15 73 !REF: /test_pardo/a 74 !REF: /test_pardo/Block1/k 75 !REF: /test_pardo/Block1/j 76 !REF: /test_pardo/Block1/i 77 a(k,j,i) = 1. 78 end do 79 end do 80 end do 81end subroutine test_pardo 82 83! Rule a) 84!DEF: /test_taskloop (Subroutine) Subprogram 85subroutine test_taskloop 86 implicit none 87 !DEF: /test_taskloop/a ObjectEntity REAL(4) 88 real a(5,5) 89 !DEF: /test_taskloop/i ObjectEntity INTEGER(4) 90 !DEF: /test_taskloop/j ObjectEntity INTEGER(4) 91 integer i, j 92!$omp taskloop private(j) 93 !DEF: /test_taskloop/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 94 do i=1,5 95 !DEF: /test_taskloop/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 96 !REF: /test_taskloop/Block1/i 97 do j=1,i 98 !REF: /test_taskloop/a 99 !REF: /test_taskloop/Block1/j 100 !REF: /test_taskloop/Block1/i 101 a(j,i) = 3.14 102 end do 103 end do 104!$omp end taskloop 105end subroutine test_taskloop 106 107! Rule a); OpenMP 4.5 Examples teams.2.f90 108! TODO: reduction; data-mapping attributes 109!DEF: /dotprod (Subroutine) Subprogram 110!DEF: /dotprod/b ObjectEntity REAL(4) 111!DEF: /dotprod/c ObjectEntity REAL(4) 112!DEF: /dotprod/n ObjectEntity INTEGER(4) 113!DEF: /dotprod/block_size ObjectEntity INTEGER(4) 114!DEF: /dotprod/num_teams ObjectEntity INTEGER(4) 115!DEF: /dotprod/block_threads ObjectEntity INTEGER(4) 116subroutine dotprod (b, c, n, block_size, num_teams, block_threads) 117 implicit none 118 !REF: /dotprod/n 119 integer n 120 !REF: /dotprod/b 121 !REF: /dotprod/n 122 !REF: /dotprod/c 123 !DEF: /dotprod/sum ObjectEntity REAL(4) 124 real b(n), c(n), sum 125 !REF: /dotprod/block_size 126 !REF: /dotprod/num_teams 127 !REF: /dotprod/block_threads 128 !DEF: /dotprod/i ObjectEntity INTEGER(4) 129 !DEF: /dotprod/i0 ObjectEntity INTEGER(4) 130 integer block_size, num_teams, block_threads, i, i0 131 !REF: /dotprod/sum 132 sum = 0.0e0 133!$omp target map(to:b,c) map(tofrom:sum) 134!$omp teams num_teams(num_teams) thread_limit(block_threads) reduction(+:sum) 135!$omp distribute 136 !DEF: /dotprod/Block1/Block1/Block1/i0 (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 137 !REF: /dotprod/n 138 !REF: /dotprod/block_size 139 do i0=1,n,block_size 140!$omp parallel do reduction(+:sum) 141 !DEF: /dotprod/Block1/Block1/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 142 !REF: /dotprod/Block1/Block1/Block1/i0 143 !DEF: /dotprod/min ELEMENTAL, INTRINSIC, PURE (Function) ProcEntity 144 !REF: /dotprod/block_size 145 !REF: /dotprod/n 146 do i=i0,min(i0+block_size, n) 147 !DEF: /dotprod/Block1/Block1/Block1/Block1/sum (OmpReduction) HostAssoc REAL(4) 148 !REF: /dotprod/b 149 !REF: /dotprod/Block1/Block1/Block1/Block1/i 150 !REF: /dotprod/c 151 sum = sum+b(i)*c(i) 152 end do 153 end do 154!$omp end teams 155!$omp end target 156 !REF: /dotprod/sum 157 print *, sum 158end subroutine dotprod 159 160! Rule b) 161! TODO: nested constructs (j, k should be private too) 162!DEF: /test_simd (Subroutine) Subprogram 163subroutine test_simd 164 implicit none 165 !DEF: /test_simd/a ObjectEntity REAL(4) 166 real a(20,20,20) 167 !DEF: /test_simd/i ObjectEntity INTEGER(4) 168 !DEF: /test_simd/j ObjectEntity INTEGER(4) 169 !DEF: /test_simd/k ObjectEntity INTEGER(4) 170 integer i, j, k 171!$omp parallel do simd 172 !DEF: /test_simd/Block1/i (OmpLinear, OmpPreDetermined) HostAssoc INTEGER(4) 173 do i=1,5 174 !DEF: /test_simd/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 175 do j=6,10 176 !DEF: /test_simd/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 177 do k=11,15 178 !REF: /test_simd/a 179 !REF: /test_simd/Block1/k 180 !REF: /test_simd/Block1/j 181 !REF: /test_simd/Block1/i 182 a(k,j,i) = 3.14 183 end do 184 end do 185 end do 186end subroutine test_simd 187 188! Rule c) 189!DEF: /test_simd_multi (Subroutine) Subprogram 190subroutine test_simd_multi 191 implicit none 192 !DEF: /test_simd_multi/a ObjectEntity REAL(4) 193 real a(20,20,20) 194 !DEF: /test_simd_multi/i ObjectEntity INTEGER(4) 195 !DEF: /test_simd_multi/j ObjectEntity INTEGER(4) 196 !DEF: /test_simd_multi/k ObjectEntity INTEGER(4) 197 integer i, j, k 198!$omp parallel do simd collapse(3) 199 !DEF: /test_simd_multi/Block1/i (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 200 do i=1,5 201 !DEF: /test_simd_multi/Block1/j (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 202 do j=6,10 203 !DEF: /test_simd_multi/Block1/k (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 204 do k=11,15 205 !REF: /test_simd_multi/a 206 !REF: /test_simd_multi/Block1/k 207 !REF: /test_simd_multi/Block1/j 208 !REF: /test_simd_multi/Block1/i 209 a(k,j,i) = 3.14 210 end do 211 end do 212 end do 213end subroutine test_simd_multi 214 215! Rule d) 216!DEF: /test_seq_loop (Subroutine) Subprogram 217subroutine test_seq_loop 218 implicit none 219 !DEF: /test_seq_loop/i ObjectEntity INTEGER(4) 220 !DEF: /test_seq_loop/j ObjectEntity INTEGER(4) 221 integer i, j 222 !REF: /test_seq_loop/i 223 i = -1 224 !REF: /test_seq_loop/j 225 j = -1 226 !$omp parallel 227 !REF: /test_seq_loop/i 228 !REF: /test_seq_loop/j 229 print *, i, j 230 !$omp parallel 231 !REF: /test_seq_loop/i 232 !DEF: /test_seq_loop/Block1/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 233 print *, i, j 234 !$omp do 235 !DEF: /test_seq_loop/Block1/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) 236 do i=1,10 237 !REF: /test_seq_loop/Block1/Block1/j 238 do j=1,10 239 end do 240 end do 241 !REF: /test_seq_loop/i 242 !REF: /test_seq_loop/Block1/Block1/j 243 print *, i, j 244 !$omp end parallel 245 !REF: /test_seq_loop/i 246 !REF: /test_seq_loop/j 247 print *, i, j 248 !$omp end parallel 249 !REF: /test_seq_loop/i 250 !REF: /test_seq_loop/j 251 print *, i, j 252end subroutine test_seq_loop 253