From eeb6b3b0ee12feb233998b2c8119af2a7c94a63a Mon Sep 17 00:00:00 2001 From: Maosu Zhao Date: Tue, 7 May 2024 14:40:05 +0800 Subject: [PATCH 1/3] [DeviceSanitizer] Remove device global "__AsanDeviceGlobalCount" Now UR already implemented API "urProgramGetGlobalVariablePointer", so we can use it to query the size of device globals. After that, we can remove "__AsanDeviceGlobalCount". --- source/loader/layers/sanitizer/asan_interceptor.cpp | 12 +++++++----- source/loader/layers/sanitizer/asan_libdevice.hpp | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/loader/layers/sanitizer/asan_interceptor.cpp b/source/loader/layers/sanitizer/asan_interceptor.cpp index c55d752410..108ef627eb 100644 --- a/source/loader/layers/sanitizer/asan_interceptor.cpp +++ b/source/loader/layers/sanitizer/asan_interceptor.cpp @@ -522,16 +522,18 @@ SanitizerInterceptor::registerDeviceGlobals(ur_context_handle_t Context, for (auto Device : Devices) { ManagedQueue Queue(Context, Device); - uint64_t NumOfDeviceGlobal; - auto Result = context.urDdiTable.Enqueue.pfnDeviceGlobalVariableRead( - Queue, Program, kSPIR_AsanDeviceGlobalCount, true, - sizeof(NumOfDeviceGlobal), 0, &NumOfDeviceGlobal, 0, nullptr, - nullptr); + [[maybe_unused]] size_t MetadataSize; + [[maybe_unused]] void *MetadataPtr; + auto Result = context.urDdiTable.Program.pfnGetGlobalVariablePointer( + Device, Program, kSPIR_AsanDeviceGlobalMetadata, &MetadataSize, + &MetadataPtr); if (Result != UR_RESULT_SUCCESS) { context.logger.info("No device globals"); continue; } + const uint64_t NumOfDeviceGlobal = + MetadataSize / sizeof(DeviceGlobalInfo); std::vector GVInfos(NumOfDeviceGlobal); Result = context.urDdiTable.Enqueue.pfnDeviceGlobalVariableRead( Queue, Program, kSPIR_AsanDeviceGlobalMetadata, true, diff --git a/source/loader/layers/sanitizer/asan_libdevice.hpp b/source/loader/layers/sanitizer/asan_libdevice.hpp index 46ddee4423..37ab08a55a 100644 --- a/source/loader/layers/sanitizer/asan_libdevice.hpp +++ b/source/loader/layers/sanitizer/asan_libdevice.hpp @@ -93,7 +93,6 @@ constexpr auto kSPIR_AsanShadowMemoryGlobalEnd = "__AsanShadowMemoryGlobalEnd"; constexpr auto kSPIR_DeviceType = "__DeviceType"; constexpr auto kSPIR_AsanDebug = "__AsanDebug"; -constexpr auto kSPIR_AsanDeviceGlobalCount = "__AsanDeviceGlobalCount"; constexpr auto kSPIR_AsanDeviceGlobalMetadata = "__AsanDeviceGlobalMetadata"; inline const char *ToString(DeviceSanitizerMemoryType MemoryType) { From 453b8c211c6cd2b8ef825d7e5ffd11606ea3f676 Mon Sep 17 00:00:00 2001 From: Maosu Zhao Date: Tue, 7 May 2024 17:08:07 +0800 Subject: [PATCH 2/3] Re-use MetadataPtr --- source/loader/layers/sanitizer/asan_interceptor.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/loader/layers/sanitizer/asan_interceptor.cpp b/source/loader/layers/sanitizer/asan_interceptor.cpp index 108ef627eb..acdbc5bb2b 100644 --- a/source/loader/layers/sanitizer/asan_interceptor.cpp +++ b/source/loader/layers/sanitizer/asan_interceptor.cpp @@ -522,8 +522,8 @@ SanitizerInterceptor::registerDeviceGlobals(ur_context_handle_t Context, for (auto Device : Devices) { ManagedQueue Queue(Context, Device); - [[maybe_unused]] size_t MetadataSize; - [[maybe_unused]] void *MetadataPtr; + size_t MetadataSize; + void *MetadataPtr; auto Result = context.urDdiTable.Program.pfnGetGlobalVariablePointer( Device, Program, kSPIR_AsanDeviceGlobalMetadata, &MetadataSize, &MetadataPtr); @@ -535,10 +535,9 @@ SanitizerInterceptor::registerDeviceGlobals(ur_context_handle_t Context, const uint64_t NumOfDeviceGlobal = MetadataSize / sizeof(DeviceGlobalInfo); std::vector GVInfos(NumOfDeviceGlobal); - Result = context.urDdiTable.Enqueue.pfnDeviceGlobalVariableRead( - Queue, Program, kSPIR_AsanDeviceGlobalMetadata, true, - sizeof(DeviceGlobalInfo) * NumOfDeviceGlobal, 0, &GVInfos[0], 0, - nullptr, nullptr); + Result = context.urDdiTable.Enqueue.pfnUSMMemcpy( + Queue, true, &GVInfos[0], MetadataPtr, + sizeof(DeviceGlobalInfo) * NumOfDeviceGlobal, 0, nullptr, nullptr); if (Result != UR_RESULT_SUCCESS) { context.logger.error("Device Global[{}] Read Failed: {}", kSPIR_AsanDeviceGlobalMetadata, Result); From 35044c812797f9b49ff711c9c3bcecb99936030c Mon Sep 17 00:00:00 2001 From: Maosu Zhao Date: Tue, 21 May 2024 15:33:12 +0800 Subject: [PATCH 3/3] Add assert --- source/loader/layers/sanitizer/asan_interceptor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/loader/layers/sanitizer/asan_interceptor.cpp b/source/loader/layers/sanitizer/asan_interceptor.cpp index 655ae06edf..87f36b2865 100644 --- a/source/loader/layers/sanitizer/asan_interceptor.cpp +++ b/source/loader/layers/sanitizer/asan_interceptor.cpp @@ -553,6 +553,8 @@ SanitizerInterceptor::registerDeviceGlobals(ur_context_handle_t Context, const uint64_t NumOfDeviceGlobal = MetadataSize / sizeof(DeviceGlobalInfo); + assert((MetadataSize % sizeof(DeviceGlobalInfo) == 0) && + "DeviceGlobal metadata size is not correct"); std::vector GVInfos(NumOfDeviceGlobal); Result = context.urDdiTable.Enqueue.pfnUSMMemcpy( Queue, true, &GVInfos[0], MetadataPtr,