summaryrefslogtreecommitdiffstats
path: root/openmp/libomptarget/src/omptarget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/libomptarget/src/omptarget.cpp')
-rw-r--r--openmp/libomptarget/src/omptarget.cpp142
1 files changed, 85 insertions, 57 deletions
diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp
index 3cc09b45785..d522c72abc2 100644
--- a/openmp/libomptarget/src/omptarget.cpp
+++ b/openmp/libomptarget/src/omptarget.cpp
@@ -20,11 +20,31 @@
#include <cassert>
#include <vector>
+#include <mutex>
#ifdef OMPTARGET_DEBUG
int DebugLevel = 0;
#endif // OMPTARGET_DEBUG
+////////////////////////////////////////////////////////////////////////////////
+/// support for fatal messages
+
+// mutex
+std::mutex LibomptargetPrintMtx;
+
+void FatalMessage(const int errorNum, const char *fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ LibomptargetPrintMtx.lock();
+ fprintf(stderr, "Libomptarget error %d:", errorNum);
+ vfprintf(stderr, fmt, args);
+ fprintf(stderr, "\n");
+ LibomptargetPrintMtx.unlock();
+ va_end(args);
+ exit(1);
+}
+
+
/* All begin addresses for partially mapped structs must be 8-aligned in order
* to ensure proper alignment of members. E.g.
*
@@ -212,7 +232,6 @@ static int32_t member_of(int64_t type) {
int target_data_begin(DeviceTy &Device, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
// process each input.
- int rc = OFFLOAD_SUCCESS;
for (int32_t i = 0; i < arg_num; ++i) {
// Ignore private variables and arrays - there is no mapping for them.
if ((arg_types[i] & OMP_TGT_MAPTYPE_LITERAL) ||
@@ -257,6 +276,7 @@ int target_data_begin(DeviceTy &Device, int32_t arg_num,
if (!Pointer_TgtPtrBegin) {
DP("Call to getOrAllocTgtPtr returned null pointer (device failure or "
"illegal mapping).\n");
+ return OFFLOAD_FAIL;
}
DP("There are %zu bytes allocated at target address " DPxMOD " - is%s new"
"\n", sizeof(void *), DPxPTR(Pointer_TgtPtrBegin),
@@ -306,7 +326,7 @@ int target_data_begin(DeviceTy &Device, int32_t arg_num,
int rt = Device.data_submit(TgtPtrBegin, HstPtrBegin, data_size);
if (rt != OFFLOAD_SUCCESS) {
DP("Copying data to device failed.\n");
- rc = OFFLOAD_FAIL;
+ return OFFLOAD_FAIL;
}
}
}
@@ -320,7 +340,7 @@ int target_data_begin(DeviceTy &Device, int32_t arg_num,
sizeof(void *));
if (rt != OFFLOAD_SUCCESS) {
DP("Copying data to device failed.\n");
- rc = OFFLOAD_FAIL;
+ return OFFLOAD_FAIL;
}
// create shadow pointers for this entry
Device.ShadowMtx.lock();
@@ -330,13 +350,12 @@ int target_data_begin(DeviceTy &Device, int32_t arg_num,
}
}
- return rc;
+ return OFFLOAD_SUCCESS;
}
/// Internal function to undo the mapping and retrieve the data from the device.
int target_data_end(DeviceTy &Device, int32_t arg_num, void **args_base,
void **args, int64_t *arg_sizes, int64_t *arg_types) {
- int rc = OFFLOAD_SUCCESS;
// process each input.
for (int32_t i = arg_num - 1; i >= 0; --i) {
// Ignore private variables and arrays - there is no mapping for them.
@@ -404,7 +423,7 @@ int target_data_end(DeviceTy &Device, int32_t arg_num, void **args_base,
int rt = Device.data_retrieve(HstPtrBegin, TgtPtrBegin, data_size);
if (rt != OFFLOAD_SUCCESS) {
DP("Copying data from device failed.\n");
- rc = OFFLOAD_FAIL;
+ return OFFLOAD_FAIL;
}
}
}
@@ -447,17 +466,17 @@ int target_data_end(DeviceTy &Device, int32_t arg_num, void **args_base,
int rt = Device.deallocTgtPtr(HstPtrBegin, data_size, ForceDelete);
if (rt != OFFLOAD_SUCCESS) {
DP("Deallocating data from device failed.\n");
- rc = OFFLOAD_FAIL;
+ return OFFLOAD_FAIL;
}
}
}
}
- return rc;
+ return OFFLOAD_SUCCESS;
}
/// Internal function to pass data to/from the target.
-void target_data_update(DeviceTy &Device, int32_t arg_num,
+int target_data_update(DeviceTy &Device, int32_t arg_num,
void **args_base, void **args, int64_t *arg_sizes, int64_t *arg_types) {
// process each input.
for (int32_t i = 0; i < arg_num; ++i) {
@@ -470,11 +489,19 @@ void target_data_update(DeviceTy &Device, int32_t arg_num,
bool IsLast;
void *TgtPtrBegin = Device.getTgtPtrBegin(HstPtrBegin, MapSize, IsLast,
false);
+ if (!TgtPtrBegin) {
+ DP("hst data:" DPxMOD " not found, becomes a noop\n", DPxPTR(HstPtrBegin));
+ continue;
+ }
if (arg_types[i] & OMP_TGT_MAPTYPE_FROM) {
DP("Moving %" PRId64 " bytes (tgt:" DPxMOD ") -> (hst:" DPxMOD ")\n",
arg_sizes[i], DPxPTR(TgtPtrBegin), DPxPTR(HstPtrBegin));
- Device.data_retrieve(HstPtrBegin, TgtPtrBegin, MapSize);
+ int rt = Device.data_retrieve(HstPtrBegin, TgtPtrBegin, MapSize);
+ if (rt != OFFLOAD_SUCCESS) {
+ DP("Copying data from device failed.\n");
+ return OFFLOAD_FAIL;
+ }
uintptr_t lb = (uintptr_t) HstPtrBegin;
uintptr_t ub = (uintptr_t) HstPtrBegin + MapSize;
@@ -497,8 +524,11 @@ void target_data_update(DeviceTy &Device, int32_t arg_num,
if (arg_types[i] & OMP_TGT_MAPTYPE_TO) {
DP("Moving %" PRId64 " bytes (hst:" DPxMOD ") -> (tgt:" DPxMOD ")\n",
arg_sizes[i], DPxPTR(HstPtrBegin), DPxPTR(TgtPtrBegin));
- Device.data_submit(TgtPtrBegin, HstPtrBegin, MapSize);
-
+ int rt = Device.data_submit(TgtPtrBegin, HstPtrBegin, MapSize);
+ if (rt != OFFLOAD_SUCCESS) {
+ DP("Copying data to device failed.\n");
+ return OFFLOAD_FAIL;
+ }
uintptr_t lb = (uintptr_t) HstPtrBegin;
uintptr_t ub = (uintptr_t) HstPtrBegin + MapSize;
Device.ShadowMtx.lock();
@@ -512,12 +542,18 @@ void target_data_update(DeviceTy &Device, int32_t arg_num,
DP("Restoring original target pointer value " DPxMOD " for target "
"pointer " DPxMOD "\n", DPxPTR(it->second.TgtPtrVal),
DPxPTR(it->second.TgtPtrAddr));
- Device.data_submit(it->second.TgtPtrAddr,
+ rt = Device.data_submit(it->second.TgtPtrAddr,
&it->second.TgtPtrVal, sizeof(void *));
+ if (rt != OFFLOAD_SUCCESS) {
+ DP("Copying data to device failed.\n");
+ Device.ShadowMtx.unlock();
+ return OFFLOAD_FAIL;
+ }
}
Device.ShadowMtx.unlock();
}
}
+ return OFFLOAD_SUCCESS;
}
/// performs the same actions as data_begin in case arg_num is
@@ -585,12 +621,8 @@ int target(int64_t device_id, void *host_ptr, int32_t arg_num,
// Move data to device.
int rc = target_data_begin(Device, arg_num, args_base, args, arg_sizes,
arg_types);
-
if (rc != OFFLOAD_SUCCESS) {
- DP("Call to target_data_begin failed, skipping target execution.\n");
- // Call target_data_end to dealloc whatever target_data_begin allocated
- // and return OFFLOAD_FAIL.
- target_data_end(Device, arg_num, args_base, args, arg_sizes, arg_types);
+ DP("Call to target_data_begin failed, abort target.\n");
return OFFLOAD_FAIL;
}
@@ -620,30 +652,28 @@ int target(int64_t device_id, void *host_ptr, int32_t arg_num,
TgtPtrBegin = Device.RTL->data_alloc(Device.RTLDeviceID,
arg_sizes[i], HstPtrBegin);
if (!TgtPtrBegin) {
- DP ("Data allocation for %sprivate array " DPxMOD " failed\n",
+ DP ("Data allocation for %sprivate array " DPxMOD " failed, "
+ "abort target.\n",
(arg_types[i] & OMP_TGT_MAPTYPE_TO ? "first-" : ""),
DPxPTR(HstPtrBegin));
- rc = OFFLOAD_FAIL;
- break;
- } else {
- fpArrays.push_back(TgtPtrBegin);
- TgtBaseOffset = (intptr_t)HstPtrBase - (intptr_t)HstPtrBegin;
+ return OFFLOAD_FAIL;
+ }
+ fpArrays.push_back(TgtPtrBegin);
+ TgtBaseOffset = (intptr_t)HstPtrBase - (intptr_t)HstPtrBegin;
#ifdef OMPTARGET_DEBUG
- void *TgtPtrBase = (void *)((intptr_t)TgtPtrBegin + TgtBaseOffset);
- DP("Allocated %" PRId64 " bytes of target memory at " DPxMOD " for "
- "%sprivate array " DPxMOD " - pushing target argument " DPxMOD "\n",
- arg_sizes[i], DPxPTR(TgtPtrBegin),
- (arg_types[i] & OMP_TGT_MAPTYPE_TO ? "first-" : ""),
- DPxPTR(HstPtrBegin), DPxPTR(TgtPtrBase));
+ void *TgtPtrBase = (void *)((intptr_t)TgtPtrBegin + TgtBaseOffset);
+ DP("Allocated %" PRId64 " bytes of target memory at " DPxMOD " for "
+ "%sprivate array " DPxMOD " - pushing target argument " DPxMOD "\n",
+ arg_sizes[i], DPxPTR(TgtPtrBegin),
+ (arg_types[i] & OMP_TGT_MAPTYPE_TO ? "first-" : ""),
+ DPxPTR(HstPtrBegin), DPxPTR(TgtPtrBase));
#endif
- // If first-private, copy data from host
- if (arg_types[i] & OMP_TGT_MAPTYPE_TO) {
- int rt = Device.data_submit(TgtPtrBegin, HstPtrBegin, arg_sizes[i]);
- if (rt != OFFLOAD_SUCCESS) {
- DP ("Copying data to device failed.\n");
- rc = OFFLOAD_FAIL;
- break;
- }
+ // If first-private, copy data from host
+ if (arg_types[i] & OMP_TGT_MAPTYPE_TO) {
+ int rt = Device.data_submit(TgtPtrBegin, HstPtrBegin, arg_sizes[i]);
+ if (rt != OFFLOAD_SUCCESS) {
+ DP ("Copying data to device failed, failed.\n");
+ return OFFLOAD_FAIL;
}
}
} else if (arg_types[i] & OMP_TGT_MAPTYPE_PTR_AND_OBJ) {
@@ -675,21 +705,20 @@ int target(int64_t device_id, void *host_ptr, int32_t arg_num,
Device.loopTripCnt = 0;
// Launch device execution.
- if (rc == OFFLOAD_SUCCESS) {
- DP("Launching target execution %s with pointer " DPxMOD " (index=%d).\n",
- TargetTable->EntriesBegin[TM->Index].name,
- DPxPTR(TargetTable->EntriesBegin[TM->Index].addr), TM->Index);
- if (IsTeamConstruct) {
- rc = Device.run_team_region(TargetTable->EntriesBegin[TM->Index].addr,
- &tgt_args[0], &tgt_offsets[0], tgt_args.size(), team_num,
- thread_limit, ltc);
- } else {
- rc = Device.run_region(TargetTable->EntriesBegin[TM->Index].addr,
- &tgt_args[0], &tgt_offsets[0], tgt_args.size());
- }
+ DP("Launching target execution %s with pointer " DPxMOD " (index=%d).\n",
+ TargetTable->EntriesBegin[TM->Index].name,
+ DPxPTR(TargetTable->EntriesBegin[TM->Index].addr), TM->Index);
+ if (IsTeamConstruct) {
+ rc = Device.run_team_region(TargetTable->EntriesBegin[TM->Index].addr,
+ &tgt_args[0], &tgt_offsets[0], tgt_args.size(), team_num,
+ thread_limit, ltc);
} else {
- DP("Errors occurred while obtaining target arguments, skipping kernel "
- "execution\n");
+ rc = Device.run_region(TargetTable->EntriesBegin[TM->Index].addr,
+ &tgt_args[0], &tgt_offsets[0], tgt_args.size());
+ }
+ if (rc != OFFLOAD_SUCCESS) {
+ DP ("Executing target region abort target.\n");
+ return OFFLOAD_FAIL;
}
// Deallocate (first-)private arrays
@@ -697,18 +726,17 @@ int target(int64_t device_id, void *host_ptr, int32_t arg_num,
int rt = Device.RTL->data_delete(Device.RTLDeviceID, it);
if (rt != OFFLOAD_SUCCESS) {
DP("Deallocation of (first-)private arrays failed.\n");
- rc = OFFLOAD_FAIL;
+ return OFFLOAD_FAIL;
}
}
// Move data from device.
int rt = target_data_end(Device, arg_num, args_base, args, arg_sizes,
arg_types);
-
if (rt != OFFLOAD_SUCCESS) {
- DP("Call to target_data_end failed.\n");
- rc = OFFLOAD_FAIL;
+ DP("Call to target_data_end failed, abort targe.\n");
+ return OFFLOAD_FAIL;
}
- return rc;
+ return OFFLOAD_SUCCESS;
}
OpenPOWER on IntegriCloud