32#ifndef _GLIBCXX_PARALLEL_MULTIWAY_MERGESORT_H
33#define _GLIBCXX_PARALLEL_MULTIWAY_MERGESORT_H 1
45 template<
typename _DifferenceTp>
48 typedef _DifferenceTp _DifferenceType;
60 template<
typename _RAIter>
64 typedef typename _TraitsType::value_type _ValueType;
65 typedef typename _TraitsType::difference_type _DifferenceType;
95 template<
typename _RAIter,
typename _DifferenceTp>
98 _DifferenceTp __num_samples)
101 typedef typename _TraitsType::value_type _ValueType;
102 typedef _DifferenceTp _DifferenceType;
106 _DifferenceType* __es =
new _DifferenceType[__num_samples + 2];
109 __num_samples + 1, __es);
111 for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
112 ::new(&(__sd->
_M_samples[__iam * __num_samples + __i]))
120 template<
bool __exact,
typename _RAIter,
121 typename _Compare,
typename _SortingPlacesIterator>
126 template<
typename _RAIter,
typename _Compare,
127 typename _SortingPlacesIterator>
141 _SortingPlacesIterator> >
152 if (__iam < __sd->_M_num_threads - 1)
162 = __offsets[__seq] - __seqs[__seq].first;
176 __sd->
_M_pieces[__iam - 1][__seq]._M_end;
179 __sd->
_M_pieces[__iam][__seq]._M_begin = 0;
185 template<
typename _RAIter,
typename _Compare,
186 typename _SortingPlacesIterator>
198 typedef typename _TraitsType::value_type _ValueType;
199 typedef typename _TraitsType::difference_type _DifferenceType;
216 if (__num_samples * __iam > 0)
227 __sd->
_M_pieces[__iam][__s]._M_begin = 0;
229 if ((__num_samples * (__iam + 1)) <
236 __sd->
_M_samples[__num_samples * (__iam + 1)],
247 template<
bool __stable,
typename _RAIter,
typename _Compare>
248 struct __possibly_stable_sort
251 template<
typename _RAIter,
typename _Compare>
252 struct __possibly_stable_sort<true, _RAIter, _Compare>
254 void operator()(
const _RAIter& __begin,
255 const _RAIter& __end, _Compare& __comp)
const
256 { __gnu_sequential::stable_sort(__begin, __end, __comp); }
259 template<
typename _RAIter,
typename _Compare>
260 struct __possibly_stable_sort<false, _RAIter, _Compare>
262 void operator()(
const _RAIter __begin,
263 const _RAIter __end, _Compare& __comp)
const
264 { __gnu_sequential::sort(__begin, __end, __comp); }
267 template<
bool __stable,
typename _Seq_RAIter,
268 typename _RAIter,
typename _Compare,
270 struct __possibly_stable_multiway_merge
273 template<
typename _Seq_RAIter,
typename _RAIter,
274 typename _Compare,
typename _DiffType>
275 struct __possibly_stable_multiway_merge<true, _Seq_RAIter,
276 _RAIter, _Compare, _DiffType>
278 void operator()(
const _Seq_RAIter& __seqs_begin,
279 const _Seq_RAIter& __seqs_end,
280 const _RAIter& __target,
282 _DiffType __length_am)
const
283 { stable_multiway_merge(__seqs_begin, __seqs_end, __target,
284 __length_am, __comp, sequential_tag()); }
287 template<
typename _Seq_RAIter,
typename _RAIter,
288 typename _Compare,
typename _DiffType>
289 struct __possibly_stable_multiway_merge<false, _Seq_RAIter,
290 _RAIter, _Compare, _DiffType>
292 void operator()(
const _Seq_RAIter& __seqs_begin,
293 const _Seq_RAIter& __seqs_end,
294 const _RAIter& __target,
296 _DiffType __length_am)
const
298 __comp, sequential_tag()); }
305 template<
bool __stable,
bool __exact,
typename _RAIter,
312 typedef typename _TraitsType::value_type _ValueType;
313 typedef typename _TraitsType::difference_type _DifferenceType;
318 _DifferenceType __length_local =
323 typedef _ValueType* _SortingPlacesIterator;
326 static_cast<_ValueType*
>(::operator
new(
sizeof(_ValueType)
327 * (__length_local + 1)));
335 __possibly_stable_sort<__stable, _SortingPlacesIterator, _Compare>()
345 _DifferenceType __num_samples =
348 (__iam, __sd, __comp, __num_samples);
351 _DifferenceType __offset = 0, __length_am = 0;
354 __length_am += (__sd->
_M_pieces[__iam][__s]._M_end
356 __offset += __sd->
_M_pieces[__iam][__s]._M_begin;
373 __possibly_stable_multiway_merge<
374 __stable,
typename _SeqVector::iterator,
375 _RAIter, _Compare, _DifferenceType>()(__seqs.begin(), __seqs.end(),
381 for (_DifferenceType __i = 0; __i < __length_local; ++__i)
392 template<
bool __stable,
bool __exact,
typename _RAIter,
402 typedef typename _TraitsType::value_type _ValueType;
403 typedef typename _TraitsType::difference_type _DifferenceType;
405 _DifferenceType __n = __end - __begin;
411 if (__num_threads > __n)
416 _DifferenceType* __starts;
417 _DifferenceType __size;
419# pragma omp parallel num_threads(__num_threads)
421 __num_threads = omp_get_num_threads();
436 (::operator
new(__size *
sizeof(_ValueType)));
441 __sd.
_M_offsets =
new _DifferenceType[__num_threads - 1];
445 __sd.
_M_pieces[__s].resize(__num_threads);
446 __starts = __sd.
_M_starts =
new _DifferenceType[__num_threads + 1];
448 _DifferenceType __chunk_length = __n / __num_threads;
449 _DifferenceType __split = __n % __num_threads;
450 _DifferenceType __pos = 0;
453 __starts[__i] = __pos;
454 __pos += ((__i < __split)
455 ? (__chunk_length + 1) : __chunk_length);
457 __starts[__num_threads] = __pos;
461 parallel_sort_mwms_pu<__stable, __exact>(&__sd, __comp);
469 for (_DifferenceType __i = 0; __i < __size; ++__i)
End-user include file. Provides advanced settings and tuning options. This file is a GNU parallel ext...
Implementation of sequential and parallel multiway merge.
#define _GLIBCXX_CALL(__n)
Macro to produce log message when entering a function.
Includes the original header files concerned with iterators except for stream iterators....
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
GNU parallel code for public use.
uint16_t _ThreadIndex
Unsigned integer to index a thread number. The maximum thread number (for each processor) must fit in...
_RAIterOut multiway_merge(_RAIterPairIterator __seqs_begin, _RAIterPairIterator __seqs_end, _RAIterOut __target, _DifferenceTp __length, _Compare __comp, __gnu_parallel::sequential_tag)
Multiway Merge Frontend.
void __determine_samples(_PMWMSSortingData< _RAIter > *__sd, _DifferenceTp __num_samples)
Select _M_samples from a sequence.
void parallel_sort_mwms_pu(_PMWMSSortingData< _RAIter > *__sd, _Compare &__comp)
PMWMS code executed by each thread.
_OutputIterator __equally_split(_DifferenceType __n, _ThreadIndex __num_threads, _OutputIterator __s)
function to split a sequence into parts of almost equal size.
void multiseq_partition(_RanSeqs __begin_seqs, _RanSeqs __end_seqs, _RankType __rank, _RankIterator __begin_offsets, _Compare __comp=std::less< typename std::iterator_traits< typename std::iterator_traits< _RanSeqs >::value_type::first_type >::value_type >())
Splits several sorted sequences at a certain global __rank, resulting in a splitting point for each s...
void parallel_sort_mwms(_RAIter __begin, _RAIter __end, _Compare __comp, _ThreadIndex __num_threads)
PMWMS main call.
Traits class for iterators.
Struct holding two objects of arbitrary type.
A standard container which offers fixed time access to individual elements in any order.
iterator begin() noexcept
_DifferenceType _M_begin
Begin of subsequence.
_DifferenceType _M_end
End of subsequence.
Data accessed by all threads.
_DifferenceType * _M_offsets
Offsets to add to the found positions.
_ValueType * _M_samples
Samples.
_RAIter _M_source
Input __begin.
_DifferenceType * _M_starts
Start indices, per thread.
std::vector< _Piece< _DifferenceType > > * _M_pieces
Pieces of data to merge [thread][__sequence].
_ThreadIndex _M_num_threads
Number of threads involved.
_ValueType ** _M_temporary
Storage in which to sort.
unsigned int sort_mwms_oversampling
Oversampling factor for parallel std::sort (MWMS).
static const _Settings & get()
Get the global settings.