9 #ifdef ENABLE_STACK_TRACE
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/Support/Signals.h"
37 SpinLock GlobalHandler::MSyclGlobalHandlerProtector{};
57 LockGuard Guard(GlobalHandler::MSyclGlobalHandlerProtector);
58 GlobalHandler *RTGlobalObjHandler = GlobalHandler::getInstancePtr();
59 if (RTGlobalObjHandler) {
66 static std::atomic_uint MCounter;
69 std::atomic_uint ObjectUsageCounter::MCounter{0};
71 GlobalHandler::GlobalHandler() =
default;
72 GlobalHandler::~GlobalHandler() =
default;
74 void GlobalHandler::InitXPTI() {
75 #ifdef XPTI_ENABLE_INSTRUMENTATION
79 xpti::payload_t SYCLPayload(
"SYCL Runtime Exceptions");
80 uint64_t SYCLInstanceNo;
81 GSYCLCallEvent = xptiMakeEvent(
"SYCL Try-catch Exceptions", &SYCLPayload,
82 xpti::trace_algorithm_event, xpti_at::active,
87 void GlobalHandler::TraceEventXPTI(
const char *Message) {
88 #ifdef XPTI_ENABLE_INSTRUMENTATION
91 if (xptiTraceEnabled()) {
95 auto CodeLocation = Tls.
query();
98 xpti::framework::tracepoint_t TP(
99 CodeLocation.fileName(), CodeLocation.functionName(),
100 CodeLocation.lineNumber(), CodeLocation.columnNumber(),
nullptr);
110 .trace_type(xpti::trace_point_type_t::diagnostics)
111 .notify(
static_cast<const void *
>(Message));
119 return RTGlobalObjHandler;
123 GlobalHandler *RTGlobalObjHandler = GlobalHandler::getInstancePtr();
124 assert(RTGlobalObjHandler &&
"Handler must not be deallocated earlier");
126 #ifdef XPTI_ENABLE_INSTRUMENTATION
127 static std::once_flag InitXPTIFlag;
128 if (xptiTraceEnabled()) {
129 std::call_once(InitXPTIFlag, [&]() { RTGlobalObjHandler->
InitXPTI(); });
132 return *RTGlobalObjHandler;
135 template <
typename T,
typename... Types>
136 T &GlobalHandler::getOrCreate(InstWithLock<T> &IWL, Types... Args) {
140 IWL.Inst = std::make_unique<T>(Args...);
149 prepareSchedulerToRelease();
154 #ifdef ENABLE_STACK_TRACE
155 static std::once_flag PrintStackFlag;
156 std::call_once(PrintStackFlag, []() {
157 llvm::sys::PrintStackTraceOnErrorSignal(llvm::StringRef());
163 getOrCreate(MScheduler);
164 registerSchedulerUsage();
172 return *MScheduler.Inst;
175 void GlobalHandler::registerSchedulerUsage(
bool ModifyCounter) {
180 return getOrCreate(MProgramManager);
183 std::unordered_map<PlatformImplPtr, ContextImplPtr> &
184 GlobalHandler::getPlatformToDefaultContextCache() {
185 return getOrCreate(MPlatformToDefaultContextCache);
188 std::mutex &GlobalHandler::getPlatformToDefaultContextCacheMutex() {
189 return getOrCreate(MPlatformToDefaultContextCacheMutex);
192 Sync &GlobalHandler::getSync() {
return getOrCreate(MSync); }
194 std::vector<PlatformImplPtr> &GlobalHandler::getPlatformCache() {
195 return getOrCreate(MPlatformCache);
198 std::mutex &GlobalHandler::getPlatformMapMutex() {
199 return getOrCreate(MPlatformMapMutex);
202 std::mutex &GlobalHandler::getFilterMutex() {
203 return getOrCreate(MFilterMutex);
205 std::vector<plugin> &GlobalHandler::getPlugins() {
207 return getOrCreate(MPlugins);
210 GlobalHandler::getDeviceFilterList(
const std::string &InitValue) {
211 return getOrCreate(MDeviceFilterList, InitValue);
215 GlobalHandler::getOneapiDeviceSelectorTargets(
const std::string &InitValue) {
216 return getOrCreate(MOneapiDeviceSelectorTargets, InitValue);
220 return getOrCreate(MXPTIRegistry);
225 ThreadPool &TP = getOrCreate(MHostTaskThreadPool, Size);
230 void GlobalHandler::releaseDefaultContexts() {
233 MPlatformToDefaultContextCache.Inst.reset(
nullptr);
244 MPlatformToDefaultContextCache.Inst.release();
250 GlobalHandler::instance().releaseDefaultContexts();
254 void GlobalHandler::registerDefaultContextReleaseHandler() {
260 void GlobalHandler::unloadPlugins() {
265 for (
plugin &Plugin : getPlugins()) {
269 void *PluginParameter =
nullptr;
275 getPlugins().clear();
278 void GlobalHandler::prepareSchedulerToRelease() {
282 MScheduler.Inst->releaseResources();
286 void GlobalHandler::drainThreadPool() {
287 if (MHostTaskThreadPool.Inst)
288 MHostTaskThreadPool.Inst->drain();
304 const LockGuard Lock{GlobalHandler::MSyclGlobalHandlerProtector};
313 if (Handler->MHostTaskThreadPool.Inst)
314 Handler->MHostTaskThreadPool.Inst->finishAndWait();
324 Handler->MPlatformCache.Inst.reset(
nullptr);
325 Handler->MScheduler.Inst.reset(
nullptr);
326 Handler->MProgramManager.Inst.reset(
nullptr);
330 if (Handler->MPlugins.Inst)
331 Handler->MPlugins.Inst.reset(
nullptr);
340 extern "C" __SYCL_EXPORT BOOL WINAPI DllMain(HINSTANCE hinstDLL,
344 static const char *
PiTrace = std::getenv(
"SYCL_PI_TRACE");
346 if (PiTraceValue == -1 || PiTraceValue == 2) {
352 case DLL_PROCESS_DETACH:
354 std::cout <<
"---> DLL_PROCESS_DETACH syclx.dll\n" << std::endl;
356 #ifdef XPTI_ENABLE_INSTRUMENTATION
357 if (xptiTraceEnabled())
364 case DLL_PROCESS_ATTACH:
366 std::cout <<
"---> DLL_PROCESS_ATTACH syclx.dll\n" << std::endl;
367 case DLL_THREAD_ATTACH:
368 case DLL_THREAD_DETACH: