[og9] Add 'ephemeral' parameter to GOMP_OFFLOAD_openacc_async_host2dev
diff mbox series

Message ID 20190919135913.120673-1-julian@codesourcery.com
State New
Headers show
Series
  • [og9] Add 'ephemeral' parameter to GOMP_OFFLOAD_openacc_async_host2dev
Related show

Commit Message

Julian Brown Sept. 19, 2019, 1:59 p.m. UTC
This patch fixes a build failure in the NVPTX libgomp plugin after the
EPHEMERAL parameter was added to the GOMP_OFFLOAD_openacc_async_host2dev
plugin entry point.

So far the parameter is ignored, which is no change from the previous
behaviour but which I think may lead to a data race in some (presumably
rare) circumstances -- for reasons I describe in the FIXME comment added
to the function.

I will apply this to the openacc-gcc-9-branch shortly (to unbreak the
build), and investigate further.

Julian

ChangeLog

	libgomp/
	* plugin/plugin-nvptx.c (GOMP_OFFLOAD_openacc_async_host2dev):
	Add EPHEMERAL parameter, and FIXME function comment.
---
 libgomp/ChangeLog.openacc     |  5 +++++
 libgomp/plugin/plugin-nvptx.c | 13 ++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/libgomp/ChangeLog.openacc b/libgomp/ChangeLog.openacc
index 943a9e4a933..7813760e642 100644
--- a/libgomp/ChangeLog.openacc
+++ b/libgomp/ChangeLog.openacc
@@ -1,3 +1,8 @@ 
+2019-09-19  Julian Brown  <julian@codesourcery.com>
+
+	* plugin/plugin-nvptx.c (GOMP_OFFLOAD_openacc_async_host2dev):
+	Add EPHEMERAL parameter, and FIXME function comment.
+
 2019-09-18  Tobias Burnus  <tobias@codesourcery.com>
 
 	* testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Fix dg-warning
diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c
index 4beb3222e8f..452415e1879 100644
--- a/libgomp/plugin/plugin-nvptx.c
+++ b/libgomp/plugin/plugin-nvptx.c
@@ -1868,9 +1868,20 @@  GOMP_OFFLOAD_dev2dev (int ord, void *dst, const void *src, size_t n)
   return true;
 }
 
+/* FIXME: It is unknown whether the cuMemcpyHtoDAsync API call caches source
+   data before the asynchronous copy takes place.  Either way there is a data
+   race associated with ignoring the EPHEMERAL parameter here -- either if it
+   is TRUE (because we are copying uncached data that may disappear before the
+   async copy takes place) or if it is FALSE (because the source data may be
+   cached/snapshotted here before it is modified by an earlier async operation,
+   so stale data gets copied to the target).
+   Neither problem has been observed in practice, so far.  */
+
 bool
 GOMP_OFFLOAD_openacc_async_host2dev (int ord, void *dst, const void *src,
-				     size_t n, struct goacc_asyncqueue *aq)
+				     size_t n,
+				     bool ephemeral __attribute__((unused)),
+				     struct goacc_asyncqueue *aq)
 {
   if (!nvptx_attach_host_thread_to_device (ord)
       || !cuda_memcpy_sanity_check (src, dst, n))