b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2threading.H
1//------------------------------------------------------------------------
2// b2threading.H --
3//
4//
5// written by Johannes Wendler <johannes.wendler@dlr.de>
6// Thomas Blome <thomas.blome@dlr.de>
7//
8// Copyright (c) 2024 Deutsches Zentrum für Luft- und Raumfahrt (DLR) e.V.
9// Linder Höhe, 51147 Köln
10//
11// All Rights Reserved. Proprietary source code. The contents of
12// this file may not be disclosed to third parties, copied or
13// duplicated in any form, in whole or in part, without the prior
14// written permission of SMR.
15//------------------------------------------------------------------------
16
17#ifndef B2THREADING_H_
18#define B2THREADING_H_
19
20#include <functional>
21
22#ifdef HAVE_LIB_TBB
23#include "tbb/spin_rw_mutex.h"
24#include "tbb/tbb.h"
25#if TBB_VERSION_MAJOR >= 2021
26#include "oneapi/tbb/mutex.h"
27#else
28#include "tbb/mutex.h"
29#endif
30#endif
31
32namespace b2000 {
33
34#ifdef HAVE_LIB_TBB
41template <typename Loop, typename... Args>
42struct TbbTaskWrapper {
43 TbbTaskWrapper(Args&&... args) : loop(Loop(std::forward<Args>(args)...)) {}
44
45 void operator()(const tbb::blocked_range<size_t>& r) const { loop(r.begin(), r.end()); }
46
47private:
48 Loop loop;
49};
50#endif
51
63template <typename Loop, typename... Args>
64void b2RunPossiblyParallel(size_t begin, size_t end, Args&&... args) {
65#ifdef HAVE_LIB_TBB
66 tbb::parallel_for(
67 tbb::blocked_range<size_t>(begin, end),
68 TbbTaskWrapper<Loop, Args...>(std::forward<Args>(args)...), tbb::auto_partitioner());
69#else
70 auto loop = Loop(std::forward<Args>(args)...);
71 loop(begin, end);
72#endif
73}
74
75#ifdef HAVE_LIB_TBB
79struct b2Mutex : public tbb::mutex {};
80
84struct b2spin_rw_mutex : public tbb::spin_rw_mutex {};
85#else
89struct b2Mutex {
90 struct scoped_lock {
91 explicit scoped_lock(b2Mutex mutex) {}
92 };
93};
94
99 struct scoped_lock {
100 scoped_lock() {}
101 explicit scoped_lock(b2spin_rw_mutex mutex) {}
102 void acquire(b2spin_rw_mutex mutex) {}
103 void release() {}
104 };
105};
106#endif
107
108#ifdef HAVE_LIB_TBB
109
116template <typename Loop, typename Args>
117struct RecursiveTask {
118 RecursiveTask(
119 size_t tree_node_, size_t sublevel_, tbb::task_group& tk_group_, Args& args_,
120 b2Mutex& mutex_)
121 : tree_node(tree_node_),
122 sublevel(sublevel_),
123 tk_group(tk_group_),
124 args(args_),
125 mutex(mutex_) {}
126 size_t tree_node;
127 size_t sublevel;
128 tbb::task_group& tk_group;
129 Args& args;
130 b2Mutex& mutex;
131
132 void operator()() const {
133 if (sublevel > 0) {
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));
136 tk_group.wait();
137 }
138 if (args.tree[tree_node].first < args.tree[tree_node].second) {
139 tbb::parallel_for(
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());
143 }
144 }
145};
146
147#endif
148
162template <typename Loop, typename Args>
163void b2runRecursively(size_t tree_node, size_t sublevel, Args& args, b2Mutex& mutex) {
164#ifdef HAVE_LIB_TBB
165 tbb::task_group tk_group;
166 tk_group.run(RecursiveTask<Loop, Args>(tree_node, sublevel, tk_group, args, mutex));
167 tk_group.wait();
168#else
169 auto loop = Loop(args, mutex);
170 loop(args.tree[0].first, args.tree[0].second);
171#endif
172}
173
174} // namespace b2000
175#endif
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