
The following patch introduces a new interop interface implementation with the following characteristics: * It supports the new 6.0 prefer_type specification * It supports both explicit objects (from interop constructs) and implicit objects (from variant calls). * Implements a per-thread reuse mechanism for implicit objects to reduce overheads. * It provides a plugin interface that allows selecting the supported interop types, and managing all the backend related interop operations (init, sync, ...). * It enables cooperation with the OpenMP runtime to allow progress on OpenMP synchronizations. * It cleanups some vendor/fr_id mismatchs from the current query routines. * It supports extension to define interop callbacks for library cleanup.
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
//===----------- 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"
|
|
|
|
#ifdef OMPT_SUPPORT
|
|
extern void llvm::omp::target::ompt::connectLibrary();
|
|
#endif
|
|
|
|
static std::mutex PluginMtx;
|
|
static uint32_t RefCount = 0;
|
|
std::atomic<bool> RTLAlive{false};
|
|
std::atomic<int> RTLOngoingSyncs{0};
|
|
|
|
void initRuntime() {
|
|
std::scoped_lock<decltype(PluginMtx)> Lock(PluginMtx);
|
|
Profiler::get();
|
|
TIMESCOPE();
|
|
|
|
if (PM == nullptr)
|
|
PM = new PluginManager();
|
|
|
|
RefCount++;
|
|
if (RefCount == 1) {
|
|
DP("Init offload library!\n");
|
|
#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) {
|
|
DP("Deinit offload library!\n");
|
|
// RTL deinitialization has started
|
|
RTLAlive = false;
|
|
while (RTLOngoingSyncs > 0) {
|
|
DP("Waiting for ongoing syncs to finish, count: %d\n",
|
|
RTLOngoingSyncs.load());
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
}
|
|
PM->deinit();
|
|
delete PM;
|
|
PM = nullptr;
|
|
}
|
|
|
|
RefCount--;
|
|
}
|