alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
QueueGenericThreadsBlocking.hpp
Go to the documentation of this file.
1/* Copyright 2022 Axel Huebl, Benjamin Worpitz, Matthias Werner, Jan Stephan, Bernhard Manfred Gruber
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
12
13#include <atomic>
14#include <memory>
15#include <mutex>
16
17namespace alpaka
18{
19 template<typename TDev>
20 class EventGenericThreads;
21
22 namespace generic
23 {
24 namespace detail
25 {
26#if BOOST_COMP_CLANG
27// avoid diagnostic warning: "has no out-of-line virtual method definitions; its vtable will be emitted in every
28// translation unit [-Werror,-Wweak-vtables]" https://stackoverflow.com/a/29288300
29# pragma clang diagnostic push
30# pragma clang diagnostic ignored "-Wweak-vtables"
31#endif
32 //! The CPU device queue implementation.
33 template<typename TDev>
35#if BOOST_COMP_CLANG
36# pragma clang diagnostic pop
37#endif
38 {
39 public:
40 explicit QueueGenericThreadsBlockingImpl(TDev dev) noexcept
41 : m_dev(std::move(dev))
43 {
44 }
45
49
51 {
52 alpaka::enqueue(*this, ev);
53 }
54
55 void wait(EventGenericThreads<TDev> const& ev) final
56 {
57 alpaka::wait(*this, ev);
58 }
59
60 public:
61 TDev const m_dev; //!< The device this queue is bound to.
62 std::mutex mutable m_mutex;
63 std::atomic<bool> m_bCurrentlyExecutingTask;
64 };
65 } // namespace detail
66 } // namespace generic
67
68 //! The CPU device queue.
69 template<typename TDev>
71 : public interface::Implements<ConceptCurrentThreadWaitFor, QueueGenericThreadsBlocking<TDev>>
72 , public interface::Implements<ConceptQueue, QueueGenericThreadsBlocking<TDev>>
73 , public interface::Implements<ConceptGetDev, QueueGenericThreadsBlocking<TDev>>
74 {
75 public:
76 explicit QueueGenericThreadsBlocking(TDev const& dev)
77 : m_spQueueImpl(std::make_shared<generic::detail::QueueGenericThreadsBlockingImpl<TDev>>(dev))
78 {
80
81 dev.registerQueue(m_spQueueImpl);
82 }
83
84 auto operator==(QueueGenericThreadsBlocking<TDev> const& rhs) const -> bool
85 {
86 return (m_spQueueImpl == rhs.m_spQueueImpl);
87 }
88
89 auto operator!=(QueueGenericThreadsBlocking<TDev> const& rhs) const -> bool
90 {
91 return !((*this) == rhs);
92 }
93
94 public:
95 std::shared_ptr<generic::detail::QueueGenericThreadsBlockingImpl<TDev>> m_spQueueImpl;
96 };
97
98 namespace trait
99 {
100 //! The CPU blocking device queue device type trait specialization.
101 template<typename TDev>
103 {
104 using type = TDev;
105 };
106
107 //! The CPU blocking device queue device get trait specialization.
108 template<typename TDev>
110 {
112 {
113 return queue.m_spQueueImpl->m_dev;
114 }
115 };
116
117 //! The CPU blocking device queue event type trait specialization.
118 template<typename TDev>
123
124 //! The CPU blocking device queue enqueue trait specialization.
125 //! This default implementation for all tasks directly invokes the function call operator of the task.
126 template<typename TDev, typename TTask>
128 {
129 ALPAKA_FN_HOST static auto enqueue(QueueGenericThreadsBlocking<TDev>& queue, TTask const& task) -> void
130 {
131 std::lock_guard<std::mutex> lk(queue.m_spQueueImpl->m_mutex);
132
133 queue.m_spQueueImpl->m_bCurrentlyExecutingTask = true;
134
135 task();
136
137 queue.m_spQueueImpl->m_bCurrentlyExecutingTask = false;
138 }
139 };
140
141 //! The CPU blocking device queue test trait specialization.
142 template<typename TDev>
144 {
146 {
147 return !queue.m_spQueueImpl->m_bCurrentlyExecutingTask;
148 }
149 };
150
151 //! The CPU blocking device queue thread wait trait specialization.
152 //!
153 //! Blocks execution of the calling thread until the queue has finished processing all previously requested
154 //! tasks (kernels, data copies, ...)
155 template<typename TDev>
157 {
159 {
160 std::lock_guard<std::mutex> lk(queue.m_spQueueImpl->m_mutex);
161 }
162 };
163 } // namespace trait
164} // namespace alpaka
165
#define ALPAKA_DEBUG_FULL_LOG_SCOPE
Definition Debug.hpp:62
std::shared_ptr< generic::detail::QueueGenericThreadsBlockingImpl< TDev > > m_spQueueImpl
auto operator==(QueueGenericThreadsBlocking< TDev > const &rhs) const -> bool
auto operator!=(QueueGenericThreadsBlocking< TDev > const &rhs) const -> bool
auto operator=(QueueGenericThreadsBlockingImpl< TDev > const &) -> QueueGenericThreadsBlockingImpl< TDev > &=delete
void wait(EventGenericThreads< TDev > const &ev) final
waiting for the event
QueueGenericThreadsBlockingImpl(QueueGenericThreadsBlockingImpl< TDev > const &)=delete
void enqueue(EventGenericThreads< TDev > &ev) final
enqueue the event
#define ALPAKA_FN_HOST
Definition Common.hpp:40
The alpaka accelerator library.
ALPAKA_FN_HOST auto enqueue(TQueue &queue, TTask &&task) -> void
Queues the given task in the given queue.
Definition Traits.hpp:47
ALPAKA_FN_HOST auto wait(TAwaited const &awaited) -> void
Waits the thread for the completion of the given awaited action to complete.
Definition Traits.hpp:34
STL namespace.
Tag used in class inheritance hierarchies that describes that a specific interface (TInterface) is im...
Definition Interface.hpp:15
static ALPAKA_FN_HOST auto currentThreadWaitFor(QueueGenericThreadsBlocking< TDev > const &queue) -> void
The thread wait trait.
Definition Traits.hpp:21
The device type trait.
Definition Traits.hpp:23
static ALPAKA_FN_HOST auto empty(QueueGenericThreadsBlocking< TDev > const &queue) -> bool
The queue empty trait.
Definition Traits.hpp:31
static ALPAKA_FN_HOST auto enqueue(QueueGenericThreadsBlocking< TDev > &queue, TTask const &task) -> void
The queue enqueue trait.
Definition Traits.hpp:27
The event type trait.
Definition Traits.hpp:17
static ALPAKA_FN_HOST auto getDev(QueueGenericThreadsBlocking< TDev > const &queue) -> TDev
The device get trait.
Definition Traits.hpp:27