2828
2929namespace RcppParallel {
3030
31+ namespace {
32+
33+ template <typename T, typename U>
34+ int resolveValue (const char * envvar,
35+ T requestedValue,
36+ U defaultValue)
37+ {
38+ // if the requested value is non-zero and not the default, we can use it
39+ if (requestedValue != defaultValue && requestedValue > 0 )
40+ return requestedValue;
41+
42+ // otherwise, try reading the default from associated envvar
43+ // if the environment variable is unset, use the default
44+ const char * var = getenv (envvar);
45+ if (var == NULL )
46+ return defaultValue;
47+
48+ // try to convert the string to a number
49+ // if an error occurs during conversion, just use default
50+ errno = 0 ;
51+ char * end;
52+ long value = strtol (var, &end, 10 );
53+ if (errno != 0 )
54+ return defaultValue;
55+
56+ // okay, return the parsed environment variable value
57+ return value;
58+ }
59+
60+ } // end anonymous namespace
61+
3162inline void parallelFor (std::size_t begin,
3263 std::size_t end,
3364 Worker& worker,
3465 std::size_t grainSize = 1 ,
3566 int numThreads = -1 )
3667{
68+ grainSize = resolveValue (" RCPP_PARALLEL_GRAIN_SIZE" , grainSize, 1 );
69+ numThreads = resolveValue (" RCPP_PARALLEL_NUM_THREADS" , numThreads, -1 );
70+
3771#if RCPP_PARALLEL_USE_TBB
3872 if (internal::backend () == internal::BACKEND_TBB)
3973 tbbParallelFor (begin, end, worker, grainSize, numThreads);
@@ -51,6 +85,9 @@ inline void parallelReduce(std::size_t begin,
5185 std::size_t grainSize = 1 ,
5286 int numThreads = -1 )
5387{
88+ grainSize = resolveValue (" RCPP_PARALLEL_GRAIN_SIZE" , grainSize, 1 );
89+ numThreads = resolveValue (" RCPP_PARALLEL_NUM_THREADS" , numThreads, -1 );
90+
5491#if RCPP_PARALLEL_USE_TBB
5592 if (internal::backend () == internal::BACKEND_TBB)
5693 tbbParallelReduce (begin, end, reducer, grainSize, numThreads);
@@ -61,6 +98,6 @@ inline void parallelReduce(std::size_t begin,
6198#endif
6299}
63100
64- } // namespace RcppParallel
101+ } // end namespace RcppParallel
65102
66103#endif // __RCPP_PARALLEL__
0 commit comments