Properly assign to packet header (PR hsa/70394)
authorMartin Liska <mliska@suse.cz>
Thu, 24 Mar 2016 13:04:12 +0000 (14:04 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 24 Mar 2016 13:04:12 +0000 (13:04 +0000)
* plugin/plugin-hsa.c (packet_store_release): New function
that is taken from the HSA runtime manual.
(GOMP_OFFLOAD_run): Use the function.

From-SVN: r234454

libgomp/ChangeLog
libgomp/plugin/plugin-hsa.c

index cb8c98edabe89f05ec475f70537ea92ef6b48e3f..5f2c401e461297a73f825730e65f701bd3741d34 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-24  Martin Liska  <mliska@suse.cz>
+
+       * plugin/plugin-hsa.c (packet_store_release): New function
+       that is taken from the HSA runtime manual.
+       (GOMP_OFFLOAD_run): Use the function.
+
 2016-03-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/70376
index f7ef6000e1c96bd288b8426aa8bd4af150f6abb3..0b3b67ac01c656610c4f2eb0b151d4646a79470a 100644 (file)
@@ -1185,6 +1185,14 @@ failure:
   return false;
 }
 
+/* Atomically store pair of uint16_t values (HEADER and REST) to a PACKET.  */
+
+void
+packet_store_release (uint32_t* packet, uint16_t header, uint16_t rest)
+{
+  __atomic_store_n (packet, header | (rest << 16), __ATOMIC_RELEASE);
+}
+
 /* Part of the libgomp plugin interface.  Run a kernel on device N and pass it
    an array of pointers in VARS as a parameter.  The kernel is identified by
    FN_PTR which must point to a kernel_info structure.  */
@@ -1232,7 +1240,6 @@ GOMP_OFFLOAD_run (int n, void *fn_ptr, void *vars, void **args)
           + index % agent->command_q->size;
 
   memset (((uint8_t *) packet) + 4, 0, sizeof (*packet) - 4);
-  packet->setup |= (uint16_t) 1 << HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS;
   packet->grid_size_x = kla->gdims[0];
   uint32_t wgs = kla->wdims[0];
   if (wgs == 0)
@@ -1275,7 +1282,9 @@ GOMP_OFFLOAD_run (int n, void *fn_ptr, void *vars, void **args)
 
   HSA_DEBUG ("Going to dispatch kernel %s\n", kernel->name);
 
-  __atomic_store_n ((uint16_t *) (&packet->header), header, __ATOMIC_RELEASE);
+  packet_store_release ((uint32_t *) packet, header,
+                       1 << HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS);
+
   hsa_signal_store_release (agent->command_q->doorbell_signal, index);
 
   /* TODO: GPU agents in Carrizo APUs cannot properly update L2 cache for