! RUN: %S/test_symbols.sh %s %t %f18 -fopenmp ! 2.15.1.1 Predetermined rules for associated do-loops index variable ! a) The loop iteration variable(s) in the associated do-loop(s) of a do, ! parallel do, taskloop, or distribute construct is (are) private. ! b) The loop iteration variable in the associated do-loop of a simd construct ! with just one associated do-loop is linear with a linear-step that is the ! increment of the associated do-loop. ! c) The loop iteration variables in the associated do-loops of a simd ! construct with multiple associated do-loops are lastprivate. ! d) A loop iteration variable for a sequential loop in a parallel or task ! generating construct is private in the innermost such construct that ! encloses the loop. ! - TBD ! All the tests assume that the do-loops association for collapse/ordered ! clause has been performed (the number of nested do-loops >= n). ! Rule a) ! TODO: nested constructs (k should be private too) !DEF: /test_do (Subroutine) Subprogram subroutine test_do implicit none !DEF: /test_do/a ObjectEntity REAL(4) real a(20,20,20) !DEF: /test_do/i ObjectEntity INTEGER(4) !DEF: /test_do/j ObjectEntity INTEGER(4) !DEF: /test_do/k ObjectEntity INTEGER(4) integer i, j, k !$omp parallel !REF: /test_do/i i = 99 !$omp do collapse(2) !DEF: /test_do/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,5 !DEF: /test_do/Block1/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do j=6,10 !REF: /test_do/a a(1,1,1) = 0. !DEF: /test_do/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do k=11,15 !REF: /test_do/a !REF: /test_do/Block1/k !REF: /test_do/Block1/Block1/j !REF: /test_do/Block1/Block1/i a(k,j,i) = 1. end do end do end do !$omp end parallel end subroutine test_do ! Rule a) !DEF: /test_pardo (Subroutine) Subprogram subroutine test_pardo implicit none !DEF: /test_pardo/a ObjectEntity REAL(4) real a(20,20,20) !DEF: /test_pardo/i ObjectEntity INTEGER(4) !DEF: /test_pardo/j ObjectEntity INTEGER(4) !DEF: /test_pardo/k ObjectEntity INTEGER(4) integer i, j, k !$omp parallel do collapse(2) private(k) ordered(2) !DEF: /test_pardo/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,5 !DEF: /test_pardo/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do j=6,10 !REF: /test_pardo/a a(1,1,1) = 0. !DEF: /test_pardo/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do k=11,15 !REF: /test_pardo/a !REF: /test_pardo/Block1/k !REF: /test_pardo/Block1/j !REF: /test_pardo/Block1/i a(k,j,i) = 1. end do end do end do end subroutine test_pardo ! Rule a) !DEF: /test_taskloop (Subroutine) Subprogram subroutine test_taskloop implicit none !DEF: /test_taskloop/a ObjectEntity REAL(4) real a(5,5) !DEF: /test_taskloop/i ObjectEntity INTEGER(4) !DEF: /test_taskloop/j ObjectEntity INTEGER(4) integer i, j !$omp taskloop private(j) !DEF: /test_taskloop/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,5 !DEF: /test_taskloop/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) !REF: /test_taskloop/Block1/i do j=1,i !REF: /test_taskloop/a !REF: /test_taskloop/Block1/j !REF: /test_taskloop/Block1/i a(j,i) = 3.14 end do end do !$omp end taskloop end subroutine test_taskloop ! Rule a); OpenMP 4.5 Examples teams.2.f90 ! TODO: reduction; data-mapping attributes !DEF: /dotprod (Subroutine) Subprogram !DEF: /dotprod/b ObjectEntity REAL(4) !DEF: /dotprod/c ObjectEntity REAL(4) !DEF: /dotprod/n ObjectEntity INTEGER(4) !DEF: /dotprod/block_size ObjectEntity INTEGER(4) !DEF: /dotprod/num_teams ObjectEntity INTEGER(4) !DEF: /dotprod/block_threads ObjectEntity INTEGER(4) subroutine dotprod (b, c, n, block_size, num_teams, block_threads) implicit none !REF: /dotprod/n integer n !REF: /dotprod/b !REF: /dotprod/n !REF: /dotprod/c !DEF: /dotprod/sum ObjectEntity REAL(4) real b(n), c(n), sum !REF: /dotprod/block_size !REF: /dotprod/num_teams !REF: /dotprod/block_threads !DEF: /dotprod/i ObjectEntity INTEGER(4) !DEF: /dotprod/i0 ObjectEntity INTEGER(4) integer block_size, num_teams, block_threads, i, i0 !REF: /dotprod/sum sum = 0.0e0 !$omp target map(to:b,c) map(tofrom:sum) !$omp teams num_teams(num_teams) thread_limit(block_threads) reduction(+:sum) !$omp distribute !DEF: /dotprod/Block1/Block1/Block1/i0 (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) !REF: /dotprod/n !REF: /dotprod/block_size do i0=1,n,block_size !$omp parallel do reduction(+:sum) !DEF: /dotprod/Block1/Block1/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) !REF: /dotprod/Block1/Block1/Block1/i0 !DEF: /dotprod/min INTRINSIC (Function) ProcEntity !REF: /dotprod/block_size !REF: /dotprod/n do i=i0,min(i0+block_size, n) !REF: /dotprod/sum !REF: /dotprod/b !REF: /dotprod/Block1/Block1/Block1/Block1/i !REF: /dotprod/c sum = sum+b(i)*c(i) end do end do !$omp end teams !$omp end target !REF: /dotprod/sum print *, sum end subroutine dotprod ! Rule b) ! TODO: nested constructs (j, k should be private too) !DEF: /test_simd (Subroutine) Subprogram subroutine test_simd implicit none !DEF: /test_simd/a ObjectEntity REAL(4) real a(20,20,20) !DEF: /test_simd/i ObjectEntity INTEGER(4) !DEF: /test_simd/j ObjectEntity INTEGER(4) !DEF: /test_simd/k ObjectEntity INTEGER(4) integer i, j, k !$omp parallel do simd !DEF: /test_simd/Block1/i (OmpLinear, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,5 !DEF: /test_simd/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do j=6,10 !DEF: /test_simd/Block1/k (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do k=11,15 !REF: /test_simd/a !REF: /test_simd/Block1/k !REF: /test_simd/Block1/j !REF: /test_simd/Block1/i a(k,j,i) = 3.14 end do end do end do end subroutine test_simd ! Rule c) !DEF: /test_simd_multi (Subroutine) Subprogram subroutine test_simd_multi implicit none !DEF: /test_simd_multi/a ObjectEntity REAL(4) real a(20,20,20) !DEF: /test_simd_multi/i ObjectEntity INTEGER(4) !DEF: /test_simd_multi/j ObjectEntity INTEGER(4) !DEF: /test_simd_multi/k ObjectEntity INTEGER(4) integer i, j, k !$omp parallel do simd collapse(3) !DEF: /test_simd_multi/Block1/i (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,5 !DEF: /test_simd_multi/Block1/j (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do j=6,10 !DEF: /test_simd_multi/Block1/k (OmpLastPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do k=11,15 !REF: /test_simd_multi/a !REF: /test_simd_multi/Block1/k !REF: /test_simd_multi/Block1/j !REF: /test_simd_multi/Block1/i a(k,j,i) = 3.14 end do end do end do end subroutine test_simd_multi ! Rule d) !DEF: /test_seq_loop (Subroutine) Subprogram subroutine test_seq_loop implicit none !DEF: /test_seq_loop/i ObjectEntity INTEGER(4) !DEF: /test_seq_loop/j ObjectEntity INTEGER(4) integer i, j !REF: /test_seq_loop/i i = -1 !REF: /test_seq_loop/j j = -1 !$omp parallel !REF: /test_seq_loop/i !REF: /test_seq_loop/j print *, i, j !$omp parallel !REF: /test_seq_loop/i !DEF: /test_seq_loop/Block1/Block1/j (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) print *, i, j !$omp do !DEF: /test_seq_loop/Block1/Block1/Block1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4) do i=1,10 !REF: /test_seq_loop/Block1/Block1/j do j=1,10 end do end do !REF: /test_seq_loop/i !REF: /test_seq_loop/Block1/Block1/j print *, i, j !$omp end parallel !REF: /test_seq_loop/i !REF: /test_seq_loop/j print *, i, j !$omp end parallel !REF: /test_seq_loop/i !REF: /test_seq_loop/j print *, i, j end subroutine test_seq_loop