| //===----------- rtl.cpp - Target independent OpenMP target RTL -----------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Initialization and tear down of the offload runtime. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "OpenMP/OMPT/Callback.h" | |
| #include "PluginManager.h" | |
| #include "Shared/Debug.h" | |
| #include "Shared/Profile.h" | |
| using namespace llvm::omp::target::debug; | |
| static std::mutex PluginMtx; | |
| static uint32_t RefCount = 0; | |
| std::atomic<bool> RTLAlive{false}; | |
| std::atomic<int> RTLOngoingSyncs{0}; | |
| /// Check deleted and deprecated features, such as environment variables. | |
| static void checkRuntimeEnvironment() { | |
| const char *ShmemEnvarName = "LIBOMPTARGET_SHARED_MEMORY_SIZE"; | |
| if (std::getenv(ShmemEnvarName)) | |
| MESSAGE("Warning: %s is no longer valid. Please use OpenMP clause " | |
| "'dyn_groupprivate' instead.\n", | |
| ShmemEnvarName); | |
| } | |
| void initRuntime() { | |
| std::scoped_lock<decltype(PluginMtx)> Lock(PluginMtx); | |
| Profiler::get(); | |
| TIMESCOPE(); | |
| checkRuntimeEnvironment(); | |
| if (PM == nullptr) | |
| PM = new PluginManager(); | |
| RefCount++; | |
| if (RefCount == 1) { | |
| ODBG(ODT_Init) << "Init offload library!"; | |
| #ifdef OMPT_SUPPORT | |
| // Initialize OMPT first | |
| llvm::omp::target::ompt::connectLibrary(); | |
| #endif | |
| PM->init(); | |
| PM->registerDelayedLibraries(); | |
| // RTL initialization is complete | |
| RTLAlive = true; | |
| } | |
| } | |
| void deinitRuntime() { | |
| std::scoped_lock<decltype(PluginMtx)> Lock(PluginMtx); | |
| assert(PM && "Runtime not initialized"); | |
| if (RefCount == 1) { | |
| ODBG(ODT_Deinit) << "Deinit offload library!"; | |
| // RTL deinitialization has started | |
| RTLAlive = false; | |
| while (RTLOngoingSyncs > 0) { | |
| ODBG(ODT_Sync) << "Waiting for ongoing syncs to finish, count:" | |
| << RTLOngoingSyncs.load(); | |
| std::this_thread::sleep_for(std::chrono::milliseconds(100)); | |
| } | |
| PM->deinit(); | |
| delete PM; | |
| PM = nullptr; | |
| } | |
| RefCount--; | |
| } |