[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