Skip to content

Commit aeacb93

Browse files
committed
move parallel-for stuff into cpp
1 parent 8964f98 commit aeacb93

File tree

3 files changed

+85
-87
lines changed

3 files changed

+85
-87
lines changed

R/zzz.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ loadTbbLibrary <- function(name) {
3737
.tbbMallocProxyDllInfo <<- loadTbbLibrary("tbbmalloc_proxy")
3838

3939
# load RcppParallel library if available
40-
.dllInfo <<- library.dynam("RcppParallel", pkgname, libname)
40+
.dllInfo <<- library.dynam("RcppParallel", pkgname, libname, local = FALSE)
4141

4242
}
4343

inst/include/RcppParallel/TBB.h

Lines changed: 5 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -54,37 +54,6 @@ struct TBBReducer
5454
Reducer& reducer_;
5555
};
5656

57-
class TBBParallelForExecutor
58-
{
59-
public:
60-
61-
TBBParallelForExecutor(Worker& worker,
62-
std::size_t begin,
63-
std::size_t end,
64-
std::size_t grainSize)
65-
: worker_(worker),
66-
begin_(begin),
67-
end_(end),
68-
grainSize_(grainSize)
69-
{
70-
}
71-
72-
void operator()() const
73-
{
74-
TBBWorker tbbWorker(worker_);
75-
tbb::parallel_for(
76-
tbb::blocked_range<std::size_t>(begin_, end_, grainSize_),
77-
tbbWorker
78-
);
79-
}
80-
81-
private:
82-
Worker& worker_;
83-
std::size_t begin_;
84-
std::size_t end_;
85-
std::size_t grainSize_;
86-
};
87-
8857
template <typename Reducer>
8958
class TBBParallelReduceExecutor
9059
{
@@ -117,38 +86,6 @@ class TBBParallelReduceExecutor
11786
std::size_t grainSize_;
11887
};
11988

120-
class TBBArenaParallelForExecutor
121-
{
122-
public:
123-
124-
TBBArenaParallelForExecutor(tbb::task_group& group,
125-
Worker& worker,
126-
std::size_t begin,
127-
std::size_t end,
128-
std::size_t grainSize)
129-
: group_(group),
130-
worker_(worker),
131-
begin_(begin),
132-
end_(end),
133-
grainSize_(grainSize)
134-
{
135-
}
136-
137-
void operator()() const
138-
{
139-
TBBParallelForExecutor executor(worker_, begin_, end_, grainSize_);
140-
group_.run_and_wait(executor);
141-
}
142-
143-
private:
144-
145-
tbb::task_group& group_;
146-
Worker& worker_;
147-
std::size_t begin_;
148-
std::size_t end_;
149-
std::size_t grainSize_;
150-
};
151-
15289
template <typename Reducer>
15390
class TBBArenaParallelReduceExecutor
15491
{
@@ -182,20 +119,11 @@ class TBBArenaParallelReduceExecutor
182119
std::size_t grainSize_;
183120
};
184121

185-
inline void tbbParallelFor(std::size_t begin,
186-
std::size_t end,
187-
Worker& worker,
188-
std::size_t grainSize = 1,
189-
int numThreads = -1)
190-
{
191-
ThreadStackSizeControl control;
192-
193-
tbb::task_group group;
194-
TBBArenaParallelForExecutor executor(group, worker, begin, end, grainSize);
195-
196-
tbb::task_arena arena(numThreads);
197-
arena.execute(executor);
198-
}
122+
void tbbParallelFor(std::size_t begin,
123+
std::size_t end,
124+
Worker& worker,
125+
std::size_t grainSize = 1,
126+
int numThreads = -1);
199127

200128
template <typename Reducer>
201129
inline void tbbParallelReduce(std::size_t begin,

src/tbb.cpp

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11

2-
32
#include <RcppParallel/Common.h>
4-
5-
#ifndef TBB_PREVIEW_GLOBAL_CONTROL
6-
# define TBB_PREVIEW_GLOBAL_CONTROL 1
7-
#endif
8-
9-
#include <tbb/tbb.h>
10-
#include <tbb/global_control.h>
11-
#include <tbb/scalable_allocator.h>
3+
#include <RcppParallel/TBB.h>
124

135
namespace RcppParallel {
146

@@ -39,4 +31,82 @@ ThreadStackSizeControl::~ThreadStackSizeControl()
3931
#endif
4032
}
4133

34+
class TBBParallelForExecutor
35+
{
36+
public:
37+
38+
TBBParallelForExecutor(Worker& worker,
39+
std::size_t begin,
40+
std::size_t end,
41+
std::size_t grainSize)
42+
: worker_(worker),
43+
begin_(begin),
44+
end_(end),
45+
grainSize_(grainSize)
46+
{
47+
}
48+
49+
void operator()() const
50+
{
51+
TBBWorker tbbWorker(worker_);
52+
tbb::parallel_for(
53+
tbb::blocked_range<std::size_t>(begin_, end_, grainSize_),
54+
tbbWorker
55+
);
56+
}
57+
58+
private:
59+
Worker& worker_;
60+
std::size_t begin_;
61+
std::size_t end_;
62+
std::size_t grainSize_;
63+
};
64+
65+
class TBBArenaParallelForExecutor
66+
{
67+
public:
68+
69+
TBBArenaParallelForExecutor(tbb::task_group& group,
70+
Worker& worker,
71+
std::size_t begin,
72+
std::size_t end,
73+
std::size_t grainSize)
74+
: group_(group),
75+
worker_(worker),
76+
begin_(begin),
77+
end_(end),
78+
grainSize_(grainSize)
79+
{
80+
}
81+
82+
void operator()() const
83+
{
84+
TBBParallelForExecutor executor(worker_, begin_, end_, grainSize_);
85+
group_.run_and_wait(executor);
86+
}
87+
88+
private:
89+
90+
tbb::task_group& group_;
91+
Worker& worker_;
92+
std::size_t begin_;
93+
std::size_t end_;
94+
std::size_t grainSize_;
95+
};
96+
97+
void tbbParallelFor(std::size_t begin,
98+
std::size_t end,
99+
Worker& worker,
100+
std::size_t grainSize,
101+
int numThreads)
102+
{
103+
ThreadStackSizeControl control;
104+
105+
tbb::task_group group;
106+
TBBArenaParallelForExecutor executor(group, worker, begin, end, grainSize);
107+
108+
tbb::task_arena arena(numThreads);
109+
arena.execute(executor);
110+
}
111+
42112
} // end namespace RcppParallel

0 commit comments

Comments
 (0)