mbox series

[0/3] OpenACC 2.6 manual deep copy support (attach/detach)

Message ID cover.1541863637.git.julian@codesourcery.com
Headers show
Series OpenACC 2.6 manual deep copy support (attach/detach) | expand

Message

Julian Brown Nov. 10, 2018, 5:11 p.m. UTC
Hi,

This patch series adds support for OpenACC 2.6's "manual deep copy"
feature.  This consists of three main parts:

 * Variable lists in data clauses can specify members of structs (in
   C/C++) or derived types (in Fortran). In C/C++ we allow either "." or
   "->" to be used to select members of structs or pointers-to-structs
   respectively. Fortran uses "%", as in the base language.

 * Struct and derived type members that are pointers trigger new
   "attach" and "detach" operations. The typical supported case is for a
   struct to be copied verbatim to the target initially. Subsequently,
   attach operations can be used to rewrite pointers to host memory
   contained in the struct to point to device memory instead. In this
   way, structs (and derived types) can be used fairly naturally in
   offloaded code. The detach operation restores pointers to point to
   host memory, i.e. before the whole struct is copied verbatim back to
   the host again.

 * There are new explicit attach/detach clauses in all three supported
   languages, as well as new behaviour for existing clauses
   (copy/copyin/copyout, etc.) implementing the semantics described above.

For more details, see the OpenACC 2.6 spec, or the Deep Copy Attach and
Detach Technical Report (TR-16-1) on the OpenACC site.

The patches are split into three parts, the first two of which are
tangentially-related cleanups, and the third of which contains the bulk
of the changes. I'll write more about those in their respective emails.

This patch series relies on the libgomp async implementation rework done
by Chung-Lin, posted previously:

https://gcc.gnu.org/ml/gcc-patches/2018-09/msg01424.html

Julian Brown (3):
  Host-to-device transfer coalescing & magic offset value
    self-documentation
  Factor out duplicate code in gimplify_scan_omp_clauses
  OpenACC 2.6 manual deep copy support (attach/detach)

 gcc/c-family/c-pragma.h                            |   2 +
 gcc/c/c-parser.c                                   |  34 +-
 gcc/c/c-typeck.c                                   |  59 +++-
 gcc/cp/parser.c                                    |  38 +-
 gcc/cp/semantics.c                                 |  75 +++-
 gcc/fortran/gfortran.h                             |   2 +
 gcc/fortran/openmp.c                               | 145 +++++---
 gcc/fortran/trans-openmp.c                         |  78 ++++-
 gcc/gimplify.c                                     | 390 +++++++++++++--------
 gcc/omp-low.c                                      |   3 +
 gcc/testsuite/c-c++-common/goacc/mdc-1.c           |  54 +++
 gcc/testsuite/c-c++-common/goacc/mdc-2.c           |  62 ++++
 gcc/testsuite/g++.dg/goacc/mdc.C                   |  68 ++++
 gcc/testsuite/gfortran.dg/goacc/data-clauses.f95   |  38 +-
 gcc/testsuite/gfortran.dg/goacc/derived-types.f90  |  77 ++++
 .../gfortran.dg/goacc/enter-exit-data.f95          |  24 +-
 gcc/tree-pretty-print.c                            |   9 +
 include/gomp-constants.h                           |   8 +
 libgomp/libgomp.h                                  |  23 +-
 libgomp/libgomp.map                                |  10 +
 libgomp/oacc-async.c                               |   4 +-
 libgomp/oacc-int.h                                 |   2 +-
 libgomp/oacc-mem.c                                 |  86 ++++-
 libgomp/oacc-parallel.c                            | 220 +++++++++---
 libgomp/openacc.h                                  |   6 +
 libgomp/target.c                                   | 292 ++++++++++++---
 .../libgomp.oacc-c-c++-common/deep-copy-1.c        |  24 ++
 .../libgomp.oacc-c-c++-common/deep-copy-2.c        |  29 ++
 .../libgomp.oacc-c-c++-common/deep-copy-3.c        |  34 ++
 .../libgomp.oacc-c-c++-common/deep-copy-4.c        |  87 +++++
 .../libgomp.oacc-c-c++-common/deep-copy-5.c        |  81 +++++
 .../testsuite/libgomp.oacc-fortran/deep-copy-1.f90 |  35 ++
 .../testsuite/libgomp.oacc-fortran/deep-copy-2.f90 |  33 ++
 .../testsuite/libgomp.oacc-fortran/deep-copy-3.f90 |  34 ++
 .../testsuite/libgomp.oacc-fortran/deep-copy-4.f90 |  49 +++
 .../testsuite/libgomp.oacc-fortran/deep-copy-5.f90 |  57 +++
 .../testsuite/libgomp.oacc-fortran/deep-copy-6.f90 |  61 ++++
 .../testsuite/libgomp.oacc-fortran/deep-copy-7.f90 |  89 +++++
 .../testsuite/libgomp.oacc-fortran/deep-copy-8.f90 |  41 +++
 .../libgomp.oacc-fortran/derived-type-1.f90        |  28 ++
 .../testsuite/libgomp.oacc-fortran/update-2.f90    | 284 +++++++++++++++
 41 files changed, 2406 insertions(+), 369 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/goacc/mdc-1.c
 create mode 100644 gcc/testsuite/c-c++-common/goacc/mdc-2.c
 create mode 100644 gcc/testsuite/g++.dg/goacc/mdc.C
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/derived-types.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/deep-copy-1.c
 create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/deep-copy-2.c
 create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/deep-copy-3.c
 create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/deep-copy-4.c
 create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/deep-copy-5.c
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-1.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-4.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-5.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-6.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-7.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/deep-copy-8.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/derived-type-1.f90
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/update-2.f90