ReduceKernel< ReduceFunctor, ReduceResultType, T > Class Template Reference

ReduceKernel< ReduceFunctor, ReduceResultType, T > Class Template Reference

#include <qtconcurrentreducekernel.h>

Class Description

template<typename ReduceFunctor, typename ReduceResultType, typename T>
class QtConcurrent::ReduceKernel< ReduceFunctor, ReduceResultType, T >

Definition at line 104 of file qtconcurrentreducekernel.h.

Public Member Functions

 ReduceKernel (ReduceOptions _reduceOptions)
 
void runReduce (ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)
 
void finish (ReduceFunctor &reduce, ReduceResultType &r)
 
bool shouldThrottle ()
 
bool shouldStartThread ()
 

Constructor & Destructor Documentation

ReduceKernel ( ReduceOptions  _reduceOptions)
inline

Definition at line 143 of file qtconcurrentreducekernel.h.

144  : reduceOptions(_reduceOptions), progress(0), resultsMapSize(0),
145  threadCount(QThreadPool::globalInstance()->maxThreadCount())
146  { }
static QThreadPool * globalInstance()

Member Function Documentation

void runReduce ( ReduceFunctor &  reduce,
ReduceResultType &  r,
const IntermediateResults< T > &  result 
)
inline

Definition at line 148 of file qtconcurrentreducekernel.h.

151  {
152  QMutexLocker locker(&mutex);
153  if (!canReduce(result.begin)) {
154  ++resultsMapSize;
155  resultsMap.insert(result.begin, result);
156  return;
157  }
158 
159  if (reduceOptions & UnorderedReduce) {
160  // UnorderedReduce
161  progress = -1;
162 
163  // reduce this result
164  locker.unlock();
165  reduceResult(reduce, r, result);
166  locker.relock();
167 
168  // reduce all stored results as well
169  while (!resultsMap.isEmpty()) {
170  ResultsMap resultsMapCopy = resultsMap;
171  resultsMap.clear();
172 
173  locker.unlock();
174  reduceResults(reduce, r, resultsMapCopy);
175  locker.relock();
176 
177  resultsMapSize -= resultsMapCopy.size();
178  }
179 
180  progress = 0;
181  } else {
182  // reduce this result
183  locker.unlock();
184  reduceResult(reduce, r, result);
185  locker.relock();
186 
187  // OrderedReduce
188  progress += result.end - result.begin;
189 
190  // reduce as many other results as possible
191  typename ResultsMap::iterator it = resultsMap.begin();
192  while (it != resultsMap.end()) {
193  if (it.value().begin != progress)
194  break;
195 
196  locker.unlock();
197  reduceResult(reduce, r, it.value());
198  locker.relock();
199 
200  --resultsMapSize;
201  progress += it.value().end - it.value().begin;
202  it = resultsMap.erase(it);
203  }
204  }
205  }
iterator end()
Definition: qmap.h:375
GLdouble GLdouble GLdouble r
Definition: GLee.h:1189
iterator erase(iterator it)
Definition: qmap.h:717
iterator insert(const Key &key, const T &value)
Definition: qmap.h:559
iterator begin()
Definition: qmap.h:372
void clear()
Definition: qmap.h:444
bool isEmpty() const
Definition: qmap.h:203
void finish ( ReduceFunctor &  reduce,
ReduceResultType &  r 
)
inline

Definition at line 208 of file qtconcurrentreducekernel.h.

209  {
210  reduceResults(reduce, r, resultsMap);
211  }
GLdouble GLdouble GLdouble r
Definition: GLee.h:1189
bool shouldThrottle ( )
inline

Definition at line 213 of file qtconcurrentreducekernel.h.

214  {
215  return (resultsMapSize > (ReduceQueueThrottleLimit * threadCount));
216  }
bool shouldStartThread ( )
inline

Definition at line 218 of file qtconcurrentreducekernel.h.

219  {
220  return (resultsMapSize <= (ReduceQueueStartLimit * threadCount));
221  }

The documentation for this class was generated from the following file: