On Wed, Jul 25, 2018 at 5:30 PM Cesar Philippidis
<ce...@codesourcery.com> wrote:
>
> This patch teaches GCC to inform the user how it assigned parallelism
> to each OpenACC loop at compile time using the -fopt-info-note-omp
> flag. For instance, given the acc parallel loop nest:
>
>   #pragma acc parallel loop
>   for (...)
>     #pragma acc loop vector
>     for (...)
>
> GCC will report somthing like
>
>   foo.c:4:0: note: Detected parallelism <acc loop gang worker>
>   foo.c:6:0: note: Detected parallelism <acc loop vector>
>
> Note how only the inner loop specifies vector parallelism. In this
> example, GCC automatically assigned gang and worker parallelism to the
> outermost loop. Perhaps, going forward, it would be useful to
> distinguish which parallelism was specified by the user and which was
> assigned by the compiler. But that can be added in a follow up patch.
>
> Is this patch OK for trunk? I bootstrapped and regtested it for x86_64
> with nvptx offloading.

Shouldn't this use MSG_OPTIMIZED_LOCATIONS instead?  Are there
any other optinfo notes emitted?  Like when despite pragmas loops
are not handled or so?

> Thanks,
> Cesar
>
> 2018-XX-YY  Cesar Philippidis  <ce...@codesourcery.com>
>
>         gcc/
>         * omp-offload.c (inform_oacc_loop): New function.
>         (execute_oacc_device_lower): Use it to display loop parallelism.
>
>         gcc/testsuite/
>         * c-c++-common/goacc/note-parallelism.c: New test.
>         * gfortran.dg/goacc/note-parallelism.f90: New test.
>
> (cherry picked from gomp-4_0-branch r245683, and gcc/testsuite/ parts of
> r245770)
>
> diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c
> index 0abf028..66b99bb 100644
> --- a/gcc/omp-offload.c
> +++ b/gcc/omp-offload.c
> @@ -866,6 +866,31 @@ debug_oacc_loop (oacc_loop *loop)
>    dump_oacc_loop (stderr, loop, 0);
>  }
>
> +/* Provide diagnostics on OpenACC loops LOOP, its siblings and its
> +   children.  */
> +
> +static void
> +inform_oacc_loop (oacc_loop *loop)
> +{
> +  const char *seq = loop->mask == 0 ? " seq" : "";
> +  const char *gang = loop->mask & GOMP_DIM_MASK (GOMP_DIM_GANG)
> +    ? " gang" : "";
> +  const char *worker = loop->mask & GOMP_DIM_MASK (GOMP_DIM_WORKER)
> +    ? " worker" : "";
> +  const char *vector = loop->mask & GOMP_DIM_MASK (GOMP_DIM_VECTOR)
> +    ? " vector" : "";
> +  dump_location_t loc = dump_location_t::from_location_t (loop->loc);
> +
> +  dump_printf_loc (MSG_NOTE, loc,
> +                  "Detected parallelism <acc loop%s%s%s%s>\n", seq, gang,
> +                  worker, vector);
> +
> +  if (loop->child)
> +    inform_oacc_loop (loop->child);
> +  if (loop->sibling)
> +    inform_oacc_loop (loop->sibling);
> +}
> +
>  /* DFS walk of basic blocks BB onwards, creating OpenACC loop
>     structures as we go.  By construction these loops are properly
>     nested.  */
> @@ -1533,6 +1558,8 @@ execute_oacc_device_lower ()
>        dump_oacc_loop (dump_file, loops, 0);
>        fprintf (dump_file, "\n");
>      }
> +  if (dump_enabled_p () && loops->child)
> +    inform_oacc_loop (loops->child);
>
>    /* Offloaded targets may introduce new basic blocks, which require
>       dominance information to update SSA.  */
> diff --git a/gcc/testsuite/c-c++-common/goacc/note-parallelism.c 
> b/gcc/testsuite/c-c++-common/goacc/note-parallelism.c
> new file mode 100644
> index 0000000..3ec794c
> --- /dev/null
> +++ b/gcc/testsuite/c-c++-common/goacc/note-parallelism.c
> @@ -0,0 +1,61 @@
> +/* Test the output of -fopt-info-note-omp.  */
> +
> +/* { dg-additional-options "-fopt-info-note-omp" } */
> +
> +int
> +main ()
> +{
> +  int x, y, z;
> +
> +#pragma acc parallel loop seq /* { dg-message "note: Detected parallelism 
> <acc loop seq>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop gang /* { dg-message "note: Detected parallelism 
> <acc loop gang>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop worker /* { dg-message "note: Detected parallelism 
> <acc loop worker>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop vector /* { dg-message "note: Detected parallelism 
> <acc loop vector>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop gang vector /* { dg-message "note: Detected 
> parallelism <acc loop gang vector>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop gang worker /* { dg-message "note: Detected 
> parallelism <acc loop gang worker>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop worker vector /* { dg-message "note: Detected 
> parallelism <acc loop worker vector>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop gang worker vector /* { dg-message "note: Detected 
> parallelism <acc loop gang worker vector>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop /* { dg-message "note: Detected parallelism <acc 
> loop gang vector>" } */
> +  for (x = 0; x < 10; x++)
> +    ;
> +
> +#pragma acc parallel loop /* { dg-message "note: Detected parallelism <acc 
> loop gang worker>" } */
> +  for (x = 0; x < 10; x++)
> +#pragma acc loop /* { dg-message "note: Detected parallelism <acc loop 
> vector>" } */
> +    for (y = 0; y < 10; y++)
> +      ;
> +
> +#pragma acc parallel loop gang /* { dg-message "note: Detected parallelism 
> <acc loop gang>" } */
> +  for (x = 0; x < 10; x++)
> +#pragma acc loop worker /* { dg-message "note: Detected parallelism <acc 
> loop worker>" } */
> +    for (y = 0; y < 10; y++)
> +#pragma acc loop vector /* { dg-message "note: Detected parallelism <acc 
> loop vector>" } */
> +      for (z = 0; z < 10; z++)
> +       ;
> +
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gfortran.dg/goacc/note-parallelism.f90 
> b/gcc/testsuite/gfortran.dg/goacc/note-parallelism.f90
> new file mode 100644
> index 0000000..a0c78c5
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/goacc/note-parallelism.f90
> @@ -0,0 +1,62 @@
> +! Test the output of -fopt-info-note-omp.
> +
> +! { dg-additional-options "-fopt-info-note-omp" }
> +
> +program test
> +  implicit none
> +
> +  integer x, y, z
> +
> +  !$acc parallel loop seq ! { dg-message "note: Detected parallelism <acc 
> loop seq>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop gang ! { dg-message "note: Detected parallelism <acc 
> loop gang>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop worker ! { dg-message "note: Detected parallelism <acc 
> loop worker>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop vector ! { dg-message "note: Detected parallelism <acc 
> loop vector>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop gang vector ! { dg-message "note: Detected parallelism 
> <acc loop gang vector>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop gang worker ! { dg-message "note: Detected parallelism 
> <acc loop gang worker>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop worker vector ! { dg-message "note: Detected 
> parallelism <acc loop worker vector>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop gang worker vector ! { dg-message "note: Detected 
> parallelism <acc loop gang worker vector>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop ! { dg-message "note: Detected parallelism <acc loop 
> gang vector>" }
> +  do x = 1, 10
> +  end do
> +
> +  !$acc parallel loop ! { dg-message "note: Detected parallelism <acc loop 
> gang worker>" }
> +  do x = 1, 10
> +     !$acc loop ! { dg-message "note: Detected parallelism <acc loop 
> vector>" }
> +     do y = 1, 10
> +     end do
> +  end do
> +
> +  !$acc parallel loop gang ! { dg-message "note: Detected parallelism <acc 
> loop gang>" }
> +  do x = 1, 10
> +     !$acc loop worker ! { dg-message "note: Detected parallelism <acc loop 
> worker>" }
> +     do y = 1, 10
> +        !$acc loop vector ! { dg-message "note: Detected parallelism <acc 
> loop vector>" }
> +        do z = 1, 10
> +        end do
> +     end do
> +  end do
> +end program test
> --
> 2.7.4
>

Reply via email to