23#include "tbb/spin_rw_mutex.h"
25#if TBB_VERSION_MAJOR >= 2021
26#include "oneapi/tbb/mutex.h"
41template <
typename Loop,
typename... Args>
42struct TbbTaskWrapper {
43 TbbTaskWrapper(Args&&... args) : loop(Loop(std::forward<Args>(args)...)) {}
45 void operator()(
const tbb::blocked_range<size_t>& r)
const { loop(r.begin(), r.end()); }
63template <
typename Loop,
typename... Args>
67 tbb::blocked_range<size_t>(begin, end),
68 TbbTaskWrapper<Loop, Args...>(std::forward<Args>(args)...), tbb::auto_partitioner());
70 auto loop = Loop(std::forward<Args>(args)...);
79struct b2Mutex :
public tbb::mutex {};
84struct b2spin_rw_mutex :
public tbb::spin_rw_mutex {};
91 explicit scoped_lock(
b2Mutex mutex) {}
116template <
typename Loop,
typename Args>
117struct RecursiveTask {
119 size_t tree_node_,
size_t sublevel_, tbb::task_group& tk_group_, Args& args_,
121 : tree_node(tree_node_),
128 tbb::task_group& tk_group;
132 void operator()()
const {
134 tk_group.run(RecursiveTask(2 * tree_node + 1, sublevel - 1, tk_group, args, mutex));
135 tk_group.run(RecursiveTask(2 * tree_node + 2, sublevel - 1, tk_group, args, mutex));
138 if (args.tree[tree_node].first < args.tree[tree_node].second) {
140 tbb::blocked_range<size_t>(
141 args.tree[tree_node].first, args.tree[tree_node].second),
142 TbbTaskWrapper<Loop, Args&, b2Mutex&>(args, mutex), tbb::auto_partitioner());
162template <
typename Loop,
typename Args>
165 tbb::task_group tk_group;
166 tk_group.run(RecursiveTask<Loop, Args>(tree_node, sublevel, tk_group, args, mutex));
169 auto loop = Loop(args, mutex);
170 loop(args.tree[0].first, args.tree[0].second);
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
void b2RunPossiblyParallel(size_t begin, size_t end, Args &&... args)
Execute given loop, if compiled with TBB this execution is parallel.
Definition b2threading.H:64
void b2runRecursively(size_t tree_node, size_t sublevel, Args &args, b2Mutex &mutex)
Recursively run the given tree of recursive tasks, if compiled without TBB it's simply a loop.
Definition b2threading.H:163
A dummy mutex for serial exeuction.
Definition b2threading.H:89
A dummy rw mutex for serial exeuction.
Definition b2threading.H:98