]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Don't mark OpenACC auto loops as independent inside acc parallel regions
authorJulian Brown <julian@codesourcery.com>
Tue, 26 Feb 2019 23:55:23 +0000 (15:55 -0800)
committerThomas Schwinge <thomas@codesourcery.com>
Tue, 3 Mar 2020 11:14:25 +0000 (12:14 +0100)
2018-09-20  Cesar Philippidis  <cesar@codesourcery.com>

gcc/
* omp-low.c (lower_oacc_head_mark): Don't mark OpenACC auto
loops as independent inside acc parallel regions.

gcc/testsuite/
* c-c++-common/goacc/loop-auto-1.c: Adjust test case to conform to
the new behavior of the auto clause in OpenACC 2.5.
* c-c++-common/goacc/loop-auto-2.c: Likewise.
* gcc.dg/goacc/loop-processing-1.c: Likewise.
* c-c++-common/goacc/loop-auto-3.c: New test.
* gfortran.dg/goacc/loop-auto-1.f90: New test.

libgomp/
* testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Adjust test case
to conform to the new behavior of the auto clause in OpenACC 2.5.

(cherry picked from openacc-gcc-9-branch commit
6acf40a4364ccab3b71c3b58bf9ba5f16d19dc27)

gcc/ChangeLog.omp
gcc/omp-low.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/c-c++-common/goacc/loop-auto-1.c
gcc/testsuite/c-c++-common/goacc/loop-auto-2.c
gcc/testsuite/c-c++-common/goacc/loop-auto-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/goacc/loop-processing-1.c
gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90 [new file with mode: 0644]
libgomp/ChangeLog.omp
libgomp/testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c

index 13437ac9e7e41e564dae3c21df67cae2a491112e..45ed71e87736bd9d767a713118be49fd0bb6946c 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-20  Cesar Philippidis  <cesar@codesourcery.com>
+
+       * omp-low.c (lower_oacc_head_mark): Don't mark OpenACC auto
+       loops as independent inside acc parallel regions.
+
 2018-10-04  Cesar Philippidis  <cesar@codesourcery.com>
             Julian Brown  <julian@codesourcery.com>
 
index a28c61fdc5ae40ffd1d951dbd0efa97687c05722..171abd54745aca68667b853df5a88da82d69170a 100644 (file)
@@ -6754,9 +6754,10 @@ lower_oacc_head_mark (location_t loc, tree ddvar, tree clauses,
       tag |= OLF_GANG_STATIC;
     }
 
-  /* In a parallel region, loops are implicitly INDEPENDENT.  */
+  /* In a parallel region, loops without auto and seq clauses are
+     implicitly INDEPENDENT.  */
   omp_context *tgt = enclosing_target_ctx (ctx);
-  if (!tgt || is_oacc_parallel (tgt))
+  if ((!tgt || is_oacc_parallel (tgt)) && !(tag & (OLF_SEQ | OLF_AUTO)))
     tag |= OLF_INDEPENDENT;
 
   if (tag & OLF_TILE)
index 8199f4db885f7ed34cb578caeccccab3b171d8d2..803fa3baa9e4f9329af66f6887eaa0503d2862e7 100644 (file)
@@ -1,3 +1,12 @@
+2018-09-20  Cesar Philippidis  <cesar@codesourcery.com>
+
+       * c-c++-common/goacc/loop-auto-1.c: Adjust test case to conform to
+       the new behavior of the auto clause in OpenACC 2.5.
+       * c-c++-common/goacc/loop-auto-2.c: Likewise.
+       * gcc.dg/goacc/loop-processing-1.c: Likewise.
+       * c-c++-common/goacc/loop-auto-3.c: New test.
+       * gfortran.dg/goacc/loop-auto-1.f90: New test.
+
 2018-10-04  Cesar Philippidis  <cesar@codesourcery.com>
             Julian Brown  <julian@codesourcery.com>
 
index 124befc400222e1c9ceca1ca669abca418842c13..dcad07f11c887015bbd864a9c8d6e69a68fd4cc8 100644 (file)
@@ -10,7 +10,7 @@ void Foo ()
 #pragma acc loop seq
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++) {}
       }
 
@@ -20,7 +20,7 @@ void Foo ()
 #pragma acc loop auto
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++)
          {
 #pragma acc loop vector
@@ -51,7 +51,7 @@ void Foo ()
 #pragma acc loop vector
        for (int jx = 0; jx < 10; jx++)
          {
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
            for (int kx = 0; kx < 10; kx++) {}
          }
 
@@ -64,27 +64,27 @@ void Foo ()
 
       }
     
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int ix = 0; ix < 10; ix++)
       {
-#pragma acc loop auto
+#pragma acc loop auto independent
        for (int jx = 0; jx < 10; jx++)
          {
-#pragma acc loop auto
+#pragma acc loop auto independent
            for (int kx = 0; kx < 10; kx++) {}
          }
       }
 
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int ix = 0; ix < 10; ix++)
       {
-#pragma acc loop auto
+#pragma acc loop auto independent
        for (int jx = 0; jx < 10; jx++)
          {
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
            for (int kx = 0; kx < 10; kx++)
              {
-#pragma acc loop auto
+#pragma acc loop auto independent
                for (int lx = 0; lx < 10; lx++) {}
              }
          }
@@ -101,7 +101,7 @@ void Gang (void)
 #pragma acc loop seq
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++) {}
       }
 
@@ -111,7 +111,7 @@ void Gang (void)
 #pragma acc loop auto
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++)
          {
 #pragma acc loop vector
@@ -142,7 +142,7 @@ void Gang (void)
 #pragma acc loop vector
        for (int jx = 0; jx < 10; jx++)
          {
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
            for (int kx = 0; kx < 10; kx++) {}
          }
 
@@ -176,7 +176,7 @@ void Worker (void)
 #pragma acc loop seq
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++) {}
       }
 
@@ -186,7 +186,7 @@ void Worker (void)
 #pragma acc loop auto
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++)
          {
 #pragma acc loop vector
@@ -194,20 +194,20 @@ void Worker (void)
          }
       }
 
-#pragma acc loop auto
+#pragma acc loop
     for (int ix = 0; ix < 10; ix++)
       {
-#pragma acc loop auto
+#pragma acc loop
        for (int jx = 0; jx < 10; jx++) {}
       }
 
-#pragma acc loop auto
+#pragma acc loop
     for (int ix = 0; ix < 10; ix++)
       {
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++)
          {
-#pragma acc loop auto
+#pragma acc loop
            for (int kx = 0; kx < 10; kx++) {}
          }
       }
@@ -222,17 +222,17 @@ void Vector (void)
 #pragma acc loop seq
        for (int jx = 0; jx < 10; jx++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++) {}
       }
 
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int ix = 0; ix < 10; ix++) {}
 
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
     for (int ix = 0; ix < 10; ix++)
       {
-#pragma acc loop auto
+#pragma acc loop auto independent
        for (int jx = 0; jx < 10; jx++) {}
       }
 }
@@ -240,6 +240,6 @@ void Vector (void)
 #pragma acc routine seq
 void Seq (void)
 {
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
     for (int ix = 0; ix < 10; ix++) {}
 }
index af3f0bddf2cbb8e4f189bd23e127b8008d84ba09..5aa36e93ab8f5848606193edd2e7ee700a85ec6d 100644 (file)
@@ -72,12 +72,12 @@ void Bad ()
 #pragma acc loop tile(*) gang vector
     for (int ix = 0; ix < 10; ix++)
       {
-       #pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+       #pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
        for (int jx = 0; jx < 10; jx++)
          ;
       }
 
-#pragma acc loop tile(*) auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop tile(*) auto independent /* { dg-warning "insufficient partitioning" } */
     for (int ix = 0; ix < 10; ix++)
       {
        #pragma acc loop worker
diff --git a/gcc/testsuite/c-c++-common/goacc/loop-auto-3.c b/gcc/testsuite/c-c++-common/goacc/loop-auto-3.c
new file mode 100644 (file)
index 0000000..8f79ead
--- /dev/null
@@ -0,0 +1,78 @@
+/* Ensure that the auto clause falls back to seq parallelism when the
+   OpenACC loop is not explicitly independent.  */
+
+/* { dg-additional-options "-fopt-info-optimized-omp" } */
+
+void
+test ()
+{
+  int i, j, k, l, n = 100;
+  
+#pragma acc parallel loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+  for (i = 0; i < n; i++)
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+    for (j = 0; j < n; j++)
+#pragma acc loop worker vector /* { dg-message "optimized: assigned OpenACC worker vector loop parallelism" } */
+      for (k = 0; k < n; k++)
+       ;
+
+#pragma acc parallel loop auto independent /* { dg-message "optimized: assigned OpenACC gang worker loop parallelism" } */
+  for (i = 0; i < n; i++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+    for (j = 0; j < n; j++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+      for (k = 0; k < n; k++)
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+       for (l = 0; l < n; l++)
+         ;
+
+#pragma acc parallel loop gang /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+  for (i = 0; i < n; i++)
+#pragma acc loop worker /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+    for (j = 0; j < n; j++)
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+      for (k = 0; k < n; k++)
+       {
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+         /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+         for (l = 0; l < n; l++)
+           ;
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+         for (l = 0; l < n; l++)
+           ;
+       }
+
+#pragma acc parallel loop /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+  /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+  for (i = 0; i < n; i++)
+    {
+#pragma acc loop gang worker /* { dg-message "optimized: assigned OpenACC gang worker loop parallelism" } */
+      for (j = 0; j < n; j++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+       for (k = 0; k < n; k++)
+         {
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+           for (l = 0; l < n; l++)
+             ;
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+           for (l = 0; l < n; l++)
+             ;
+         }
+#pragma acc loop worker /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+      for (j = 0; j < n; j++)
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+       for (k = 0; k < n; k++)
+         ;
+    }
+
+#pragma acc parallel loop /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+  for (i = 0; i < n; i++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+    for (j = 0; j < n; j++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+      /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+      for (k = 0; k < n; k++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+         for (l = 0; l < n; l++)
+           ;
+}
index 1d222ab329161522231c60b05ed0274776d6d493..296b61d4c5135968a5405682b8ef116572b04797 100644 (file)
@@ -9,7 +9,7 @@ void vector_1 (int *ary, int size)
   {
 #pragma acc loop gang
     for (int jx = 0; jx < 1; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int ix = 0; ix < size; ix++)
        ary[ix] = place ();
   }
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90 b/gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90
new file mode 100644 (file)
index 0000000..8d600f4
--- /dev/null
@@ -0,0 +1,88 @@
+! Ensure that the auto clause falls back to seq parallelism when the
+! OpenACC loop is not explicitly independent.
+
+! { dg-additional-options "-fopt-info-optimized-omp" }
+
+program test
+  implicit none
+  integer, parameter :: n = 100
+  integer i, j, k, l
+  
+  !$acc parallel loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+  do i = 1, n
+     !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+     do j = 1, n
+        !$acc loop worker vector ! { dg-message "optimized: assigned OpenACC worker vector loop parallelism" }
+        do k = 1, n
+        end do
+     end do
+  end do
+  !$acc parallel loop auto independent ! { dg-message "optimized: assigned OpenACC gang worker loop parallelism" }
+  do i = 1, n
+     !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+     do j = 1, n
+        !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+        do k = 1, n
+           !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+           do l = 1, n
+           end do
+        end do
+     end do
+  end do
+
+  !$acc parallel loop gang ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+  do i = 1, n
+     !$acc loop worker ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+     do j = 1, n
+        !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+        do k = 1, n
+           !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+           ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+           do l = 1, n
+           end do
+           !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+           do l = 1, n
+           end do
+        end do
+     end do
+  end do
+  
+
+  !$acc parallel loop ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+  ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+  do i = 1, n
+     !$acc loop gang worker ! { dg-message "optimized: assigned OpenACC gang worker loop parallelism" }
+     do j = 1, n
+        !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+       do k = 1, n
+          !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+          do l = 1, n
+          end do
+       end do
+       !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+       do l = 1, n
+       end do
+    end do
+    !$acc loop worker ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+    do j = 1, n
+       !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+       do k = 1, n
+       end do
+    end do
+  end do
+
+  !$acc parallel loop ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+  do i = 1, n
+     !$acc loop ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+     do j = 1, n
+        !$acc loop ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+        ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+        do k = 1, n
+           !$acc loop ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+           do l = 1, n
+           end do
+        end do
+     end do
+  end do
+end program test
index 15f44cad3e04ebad5ff6a5a3e187b8a9dcb5489c..82674a8ee057216207b72cd7b1045abebd7e1980 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-20  Cesar Philippidis  <cesar@codesourcery.com>
+
+       * testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Adjust test case
+       to conform to the new behavior of the auto clause in OpenACC 2.5.
+
 2018-10-04  Cesar Philippidis  <cesar@codesourcery.com>
             Julian Brown  <julian@codesourcery.com>
 
index 8e2c1c9aa35d0267fdc7602c8ab7d5f128fc6777..9642b391942459a12e91154ef0cacdfff7756b7b 100644 (file)
@@ -101,7 +101,7 @@ int vector_1 (int *ary, int size)
   {
 #pragma acc loop gang
     for (int jx = 0; jx < 1; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int ix = 0; ix < size; ix++)
        ary[ix] = place ();
   }
@@ -117,7 +117,7 @@ int vector_2 (int *ary, int size)
   {
 #pragma acc loop worker
     for (int jx = 0; jx < size  / 64; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int ix = 0; ix < 64; ix++)
        ary[ix + jx * 64] = place ();
   }
@@ -133,7 +133,7 @@ int worker_1 (int *ary, int size)
   {
 #pragma acc loop gang
     for (int kx = 0; kx < 1; kx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int jx = 0; jx <  size  / 64; jx++)
 #pragma acc loop vector
        for (int ix = 0; ix < 64; ix++)
@@ -149,7 +149,7 @@ int gang_1 (int *ary, int size)
   
 #pragma acc parallel num_gangs (32) num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)/* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "vector" { target *-*-* } } */
   {
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int jx = 0; jx <  size  / 64; jx++)
 #pragma acc loop worker
       for (int ix = 0; ix < 64; ix++)
@@ -165,11 +165,11 @@ int gang_2 (int *ary, int size)
   
 #pragma acc parallel num_gangs (32) num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
   {
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int kx = 0; kx < size / (32 * 32); kx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int jx = 0; jx <  32; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
        for (int ix = 0; ix < 32; ix++)
          ary[ix + jx * 32 + kx * 32 * 32] = place ();
   }
@@ -183,9 +183,9 @@ int gang_3 (int *ary, int size)
   
 #pragma acc parallel num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
   {
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int jx = 0; jx <  size  / 64; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
       for (int ix = 0; ix < 64; ix++)
        ary[ix + jx * 64] = place ();
   }
@@ -199,7 +199,7 @@ int gang_4 (int *ary, int size)
   
 #pragma acc parallel vector_length(32) copy(ary[0:size]) firstprivate (size)
   {
-#pragma acc loop auto
+#pragma acc loop auto independent
     for (int jx = 0; jx <  size; jx++)
       ary[jx] = place ();
   }