diff options
author | Chung-Lin Tang <cltang@codesourcery.com> | 2016-05-26 09:58:56 +0000 |
---|---|---|
committer | Chung-Lin Tang <cltang@gcc.gnu.org> | 2016-05-26 09:58:56 +0000 |
commit | 6ce13072311aaa5194488797f127c2b202d72b25 (patch) | |
tree | 1788f7eb15481be06ce674ae4ed2f5734bedeb2c /liboffloadmic/plugin | |
parent | 1875b9a02d4e9da706729f73691e32ef8ace858f (diff) | |
download | gcc-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.cpp | 121 |
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 |