dispenso 1.4.1
A library for task parallelism
Loading...
Searching...
No Matches
task_set.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
15#pragma once
16
17namespace dispenso {
18enum class ParentCascadeCancel { kOff, kOn };
19}
20
21#include <dispenso/detail/task_set_impl.h>
22
23namespace dispenso {
24
25constexpr ssize_t kDefaultStealingMultiplier = 4;
26
38class TaskSet : public TaskSetBase {
39 public:
49 ThreadPool& p,
50 ParentCascadeCancel registerForParentCancel,
51 ssize_t stealingLoadMultiplier = kDefaultStealingMultiplier)
52 : TaskSetBase(p, registerForParentCancel, stealingLoadMultiplier),
53 token_(makeToken(p.work_)) {}
54
56 TaskSet(ThreadPool& p) : TaskSet(p, ParentCascadeCancel::kOff, kDefaultStealingMultiplier) {}
59 TaskSet(ThreadPool& p, ssize_t stealingLoadMultiplier)
60 : TaskSet(p, ParentCascadeCancel::kOff, stealingLoadMultiplier) {}
61
62 TaskSet(TaskSet&& other) = delete;
63 TaskSet& operator=(TaskSet&& other) = delete;
64
78 template <typename F>
79 DISPENSO_REQUIRES(OnceCallableFunc<F>)
80 void schedule(F&& f) {
81 if (DISPENSO_EXPECT(canceled(), false)) {
82 return;
83 }
84 if (outstandingTaskCount_.load(std::memory_order_relaxed) > taskSetLoadFactor_) {
85 f();
86 } else {
87 pool_.schedule(token_, packageTask(std::forward<F>(f)));
88 }
89 }
90
103 template <typename F>
104 DISPENSO_REQUIRES(OnceCallableFunc<F>)
105 void schedule(F&& f, ForceQueuingTag fq) {
106 pool_.schedule(token_, packageTask(std::forward<F>(f)), fq);
107 }
108
115 DISPENSO_DLL_ACCESS bool wait();
116
131 DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute);
132
138 void cancel() {
139 TaskSetBase::cancel();
140 }
141
147 bool canceled() const {
148 return TaskSetBase::canceled();
149 }
150
156 wait();
157 }
158
159 private:
160 DISPENSO_DLL_ACCESS moodycamel::ProducerToken makeToken(
161 moodycamel::ConcurrentQueue<OnceFunction>& pool);
162
163 moodycamel::ProducerToken token_;
164
165 template <typename Result>
166 friend class detail::FutureBase;
167};
168
181class ConcurrentTaskSet : public TaskSetBase {
182 public:
192 ThreadPool& pool,
193 ParentCascadeCancel registerForParentCancel,
194 ssize_t stealingLoadMultiplier = kDefaultStealingMultiplier)
195 : TaskSetBase(pool, registerForParentCancel, stealingLoadMultiplier) {}
196
199 : ConcurrentTaskSet(p, ParentCascadeCancel::kOff, kDefaultStealingMultiplier) {}
202 ConcurrentTaskSet(ThreadPool& p, ssize_t stealingLoadMultiplier)
203 : ConcurrentTaskSet(p, ParentCascadeCancel::kOff, stealingLoadMultiplier) {}
204
205 ConcurrentTaskSet(ConcurrentTaskSet&& other) = delete;
206 ConcurrentTaskSet& operator=(ConcurrentTaskSet&& other) = delete;
207
224 template <typename F>
225 DISPENSO_REQUIRES(OnceCallableFunc<F>)
226 void schedule(F&& f, bool skipRecheck = false) {
227 if (outstandingTaskCount_.load(std::memory_order_relaxed) > taskSetLoadFactor_ &&
228 DISPENSO_EXPECT(!canceled(), true)) {
229 f();
230 } else if (skipRecheck) {
231 pool_.schedule(packageTask(std::forward<F>(f)), ForceQueuingTag());
232 } else {
233 pool_.schedule(packageTask(std::forward<F>(f)));
234 }
235 }
236
249 template <typename F>
250 DISPENSO_REQUIRES(OnceCallableFunc<F>)
251 void schedule(F&& f, ForceQueuingTag fq) {
252 pool_.schedule(packageTask(std::forward<F>(f)), fq);
253 }
254
259 DISPENSO_DLL_ACCESS bool wait();
260
274 DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute);
275
282 void cancel() {
283 TaskSetBase::cancel();
284 }
285
291 bool canceled() const {
292 return TaskSetBase::canceled();
293 }
294
300 wait();
301 }
302
303 private:
304 bool tryExecuteNext() {
305 return pool_.tryExecuteNext();
306 }
307
308 template <typename Result>
309 friend class detail::FutureBase;
310
311 friend class detail::LimitGatedScheduler;
312};
313
319DISPENSO_DLL_ACCESS TaskSetBase* parentTaskSet();
320
321} // namespace dispenso
void schedule(F &&f, bool skipRecheck=false)
Definition task_set.h:226
DISPENSO_DLL_ACCESS bool wait()
ConcurrentTaskSet(ThreadPool &p, ssize_t stealingLoadMultiplier)
Definition task_set.h:202
ConcurrentTaskSet(ThreadPool &pool, ParentCascadeCancel registerForParentCancel, ssize_t stealingLoadMultiplier=kDefaultStealingMultiplier)
Definition task_set.h:191
ConcurrentTaskSet(ThreadPool &p)
Definition task_set.h:198
DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute)
TaskSet(ThreadPool &p, ssize_t stealingLoadMultiplier)
Definition task_set.h:59
void schedule(F &&f)
Definition task_set.h:80
DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute)
bool canceled() const
Definition task_set.h:147
TaskSet(ThreadPool &p, ParentCascadeCancel registerForParentCancel, ssize_t stealingLoadMultiplier=kDefaultStealingMultiplier)
Definition task_set.h:48
TaskSet(ThreadPool &p)
Definition task_set.h:56
DISPENSO_DLL_ACCESS bool wait()
DISPENSO_DLL_ACCESS TaskSetBase * parentTaskSet()