Alex Duran 66d1c37eb6
[OFFLOAD][OPENMP] 6.0 compatible interop interface (#143491)
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.
2025-08-06 16:34:39 +02:00

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--;
}