diff options
author | Kwok Cheung Yeung <kcy@codesourcery.com> | 2020-10-20 04:15:59 -0700 |
---|---|---|
committer | Kwok Cheung Yeung <kcy@codesourcery.com> | 2020-10-20 04:16:26 -0700 |
commit | 1bfc07d150790fae93184a79a7cce897655cb37b (patch) | |
tree | 6e596730698b9ed4a72930de00b3ed632e124436 /libgomp/target.c | |
parent | 94fd05f1f76faca9dc9033b55d44c960155d38e9 (diff) | |
download | gcc-1bfc07d150790fae93184a79a7cce897655cb37b.zip gcc-1bfc07d150790fae93184a79a7cce897655cb37b.tar.gz gcc-1bfc07d150790fae93184a79a7cce897655cb37b.tar.bz2 |
openmp: Implement support for OMP_TARGET_OFFLOAD environment variable
This implements support for the OMP_TARGET_OFFLOAD environment variable
introduced in the OpenMP 5.0 standard, which controls how offloading
is handled. It may be set to MANDATORY (abort if offloading cannot be
performed), DISABLED (no offloading to devices) or DEFAULT (offload to
device if possible, fall back to host if not).
2020-10-20 Kwok Cheung Yeung <kcy@codesourcery.com>
libgomp/
* env.c (gomp_target_offload_var): New.
(parse_target_offload): New.
(handle_omp_display_env): Print value of OMP_TARGET_OFFLOAD.
(initialize_env): Parse OMP_TARGET_OFFLOAD.
* libgomp.h (gomp_target_offload_t): New.
(gomp_target_offload_var): New.
* libgomp.texi (OMP_TARGET_OFFLOAD): New section.
* target.c (resolve_device): Generate error if device not found and
offloading is mandatory.
(gomp_target_fallback): Generate error if offloading is mandatory.
(GOMP_target): Add argument in call to gomp_target_fallback.
(GOMP_target_ext): Likewise.
(gomp_target_data_fallback): Generate error if offloading is mandatory.
(GOMP_target_data): Add argument in call to gomp_target_data_fallback.
(GOMP_target_data_ext): Likewise.
(gomp_target_task_fn): Add argument in call to gomp_target_fallback.
(gomp_target_init): Return early if offloading is disabled.
Diffstat (limited to 'libgomp/target.c')
-rw-r--r-- | libgomp/target.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/libgomp/target.c b/libgomp/target.c index ab7ac9b..bb643b3 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -116,7 +116,14 @@ resolve_device (int device_id) } if (device_id < 0 || device_id >= gomp_get_num_devices ()) - return NULL; + { + if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_MANDATORY + && device_id != GOMP_DEVICE_HOST_FALLBACK) + gomp_fatal ("OMP_TARGET_OFFLOAD is set to MANDATORY, " + "but device not found"); + + return NULL; + } gomp_mutex_lock (&devices[device_id].lock); if (devices[device_id].state == GOMP_DEVICE_UNINITIALIZED) @@ -124,6 +131,12 @@ resolve_device (int device_id) else if (devices[device_id].state == GOMP_DEVICE_FINALIZED) { gomp_mutex_unlock (&devices[device_id].lock); + + if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_MANDATORY + && device_id != GOMP_DEVICE_HOST_FALLBACK) + gomp_fatal ("OMP_TARGET_OFFLOAD is set to MANDATORY, " + "but device is finalized"); + return NULL; } gomp_mutex_unlock (&devices[device_id].lock); @@ -1997,9 +2010,16 @@ gomp_unload_device (struct gomp_device_descr *devicep) /* Host fallback for GOMP_target{,_ext} routines. */ static void -gomp_target_fallback (void (*fn) (void *), void **hostaddrs) +gomp_target_fallback (void (*fn) (void *), void **hostaddrs, + struct gomp_device_descr *devicep) { struct gomp_thread old_thr, *thr = gomp_thread (); + + if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_MANDATORY + && devicep != NULL) + gomp_fatal ("OMP_TARGET_OFFLOAD is set to MANDATORY, but device cannot " + "be used for offloading"); + old_thr = *thr; memset (thr, '\0', sizeof (*thr)); if (gomp_places_list) @@ -2107,7 +2127,7 @@ GOMP_target (int device, void (*fn) (void *), const void *unused, /* All shared memory devices should use the GOMP_target_ext function. */ || devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM || !(fn_addr = gomp_get_target_fn_addr (devicep, fn))) - return gomp_target_fallback (fn, hostaddrs); + return gomp_target_fallback (fn, hostaddrs, devicep); struct target_mem_desc *tgt_vars = gomp_map_vars (devicep, mapnum, hostaddrs, NULL, sizes, kinds, false, @@ -2243,7 +2263,7 @@ GOMP_target_ext (int device, void (*fn) (void *), size_t mapnum, tgt_align, tgt_size); } } - gomp_target_fallback (fn, hostaddrs); + gomp_target_fallback (fn, hostaddrs, devicep); return; } @@ -2276,9 +2296,15 @@ GOMP_target_ext (int device, void (*fn) (void *), size_t mapnum, /* Host fallback for GOMP_target_data{,_ext} routines. */ static void -gomp_target_data_fallback (void) +gomp_target_data_fallback (struct gomp_device_descr *devicep) { struct gomp_task_icv *icv = gomp_icv (false); + + if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_MANDATORY + && devicep != NULL) + gomp_fatal ("OMP_TARGET_OFFLOAD is set to MANDATORY, but device cannot " + "be used for offloading"); + if (icv->target_data) { /* Even when doing a host fallback, if there are any active @@ -2302,7 +2328,7 @@ GOMP_target_data (int device, const void *unused, size_t mapnum, if (devicep == NULL || !(devicep->capabilities & GOMP_OFFLOAD_CAP_OPENMP_400) || (devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)) - return gomp_target_data_fallback (); + return gomp_target_data_fallback (devicep); struct target_mem_desc *tgt = gomp_map_vars (devicep, mapnum, hostaddrs, NULL, sizes, kinds, false, @@ -2321,7 +2347,7 @@ GOMP_target_data_ext (int device, size_t mapnum, void **hostaddrs, if (devicep == NULL || !(devicep->capabilities & GOMP_OFFLOAD_CAP_OPENMP_400) || devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) - return gomp_target_data_fallback (); + return gomp_target_data_fallback (devicep); struct target_mem_desc *tgt = gomp_map_vars (devicep, mapnum, hostaddrs, NULL, sizes, kinds, true, @@ -2617,7 +2643,7 @@ gomp_target_task_fn (void *data) || (devicep->can_run_func && !devicep->can_run_func (fn_addr))) { ttask->state = GOMP_TARGET_TASK_FALLBACK; - gomp_target_fallback (ttask->fn, ttask->hostaddrs); + gomp_target_fallback (ttask->fn, ttask->hostaddrs, devicep); return false; } @@ -3258,6 +3284,9 @@ gomp_target_init (void) num_devices = 0; devices = NULL; + if (gomp_target_offload_var == GOMP_TARGET_OFFLOAD_DISABLED) + return; + cur = OFFLOAD_PLUGINS; if (*cur) do |