[ was: Re: [gomp4] New test loop independent clause ]
On 15/07/15 12:43, Tom de Vries wrote:
I'm not sure if I mentioned it at the meeting, but marking the outer loop of that example as independent does not result in parallelization either. So that's something to be investigated.
I've got it working now. Committed to gomp-4_0-branch. Thanks, - Tom
Add kernels-loop-nest-independent.f95 2015-07-15 Tom de Vries <t...@codesourcery.com> * gfortran.dg/goacc/kernels-loop-nest-independent.f95: New test. * testsuite/libgomp.oacc-fortran/kernels-loop-nest-independent.f95: New test. diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-loop-nest-independent.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-nest-independent.f95 new file mode 100644 index 0000000..436048e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-nest-independent.f95 @@ -0,0 +1,41 @@ +! { dg-do compile } +! { dg-additional-options "-O2" } +! { dg-additional-options "-ftree-parallelize-loops=32" } +! { dg-additional-options "-fdump-tree-parloops_oacc_kernels-all" } +! { dg-additional-options "-fdump-tree-optimized" } + +! Based on autopar/outer-1.c. + +program main + implicit none + integer, parameter :: n = 500 + integer, dimension (0:n-1, 0:n-1) :: x + integer :: i, j, ii, jj + + + !$acc kernels copyout (x) + !$acc loop independent + do ii = 0, n - 1 + do jj = 0, n - 1 + x(jj, ii) = ii + jj + 3 + end do + end do + !$acc end kernels + + do i = 0, n - 1 + do j = 0, n - 1 + if (x(i, j) .ne. i + j + 3) call abort + end do + end do + +end program main + +! Check that only one loop is analyzed, and that it can be parallelized. +! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized, marked independent" 1 "parloops_oacc_kernels" } } +! { dg-final { scan-tree-dump-not "FAILED:" "parloops_oacc_kernels" } } +! { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops_oacc_kernels" } } + +! Check that the loop has been split off into a function. +! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } } + +! { dg-final { scan-tree-dump-times "(?n)pragma omp target oacc_parallel.*num_gangs\\(32\\)" 1 "parloops_oacc_kernels" } } diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-nest-independent.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-nest-independent.f95 new file mode 100644 index 0000000..87a3d23 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-nest-independent.f95 @@ -0,0 +1,28 @@ +! { dg-do run } +! { dg-options "-ftree-parallelize-loops=32" } + +! Based on autopar/outer-1.c. + +program main + implicit none + integer, parameter :: n = 500 + integer, dimension (0:n-1, 0:n-1) :: x + integer :: i, j, ii, jj + + + !$acc kernels copyout (x) + !$acc loop independent + do ii = 0, n - 1 + do jj = 0, n - 1 + x(jj, ii) = ii + jj + 3 + end do + end do + !$acc end kernels + + do i = 0, n - 1 + do j = 0, n - 1 + if (x(i, j) .ne. i + j + 3) call abort + end do + end do + +end program main -- 1.9.1