Add a new nextgen plugin that supports GPU devices through the Intel oneAPI Level Zero library. The plugin is not enabled by default and needs to be added to LIBOMPTARGET_PLUGINS_TO_BUILD explicitely. --------- Co-authored-by: Alexey Sachkov <alexey.sachkov@intel.com> Co-authored-by: Nick Sarnie <nick.sarnie@intel.com> Co-authored-by: Joseph Huber <huberjn@outlook.com>
72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
//===--- Level Zero Target RTL Implementation -----------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Thread Level Storage abstraction.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef OPENMP_LIBOMPTARGET_PLUGINS_NEXTGEN_LEVEL_ZERO_TLS_H
|
|
#define OPENMP_LIBOMPTARGET_PLUGINS_NEXTGEN_LEVEL_ZERO_TLS_H
|
|
|
|
#include <bitset>
|
|
|
|
#include "AsyncQueue.h"
|
|
#include "L0Memory.h"
|
|
#include "L0Trace.h"
|
|
#include "PerThreadTable.h"
|
|
|
|
namespace llvm::omp::target::plugin {
|
|
|
|
/// All thread-local data used by the Plugin.
|
|
class L0ThreadTLSTy {
|
|
/// Async info tracking.
|
|
static constexpr int32_t PerThreadQueues = 10;
|
|
std::bitset<PerThreadQueues> InUseQueues{0};
|
|
AsyncQueueTy AsyncQueues[PerThreadQueues];
|
|
|
|
public:
|
|
L0ThreadTLSTy() = default;
|
|
L0ThreadTLSTy(const L0ThreadTLSTy &) = delete;
|
|
L0ThreadTLSTy(L0ThreadTLSTy &&) = delete;
|
|
L0ThreadTLSTy &operator=(const L0ThreadTLSTy &) = delete;
|
|
L0ThreadTLSTy &operator=(const L0ThreadTLSTy &&) = delete;
|
|
~L0ThreadTLSTy() = default;
|
|
|
|
AsyncQueueTy *getAsyncQueue() {
|
|
AsyncQueueTy *Ret = nullptr;
|
|
if (!InUseQueues.all()) {
|
|
// there's a free queue in this thread, find it.
|
|
for (size_t Queue = 0; Queue < PerThreadQueues; Queue++) {
|
|
if (!InUseQueues.test(Queue)) {
|
|
InUseQueues.set(Queue);
|
|
Ret = &AsyncQueues[Queue];
|
|
break;
|
|
}
|
|
}
|
|
assert(Ret && "A queue should have been found!");
|
|
}
|
|
return Ret;
|
|
}
|
|
|
|
bool releaseAsyncQueue(AsyncQueueTy *Queue) {
|
|
if (Queue >= &AsyncQueues[0] && Queue < &AsyncQueues[PerThreadQueues]) {
|
|
// it's a local queue
|
|
size_t QueueId = Queue - &AsyncQueues[0];
|
|
InUseQueues.reset(QueueId);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
using L0ThreadTblTy = PerThread<L0ThreadTLSTy>;
|
|
|
|
} // namespace llvm::omp::target::plugin
|
|
|
|
#endif // OPENMP_LIBOMPTARGET_PLUGINS_NEXTGEN_LEVEL_ZERO_TLS_H
|