| //===--- 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 |