21 #define mDoSort(extra_var,extra_action,sztype) \ 24 for ( sztype d=sz/2; d>0; d=d/2 ) \ 25 for ( sztype i=d; i<sz; i++ ) \ 26 for ( sztype j=i-d; j>=0 && arr[j]>arr[j+d]; j-=d ) \ 28 tmp = arr[j]; arr[j] = arr[j+d]; arr[j+d] = tmp; \ 34 template <
class T,
class I>
39 template <class T, class IT,class I>
41 mDoSort(IT itmp,itmp = idxs[j]; idxs[j] = idxs[j+d]; idxs[j+d] = itmp,I)
44 #define mDoSort(extra_var,extra_action,sztype) \ 47 for ( sztype d=sz/2; d>0; d=d/2 ) \ 48 for ( sztype i=d; i<sz; i++ ) \ 49 for ( sztype j=i-d; j>=0 && arr[j]>arr[j+d]; j-=d ) \ 51 Swap( arr[j], arr[j+d] ); \ 62 template <class T, class IT>
64 mDoSort(IT itmp,itmp = idxs[j]; idxs[j] = idxs[j+d]; idxs[j+d] = itmp,
int)
69 template <
class T,
class I>
74 for ( I idx=0; idx<sz; ++idx )
76 const int vidx = vals.
indexOf( arr[idx] );
79 if ( vals.
size()>maxnrvals )
93 for (
int idx=0; idx<vsize; idx++ )
98 for (
int idx=0; idx<vsize; ++idx )
100 for (
int idy=count[idxs[idx]]-1; idy>=0; --idy )
101 arr[++index] = vals[idx];
130 static bool mergeLists(
const T* vals, T* res,
131 int start0,
int start1,
int start2,
132 int stop,
int& totalsz );
163 const int localseed = (partsortglobalseed *
FA +
FC) %
FM;
169 partsortglobalseed = localseed;
171 return (
float) localseed;
175 template <
class T,
class I>
inline 177 I* jstart, I* jstop )
179 I ipivot, ileft, iright;
184 ipivot = (int)(istart + (istop-istart) * (float)localseed / (
float)
FM + .5);
185 if ( ipivot < istart ) ipivot = istart;
186 if ( ipivot > istop ) ipivot = istop;
187 pivotval = arr[ipivot];
189 for ( ileft=istart, iright=istop; ; )
191 while ( arr[ileft] <=pivotval && ileft<istop ) ileft++;
192 while ( arr[iright]>=pivotval && iright>istart ) iright--;
193 if ( ileft < iright )
196 arr[ileft++] = arr[iright];
202 if ( ileft < ipivot )
205 arr[ileft++] = arr[ipivot];
208 else if ( ipivot < iright )
211 arr[iright--] = arr[ipivot];
220 template <
class T,
class I>
inline 226 for ( i=istart+1; i<=istop; i++ )
228 for ( arr_i=arr[i],j=i; j>istart && arr[j-1]>arr_i; j-- )
235 template <
class T,
class I>
inline 241 I j, k, p = 0, q = sz-1;
247 if ( itarget <= j ) q = j;
248 else if ( itarget >= k ) p = k;
256 template <
class T,
class I>
inline 263 qstack[top++] = sz - 1;
292 template <
class T,
class IT>
inline 293 void partSort( T* arr, IT* iarr,
int istart,
int istop,
int* jstart,
int* jstop)
295 int ipivot, ileft, iright;
301 ipivot = (int)(istart + (istop-istart) * (float)localseed / (
float)
FM);
302 if ( ipivot < istart ) ipivot = istart;
303 if ( ipivot > istop ) ipivot = istop;
304 pivotval = arr[ipivot];
306 for ( ileft=istart, iright=istop; ; )
308 while ( arr[ileft] <=pivotval && ileft<istop ) ileft++;
309 while ( arr[iright]>=pivotval && iright>istart ) iright--;
310 if ( ileft < iright )
315 iarr[ileft] = iarr[iright];
316 arr[ileft++] = arr[iright];
324 if ( ileft < ipivot )
329 iarr[ileft] = iarr[ipivot];
330 arr[ileft++] = arr[ipivot];
335 else if ( ipivot < iright )
340 iarr[iright] = iarr[ipivot];
341 arr[iright--] = arr[ipivot];
352 template <
class T,
class IT>
inline 359 for ( i=istart+1; i<=istop; i++ )
361 for ( iarr_i=iarr[i],arr_i=arr[i],j=i; j>istart && arr[j-1]>arr_i; j-- )
372 template <
class T,
class IT>
373 void sortFor( T* arr, IT* iarr,
int sz,
int itarget )
375 int j, k, p = 0, q = sz-1;
379 partSort( arr, iarr, p, q, &j, &k );
381 if ( itarget <= j ) q = j;
382 else if ( itarget >= k ) p = k;
390 template <
class T,
class IT>
inline 396 qstack[top++] = sz - 1;
405 partSort( arr, iarr, p, q, &j, &k );
433 template <
class T>
inline 438 , barrier_( -1, false )
446 template <
class T>
inline 459 template <
class T>
inline 482 template <
class T>
inline 495 template <
class T>
inline 498 const int threadsize = stop-start+1;
499 if ( threadsize<100 )
567 curstart0, curstart1, curstart2, curstop, cursize) )
580 template <
class T>
inline 582 int start0,
int start1,
int start2,
583 int stop,
int& totalsz )
585 const int sz0 = start1-start0;
586 const int sz1 = start2==-1 ? stop-start1+1 : start2-start1;
587 const int sz2 = start2==-1 ? 0 : stop-start2+1;
588 totalsz = sz0+sz1+sz2;
590 const T* ptr0 = valptr + start0;
591 const T* stopptr0 = ptr0+sz0;
592 const T* ptr1 = valptr + start1;
593 const T* stopptr1 = ptr1+sz1;
594 const T* ptr2 = start2==-1 ? 0 : valptr + start2;
595 const T* stopptr2 = ptr2+sz2;
599 if ( ptr0 && (!ptr1 || *ptr0<*ptr1) && (!ptr2 || *ptr0<*ptr2 ) )
601 (*result++) = (*ptr0++);
602 if ( ptr0==stopptr0 )
605 else if ( ptr1 && ( !ptr2 || *ptr1<*ptr2 ) )
607 (*result++) = (*ptr1++);
608 if ( ptr1==stopptr1 )
613 (*result++) = (*ptr2++);
614 if ( ptr2==stopptr2 )
Is an object that faciliates many threads to wait for something to happen.
Definition: thread.h:108
void insertionSort(T *arr, I istart, I istop)
Definition: sorting.h:221
void partSort(T *arr, I istart, I istop, I *jstart, I *jstop)
Definition: sorting.h:176
void sort_idxabl(T &arr, int sz)
Definition: sorting.h:58
Mutex & mutex()
Definition: thread.h:266
int nrThreads() const
Definition: thread.h:249
const int nrvals_
Definition: sorting.h:142
#define mExtern(module)
Definition: commondefs.h:163
#define NSMALL
Definition: sorting.h:153
void sortFor(T *arr, I sz, I itarget)
Definition: sorting.h:236
void sort_array(T *arr, I sz)
Definition: sorting.h:35
#define FC
Definition: sorting.h:156
TypeSet< int > starts_
Definition: sorting.h:146
#define mCast(tp, v)
Definition: commondefs.h:120
#define od_int64
Definition: plftypes.h:34
Sorting in parallel. Code is still experimental.
Definition: sorting.h:118
int totalnr_
Definition: sorting.h:143
#define mDoSort(extra_var, extra_action, sztype)
Definition: sorting.h:44
virtual bool shouldContinue()
mExtern(Algo) Threads float getPartSortSeed()
Definition: sorting.h:161
od_int64 nrDone() const
May be -1, i.e. class does not report nrdone.
Definition: sorting.h:133
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:64
virtual T * arr()
3rd party access
Definition: typeset.h:86
void quickSort(T *arr, I sz)
Definition: sorting.h:257
interface to threads that should be portable.
Definition: atomic.h:24
bool duplicate_sort(T *arr, I sz, int maxnrvals)
Definition: sorting.h:70
Set of (small) copyable elements.
Definition: commontypes.h:26
int minThreadSize() const
Definition: sorting.h:126
ArrPtrMan< T > tmpbuffer_
Definition: sorting.h:136
TypeSet< int > newstarts_
Definition: sorting.h:147
#define mTryAlloc(var, stmt)
Catches bad_alloc and sets ptr to null as normal.
Definition: commondefs.h:244
#define FA
Definition: sorting.h:155
bool doPrepare(int)
Definition: sorting.h:460
void sort_idxabl_coupled(T &arr, IT *idxs, int sz)
Definition: sorting.h:63
ParallelSorter(T *vals, int sz)
Definition: sorting.h:434
bool doFinish(bool)
Definition: sorting.h:483
#define NSTACK
Definition: sorting.h:157
Waits for a number of threads to reach a certain point (i.e. the call to Barrier::waitForAll). Once everyone has arrived, everyone is released.
Definition: thread.h:244
static bool mergeLists(const T *vals, T *res, int start0, int start1, int start2, int stop, int &totalsz)
Definition: sorting.h:581
bool doWork(od_int64, od_int64, int)
Definition: sorting.h:496
#define FM
Definition: sorting.h:154
od_int64 nrIterations() const
Definition: sorting.h:124
virtual void erase()
Definition: typeset.h:360
T * buf_
Definition: sorting.h:140
Threads::Barrier barrier_
Definition: sorting.h:149
Threads::ConditionVar condvar_
Definition: sorting.h:145
int * idxs_
Definition: sorting.h:138
T * vals_
Definition: sorting.h:135
bool waitForAll(bool unlock=true)
virtual void removeSingle(size_type, bool preserver_order=true)
Definition: typeset.h:507
#define mClass(module)
Definition: commondefs.h:161
virtual size_type indexOf(T, bool forward=true, size_type start=-1) const
void addToNrDone(int64_t increment)
T * curvals_
Definition: sorting.h:139
void sort_coupled(T *arr, IT *idxs, I sz)
Definition: sorting.h:40