aboutsummaryrefslogtreecommitdiff
path: root/liboffloadmic/plugin
diff options
context:
space:
mode:
authorChung-Lin Tang <cltang@codesourcery.com>2016-05-26 09:58:56 +0000
committerChung-Lin Tang <cltang@gcc.gnu.org>2016-05-26 09:58:56 +0000
commit6ce13072311aaa5194488797f127c2b202d72b25 (patch)
tree1788f7eb15481be06ce674ae4ed2f5734bedeb2c /liboffloadmic/plugin
parent1875b9a02d4e9da706729f73691e32ef8ace858f (diff)
downloadgcc-6ce13072311aaa5194488797f127c2b202d72b25.zip
gcc-6ce13072311aaa5194488797f127c2b202d72b25.tar.gz
gcc-6ce13072311aaa5194488797f127c2b202d72b25.tar.bz2
target.c (gomp_device_copy): New function.
libgomp/ 2016-05-26 Chung-Lin Tang <cltang@codesourcery.com> * target.c (gomp_device_copy): New function. (gomp_copy_host2dev): Likewise. (gomp_copy_dev2host): Likewise. (gomp_free_device_memory): Likewise. (gomp_map_vars_existing): Adjust to call gomp_copy_host2dev. (gomp_map_pointer): Likewise. (gomp_map_vars): Adjust to call gomp_copy_host2dev, handle NULL value from alloc_func plugin hook. (gomp_unmap_tgt): Adjust to call gomp_free_device_memory. (gomp_copy_from_async): Adjust to call gomp_copy_dev2host. (gomp_unmap_vars): Likewise. (gomp_update): Adjust to call gomp_copy_dev2host and gomp_copy_host2dev functions. (gomp_unload_image_from_device): Handle false value from unload_image_func plugin hook. (gomp_init_device): Handle false value from init_device_func plugin hook. (gomp_exit_data): Adjust to call gomp_copy_dev2host. (omp_target_free): Adjust to call gomp_free_device_memory. (omp_target_memcpy): Handle return values from host2dev_func, dev2host_func, and dev2dev_func plugin hooks. (omp_target_memcpy_rect_worker): Likewise. (gomp_target_fini): Handle false value from fini_device_func plugin hook. * libgomp.h (struct gomp_device_descr): Adjust return type of init_device_func, fini_device_func, unload_image_func, free_func, dev2host_func,host2dev_func, and dev2dev_func plugin hooks to 'bool'. * oacc-init.c (acc_shutdown_1): Handle false value from fini_device_func plugin hook. * oacc-host.c (host_init_device): Change return type to bool. (host_fini_device): Likewise. (host_unload_image): Likewise. (host_free): Likewise. (host_dev2host): Likewise. (host_host2dev): Likewise. * oacc-mem.c (acc_free): Handle plugin hook fatal error case. (acc_memcpy_to_device): Likewise. (acc_memcpy_from_device): Likewise. (delete_copyout): Add libfnname parameter, handle free_func hook fatal error case. (acc_delete): Adjust delete_copyout call. (acc_copyout): Likewise. (update_dev_host): Move gomp_mutex_unlock to after host2dev/dev2host hook calls. * plugin/plugin-hsa.c (hsa_warn): Adjust 'hsa_error' local variable to 'hsa_error_msg', for clarity. (hsa_fatal): Likewise. (hsa_error): New function. (init_hsa_context): Change return type to bool, adjust to return false on error. (GOMP_OFFLOAD_get_num_devices): Adjust to handle init_hsa_context return value. (GOMP_OFFLOAD_init_device): Change return type to bool, adjust to return false on error. (get_agent_info): Adjust to return NULL on error. (destroy_hsa_program): Change return type to bool, adjust to return false on error. (GOMP_OFFLOAD_load_image): Adjust to return -1 on error. (destroy_module): Change return type to bool, adjust to return false on error. (GOMP_OFFLOAD_unload_image): Likewise. (GOMP_OFFLOAD_fini_device): Likewise. (GOMP_OFFLOAD_alloc): Change to return NULL when called. (GOMP_OFFLOAD_free): Change to return false when called. (GOMP_OFFLOAD_dev2host): Likewise. (GOMP_OFFLOAD_host2dev): Likewise. (GOMP_OFFLOAD_dev2dev): Likewise. * plugin/plugin-nvptx.c (CUDA_CALL_ERET): New convenience macro. (CUDA_CALL): Likewise. (CUDA_CALL_ASSERT): Likewise. (map_init): Change return type to bool, use CUDA_CALL* macros. (map_fini): Likewise. (init_streams_for_device): Change return type to bool, adjust call to map_init. (fini_streams_for_device): Change return type to bool, adjust call to map_fini. (select_stream_for_async): Release stream_lock before calls to GOMP_PLUGIN_fatal, adjust call to map_init. (nvptx_init): Use CUDA_CALL* macros. (nvptx_attach_host_thread_to_device): Change return type to bool, use CUDA_CALL* macros. (nvptx_open_device): Use CUDA_CALL* macros. (nvptx_close_device): Change return type to bool, use CUDA_CALL* macros. (nvptx_get_num_devices): Use CUDA_CALL* macros. (link_ptx): Change return type to bool, use CUDA_CALL* macros. (nvptx_exec): Use CUDA_CALL* macros. (nvptx_alloc): Use CUDA_CALL* macros. (nvptx_free): Change return type to bool, use CUDA_CALL* macros. (nvptx_host2dev): Likewise. (nvptx_dev2host): Likewise. (nvptx_wait): Use CUDA_CALL* macros. (nvptx_wait_async): Likewise. (nvptx_wait_all): Likewise. (nvptx_wait_all_async): Likewise. (nvptx_set_cuda_stream): Adjust order of stream_lock acquire, use CUDA_CALL* macros, adjust call to map_fini. (GOMP_OFFLOAD_init_device): Change return type to bool, adjust code accordingly. (GOMP_OFFLOAD_fini_device): Likewise. (GOMP_OFFLOAD_load_image): Adjust calls to nvptx_attach_host_thread_to_device/link_ptx to handle errors, use CUDA_CALL* macros. (GOMP_OFFLOAD_unload_image): Change return type to bool, adjust return code. (GOMP_OFFLOAD_alloc): Adjust calls to code to handle error return. (GOMP_OFFLOAD_free): Change return type to bool, adjust calls to handle error return. (GOMP_OFFLOAD_dev2host): Likewise. (GOMP_OFFLOAD_host2dev): Likewise. (GOMP_OFFLOAD_openacc_register_async_cleanup): Use CUDA_CALL* macros. (GOMP_OFFLOAD_openacc_create_thread_data): Likewise. liboffloadmic/ 2016-05-26 Chung-Lin Tang <cltang@codesourcery.com> * plugin/libgomp-plugin-intelmic.cpp (offload): Change return type to bool, adjust return code. (GOMP_OFFLOAD_init_device): Likewise. (GOMP_OFFLOAD_fini_device): Likewise. (get_target_table): Likewise. (offload_image): Likwise. (GOMP_OFFLOAD_load_image): Adjust call to offload_image(), change to return -1 on error. (GOMP_OFFLOAD_unload_image): Change return type to bool, adjust return code. (GOMP_OFFLOAD_alloc): Likewise. (GOMP_OFFLOAD_free): Likewise. (GOMP_OFFLOAD_host2dev): Likewise. (GOMP_OFFLOAD_dev2host): Likewise. (GOMP_OFFLOAD_dev2dev): Likewise. From-SVN: r236768
Diffstat (limited to 'liboffloadmic/plugin')
-rw-r--r--liboffloadmic/plugin/libgomp-plugin-intelmic.cpp121
1 files changed, 70 insertions, 51 deletions
diff --git a/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp b/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
index 57accb4..7983532 100644
--- a/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
+++ b/liboffloadmic/plugin/libgomp-plugin-intelmic.cpp
@@ -205,7 +205,7 @@ GOMP_OFFLOAD_get_num_devices (void)
return num_devices;
}
-static void
+static bool
offload (const char *file, uint64_t line, int device, const char *name,
int num_vars, VarDesc *vars, const void **async_data)
{
@@ -213,20 +213,21 @@ offload (const char *file, uint64_t line, int device, const char *name,
if (ofld)
{
if (async_data == NULL)
- __offload_offload1 (ofld, name, 0, num_vars, vars, NULL, 0, NULL, NULL);
+ return __offload_offload1 (ofld, name, 0, num_vars, vars, NULL, 0,
+ NULL, NULL);
else
{
OffloadFlags flags;
flags.flags = 0;
flags.bits.omp_async = 1;
- __offload_offload3 (ofld, name, 0, num_vars, vars, NULL, 0, NULL,
- async_data, 0, NULL, flags, NULL);
+ return __offload_offload3 (ofld, name, 0, num_vars, vars, NULL, 0,
+ NULL, async_data, 0, NULL, flags, NULL);
}
}
else
{
- fprintf (stderr, "%s:%d: Offload target acquire failed\n", file, line);
- exit (1);
+ GOMP_PLUGIN_error ("%s:%d: Offload target acquire failed\n", file, line);
+ return false;
}
}
@@ -244,25 +245,26 @@ register_main_image ()
/* liboffloadmic loads and runs offload_target_main on all available devices
during a first call to offload (). */
-extern "C" void
+extern "C" bool
GOMP_OFFLOAD_init_device (int device)
{
TRACE ("(device = %d)", device);
pthread_once (&main_image_is_registered, register_main_image);
- offload (__FILE__, __LINE__, device, "__offload_target_init_proc", 0, NULL,
- NULL);
+ return offload (__FILE__, __LINE__, device, "__offload_target_init_proc", 0,
+ NULL, NULL);
}
-extern "C" void
+extern "C" bool
GOMP_OFFLOAD_fini_device (int device)
{
TRACE ("(device = %d)", device);
/* liboffloadmic will finalize target processes on all available devices. */
__offload_unregister_image (&main_target_image);
+ return true;
}
-static void
+static bool
get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
{
VarDesc vd1[2] = { vd_tgt2host, vd_tgt2host };
@@ -271,8 +273,9 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
vd1[1].ptr = &num_vars;
vd1[1].size = sizeof (num_vars);
- offload (__FILE__, __LINE__, device, "__offload_target_table_p1", 2, vd1,
- NULL);
+ if (!offload (__FILE__, __LINE__, device, "__offload_target_table_p1", 2,
+ vd1, NULL))
+ return false;
int table_size = num_funcs + 2 * num_vars;
if (table_size > 0)
@@ -284,15 +287,16 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
vd2.ptr = table;
vd2.size = table_size * sizeof (void *);
- offload (__FILE__, __LINE__, device, "__offload_target_table_p2", 1, &vd2,
- NULL);
+ return offload (__FILE__, __LINE__, device, "__offload_target_table_p2",
+ 1, &vd2, NULL);
}
+ return true;
}
/* Offload TARGET_IMAGE to all available devices and fill address_table with
corresponding target addresses. */
-static void
+static bool
offload_image (const void *target_image)
{
void *image_start = ((void **) target_image)[0];
@@ -306,8 +310,8 @@ offload_image (const void *target_image)
+ image_size);
if (!image)
{
- fprintf (stderr, "%s: Can't allocate memory\n", __FILE__);
- exit (1);
+ GOMP_PLUGIN_error ("%s: Can't allocate memory\n", __FILE__);
+ return false;
}
image->size = image_size;
@@ -322,13 +326,14 @@ offload_image (const void *target_image)
/* Receive tables for target_image from all devices. */
DevAddrVect dev_table;
+ bool ret = true;
for (int dev = 0; dev < num_devices; dev++)
{
int num_funcs = 0;
int num_vars = 0;
void **table = NULL;
- get_target_table (dev, num_funcs, num_vars, table);
+ ret &= get_target_table (dev, num_funcs, num_vars, table);
AddrVect curr_dev_table;
@@ -357,6 +362,7 @@ offload_image (const void *target_image)
address_table->insert (std::make_pair (target_image, dev_table));
image_descriptors->insert (std::make_pair (target_image, image));
+ return ret;
}
/* Return the libgomp version number we're compatible with. There is
@@ -375,22 +381,29 @@ GOMP_OFFLOAD_load_image (int device, const unsigned version,
TRACE ("(device = %d, target_image = %p)", device, target_image);
if (GOMP_VERSION_DEV (version) > GOMP_VERSION_INTEL_MIC)
- GOMP_PLUGIN_fatal ("Offload data incompatible with intelmic plugin"
- " (expected %u, received %u)",
- GOMP_VERSION_INTEL_MIC, GOMP_VERSION_DEV (version));
+ {
+ GOMP_PLUGIN_error ("Offload data incompatible with intelmic plugin"
+ " (expected %u, received %u)",
+ GOMP_VERSION_INTEL_MIC, GOMP_VERSION_DEV (version));
+ return -1;
+ }
/* If target_image is already present in address_table, then there is no need
to offload it. */
if (address_table->count (target_image) == 0)
- offload_image (target_image);
+ {
+ /* If fail, return -1 as error code. */
+ if (!offload_image (target_image))
+ return -1;
+ }
AddrVect *curr_dev_table = &(*address_table)[target_image][device];
int table_size = curr_dev_table->size ();
addr_pair *table = (addr_pair *) malloc (table_size * sizeof (addr_pair));
if (table == NULL)
{
- fprintf (stderr, "%s: Can't allocate memory\n", __FILE__);
- exit (1);
+ GOMP_PLUGIN_error ("%s: Can't allocate memory\n", __FILE__);
+ return -1;
}
std::copy (curr_dev_table->begin (), curr_dev_table->end (), table);
@@ -398,12 +411,17 @@ GOMP_OFFLOAD_load_image (int device, const unsigned version,
return table_size;
}
-extern "C" void
+extern "C" bool
GOMP_OFFLOAD_unload_image (int device, unsigned version,
const void *target_image)
{
if (GOMP_VERSION_DEV (version) > GOMP_VERSION_INTEL_MIC)
- return;
+ {
+ GOMP_PLUGIN_error ("Offload data incompatible with intelmic plugin"
+ " (expected %u, received %u)",
+ GOMP_VERSION_INTEL_MIC, GOMP_VERSION_DEV (version));
+ return false;
+ }
TRACE ("(device = %d, target_image = %p)", device, target_image);
@@ -417,6 +435,7 @@ GOMP_OFFLOAD_unload_image (int device, unsigned version,
address_table->erase (target_image);
image_descriptors->erase (target_image);
}
+ return true;
}
extern "C" void *
@@ -431,12 +450,14 @@ GOMP_OFFLOAD_alloc (int device, size_t size)
vd[1].ptr = &tgt_ptr;
vd[1].size = sizeof (void *);
- offload (__FILE__, __LINE__, device, "__offload_target_alloc", 2, vd, NULL);
+ if (!offload (__FILE__, __LINE__, device, "__offload_target_alloc", 2,
+ vd, NULL))
+ return NULL;
return tgt_ptr;
}
-extern "C" void
+extern "C" bool
GOMP_OFFLOAD_free (int device, void *tgt_ptr)
{
TRACE ("(device = %d, tgt_ptr = %p)", device, tgt_ptr);
@@ -445,17 +466,18 @@ GOMP_OFFLOAD_free (int device, void *tgt_ptr)
vd.ptr = &tgt_ptr;
vd.size = sizeof (void *);
- offload (__FILE__, __LINE__, device, "__offload_target_free", 1, &vd, NULL);
+ return offload (__FILE__, __LINE__, device, "__offload_target_free", 1,
+ &vd, NULL);
}
-extern "C" void *
+extern "C" bool
GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr,
size_t size)
{
TRACE ("(device = %d, tgt_ptr = %p, host_ptr = %p, size = %d)",
device, tgt_ptr, host_ptr, size);
if (!size)
- return tgt_ptr;
+ return true;
VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &tgt_ptr;
@@ -463,27 +485,26 @@ GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr,
vd1[1].ptr = &size;
vd1[1].size = sizeof (size);
- offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p1", 2, vd1,
- NULL);
+ if (!offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p1", 2,
+ vd1, NULL))
+ return false;
VarDesc vd2 = vd_host2tgt;
vd2.ptr = (void *) host_ptr;
vd2.size = size;
- offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p2", 1, &vd2,
- NULL);
-
- return tgt_ptr;
+ return offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p2", 1,
+ &vd2, NULL);
}
-extern "C" void *
+extern "C" bool
GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr,
size_t size)
{
TRACE ("(device = %d, host_ptr = %p, tgt_ptr = %p, size = %d)",
device, host_ptr, tgt_ptr, size);
if (!size)
- return host_ptr;
+ return true;
VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &tgt_ptr;
@@ -491,27 +512,26 @@ GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr,
vd1[1].ptr = &size;
vd1[1].size = sizeof (size);
- offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p1", 2, vd1,
- NULL);
+ if (!offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p1", 2,
+ vd1, NULL))
+ return false;
VarDesc vd2 = vd_tgt2host;
vd2.ptr = (void *) host_ptr;
vd2.size = size;
- offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p2", 1, &vd2,
- NULL);
-
- return host_ptr;
+ return offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p2", 1,
+ &vd2, NULL);
}
-extern "C" void *
+extern "C" bool
GOMP_OFFLOAD_dev2dev (int device, void *dst_ptr, const void *src_ptr,
size_t size)
{
TRACE ("(device = %d, dst_ptr = %p, src_ptr = %p, size = %d)",
device, dst_ptr, src_ptr, size);
if (!size)
- return dst_ptr;
+ return true;
VarDesc vd[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt };
vd[0].ptr = &dst_ptr;
@@ -521,9 +541,8 @@ GOMP_OFFLOAD_dev2dev (int device, void *dst_ptr, const void *src_ptr,
vd[2].ptr = &size;
vd[2].size = sizeof (size);
- offload (__FILE__, __LINE__, device, "__offload_target_tgt2tgt", 3, vd, NULL);
-
- return dst_ptr;
+ return offload (__FILE__, __LINE__, device, "__offload_target_tgt2tgt", 3,
+ vd, NULL);
}
extern "C" void