Hi!

On 2019-12-21T23:02:38+0100, I wrote:
> On 2019-12-20T17:46:57+0100, "Harwath, Frederik" <frede...@codesourcery.com> 
> wrote:
>>> > --- a/include/gomp-constants.h
>>> > +++ b/include/gomp-constants.h

>>> > +#define GOMP_DEVICE_CURRENT              -3

>>> Should this actually get value '-1' instead of '-3'?  Or, is the OpenACC
>>> 'acc_device_t' code already paying special attention to negative values
>>> '-1', '-2'?  (I don't think so.)

>>> | Also, 'acc_device_current' is a libgomp-internal thing (doesn't interface
>>> | with the compiler proper), so strictly speaking 'GOMP_DEVICE_CURRENT'
>>> | isn't needed in 'include/gomp-constants.h'.  But probably still a good
>>> | idea to list it there, in this canonical place, to keep the several lists
>>> | of device types coherent.

>>> I still wonder about that...  ;-)

> I still think that 'GOMP_DEVICE_CURENT' should get value '-1' (and
> probably be rename 'GOACC_DEVICE_CURRENT' to make more obvious that it's
> not related to the 'GOMP_DEVICE_*' ones), but we shall have a look at
> that later (before GCC 10 release); that's libgomp/OpenACC-internal,
> doesn't affect anything else.

That's still pending.  Recently,
<https://github.com/OpenACC/openacc-spec/issues/256> "Missing definition
for acc_device_current" got filed; let's (also/first) watch/wait what
comes out of that.


Also pending is the 'libgomp/plugin/plugin-gcn.c' update; Frederik is
working on that.


A few other (minor) open issue we shall discuss at some later point in
time.


>>> | Before Frederik starts working on integrating this into GCC trunk, do you
>>> | (Jakub) agree with the libgomp plugin interface changes as implemented by
>>> | Maciej?  For example, top-level 'GOMP_OFFLOAD_get_property' function in
>>> | 'struct gomp_device_descr' instead of stuffing this into its
>>> | 'acc_dispatch_t openacc'.  (I never understood why the OpenACC functions
>>> | need to be segregated like they are.)
>>>
>>> Jakub didn't answer, but I now myself decided that we should group this
>>> with the other OpenACC libgomp-plugin functions, as this interface is
>>> defined in terms of OpenACC-specific stuff such as 'acc_device_t'.

Done.  This also means that we don't anymore need (stub) implementations
in the libgomp plugins that don't implement OpenACC support.


>>> Maybe [stuff] should move from 'include/gomp-constants.h' to
>>> 'libgomp/oacc-int.h'.  I'll think about that again, when I'm awake again
>>> tomorrow.  ;-)
>>
>> Have you made up your mind yet? :-)
>
> Still sleepy.  ;-)

Done.  In the end, 'libgomp/libgomp-plugin.h' is the place to be, as that
defines, well, the libgomp plugin interface.  ;-)


See attached "OpenACC 'acc_get_property' cleanup"; committed to trunk in
r280150.


Grüße
 Thomas


From f98381a87233ddef09bf7d3a0d47807215930063 Mon Sep 17 00:00:00 2001
From: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 10 Jan 2020 22:24:36 +0000
Subject: [PATCH] OpenACC 'acc_get_property' cleanup

	include/
	* gomp-constants.h (enum gomp_device_property): Remove.
	libgomp/
	* libgomp-plugin.h (enum goacc_property): New.  Adjust all users
	to use this instead of 'enum gomp_device_property'.
	(GOMP_OFFLOAD_get_property): Rename to...
	(GOMP_OFFLOAD_openacc_get_property): ... this.  Adjust all users.
	* libgomp.h (struct gomp_device_descr): Move
	'GOMP_OFFLOAD_openacc_get_property'...
	(struct acc_dispatch_t): ... here.  Adjust all users.
	* plugin/plugin-hsa.c (GOMP_OFFLOAD_get_property): Remove.
	liboffloadmic/
	* plugin/libgomp-plugin-intelmic.cpp (GOMP_OFFLOAD_get_property):
	Remove.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@280150 138bc75d-0d04-0410-961f-82ee72b054a4
---
 include/ChangeLog                             |   4 +
 include/gomp-constants.h                      |  15 --
 libgomp/ChangeLog                             |   9 ++
 libgomp/libgomp-plugin.h                      |  36 ++++-
 libgomp/libgomp.h                             |   3 +-
 libgomp/oacc-host.c                           |  47 +++---
 libgomp/oacc-init.c                           |  10 +-
 libgomp/openacc.f90                           |   2 +-
 libgomp/openacc.h                             |   3 +-
 libgomp/plugin/plugin-gcn.c                   |  22 +--
 libgomp/plugin/plugin-hsa.c                   |  26 ----
 libgomp/plugin/plugin-nvptx.c                 | 138 +++++++++---------
 libgomp/target.c                              |   4 +-
 liboffloadmic/ChangeLog                       |   5 +
 .../plugin/libgomp-plugin-intelmic.cpp        |  21 ---
 15 files changed, 163 insertions(+), 182 deletions(-)

diff --git a/include/ChangeLog b/include/ChangeLog
index 0069df3c5c6..8a2feb911cb 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2020-01-10  Thomas Schwinge  <tho...@codesourcery.com>
+
+	* gomp-constants.h (enum gomp_device_property): Remove.
+
 2020-01-01  Jakub Jelinek  <ja...@redhat.com>
 
 	Update copyright years.
diff --git a/include/gomp-constants.h b/include/gomp-constants.h
index 5a7cc2c3f01..1587e4d2ba2 100644
--- a/include/gomp-constants.h
+++ b/include/gomp-constants.h
@@ -199,21 +199,6 @@ enum gomp_map_kind
 #define GOMP_DEVICE_ICV			-1
 #define GOMP_DEVICE_HOST_FALLBACK	-2
 
-/* Device property codes.  Keep in sync with
-   libgomp/{openacc.h,openacc.f90}:acc_device_property_t */
-/* Start from 1 to catch uninitialized use.  */
-enum gomp_device_property
-  {
-   GOMP_DEVICE_PROPERTY_MEMORY =	1,
-   GOMP_DEVICE_PROPERTY_FREE_MEMORY = 	2,
-   GOMP_DEVICE_PROPERTY_NAME =		0x10001,
-   GOMP_DEVICE_PROPERTY_VENDOR =	0x10002,
-   GOMP_DEVICE_PROPERTY_DRIVER =	0x10003
-  };
-
-/* Internal property mask to tell numeric and string values apart.  */
-#define GOMP_DEVICE_PROPERTY_STRING_MASK	0x10000
-
 /* GOMP_task/GOMP_taskloop* flags argument.  */
 #define GOMP_TASK_FLAG_UNTIED		(1 << 0)
 #define GOMP_TASK_FLAG_FINAL		(1 << 1)
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 81d0c164a3a..de286ddac7c 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,5 +1,14 @@
 2020-01-10  Thomas Schwinge  <tho...@codesourcery.com>
 
+	* libgomp-plugin.h (enum goacc_property): New.  Adjust all users
+	to use this instead of 'enum gomp_device_property'.
+	(GOMP_OFFLOAD_get_property): Rename to...
+	(GOMP_OFFLOAD_openacc_get_property): ... this.  Adjust all users.
+	* libgomp.h (struct gomp_device_descr): Move
+	'GOMP_OFFLOAD_openacc_get_property'...
+	(struct acc_dispatch_t): ... here.  Adjust all users.
+	* plugin/plugin-hsa.c (GOMP_OFFLOAD_get_property): Remove.
+
 	* target.c (gomp_map_vars_internal)
 	<GOMP_MAP_USE_DEVICE_PTR_IF_PRESENT>: Clean up/elaborate code
 	paths.
diff --git a/libgomp/libgomp-plugin.h b/libgomp/libgomp-plugin.h
index 2559ce0ea3a..64f138d3821 100644
--- a/libgomp/libgomp-plugin.h
+++ b/libgomp/libgomp-plugin.h
@@ -54,13 +54,6 @@ enum offload_target_type
   OFFLOAD_TARGET_TYPE_GCN = 8
 };
 
-/* Container type for passing device properties.  */
-union gomp_device_property_value
-{
-  const char *ptr;
-  size_t val;
-};
-
 /* Opaque type to represent plugin-dependent implementation of an
    OpenACC asynchronous queue.  */
 struct goacc_asyncqueue;
@@ -75,6 +68,32 @@ struct goacc_asyncqueue_list
 typedef struct goacc_asyncqueue *goacc_aq;
 typedef struct goacc_asyncqueue_list *goacc_aq_list;
 
+
+/* OpenACC 'acc_get_property' support.  */
+
+/* Device property values.  Keep in sync with
+   'libgomp/{openacc.h,openacc.f90}:acc_device_property_t'.  */
+enum goacc_property
+  {
+   /* Mask to tell numeric and string values apart.  */
+#define GOACC_PROPERTY_STRING_MASK 0x10000
+
+   /* Start from 1 to catch uninitialized use.  */
+   GOACC_PROPERTY_MEMORY =		1,
+   GOACC_PROPERTY_FREE_MEMORY =		2,
+   GOACC_PROPERTY_NAME =		GOACC_PROPERTY_STRING_MASK | 1,
+   GOACC_PROPERTY_VENDOR =		GOACC_PROPERTY_STRING_MASK | 2,
+   GOACC_PROPERTY_DRIVER =		GOACC_PROPERTY_STRING_MASK | 3
+  };
+
+/* Container type for passing device properties.  */
+union goacc_property_value
+{
+  const char *ptr;
+  size_t val;
+};
+
+
 /* Auxiliary struct, used for transferring pairs of addresses from plugin
    to libgomp.  */
 struct addr_pair
@@ -101,7 +120,6 @@ extern const char *GOMP_OFFLOAD_get_name (void);
 extern unsigned int GOMP_OFFLOAD_get_caps (void);
 extern int GOMP_OFFLOAD_get_type (void);
 extern int GOMP_OFFLOAD_get_num_devices (void);
-extern union gomp_device_property_value GOMP_OFFLOAD_get_property (int, int);
 extern bool GOMP_OFFLOAD_init_device (int);
 extern bool GOMP_OFFLOAD_fini_device (int);
 extern unsigned GOMP_OFFLOAD_version (void);
@@ -141,6 +159,8 @@ extern void *GOMP_OFFLOAD_openacc_cuda_get_current_context (void);
 extern void *GOMP_OFFLOAD_openacc_cuda_get_stream (struct goacc_asyncqueue *);
 extern int GOMP_OFFLOAD_openacc_cuda_set_stream (struct goacc_asyncqueue *,
 						 void *);
+extern union goacc_property_value
+  GOMP_OFFLOAD_openacc_get_property (int, enum goacc_property);
 
 #ifdef __cplusplus
 }
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index 44703aaae6a..f5415bb156c 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -1068,6 +1068,8 @@ typedef struct acc_dispatch_t
     __typeof (GOMP_OFFLOAD_openacc_async_host2dev) *host2dev_func;
   } async;
 
+  __typeof (GOMP_OFFLOAD_openacc_get_property) *get_property_func;
+
   /* NVIDIA target specific routines.  */
   struct {
     __typeof (GOMP_OFFLOAD_openacc_cuda_get_current_device)
@@ -1113,7 +1115,6 @@ struct gomp_device_descr
   __typeof (GOMP_OFFLOAD_get_caps) *get_caps_func;
   __typeof (GOMP_OFFLOAD_get_type) *get_type_func;
   __typeof (GOMP_OFFLOAD_get_num_devices) *get_num_devices_func;
-  __typeof (GOMP_OFFLOAD_get_property) *get_property_func;
   __typeof (GOMP_OFFLOAD_init_device) *init_device_func;
   __typeof (GOMP_OFFLOAD_fini_device) *fini_device_func;
   __typeof (GOMP_OFFLOAD_version) *version_func;
diff --git a/libgomp/oacc-host.c b/libgomp/oacc-host.c
index 22c18942752..46387897b13 100644
--- a/libgomp/oacc-host.c
+++ b/libgomp/oacc-host.c
@@ -59,27 +59,6 @@ host_get_num_devices (void)
   return 1;
 }
 
-static union gomp_device_property_value
-host_get_property (int n, int prop)
-{
-  union gomp_device_property_value nullval = { .val = 0 };
-
-  if (n >= host_get_num_devices ())
-    return nullval;
-
-  switch (prop)
-    {
-    case GOMP_DEVICE_PROPERTY_NAME:
-      return (union gomp_device_property_value) { .ptr = "GOMP" };
-    case GOMP_DEVICE_PROPERTY_VENDOR:
-      return (union gomp_device_property_value) { .ptr = "GNU" };
-    case GOMP_DEVICE_PROPERTY_DRIVER:
-      return (union gomp_device_property_value) { .ptr = VERSION };
-    default:
-      return nullval;
-    }
-}
-
 static bool
 host_init_device (int n __attribute__ ((unused)))
 {
@@ -245,6 +224,29 @@ host_openacc_async_destruct (struct goacc_asyncqueue *aq
   return true;
 }
 
+static union goacc_property_value
+host_openacc_get_property (int n, enum goacc_property prop)
+{
+  union goacc_property_value nullval = { .val = 0 };
+
+  if (n >= host_get_num_devices ())
+    return nullval;
+
+  switch (prop)
+    {
+    case GOACC_PROPERTY_NAME:
+      return (union goacc_property_value) { .ptr = "GOMP" };
+    case GOACC_PROPERTY_VENDOR:
+      return (union goacc_property_value) { .ptr = "GNU" };
+    case GOACC_PROPERTY_DRIVER:
+      return (union goacc_property_value) { .ptr = VERSION };
+    case GOACC_PROPERTY_MEMORY:
+    case GOACC_PROPERTY_FREE_MEMORY:
+    default:
+      return nullval;
+    }
+}
+
 static void *
 host_openacc_create_thread_data (int ord __attribute__ ((unused)))
 {
@@ -269,7 +271,6 @@ static struct gomp_device_descr host_dispatch =
     .get_caps_func = host_get_caps,
     .get_type_func = host_get_type,
     .get_num_devices_func = host_get_num_devices,
-    .get_property_func = host_get_property,
     .init_device_func = host_init_device,
     .fini_device_func = host_fini_device,
     .version_func = host_version,
@@ -303,6 +304,8 @@ static struct gomp_device_descr host_dispatch =
 	.host2dev_func = host_openacc_async_host2dev,
       },
 
+      .get_property_func = host_openacc_get_property,
+
       .cuda = {
 	.get_current_device_func = NULL,
 	.get_current_context_func = NULL,
diff --git a/libgomp/oacc-init.c b/libgomp/oacc-init.c
index d15f08f7e18..89a30b3e716 100644
--- a/libgomp/oacc-init.c
+++ b/libgomp/oacc-init.c
@@ -760,14 +760,14 @@ acc_set_device_num (int ord, acc_device_t d)
 
 ialias (acc_set_device_num)
 
-static union gomp_device_property_value
+static union goacc_property_value
 get_property_any (int ord, acc_device_t d, acc_device_property_t prop)
 {
   goacc_lazy_initialize ();
   struct goacc_thread *thr = goacc_thread ();
 
   if (d == acc_device_current && thr && thr->dev)
-    return thr->dev->get_property_func (thr->dev->target_id, prop);
+    return thr->dev->openacc.get_property_func (thr->dev->target_id, prop);
 
   gomp_mutex_lock (&acc_device_lock);
 
@@ -789,7 +789,7 @@ get_property_any (int ord, acc_device_t d, acc_device_property_t prop)
 
   assert (dev);
 
-  return dev->get_property_func (dev->target_id, prop);
+  return dev->openacc.get_property_func (dev->target_id, prop);
 }
 
 size_t
@@ -798,7 +798,7 @@ acc_get_property (int ord, acc_device_t d, acc_device_property_t prop)
   if (!known_device_type_p (d))
     unknown_device_type_error(d);
 
-  if (prop & GOMP_DEVICE_PROPERTY_STRING_MASK)
+  if (prop & GOACC_PROPERTY_STRING_MASK)
     return 0;
   else
     return get_property_any (ord, d, prop).val;
@@ -812,7 +812,7 @@ acc_get_property_string (int ord, acc_device_t d, acc_device_property_t prop)
   if (!known_device_type_p (d))
     unknown_device_type_error(d);
 
-  if (prop & GOMP_DEVICE_PROPERTY_STRING_MASK)
+  if (prop & GOACC_PROPERTY_STRING_MASK)
     return get_property_any (ord, d, prop).ptr;
   else
     return NULL;
diff --git a/libgomp/openacc.f90 b/libgomp/openacc.f90
index a3083168a3a..6c92c7c12c9 100644
--- a/libgomp/openacc.f90
+++ b/libgomp/openacc.f90
@@ -53,7 +53,7 @@ module openacc_kinds
 
   integer, parameter :: acc_device_property = c_size_t
 
-  ! Keep in sync with include/gomp-constants.h.
+  ! Keep in sync with 'libgomp/libgomp-plugin.h:goacc_property'.
   integer (acc_device_property), parameter :: acc_property_memory = 1
   integer (acc_device_property), parameter :: acc_property_free_memory = 2
   integer (acc_device_property), parameter :: acc_property_name = int(Z'10001')
diff --git a/libgomp/openacc.h b/libgomp/openacc.h
index 66786d7521f..62b2b0ea559 100644
--- a/libgomp/openacc.h
+++ b/libgomp/openacc.h
@@ -64,8 +64,7 @@ typedef enum acc_device_t {
 } acc_device_t;
 
 typedef enum acc_device_property_t {
-  /* Keep in sync with include/gomp-constants.h.  */
-  /* Start from 1 to catch uninitialized use.  */
+  /* Keep in sync with 'libgomp/libgomp-plugin.h:goacc_property'.  */
   acc_property_memory = 1,
   acc_property_free_memory = 2,
   acc_property_name = 0x10001,
diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c
index b5ca7c1b4bd..16ce251f3a5 100644
--- a/libgomp/plugin/plugin-gcn.c
+++ b/libgomp/plugin/plugin-gcn.c
@@ -3236,17 +3236,6 @@ GOMP_OFFLOAD_get_num_devices (void)
   return hsa_context.agent_count;
 }
 
-union gomp_device_property_value
-GOMP_OFFLOAD_get_property (int device, int prop)
-{
-  /* Stub. Check device and return default value for unsupported properties. */
-  /* TODO: Implement this function. */
-  get_agent_info (device);
-
-  union gomp_device_property_value nullval = { .val = 0 };
-  return nullval;
-}
-
 /* Initialize device (agent) number N so that it can be used for computation.
    Return TRUE on success.  */
 
@@ -3999,6 +3988,17 @@ GOMP_OFFLOAD_openacc_async_dev2host (int device, void *dst, const void *src,
   return true;
 }
 
+union goacc_property_value
+GOMP_OFFLOAD_openacc_get_property (int device, enum goacc_property prop)
+{
+  /* Stub. Check device and return default value for unsupported properties. */
+  /* TODO: Implement this function. */
+  get_agent_info (device);
+
+  union goacc_property_value nullval = { .val = 0 };
+  return nullval;
+}
+
 /* Set up plugin-specific thread-local-data (host-side).  */
 
 void *
diff --git a/libgomp/plugin/plugin-hsa.c b/libgomp/plugin/plugin-hsa.c
index b04923b1920..abd3bc64163 100644
--- a/libgomp/plugin/plugin-hsa.c
+++ b/libgomp/plugin/plugin-hsa.c
@@ -699,32 +699,6 @@ GOMP_OFFLOAD_get_num_devices (void)
   return hsa_context.agent_count;
 }
 
-/* Part of the libgomp plugin interface.  Return the value of property
-   PROP of agent number N.  */
-
-union gomp_device_property_value
-GOMP_OFFLOAD_get_property (int n, int prop)
-{
-  union gomp_device_property_value nullval = { .val = 0 };
-
-  if (!init_hsa_context ())
-    return nullval;
-  if (n >= hsa_context.agent_count)
-    {
-      GOMP_PLUGIN_error
-	("Request for a property of a non-existing HSA device %i", n);
-      return nullval;
-    }
-
-  switch (prop)
-    {
-    case GOMP_DEVICE_PROPERTY_VENDOR:
-      return (union gomp_device_property_value) { .ptr = "HSA" };
-    default:
-      return nullval;
-    }
-}
-
 /* Part of the libgomp plugin interface.  Initialize agent number N so that it
    can be used for computation.  Return TRUE on success.  */
 
diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c
index e867b4cdedb..6033c71a9db 100644
--- a/libgomp/plugin/plugin-nvptx.c
+++ b/libgomp/plugin/plugin-nvptx.c
@@ -1121,74 +1121,6 @@ GOMP_OFFLOAD_get_num_devices (void)
   return nvptx_get_num_devices ();
 }
 
-union gomp_device_property_value
-GOMP_OFFLOAD_get_property (int n, int prop)
-{
-  union gomp_device_property_value propval = { .val = 0 };
-
-  pthread_mutex_lock (&ptx_dev_lock);
-
-  if (n >= nvptx_get_num_devices () || n < 0 || ptx_devices[n] == NULL)
-    {
-      pthread_mutex_unlock (&ptx_dev_lock);
-      return propval;
-    }
-
-  struct ptx_device *ptx_dev = ptx_devices[n];
-  switch (prop)
-    {
-    case GOMP_DEVICE_PROPERTY_MEMORY:
-      {
-	size_t total_mem;
-
-	CUDA_CALL_ERET (propval, cuDeviceTotalMem, &total_mem, ptx_dev->dev);
-	propval.val = total_mem;
-      }
-      break;
-    case GOMP_DEVICE_PROPERTY_FREE_MEMORY:
-      {
-	size_t total_mem;
-	size_t free_mem;
-	CUdevice ctxdev;
-
-	CUDA_CALL_ERET (propval, cuCtxGetDevice, &ctxdev);
-	if (ptx_dev->dev == ctxdev)
-	  CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
-	else if (ptx_dev->ctx)
-	  {
-	    CUcontext old_ctx;
-
-	    CUDA_CALL_ERET (propval, cuCtxPushCurrent, ptx_dev->ctx);
-	    CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
-	    CUDA_CALL_ASSERT (cuCtxPopCurrent, &old_ctx);
-	  }
-	else
-	  {
-	    CUcontext new_ctx;
-
-	    CUDA_CALL_ERET (propval, cuCtxCreate, &new_ctx, CU_CTX_SCHED_AUTO,
-			    ptx_dev->dev);
-	    CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
-	    CUDA_CALL_ASSERT (cuCtxDestroy, new_ctx);
-	  }
-	propval.val = free_mem;
-      }
-      break;
-    case GOMP_DEVICE_PROPERTY_NAME:
-      propval.ptr = ptx_dev->name;
-      break;
-    case GOMP_DEVICE_PROPERTY_VENDOR:
-      propval.ptr = "Nvidia";
-      break;
-    case GOMP_DEVICE_PROPERTY_DRIVER:
-      propval.ptr = cuda_driver_version_s;
-      break;
-    }
-
-  pthread_mutex_unlock (&ptx_dev_lock);
-  return propval;
-}
-
 bool
 GOMP_OFFLOAD_init_device (int n)
 {
@@ -1818,6 +1750,76 @@ GOMP_OFFLOAD_openacc_async_dev2host (int ord, void *dst, const void *src,
   return true;
 }
 
+union goacc_property_value
+GOMP_OFFLOAD_openacc_get_property (int n, enum goacc_property prop)
+{
+  union goacc_property_value propval = { .val = 0 };
+
+  pthread_mutex_lock (&ptx_dev_lock);
+
+  if (n >= nvptx_get_num_devices () || n < 0 || ptx_devices[n] == NULL)
+    {
+      pthread_mutex_unlock (&ptx_dev_lock);
+      return propval;
+    }
+
+  struct ptx_device *ptx_dev = ptx_devices[n];
+  switch (prop)
+    {
+    case GOACC_PROPERTY_MEMORY:
+      {
+	size_t total_mem;
+
+	CUDA_CALL_ERET (propval, cuDeviceTotalMem, &total_mem, ptx_dev->dev);
+	propval.val = total_mem;
+      }
+      break;
+    case GOACC_PROPERTY_FREE_MEMORY:
+      {
+	size_t total_mem;
+	size_t free_mem;
+	CUdevice ctxdev;
+
+	CUDA_CALL_ERET (propval, cuCtxGetDevice, &ctxdev);
+	if (ptx_dev->dev == ctxdev)
+	  CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
+	else if (ptx_dev->ctx)
+	  {
+	    CUcontext old_ctx;
+
+	    CUDA_CALL_ERET (propval, cuCtxPushCurrent, ptx_dev->ctx);
+	    CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
+	    CUDA_CALL_ASSERT (cuCtxPopCurrent, &old_ctx);
+	  }
+	else
+	  {
+	    CUcontext new_ctx;
+
+	    CUDA_CALL_ERET (propval, cuCtxCreate, &new_ctx, CU_CTX_SCHED_AUTO,
+			    ptx_dev->dev);
+	    CUDA_CALL_ERET (propval, cuMemGetInfo, &free_mem, &total_mem);
+	    CUDA_CALL_ASSERT (cuCtxDestroy, new_ctx);
+	  }
+	propval.val = free_mem;
+      }
+      break;
+    case GOACC_PROPERTY_NAME:
+      propval.ptr = ptx_dev->name;
+      break;
+    case GOACC_PROPERTY_VENDOR:
+      propval.ptr = "Nvidia";
+      break;
+    case GOACC_PROPERTY_DRIVER:
+      propval.ptr = cuda_driver_version_s;
+      break;
+    default:
+      break;
+    }
+
+  pthread_mutex_unlock (&ptx_dev_lock);
+  return propval;
+}
+
 /* Adjust launch dimensions: pick good values for number of blocks and warps
    and ensure that number of warps does not exceed CUDA limits as well as GCC's
    own limits.  */
diff --git a/libgomp/target.c b/libgomp/target.c
index 38de1c0cf92..3df007283f4 100644
--- a/libgomp/target.c
+++ b/libgomp/target.c
@@ -3028,7 +3028,6 @@ gomp_load_plugin_for_device (struct gomp_device_descr *device,
   DLSYM (get_caps);
   DLSYM (get_type);
   DLSYM (get_num_devices);
-  DLSYM (get_property);
   DLSYM (init_device);
   DLSYM (fini_device);
   DLSYM (load_image);
@@ -3061,7 +3060,8 @@ gomp_load_plugin_for_device (struct gomp_device_descr *device,
 			 openacc_async_queue_callback)
 	  || !DLSYM_OPT (openacc.async.exec, openacc_async_exec)
 	  || !DLSYM_OPT (openacc.async.dev2host, openacc_async_dev2host)
-	  || !DLSYM_OPT (openacc.async.host2dev, openacc_async_host2dev))
+	  || !DLSYM_OPT (openacc.async.host2dev, openacc_async_host2dev)
+	  || !DLSYM_OPT (openacc.get_property, openacc_get_property))
 	{
 	  /* Require all the OpenACC handlers if we have
 	     GOMP_OFFLOAD_CAP_OPENACC_200.  */
diff --git a/liboffloadmic/ChangeLog b/liboffloadmic/ChangeLog
index b5fae878e9d..eba51003627 100644
--- a/liboffloadmic/ChangeLog
+++ b/liboffloadmic/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-10  Thomas Schwinge  <tho...@codesourcery.com>
+
+	* plugin/libgomp-plugin-intelmic.cpp (GOMP_OFFLOAD_get_property):
+	Remove.
+
 2019-12-22  Maciej W. Rozycki  <ma...@codesourcery.com>
 	    Frederik Harwath  <frede...@codesourcery.com>
 	    Thomas Schwinge  <tschwi...@codesourcery.com>
diff --git a/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp b/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
index 40d97702b87..d1678d0514e 100644
--- a/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
+++ b/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
@@ -174,27 +174,6 @@ GOMP_OFFLOAD_get_num_devices (void)
   return num_devices;
 }
 
-extern "C" union gomp_device_property_value
-GOMP_OFFLOAD_get_property (int n, int prop)
-{
-  union gomp_device_property_value nullval = { .val = 0 };
-
-  if (n >= num_devices)
-    {
-      GOMP_PLUGIN_error
-       ("Request for a property of a non-existing Intel MIC device %i", n);
-      return nullval;
-    }
-
-  switch (prop)
-    {
-    case GOMP_DEVICE_PROPERTY_VENDOR:
-      return (union gomp_device_property_value) { .ptr =  "Intel" };
-    default:
-      return nullval;
-    }
-}
-
 static bool
 offload (const char *file, uint64_t line, int device, const char *name,
 	 int num_vars, VarDesc *vars, const void **async_data)
-- 
2.17.1

Attachment: signature.asc
Description: PGP signature

Reply via email to