diff --git a/openmp/libomptarget/src/device.cpp b/openmp/libomptarget/src/device.cpp --- a/openmp/libomptarget/src/device.cpp +++ b/openmp/libomptarget/src/device.cpp @@ -17,6 +17,7 @@ #include #include +#include #include /// Map between Device ID (i.e. openmp device id) and its DeviceTy. @@ -50,7 +51,12 @@ ShadowPtrMap(), DataMapMtx(), PendingGlobalsMtx(), ShadowMtx(), MemoryManager(nullptr) {} -DeviceTy::~DeviceTy() = default; +DeviceTy::~DeviceTy() { + if (DeviceID == -1 || getInfoLevel() < 1) + return; + + dumpTargetPointerMappings(*this); +} int DeviceTy::associatePtr(void *HstPtrBegin, void *TgtPtrBegin, int64_t Size) { DataMapMtx.lock(); @@ -214,11 +220,13 @@ HT.incRefCount(); uintptr_t tp = HT.TgtPtrBegin + ((uintptr_t)HstPtrBegin - HT.HstPtrBegin); - DP("Mapping exists%s with HstPtrBegin=" DPxMOD ", TgtPtrBegin=" DPxMOD ", " - "Size=%" PRId64 ",%s RefCount=%s\n", (IsImplicit ? " (implicit)" : ""), - DPxPTR(HstPtrBegin), DPxPTR(tp), Size, - (UpdateRefCount ? " updated" : ""), - HT.isRefCountInf() ? "INF" : std::to_string(HT.getRefCount()).c_str()); + INFO(DeviceID, + "Mapping exists%s with HstPtrBegin=" DPxMOD ", TgtPtrBegin=" DPxMOD + ", " + "Size=%" PRId64 ",%s RefCount=%s\n", + (IsImplicit ? " (implicit)" : ""), DPxPTR(HstPtrBegin), DPxPTR(tp), + Size, (UpdateRefCount ? " updated" : ""), + HT.isRefCountInf() ? "INF" : std::to_string(HT.getRefCount()).c_str()); rc = (void *)tp; } else if ((lr.Flags.ExtendsBefore || lr.Flags.ExtendsAfter) && !IsImplicit) { // Explicit extension of mapped data - not allowed. diff --git a/openmp/libomptarget/src/interface.cpp b/openmp/libomptarget/src/interface.cpp --- a/openmp/libomptarget/src/interface.cpp +++ b/openmp/libomptarget/src/interface.cpp @@ -24,21 +24,6 @@ kmp_target_offload_kind_t TargetOffloadPolicy = tgt_default; std::mutex TargetOffloadMtx; -//////////////////////////////////////////////////////////////////////////////// -/// dump a table of all the host-target pointer pairs on failure -static void dumpTargetPointerMappings() { - for (const auto &Device : Devices) { - fprintf(stderr, "Device %d:\n", Device.DeviceID); - fprintf(stderr, "%-18s %-18s %s\n", "Host Ptr", "Target Ptr", "Size (B)"); - for (const auto &HostTargetMap : Device.HostDataToTargetMap) { - fprintf(stderr, DPxMOD " " DPxMOD " %lu\n", - DPxPTR(HostTargetMap.HstPtrBegin), - DPxPTR(HostTargetMap.TgtPtrBegin), - HostTargetMap.HstPtrEnd - HostTargetMap.HstPtrBegin); - } - } -} - //////////////////////////////////////////////////////////////////////////////// /// manage the success or failure of a target construct static void HandleDefaultTargetOffload() { @@ -76,9 +61,11 @@ case tgt_mandatory: if (!success) { if (getInfoLevel() > 1) - dumpTargetPointerMappings(); + for (const auto &Device : Devices) + dumpTargetPointerMappings(Device); else - FAILURE_MESSAGE("run with env LIBOMPTARGET_INFO>1 to dump tables\n"); + FAILURE_MESSAGE("run with env LIBOMPTARGET_INFO>1 to dump host-target" + "pointer maps\n"); FATAL_MESSAGE0(1, "failure of target construct while offloading is mandatory"); } diff --git a/openmp/libomptarget/src/private.h b/openmp/libomptarget/src/private.h --- a/openmp/libomptarget/src/private.h +++ b/openmp/libomptarget/src/private.h @@ -96,4 +96,20 @@ #define TARGET_NAME Libomptarget #define DEBUG_PREFIX GETNAME(TARGET_NAME) +//////////////////////////////////////////////////////////////////////////////// +/// dump a table of all the host-target pointer pairs on failure +static inline void dumpTargetPointerMappings(const DeviceTy &Device) { + if (Device.HostDataToTargetMap.empty()) + return; + + fprintf(stderr, "Device %d Host-Device Pointer Mappings:\n", Device.DeviceID); + fprintf(stderr, "%-18s %-18s %s\n", "Host Ptr", "Target Ptr", "Size (B)"); + for (const auto &HostTargetMap : Device.HostDataToTargetMap) { + fprintf(stderr, DPxMOD " " DPxMOD " %lu\n", + DPxPTR(HostTargetMap.HstPtrBegin), + DPxPTR(HostTargetMap.TgtPtrBegin), + HostTargetMap.HstPtrEnd - HostTargetMap.HstPtrBegin); + } +} + #endif