[PATCH] Fortran: Added support for locality specs in DO CONCURRENT (Fortran 2018/23)
Harald Anlauf
anlauf@gmx.de
Mon Sep 23 19:05:43 GMT 2024
Hi Anuj,
thanks for your work!
I am unable to apply the patch, so I only looked at the testcases.
Generally speaking, runtime tests should verify that they work as
expected. Just printing a result does not. Use a comparison
against an expected result and do e.g. STOP 123 on failure.
Also, never use -std=gnu in the options; -std=gnu is the default,
and its behavior may change any time. If you want to test something
that is enabled at F2023, please use -std=f2023. Also, -std=gnu is
meant to enable a GNU extension, but DO CONCURRENT is not an extension
but defined in the Fortran standard.
For details on my comments see below.
Thanks,
Harald
Am 22.09.24 um 08:19 schrieb Anuj Mohite:
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_10.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_10.f90
> new file mode 100644
> index 00000000000..6bbeb3bc990
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_10.f90
> @@ -0,0 +1,11 @@
> +! { dg-do compile }
> +! { dg-options "-std=f2018" }
> +
> +program do_concurrent_parsing
> + implicit none
> + integer :: concurrent, do
> + do concurrent = 1, 5
> + end do
> + do concurrent = 1, 5
^^^ should this be 'do' instead of 'concurrent'?
> + end do
> +end program do_concurrent_parsing
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_8_f2023.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_8_f2023.f90
> new file mode 100644
> index 00000000000..a99d81e4a5c
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_8_f2023.f90
> @@ -0,0 +1,23 @@
> +! { dg-do compile }
> +! { dg-options "-std=gnu" }
^^^ here you want -std=f2023
> +program do_concurrent_complex
> + implicit none
> + integer :: i, j, k, sum, product
> + integer, dimension(10,10,10) :: array
> + sum = 0
> + product = 1
> + do concurrent (i = 1:10) local(j) shared(sum) reduce(+:sum)
> + ! { dg-error "Variable .sum. at .1. has already been specified in
> a locality-spec" "" { target *-*-* } .-1 }
> + ! { dg-error "Sorry, LOCAL and LOCAL_INIT are not yet supported
> for 'do concurrent' constructs" "" { target *-*-* } .-2 }
> + do concurrent (j = 1:10) local(k) shared(product) reduce(*:product)
> + ! { dg-error "Variable .product. at .1. has already been
> specified in a locality-spec" "" { target *-*-* } .-1 }
> + ! { dg-error "Sorry, LOCAL and LOCAL_INIT are not yet supported
> for 'do concurrent' constructs" "" { target *-*-* } .-2 }
> + do concurrent (k = 1:10)
> + array(i,j,k) = i * j * k
> + sum = sum + array(i,j,k)
> + product = product * array(i,j,k)
> + end do
> + end do
> + end do
> + print *, sum, product
> +end program do_concurrent_complex
> \ No newline at end of file
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_basic.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_basic.f90
> new file mode 100644
> index 00000000000..fe8723d48b4
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_basic.f90
> @@ -0,0 +1,11 @@
> +! { dg-do run }
> +program basic_do_concurrent
> + implicit none
> + integer :: i, arr(10)
> +
> + do concurrent (i = 1:10)
> + arr(i) = i
> + end do
> +
> + print *, arr
> +end program basic_do_concurrent
> \ No newline at end of file
^^^ this testcase does neither test the result, nor does it provide
anything beyond existing tests. Consider dropping it.
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_multiple_reduce.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_multiple_reduce.f90
> new file mode 100644
> index 00000000000..47c71492107
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_multiple_reduce.f90
> @@ -0,0 +1,17 @@
> +! { dg-do compile }
> +program do_concurrent_multiple_reduce
> + implicit none
> + integer :: i, arr(10), sum, product
> + sum = 0
> + product = 1
> +
> + do concurrent (i = 1:10) reduce(+:sum) reduce(*:product)
> + arr(i) = i
> + sum = sum + i
> + product = product * i
> + end do
> +
> + print *, arr
> + print *, "Sum:", sum
> + print *, "Product:", product
^^^ please verify results!
> +end program do_concurrent_multiple_reduce
> \ No newline at end of file
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_nested.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_nested.f90
> new file mode 100644
> index 00000000000..83b9cdbc04f
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_nested.f90
> @@ -0,0 +1,26 @@
> +! { dg-do compile }
> +program nested_do_concurrent
> + implicit none
> + integer :: i, j, x(10, 10)
> + integer :: total_sum
> +
> + total_sum = 0
> +
> + ! Outer loop remains DO CONCURRENT
> + do concurrent (i = 1:10)
> + ! Inner loop changed to regular DO loop
> + do j = 1, 10
> + x(i, j) = i * j
> + end do
> + end do
> +
> + ! Separate loops for summation
> + do i = 1, 10
> + do j = 1, 10
> + total_sum = total_sum + x(i, j)
> + end do
> + end do
> +
> + print *, "Total sum:", total_sum
> + print *, "Array:", x
^^^ please verify results!
> +end program nested_do_concurrent
> \ No newline at end of file
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_reduce_max.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_reduce_max.f90
> new file mode 100644
> index 00000000000..ddf9626da7b
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_reduce_max.f90
> @@ -0,0 +1,14 @@
> +! { dg-do compile }
> +program do_concurrent_reduce_max
> + implicit none
> + integer :: i, arr(10), max_val
> + max_val = 0
> +
> + do concurrent (i = 1:10) reduce(max:max_val)
> + arr(i) = i * i
> + max_val = max(max_val, arr(i))
> + end do
> +
> + print *, arr
> + print *, "Max value:", max_val
^^^ please verify results!
> +end program do_concurrent_reduce_max
> \ No newline at end of file
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_reduce_sum.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_reduce_sum.f90
> new file mode 100644
> index 00000000000..1165e0c5243
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_reduce_sum.f90
> @@ -0,0 +1,14 @@
> +! { dg-do compile }
> +program do_concurrent_reduce_sum
> + implicit none
> + integer :: i, arr(10), sum
> + sum = 0
> +
> + do concurrent (i = 1:10) reduce(+:sum)
> + arr(i) = i
> + sum = sum + i
> + end do
> +
> + print *, arr
> + print *, "Sum:", sum
^^^ please verify results!
> +end program do_concurrent_reduce_sum
> \ No newline at end of file
> diff --git a/gcc/testsuite/gfortran.dg/do_concurrent_shared.f90
> b/gcc/testsuite/gfortran.dg/do_concurrent_shared.f90
> new file mode 100644
> index 00000000000..6e3dd1c883d
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/do_concurrent_shared.f90
> @@ -0,0 +1,14 @@
> +! { dg-do compile }
> +program do_concurrent_shared
> + implicit none
> + integer :: i, arr(10), sum
> + sum = 0
> +
> + do concurrent (i = 1:10) shared(sum)
> + arr(i) = i
> + sum = sum + i
> + end do
> +
> + print *, arr
> + print *, "Sum:", sum
^^^ please verify results!
> +end program do_concurrent_shared
> \ No newline at end of file
More information about the Fortran
mailing list