33
44#include " Common.h"
55
6+ #ifndef TBB_PREVIEW_GLOBAL_CONTROL
7+ # define TBB_PREVIEW_GLOBAL_CONTROL 1
8+ #endif
9+
610#include < tbb/tbb.h>
11+ #include < tbb/global_control.h>
712#include < tbb/scalable_allocator.h>
813
914namespace RcppParallel {
@@ -178,6 +183,43 @@ class TBBArenaParallelReduceExecutor
178183 std::size_t end_;
179184 std::size_t grainSize_;
180185};
186+
187+ class ThreadStackSizeControl
188+ {
189+ public:
190+
191+ ThreadStackSizeControl ()
192+ : control_(nullptr )
193+ {
194+ int stackSize = resolveValue (" RCPP_PARALLEL_STACK_SIZE" , 0 , 0 );
195+ if (stackSize > 0 )
196+ {
197+ control_ = new tbb::global_control (
198+ tbb::global_control::thread_stack_size,
199+ stackSize
200+ );
201+ }
202+ }
203+
204+ ~ThreadStackSizeControl ()
205+ {
206+ if (control_ != nullptr )
207+ {
208+ delete control_;
209+ control_ = nullptr ;
210+ }
211+ }
212+
213+ private:
214+
215+ // COPYING: not copyable
216+ ThreadStackSizeControl (const ThreadStackSizeControl&);
217+ ThreadStackSizeControl& operator =(const ThreadStackSizeControl&);
218+
219+ // private members
220+ tbb::global_control* control_;
221+
222+ };
181223
182224} // anonymous namespace
183225
@@ -186,9 +228,11 @@ inline void tbbParallelFor(std::size_t begin,
186228 std::size_t end,
187229 Worker& worker,
188230 std::size_t grainSize = 1 ,
189- int numThreads = - 1 )
231+ int numThreads = tbb::task_arena::automatic )
190232{
191- tbb::task_arena arena (numThreads == -1 ? tbb::task_arena::automatic : numThreads);
233+ ThreadStackSizeControl control;
234+
235+ tbb::task_arena arena (numThreads);
192236 tbb::task_group group;
193237
194238 TBBArenaParallelForExecutor executor (group, worker, begin, end, grainSize);
@@ -200,9 +244,11 @@ inline void tbbParallelReduce(std::size_t begin,
200244 std::size_t end,
201245 Reducer& reducer,
202246 std::size_t grainSize = 1 ,
203- int numThreads = - 1 )
247+ int numThreads = tbb::task_arena::automatic )
204248{
205- tbb::task_arena arena (numThreads == -1 ? tbb::task_arena::automatic : numThreads);
249+ ThreadStackSizeControl control;
250+
251+ tbb::task_arena arena (numThreads);
206252 tbb::task_group group;
207253
208254 TBBArenaParallelReduceExecutor<Reducer> executor (group, reducer, begin, end, grainSize);
0 commit comments