forked from RcppCore/RcppParallel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTBB.h
More file actions
78 lines (55 loc) · 1.72 KB
/
TBB.h
File metadata and controls
78 lines (55 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef __RCPP_PARALLEL_TBB__
#define __RCPP_PARALLEL_TBB__
#include "Common.h"
#include <tbb/tbb.h>
#include <tbb/scalable_allocator.h>
namespace RcppParallel {
namespace {
struct TBBWorker
{
explicit TBBWorker(Worker& worker) : worker_(worker) {}
void operator()(const tbb::blocked_range<size_t>& r) const {
worker_(r.begin(), r.end());
}
private:
Worker& worker_;
};
template <typename Reducer>
struct TBBReducer
{
explicit TBBReducer(Reducer& reducer)
: pSplitReducer_(NULL), reducer_(reducer)
{
}
TBBReducer(TBBReducer& tbbReducer, tbb::split)
: pSplitReducer_(new Reducer(tbbReducer.reducer_, RcppParallel::Split())),
reducer_(*pSplitReducer_)
{
}
virtual ~TBBReducer() { delete pSplitReducer_; }
void operator()(const tbb::blocked_range<size_t>& r) {
reducer_(r.begin(), r.end());
}
void join(const TBBReducer& tbbReducer) {
reducer_.join(tbbReducer.reducer_);
}
private:
Reducer* pSplitReducer_;
Reducer& reducer_;
};
} // anonymous namespace
inline void tbbParallelFor(std::size_t begin, std::size_t end,
Worker& worker, std::size_t grainSize = 1) {
TBBWorker tbbWorker(worker);
tbb::parallel_for(tbb::blocked_range<size_t>(begin, end, grainSize),
tbbWorker);
}
template <typename Reducer>
inline void tbbParallelReduce(std::size_t begin, std::size_t end,
Reducer& reducer, std::size_t grainSize = 1) {
TBBReducer<Reducer> tbbReducer(reducer);
tbb::parallel_reduce(tbb::blocked_range<size_t>(begin, end, grainSize),
tbbReducer);
}
} // namespace RcppParallel
#endif // __RCPP_PARALLEL_TBB__