summaryrefslogtreecommitdiffstats
path: root/openmp/libomptarget/src/interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/libomptarget/src/interface.cpp')
-rw-r--r--openmp/libomptarget/src/interface.cpp77
1 files changed, 73 insertions, 4 deletions
diff --git a/openmp/libomptarget/src/interface.cpp b/openmp/libomptarget/src/interface.cpp
index 0f32f4e0608..a0e152ab3ea 100644
--- a/openmp/libomptarget/src/interface.cpp
+++ b/openmp/libomptarget/src/interface.cpp
@@ -20,6 +20,55 @@
#include <cassert>
#include <cstdlib>
+#include <stdarg.h>
+#include <mutex>
+
+// Store target policy (disabled, mandatory, default)
+kmp_target_offload_kind_t TargetOffloadPolicy = tgt_default;
+std::mutex TargetOffloadMtx;
+
+////////////////////////////////////////////////////////////////////////////////
+/// manage the success or failure of a target constuct
+
+static void HandleDefaultTargetOffload() {
+ TargetOffloadMtx.lock();
+ if (TargetOffloadPolicy == tgt_default) {
+ if (omp_get_num_devices() > 0) {
+ DP("Default TARGET OFFLOAD policy is now mandatory "
+ "(devicew were found)\n");
+ TargetOffloadPolicy = tgt_mandatory;
+ } else {
+ DP("Default TARGET OFFLOAD policy is now disabled "
+ "(devices were not found)\n");
+ TargetOffloadPolicy = tgt_disabled;
+ }
+ }
+ TargetOffloadMtx.unlock();
+}
+
+static int IsOffloadDisabled() {
+ if (TargetOffloadPolicy == tgt_default) HandleDefaultTargetOffload();
+ return TargetOffloadPolicy == tgt_disabled;
+}
+
+static void HandleTargetOutcome(bool success) {
+ switch (TargetOffloadPolicy) {
+ case tgt_disabled:
+ if (success) {
+ FatalMessage(1, "expected no offloading while offloading is disabled");
+ }
+ break;
+ case tgt_default:
+ DP("Should never reach this test with target offload set to default\n");
+ assert(false);
+ break;
+ case tgt_mandatory:
+ if (!success) {
+ FatalMessage(1, "failure of target construct while offloading is mandatory");
+ }
+ break;
+ }
+}
////////////////////////////////////////////////////////////////////////////////
/// adds a target shared library to the target execution image
@@ -38,6 +87,8 @@ EXTERN void __tgt_unregister_lib(__tgt_bin_desc *desc) {
/// and passes the data to the device.
EXTERN void __tgt_target_data_begin(int64_t device_id, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
+ if (IsOffloadDisabled()) return;
+
DP("Entering data begin region for device %" PRId64 " with %d mappings\n",
device_id, arg_num);
@@ -49,6 +100,7 @@ EXTERN void __tgt_target_data_begin(int64_t device_id, int32_t arg_num,
if (CheckDeviceAndCtors(device_id) != OFFLOAD_SUCCESS) {
DP("Failed to get device %" PRId64 " ready\n", device_id);
+ HandleTargetOutcome(false);
return;
}
@@ -62,7 +114,9 @@ EXTERN void __tgt_target_data_begin(int64_t device_id, int32_t arg_num,
}
#endif
- target_data_begin(Device, arg_num, args_base, args, arg_sizes, arg_types);
+ int rc = target_data_begin(Device, arg_num, args_base,
+ args, arg_sizes, arg_types);
+ HandleTargetOutcome(rc == OFFLOAD_SUCCESS);
}
EXTERN void __tgt_target_data_begin_nowait(int64_t device_id, int32_t arg_num,
@@ -81,6 +135,7 @@ EXTERN void __tgt_target_data_begin_nowait(int64_t device_id, int32_t arg_num,
/// created by the last __tgt_target_data_begin.
EXTERN void __tgt_target_data_end(int64_t device_id, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
+ if (IsOffloadDisabled()) return;
DP("Entering data end region with %d mappings\n", arg_num);
// No devices available?
@@ -93,12 +148,14 @@ EXTERN void __tgt_target_data_end(int64_t device_id, int32_t arg_num,
RTLsMtx.unlock();
if (Devices_size <= (size_t)device_id) {
DP("Device ID %" PRId64 " does not have a matching RTL.\n", device_id);
+ HandleTargetOutcome(false);
return;
}
DeviceTy &Device = Devices[device_id];
if (!Device.IsInit) {
DP("Uninit device: ignore");
+ HandleTargetOutcome(false);
return;
}
@@ -110,7 +167,9 @@ EXTERN void __tgt_target_data_end(int64_t device_id, int32_t arg_num,
}
#endif
- target_data_end(Device, arg_num, args_base, args, arg_sizes, arg_types);
+ int rc = target_data_end(Device, arg_num, args_base,
+ args, arg_sizes, arg_types);
+ HandleTargetOutcome(rc == OFFLOAD_SUCCESS);
}
EXTERN void __tgt_target_data_end_nowait(int64_t device_id, int32_t arg_num,
@@ -126,6 +185,7 @@ EXTERN void __tgt_target_data_end_nowait(int64_t device_id, int32_t arg_num,
EXTERN void __tgt_target_data_update(int64_t device_id, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
+ if (IsOffloadDisabled()) return;
DP("Entering data update with %d mappings\n", arg_num);
// No devices available?
@@ -135,11 +195,14 @@ EXTERN void __tgt_target_data_update(int64_t device_id, int32_t arg_num,
if (CheckDeviceAndCtors(device_id) != OFFLOAD_SUCCESS) {
DP("Failed to get device %" PRId64 " ready\n", device_id);
+ HandleTargetOutcome(false);
return;
}
DeviceTy& Device = Devices[device_id];
- target_data_update(Device, arg_num, args_base, args, arg_sizes, arg_types);
+ int rc = target_data_update(Device, arg_num, args_base,
+ args, arg_sizes, arg_types);
+ HandleTargetOutcome(rc == OFFLOAD_SUCCESS);
}
EXTERN void __tgt_target_data_update_nowait(
@@ -155,6 +218,7 @@ EXTERN void __tgt_target_data_update_nowait(
EXTERN int __tgt_target(int64_t device_id, void *host_ptr, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
+ if (IsOffloadDisabled()) return OFFLOAD_FAIL;
DP("Entering target region with entry point " DPxMOD " and device Id %"
PRId64 "\n", DPxPTR(host_ptr), device_id);
@@ -164,6 +228,7 @@ EXTERN int __tgt_target(int64_t device_id, void *host_ptr, int32_t arg_num,
if (CheckDeviceAndCtors(device_id) != OFFLOAD_SUCCESS) {
DP("Failed to get device %" PRId64 " ready\n", device_id);
+ HandleTargetOutcome(false);
return OFFLOAD_FAIL;
}
@@ -177,7 +242,7 @@ EXTERN int __tgt_target(int64_t device_id, void *host_ptr, int32_t arg_num,
int rc = target(device_id, host_ptr, arg_num, args_base, args, arg_sizes,
arg_types, 0, 0, false /*team*/);
-
+ HandleTargetOutcome(rc == OFFLOAD_SUCCESS);
return rc;
}
@@ -195,6 +260,7 @@ EXTERN int __tgt_target_nowait(int64_t device_id, void *host_ptr,
EXTERN int __tgt_target_teams(int64_t device_id, void *host_ptr,
int32_t arg_num, void **args_base, void **args, int64_t *arg_sizes,
int64_t *arg_types, int32_t team_num, int32_t thread_limit) {
+ if (IsOffloadDisabled()) return OFFLOAD_FAIL;
DP("Entering target region with entry point " DPxMOD " and device Id %"
PRId64 "\n", DPxPTR(host_ptr), device_id);
@@ -204,6 +270,7 @@ EXTERN int __tgt_target_teams(int64_t device_id, void *host_ptr,
if (CheckDeviceAndCtors(device_id) != OFFLOAD_SUCCESS) {
DP("Failed to get device %" PRId64 " ready\n", device_id);
+ HandleTargetOutcome(false);
return OFFLOAD_FAIL;
}
@@ -217,6 +284,7 @@ EXTERN int __tgt_target_teams(int64_t device_id, void *host_ptr,
int rc = target(device_id, host_ptr, arg_num, args_base, args, arg_sizes,
arg_types, team_num, thread_limit, true /*team*/);
+ HandleTargetOutcome(rc == OFFLOAD_SUCCESS);
return rc;
}
@@ -242,6 +310,7 @@ EXTERN void __kmpc_push_target_tripcount(int64_t device_id,
if (CheckDeviceAndCtors(device_id) != OFFLOAD_SUCCESS) {
DP("Failed to get device %" PRId64 " ready\n", device_id);
+ HandleTargetOutcome(false);
return;
}
OpenPOWER on IntegriCloud