Skip to content

Commit 342efce

Browse files
committed
use more specific tag for Reducer generic
1 parent c0d6f55 commit 342efce

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

inst/include/RcppParallel.h

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ inline void ttParallelFor(std::size_t begin, std::size_t end, Worker& worker) {
133133
}
134134

135135
// Execute the IWorker over the range in parallel then join results
136-
template <typename T>
137-
inline void ttParallelReduce(std::size_t begin, std::size_t end, T& worker) {
136+
template <typename Reducer>
137+
inline void ttParallelReduce(std::size_t begin, std::size_t end, Reducer& reducer) {
138138

139139
using namespace tthread;
140140

@@ -145,10 +145,10 @@ inline void ttParallelReduce(std::size_t begin, std::size_t end, T& worker) {
145145
std::vector<thread*> threads;
146146
std::vector<Worker*> workers;
147147
for (std::size_t i = 0; i<ranges.size(); ++i) {
148-
T* pWorker = new T();
149-
pWorker->split(static_cast<T&>(worker));
150-
workers.push_back(pWorker);
151-
threads.push_back(new thread(workerThread, new Work(ranges[i], *pWorker)));
148+
Reducer* pReducer = new Reducer();
149+
pReducer->split(static_cast<Reducer&>(reducer));
150+
workers.push_back(pReducer);
151+
threads.push_back(new thread(workerThread, new Work(ranges[i], *pReducer)));
152152
}
153153

154154
// wait for each thread, join it's results, then delete the worker & thread
@@ -158,14 +158,13 @@ inline void ttParallelReduce(std::size_t begin, std::size_t end, T& worker) {
158158
threads[i]->join();
159159

160160
// join the results
161-
worker.join(static_cast<T&>(*workers[i]));
161+
reducer.join(static_cast<Reducer&>(*workers[i]));
162162

163163
// delete the worker (which we split above) and the thread
164164
delete workers[i];
165165
delete threads[i];
166166
}
167167
}
168-
169168
} // namespace RcppParallel
170169

171170
////// TBB Implementation /////////////////////////////////////////////
@@ -193,49 +192,49 @@ inline void tbbParallelFor(std::size_t begin, std::size_t end, Worker& worker) {
193192
tbb::parallel_for(tbb::blocked_range<size_t>(begin, end), tbbWorker);
194193
}
195194

196-
template <typename T>
197-
struct TBBReduce
195+
template <typename Reducer>
196+
struct TBBReducer
198197
{
199-
explicit TBBReduce(T& reduce)
200-
: pReduce_(&reduce), wasSplit_(false)
198+
explicit TBBReducer(Reducer& reducer)
199+
: pReducer_(&reducer), wasSplit_(false)
201200
{
202201
}
203202

204-
virtual ~TBBReduce() {
203+
virtual ~TBBReducer() {
205204
try
206205
{
207206
if (wasSplit_)
208-
delete pReduce_;
207+
delete pReducer_;
209208
}
210209
catch(...)
211210
{
212211
}
213212
}
214213

215214
void operator()(const tbb::blocked_range<size_t>& r) {
216-
pReduce_->operator()(r.begin(), r.end());
215+
pReducer_->operator()(r.begin(), r.end());
217216
}
218217

219-
TBBReduce(TBBReduce& reduce, tbb::split)
220-
: pReduce_(new T()), wasSplit_(true)
218+
TBBReducer(TBBReducer& reducer, tbb::split)
219+
: pReducer_(new Reducer()), wasSplit_(true)
221220
{
222-
pReduce_->split(*reduce.pReduce_);
221+
pReducer_->split(*reducer.pReducer_);
223222
}
224223

225-
void join(const TBBReduce& reduce) {
226-
pReduce_->join(*reduce.pReduce_);
224+
void join(const TBBReducer& reducer) {
225+
pReducer_->join(*reducer.pReducer_);
227226
}
228227

229228
private:
230-
T* pReduce_;
229+
Reducer* pReducer_;
231230
bool wasSplit_;
232231
};
233232

234-
template <typename T>
235-
inline void tbbParallelReduce(std::size_t begin, std::size_t end, T& worker) {
233+
template <typename Reducer>
234+
inline void tbbParallelReduce(std::size_t begin, std::size_t end, Reducer& reducer) {
236235

237-
TBBReduce<T> tbbReduce(worker);
238-
tbb::parallel_reduce(tbb::blocked_range<size_t>(begin, end), tbbReduce);
236+
TBBReducer<Reducer> tbbReducer(reducer);
237+
tbb::parallel_reduce(tbb::blocked_range<size_t>(begin, end), tbbReducer);
239238
}
240239

241240
} // namespace RcppParallel
@@ -256,13 +255,13 @@ inline void parallelFor(std::size_t begin, std::size_t end, Worker& worker) {
256255

257256
}
258257

259-
template <typename T>
260-
inline void parallelReduce(std::size_t begin, std::size_t end, T& worker) {
258+
template <typename Reducer>
259+
inline void parallelReduce(std::size_t begin, std::size_t end, Reducer& reducer) {
261260

262261
#if RCPP_PARALLEL_USE_TBB
263-
tbbParallelReduce(begin, end, worker);
262+
tbbParallelReduce(begin, end, reducer);
264263
#else
265-
ttParallelReduce(begin, end, worker);
264+
ttParallelReduce(begin, end, reducer);
266265
#endif
267266

268267
}

0 commit comments

Comments
 (0)