https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106715

            Bug ID: 106715
           Summary: [OpenMP][5.2] Permit 'order' clause with 'for
                    simd'/'do simd' + improve error message
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: diagnostic, openmp, rejects-valid
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

In OpenMP 5.1's 2.11.5.2, there is the restriction for
worksharing-loop SIMD constructs:
"* No ordered clause with a parameter can be specified."


This is gone with OpenMP 5.2. However, 5.2 does have the following restriction
(from 17.1 Nesting of Regions):

"An ordered region that corresponds to an ordered construct without the simd
clause specified must be closely nested inside a worksharing-loop region."


So, this is now allowed:

integer :: i, n, a(0:5)
n = 5
!$omp do ordered(1)
do i=1,n
   a(i) = a(i) + 1
end do
end

and this would also be allowed:

integer :: i, n, a(0:5)
n = 5
!$omp do simd ordered(1)
do i=1,n
   a(i) = a(i) + 1
end do
end
-------------------------

Remark: Both Fortran snippets are already accepted; as is the C/C++ version of
the first example. However, the C/C++ version of the second is rejected by GCC:

foo44.c:4:31: error: ‘ordered’ clause with parameter may not be specified on
‘#pragma omp for simd’ construct
    4 |   #pragma omp for simd ordered(1)

------------------------
void foo()
{
  int i, n = 5, a[5];
  #pragma omp for simd ordered(1)
  for(i=0; i < n; i++)
    a[i] += 1;
}
------------------------


However, this would not be allowed:

integer :: i, n, a(0:5)
n = 5
!$omp do simd ordered(1)
do i=1,n
   !$omp ordered depend(sink:i-1)  ! 'depend' -> 'doaccross' in 5.2
   a(i) = a(i) + a(i-1)
   !$omp ordered depend(source)  ! 'depend' -> 'doaccross' in 5.2
end do
end

------------
Remark: GCC outputs the following:
  Error: ‘ordered’ construct with ‘depend’ clause must be closely nested inside
a
  loop with ‘ordered’ clause with a parameter

Printing an error is fine. However, I think this message is a bit misleading as
'ordered' construct is closely nested in a loop - and that loop has an
'ordered' clause with a parameter. It is just that the "for simd" is internally
a "for" + "simd" and the 'ordered' is only only the outer 'for' bit.


Likewise for the C/C++ version of the latter (same error diagnostic):

void foo()
{
  int i, n = 5, a[5];
  #pragma omp for ordered(1)
  for(i=0; i < n; i++)
    {
      #pragma omp ordered depend(sink:i-1)
      a[i] += 1;
      #pragma omp ordered depend(source)
    }
}

Reply via email to