32 #ifndef _DEFAULT_PARTITIONER_H_ 33 #define _DEFAULT_PARTITIONER_H_ 35 #include <cnc/internal/tbbcompat.h> 36 #include <tbb/task_scheduler_init.h> 41 class range_is_tag_type {};
42 class range_is_range_type {};
57 template<
int grainSize = 0 >
62 : m_grainSize( grainSize ),
63 m_nt( getenv(
"CNC_NUM_THREADS" ) ? atoi( getenv(
"CNC_NUM_THREADS" ) ) : tbb::task_scheduler_init::default_num_threads() )
68 : m_grainSize( o.m_grainSize ),
69 m_nt( getenv(
"CNC_NUM_THREADS" ) ? atoi( getenv(
"CNC_NUM_THREADS" ) ) : tbb::task_scheduler_init::default_num_threads() )
86 template<
typename Range,
typename StepInstance >
87 inline bool divide_and_originate( Range & range, StepInstance & si )
const;
95 template<
typename Range >
96 bool is_divisible(
const Range & range )
const;
99 int grain_size(
size_t fullRangeSize )
const;
101 template<
typename Range >
102 bool is_divisible(
const Range & range,
int grain )
const;
106 template<
typename Range,
typename StepInstance >
107 bool divide_and_originate( Range & range, StepInstance & si,
const int grain )
const;
118 template<
int grainSize >
121 if( grainSize != 0 )
return grainSize;
123 if( m_grainSize <= 0 ) {
124 #define MX( _a, _b ) ((_a) > (_b) ? (_a) : (_b)) 125 const_cast< int &
>( m_grainSize ) = rangeSize > 0 ? MX( 1, (
int)(rangeSize / (size_t)m_nt / 4) ) : 1;
134 template<
int grainSize >
135 template<
typename Range,
typename StepInstance >
138 if( this->is_divisible( range, grain ) ) {
139 Range _r( range, tbb::split() );
140 si.originate_range( _r );
142 return this->is_divisible( range, grain );
148 template<
int grainSize >
149 template<
typename Range,
typename StepInstance >
152 return this->divide_and_originate( range, si, this->grain_size( range.size() ) );
158 template<
int grainSize >
159 template<
typename Range >
162 return this->is_divisible( range, this->grain_size( range.size() ) );
168 template<
int grainSize >
169 template<
typename Range >
172 return ( grainSize < 0 || (
int)range.size() > grain ) && range.is_divisible();
182 template<
int grainSize = 0 >
186 template<
typename Range,
typename StepInstance >
187 inline bool divide_and_originate( Range & range, StepInstance & si )
const;
191 template<
typename Range,
typename StepInstance >
192 bool divide_and_originate( Range & range, StepInstance & si,
const int grain )
const;
198 template<
int grainSize >
199 template<
typename Range,
typename StepInstance >
202 if( this->is_divisible( range, grain ) ) {
203 Range _r( range, tbb::split() );
204 si.originate_range( _r );
205 if( this->is_divisible( range, grain ) )
return true;
207 si.originate( range );
214 template<
int grainSize >
215 template<
typename Range,
typename StepInstance >
218 return this->divide_and_originate( range, si, this->grain_size( range.size() ) );
223 #endif // _DEFAULT_PARTITIONER_H_ range_is_range_type split_type
Interface for partitioners: configuring how ranges are partitioned.
bool divide_and_originate(Range &range, StepInstance &si) const
divide given range into in arbitrary number of ranges of type Range
bool is_divisible(const Range &range) const
return true, if given range is divisible, false otherwise
int grain_size(size_t fullRangeSize) const