Julian Brown
2018-11-10 17:11:17 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
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
--
1.8.1.1
1.8.1.1