Loading...
Searching...
No Matches
worker.hpp
1#pragma once
2
3#include "declarations.hpp"
4#include "wsq.hpp"
5#include "nonblocking_notifier.hpp"
6#include "atomic_notifier.hpp"
7
12
13namespace tf {
14
15// ----------------------------------------------------------------------------
16// Default Notifier
17// Our experiments show that NonblockingNotifier has the most stable performance
18// ----------------------------------------------------------------------------
19
35#ifdef TF_ENABLE_ATOMIC_NOTIFIER
36 using DefaultNotifier = AtomicNotifier;
37#else
39#endif
40
41// ----------------------------------------------------------------------------
42// Class Definition: Worker
43// ----------------------------------------------------------------------------
44
55class Worker {
56
57 friend class Executor;
58 friend class Runtime;
59 friend class WorkerView;
60
61 using wsq_type = BoundedWSQ<Node*>;
62
63 public:
64
72 inline size_t id() const { return _id; }
73
78 inline size_t queue_size() const { return _wsq.size(); }
79
83 inline size_t queue_capacity() const { return static_cast<size_t>(_wsq.capacity()); }
84
88 std::thread& thread() { return _thread; }
89
90 private:
91
92 alignas(TF_CACHELINE_SIZE) std::atomic_flag _done = ATOMIC_FLAG_INIT;
93
94 size_t _id;
95 size_t _sticky_victim;
96 Xorshift<uint32_t> _rdgen;
97 std::thread _thread;
98 wsq_type _wsq;
99 //std::vector<Node*> _pool;
100};
101
102// ----------------------------------------------------------------------------
103// Class Definition: WorkerView
104// ----------------------------------------------------------------------------
105
116class WorkerView {
117
118 friend class Executor;
119
120 public:
121
129 size_t id() const;
130
135 size_t queue_size() const;
136
140 size_t queue_capacity() const;
141
142 private:
143
144 WorkerView(const Worker&);
145 WorkerView(const WorkerView&) = default;
146
147 const Worker& _worker;
148
149};
150
151// Constructor
152inline WorkerView::WorkerView(const Worker& w) : _worker{w} {
153}
154
155// function: id
156inline size_t WorkerView::id() const {
157 return _worker._id;
158}
159
160// Function: queue_size
161inline size_t WorkerView::queue_size() const {
162 return _worker._wsq.size();
163}
164
165// Function: queue_capacity
166inline size_t WorkerView::queue_capacity() const {
167 return static_cast<size_t>(_worker._wsq.capacity());
168}
169
170// ----------------------------------------------------------------------------
171// Class Definition: WorkerInterface
172// ----------------------------------------------------------------------------
173
276
277 public:
278
282 virtual ~WorkerInterface() = default;
283
290 virtual void scheduler_prologue(Worker& worker) = 0;
291
301 virtual void scheduler_epilogue(Worker& worker, std::exception_ptr ptr) = 0;
302
303};
304
313template <typename T, typename... ArgsT>
314std::shared_ptr<T> make_worker_interface(ArgsT&&... args) {
315 static_assert(
316 std::is_base_of_v<WorkerInterface, T>,
317 "T must be derived from WorkerInterface"
318 );
319 return std::make_shared<T>(std::forward<ArgsT>(args)...);
320}
321
322
323
324
325} // end of namespact tf ------------------------------------------------------
326
327
class to create a lock-free bounded work-stealing queue
Definition wsq.hpp:656
class to create a non-blocking notifier
Definition nonblocking_notifier.hpp:84
class to configure worker behavior in an executor
Definition worker.hpp:275
virtual void scheduler_epilogue(Worker &worker, std::exception_ptr ptr)=0
method to call after a worker leaves the scheduling loop
virtual void scheduler_prologue(Worker &worker)=0
method to call before a worker enters the scheduling loop
virtual ~WorkerInterface()=default
default destructor
size_t id() const
queries the worker id associated with its parent executor
Definition worker.hpp:156
size_t queue_capacity() const
queries the current capacity of the queue
Definition worker.hpp:166
size_t queue_size() const
queries the size of the queue (i.e., number of pending tasks to run) associated with the worker
Definition worker.hpp:161
class to create a worker in an executor
Definition worker.hpp:55
size_t id() const
queries the worker id associated with its parent executor
Definition worker.hpp:72
size_t queue_capacity() const
queries the current capacity of the queue
Definition worker.hpp:83
size_t queue_size() const
queries the size of the queue (i.e., number of enqueued tasks to run) associated with the worker
Definition worker.hpp:78
std::thread & thread()
acquires the associated thread
Definition worker.hpp:88
class to create a fast xorshift-based pseudo-random number generator
Definition math.hpp:320
taskflow namespace
Definition small_vector.hpp:20
std::shared_ptr< T > make_worker_interface(ArgsT &&... args)
helper function to create an instance derived from tf::WorkerInterface
Definition worker.hpp:314
NonblockingNotifier DefaultNotifier
the default notifier type used by Taskflow
Definition worker.hpp:38