libstdc++
|
empty()
, size()
, and top()
are intentionally not provided. Calling them would not make sense in a concurrent setting. More...GNU parallel code for public use.
typedef unsigned short __gnu_parallel::_BinIndex |
Type to hold the index of a bin.
Since many variables of this type are allocated, it should be chosen as small as possible.
Definition at line 47 of file random_shuffle.h.
typedef int64_t __gnu_parallel::_CASable |
typedef uint64_t __gnu_parallel::_SequenceIndex |
typedef uint16_t __gnu_parallel::_ThreadIndex |
Run-time equivalents for the compile-time tags.
void __gnu_parallel::__calc_borders | ( | _RAIter | __elements, |
_DifferenceTp | __length, | ||
_DifferenceTp * | __off | ||
) |
Precalculate __advances for Knuth-Morris-Pratt algorithm.
__elements | Begin iterator of sequence to search for. |
__length | Length of sequence to search for. |
__off | Returned __offsets. |
Definition at line 51 of file search.h.
Referenced by __search_template().
bool __gnu_parallel::__compare_and_swap | ( | volatile _Tp * | __ptr, |
_Tp | __comparand, | ||
_Tp | __replacement | ||
) | [inline] |
Compare *__ptr
and comparand
. If equal, let *ptr=__replacement
and return true
, return false
otherwise.
Implementation is heavily platform-dependent.
__ptr | Pointer to signed integer. |
__comparand | Compare value. |
__replacement | Replacement value. |
Definition at line 343 of file parallel/compatibility.h.
References __compare_and_swap_32(), and __compare_and_swap_64().
Referenced by __parallel_partition(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_back(), and __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_front().
bool __gnu_parallel::__compare_and_swap_32 | ( | volatile int32_t * | __ptr, |
int32_t | __comparand, | ||
int32_t | __replacement | ||
) | [inline] |
Compare *__ptr
and comparand
. If equal, let *ptr=__replacement
and return true
, return false
otherwise.
Implementation is heavily platform-dependent.
__ptr | Pointer to 32-bit signed integer. |
__comparand | Compare value. |
__replacement | Replacement value. |
Definition at line 240 of file parallel/compatibility.h.
Referenced by __compare_and_swap().
bool __gnu_parallel::__compare_and_swap_64 | ( | volatile int64_t * | __ptr, |
int64_t | __comparand, | ||
int64_t | __replacement | ||
) | [inline] |
Compare *__ptr
and comparand
. If equal, let *ptr=__replacement
and return true
, return false
otherwise.
Implementation is heavily platform-dependent.
__ptr | Pointer to 64-bit signed integer. |
__comparand | Compare value. |
__replacement | Replacement value. |
Definition at line 285 of file parallel/compatibility.h.
Referenced by __compare_and_swap().
void __gnu_parallel::__decode2 | ( | _CASable | __x, |
int & | __a, | ||
int & | __b | ||
) | [inline] |
Decode two integers from one gnu_parallel::_CASable.
__x | __gnu_parallel::_CASable to decode integers from. |
__a | First integer, to be decoded from the most-significant _CASable_bits/2 bits of __x . |
__b | Second integer, to be encoded in the least-significant _CASable_bits/2 bits of __x . |
Definition at line 133 of file parallel/base.h.
References _CASable_bits, and _CASable_mask.
Referenced by __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_back(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_front(), and __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::push_front().
void __gnu_parallel::__determine_samples | ( | _PMWMSSortingData< _RAIter > * | __sd, |
_DifferenceTp | __num_samples | ||
) |
Select _M_samples from a sequence.
__sd | Pointer to algorithm data. _Result will be placed in __sd->_M_samples . |
__num_samples | Number of _M_samples to select. |
Definition at line 97 of file multiway_mergesort.h.
References __equally_split(), __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_samples, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_source, and __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_starts.
_CASable __gnu_parallel::__encode2 | ( | int | __a, |
int | __b | ||
) | [inline] |
Encode two integers into one gnu_parallel::_CASable.
__a | First integer, to be encoded in the most-significant _CASable_bits/2 bits. |
__b | Second integer, to be encoded in the least-significant _CASable_bits/2 bits. |
__a
and __b
. Definition at line 119 of file parallel/base.h.
References _CASable_bits.
Referenced by __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::_RestrictedBoundedConcurrentQueue(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_back(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::pop_front(), and __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::push_front().
_OutputIterator __gnu_parallel::__equally_split | ( | _DifferenceType | __n, |
_ThreadIndex | __num_threads, | ||
_OutputIterator | __s | ||
) |
function to split a sequence into parts of almost equal size.
The resulting sequence s of length __num_threads+1 contains the splitting positions when splitting the range [0,n) into parts of almost equal size (plus minus 1). The first entry is 0, the last one n. There may result empty parts.
__n | Number of elements |
__num_threads | Number of parts |
__s | Splitters |
__s+__num_threads+1
Definition at line 48 of file equally_split.h.
Referenced by __determine_samples(), __find_template(), __parallel_partial_sum_linear(), __parallel_unique_copy(), __search_template(), and multiway_merge_exact_splitting().
_DifferenceType __gnu_parallel::__equally_split_point | ( | _DifferenceType | __n, |
_ThreadIndex | __num_threads, | ||
_ThreadIndex | __thread_no | ||
) |
function to split a sequence into parts of almost equal size.
Returns the position of the splitting point between thread number __thread_no (included) and thread number __thread_no+1 (excluded).
__n | Number of elements |
__num_threads | Number of parts |
__thread_no | Number of threads |
Definition at line 75 of file equally_split.h.
Referenced by __for_each_template_random_access_ed().
_Tp __gnu_parallel::__fetch_and_add | ( | volatile _Tp * | __ptr, |
_Tp | __addend | ||
) | [inline] |
Add a value to a variable, atomically.
Implementation is heavily platform-dependent.
__ptr | Pointer to a signed integer. |
__addend | Value to add. |
Definition at line 186 of file parallel/compatibility.h.
References __fetch_and_add_32(), and __fetch_and_add_64().
Referenced by __parallel_partition(), and __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Piece >::push_front().
int32_t __gnu_parallel::__fetch_and_add_32 | ( | volatile int32_t * | __ptr, |
int32_t | __addend | ||
) | [inline] |
Add a value to a variable, atomically.
Implementation is heavily platform-dependent.
__ptr | Pointer to a 32-bit signed integer. |
__addend | Value to add. |
Definition at line 95 of file parallel/compatibility.h.
Referenced by __fetch_and_add().
int64_t __gnu_parallel::__fetch_and_add_64 | ( | volatile int64_t * | __ptr, |
int64_t | __addend | ||
) | [inline] |
Add a value to a variable, atomically.
Implementation is heavily platform-dependent.
__ptr | Pointer to a 64-bit signed integer. |
__addend | Value to add. |
Definition at line 134 of file parallel/compatibility.h.
Referenced by __fetch_and_add().
std::pair<_RAIter1, _RAIter2> __gnu_parallel::__find_template | ( | _RAIter1 | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 | __begin2, | ||
_Pred | __pred, | ||
_Selector | __selector | ||
) | [inline] |
Parallel std::find, switch for different algorithms.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. Must have same length as first sequence. |
__pred | Find predicate. |
__selector | _Functionality (e. g. std::find_if(), std::equal(),...) |
Definition at line 60 of file find.h.
References __gnu_parallel::_Settings::get(), and std::make_pair().
std::pair<_RAIter1, _RAIter2> __gnu_parallel::__find_template | ( | _RAIter1 | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 | __begin2, | ||
_Pred | __pred, | ||
_Selector | __selector, | ||
equal_split_tag | |||
) |
Parallel std::find, equal splitting variant.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. Second __sequence must have same length as first sequence. |
__pred | Find predicate. |
__selector | _Functionality (e. g. std::find_if(), std::equal(),...) |
Definition at line 97 of file find.h.
References __equally_split(), and _GLIBCXX_CALL.
std::pair<_RAIter1, _RAIter2> __gnu_parallel::__find_template | ( | _RAIter1 | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 | __begin2, | ||
_Pred | __pred, | ||
_Selector | __selector, | ||
growing_blocks_tag | |||
) |
Parallel std::find, growing block size variant.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. Second __sequence must have same length as first sequence. |
__pred | Find predicate. |
__selector | _Functionality (e. g. std::find_if(), std::equal(),...) |
There are two main differences between the growing blocks and the constant-size blocks variants.
Definition at line 185 of file find.h.
References _GLIBCXX_CALL, __gnu_parallel::_Settings::find_scale_factor, __gnu_parallel::_Settings::find_sequential_search_size, and __gnu_parallel::_Settings::get().
std::pair<_RAIter1, _RAIter2> __gnu_parallel::__find_template | ( | _RAIter1 | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 | __begin2, | ||
_Pred | __pred, | ||
_Selector | __selector, | ||
constant_size_blocks_tag | |||
) |
Parallel std::find, constant block size variant.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. Second __sequence must have same length as first sequence. |
__pred | Find predicate. |
__selector | _Functionality (e. g. std::find_if(), std::equal(),...) |
Definition at line 315 of file find.h.
References _GLIBCXX_CALL, __gnu_parallel::_Settings::find_initial_block_size, __gnu_parallel::_Settings::find_sequential_search_size, and __gnu_parallel::_Settings::get().
_UserOp __gnu_parallel::__for_each_template_random_access | ( | _IIter | __begin, |
_IIter | __end, | ||
_UserOp | __user_op, | ||
_Functionality & | __functionality, | ||
_Red | __reduction, | ||
_Result | __reduction_start, | ||
_Result & | __output, | ||
typename std::iterator_traits< _IIter >::difference_type | __bound, | ||
_Parallelism | __parallelism_tag | ||
) |
Chose the desired algorithm by evaluating __parallelism_tag
.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__user_op | A user-specified functor (comparator, predicate, associative operator,...) |
__functionality | functor to process an element with __user_op (depends on desired functionality, e. g. accumulate, for_each,... |
__reduction | Reduction functor. |
__reduction_start | Initial value for reduction. |
__output | Output iterator. |
__bound | Maximum number of elements processed. |
__parallelism_tag | Parallelization method |
Definition at line 61 of file for_each.h.
References __for_each_template_random_access_ed(), __for_each_template_random_access_omp_loop(), __for_each_template_random_access_workstealing(), parallel_omp_loop, parallel_omp_loop_static, and parallel_unbalanced.
_Op __gnu_parallel::__for_each_template_random_access_ed | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Op | __o, | ||
_Fu & | __f, | ||
_Red | __r, | ||
_Result | __base, | ||
_Result & | __output, | ||
typename std::iterator_traits< _RAIter >::difference_type | __bound | ||
) |
Embarrassingly parallel algorithm for random access iterators, using hand-crafted parallelization by equal splitting the work.
__begin | Begin iterator of element sequence. |
__end | End iterator of element sequence. |
__o | User-supplied functor (comparator, predicate, adding functor, ...) |
__f | Functor to "process" an element with __op (depends on desired functionality, e. g. for std::for_each(), ...). |
__r | Functor to "add" a single __result to the already processed elements (depends on functionality). |
__base | Base value for reduction. |
__output | Pointer to position where final result is written to |
__bound | Maximum number of elements processed (e. g. for std::count_n()). |
Definition at line 67 of file par_loop.h.
References __equally_split_point().
Referenced by __for_each_template_random_access().
_Op __gnu_parallel::__for_each_template_random_access_omp_loop | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Op | __o, | ||
_Fu & | __f, | ||
_Red | __r, | ||
_Result | __base, | ||
_Result & | __output, | ||
typename std::iterator_traits< _RAIter >::difference_type | __bound | ||
) |
Embarrassingly parallel algorithm for random access iterators, using an OpenMP for loop.
__begin | Begin iterator of element sequence. |
__end | End iterator of element sequence. |
__o | User-supplied functor (comparator, predicate, adding functor, etc.). |
__f | Functor to process an element with __op (depends on desired functionality, e. g. for std::for_each(), ...). |
__r | Functor to add a single __result to the already processed elements (depends on functionality). |
__base | Base value for reduction. |
__output | Pointer to position where final result is written to |
__bound | Maximum number of elements processed (e. g. for std::count_n()). |
Definition at line 67 of file omp_loop.h.
Referenced by __for_each_template_random_access().
_Op __gnu_parallel::__for_each_template_random_access_omp_loop_static | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Op | __o, | ||
_Fu & | __f, | ||
_Red | __r, | ||
_Result | __base, | ||
_Result & | __output, | ||
typename std::iterator_traits< _RAIter >::difference_type | __bound | ||
) |
Embarrassingly parallel algorithm for random access iterators, using an OpenMP for loop with static scheduling.
__begin | Begin iterator of element sequence. |
__end | End iterator of element sequence. |
__o | User-supplied functor (comparator, predicate, adding functor, ...). |
__f | Functor to process an element with __op (depends on desired functionality, e. g. for std::for_each(), ...). |
__r | Functor to add a single __result to the already processed __elements (depends on functionality). |
__base | Base value for reduction. |
__output | Pointer to position where final result is written to |
__bound | Maximum number of elements processed (e. g. for std::count_n()). |
Definition at line 66 of file omp_loop_static.h.
_Op __gnu_parallel::__for_each_template_random_access_workstealing | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Op | __op, | ||
_Fu & | __f, | ||
_Red | __r, | ||
_Result | __base, | ||
_Result & | __output, | ||
typename std::iterator_traits< _RAIter >::difference_type | __bound | ||
) |
Work stealing algorithm for random access iterators.
Uses O(1) additional memory. Synchronization at job lists is done with atomic operations.
__begin | Begin iterator of element sequence. |
__end | End iterator of element sequence. |
__op | User-supplied functor (comparator, predicate, adding functor, ...). |
__f | Functor to process an element with __op (depends on desired functionality, e. g. for std::for_each(), ...). |
__r | Functor to add a single __result to the already processed elements (depends on functionality). |
__base | Base value for reduction. |
__output | Pointer to position where final result is written to |
__bound | Maximum number of elements processed (e. g. for std::count_n()). |
Definition at line 99 of file workstealing.h.
References __gnu_debug::__base(), __yield(), _GLIBCXX_CALL, __gnu_parallel::_Job< _DifferenceTp >::_M_first, __gnu_parallel::_Job< _DifferenceTp >::_M_last, __gnu_parallel::_Job< _DifferenceTp >::_M_load, __gnu_parallel::_Settings::cache_line_size, __gnu_parallel::_Settings::get(), and min().
Referenced by __for_each_template_random_access().
bool __gnu_parallel::__is_sorted | ( | _IIter | __begin, |
_IIter | __end, | ||
_Compare | __comp | ||
) |
Check whether [__begin,
__end
) is sorted according to __comp
.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__comp | Comparator. |
true
if sorted, false
otherwise. Definition at line 51 of file checkers.h.
Referenced by __sequential_multiway_merge(), multiway_merge_loser_tree_sentinel(), and parallel_multiway_merge().
_RAIter __gnu_parallel::__median_of_three_iterators | ( | _RAIter | __a, |
_RAIter | __b, | ||
_RAIter | __c, | ||
_Compare | __comp | ||
) |
Compute the median of three referenced elements, according to __comp
.
__a | First iterator. |
__b | Second iterator. |
__c | Third iterator. |
__comp | Comparator. |
Definition at line 398 of file parallel/base.h.
Referenced by __qsb_divide().
_OutputIterator __gnu_parallel::__merge_advance | ( | _RAIter1 & | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 & | __begin2, | ||
_RAIter2 | __end2, | ||
_OutputIterator | __target, | ||
_DifferenceTp | __max_length, | ||
_Compare | __comp | ||
) | [inline] |
Merge routine being able to merge only the __max_length
smallest elements.
The __begin
iterators are advanced accordingly, they might not reach __end
, in contrast to the usual variant. Static switch on whether to use the conditional-move variant.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__target | Target begin iterator. |
__max_length | Maximum number of elements to merge. |
__comp | Comparator. |
Definition at line 171 of file merge.h.
References __merge_advance_movc(), and _GLIBCXX_CALL.
Referenced by __parallel_merge_advance(), and __sequential_multiway_merge().
_OutputIterator __gnu_parallel::__merge_advance_movc | ( | _RAIter1 & | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 & | __begin2, | ||
_RAIter2 | __end2, | ||
_OutputIterator | __target, | ||
_DifferenceTp | __max_length, | ||
_Compare | __comp | ||
) |
Merge routine being able to merge only the __max_length
smallest elements.
The __begin
iterators are advanced accordingly, they might not reach __end
, in contrast to the usual variant. Specially designed code should allow the compiler to generate conditional moves instead of branches.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__target | Target begin iterator. |
__max_length | Maximum number of elements to merge. |
__comp | Comparator. |
Definition at line 105 of file merge.h.
Referenced by __merge_advance().
_OutputIterator __gnu_parallel::__merge_advance_usual | ( | _RAIter1 & | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 & | __begin2, | ||
_RAIter2 | __end2, | ||
_OutputIterator | __target, | ||
_DifferenceTp | __max_length, | ||
_Compare | __comp | ||
) |
Merge routine being able to merge only the __max_length
smallest elements.
The __begin
iterators are advanced accordingly, they might not reach __end
, in contrast to the usual variant.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__target | Target begin iterator. |
__max_length | Maximum number of elements to merge. |
__comp | Comparator. |
_RAIter3 __gnu_parallel::__parallel_merge_advance | ( | _RAIter1 & | __begin1, |
_RAIter1 | __end1, | ||
_RAIter2 & | __begin2, | ||
_RAIter2 | __end2, | ||
_RAIter3 | __target, | ||
typename std::iterator_traits< _RAIter1 >::difference_type | __max_length, | ||
_Compare | __comp | ||
) | [inline] |
Merge routine fallback to sequential in case the iterators of the two input sequences are of different type.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__target | Target begin iterator. |
__max_length | Maximum number of elements to merge. |
__comp | Comparator. |
Definition at line 195 of file merge.h.
References __merge_advance().
_RAIter3 __gnu_parallel::__parallel_merge_advance | ( | _RAIter1 & | __begin1, |
_RAIter1 | __end1, | ||
_RAIter1 & | __begin2, | ||
_RAIter1 | __end2, | ||
_RAIter3 | __target, | ||
typename std::iterator_traits< _RAIter1 >::difference_type | __max_length, | ||
_Compare | __comp | ||
) | [inline] |
Parallel merge routine being able to merge only the __max_length
smallest elements.
The __begin
iterators are advanced accordingly, they might not reach __end
, in contrast to the usual variant. The functionality is projected onto parallel_multiway_merge.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__target | Target begin iterator. |
__max_length | Maximum number of elements to merge. |
__comp | Comparator. |
Definition at line 223 of file merge.h.
References std::make_pair(), multiway_merge_exact_splitting(), and parallel_multiway_merge().
void __gnu_parallel::__parallel_nth_element | ( | _RAIter | __begin, |
_RAIter | __nth, | ||
_RAIter | __end, | ||
_Compare | __comp | ||
) |
Parallel implementation of std::nth_element().
__begin | Begin iterator of input sequence. |
__nth | _Iterator of element that must be in position afterwards. |
__end | End iterator of input sequence. |
__comp | Comparator. |
Definition at line 332 of file partition.h.
References __parallel_partition(), _GLIBCXX_CALL, __gnu_parallel::_Settings::get(), max(), __gnu_parallel::_Settings::nth_element_minimal_n, and __gnu_parallel::_Settings::partition_minimal_n.
Referenced by __parallel_partial_sort().
void __gnu_parallel::__parallel_partial_sort | ( | _RAIter | __begin, |
_RAIter | __middle, | ||
_RAIter | __end, | ||
_Compare | __comp | ||
) |
Parallel implementation of std::partial_sort().
__begin | Begin iterator of input sequence. |
__middle | Sort until this position. |
__end | End iterator of input sequence. |
__comp | Comparator. |
Definition at line 422 of file partition.h.
References __parallel_nth_element().
_OutputIterator __gnu_parallel::__parallel_partial_sum | ( | _IIter | __begin, |
_IIter | __end, | ||
_OutputIterator | __result, | ||
_BinaryOperation | __bin_op | ||
) |
Parallel partial sum front-__end.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__result | Begin iterator of output sequence. |
__bin_op | Associative binary function. |
Definition at line 205 of file partial_sum.h.
References __parallel_partial_sum_linear(), _GLIBCXX_CALL, and __gnu_parallel::_Settings::get().
_OutputIterator __gnu_parallel::__parallel_partial_sum_basecase | ( | _IIter | __begin, |
_IIter | __end, | ||
_OutputIterator | __result, | ||
_BinaryOperation | __bin_op, | ||
typename std::iterator_traits< _IIter >::value_type | __value | ||
) |
Base case prefix sum routine.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__result | Begin iterator of output sequence. |
__bin_op | Associative binary function. |
__value | Start value. Must be passed since the neutral element is unknown in general. |
Definition at line 58 of file partial_sum.h.
Referenced by __parallel_partial_sum_linear().
_OutputIterator __gnu_parallel::__parallel_partial_sum_linear | ( | _IIter | __begin, |
_IIter | __end, | ||
_OutputIterator | __result, | ||
_BinaryOperation | __bin_op, | ||
typename std::iterator_traits< _IIter >::difference_type | __n | ||
) |
Parallel partial sum implementation, two-phase approach, no recursion.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__result | Begin iterator of output sequence. |
__bin_op | Associative binary function. |
__n | Length of sequence. |
Definition at line 89 of file partial_sum.h.
References __equally_split(), __parallel_partial_sum_basecase(), std::accumulate(), __gnu_parallel::_Settings::get(), and __gnu_parallel::_Settings::partial_sum_dilation.
Referenced by __parallel_partial_sum().
std::iterator_traits<_RAIter>::difference_type __gnu_parallel::__parallel_partition | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Predicate | __pred, | ||
_ThreadIndex | __num_threads | ||
) |
Parallel implementation of std::partition.
__begin | Begin iterator of input sequence to split. |
__end | End iterator of input sequence to split. |
__pred | Partition predicate, possibly including some kind of pivot. |
__num_threads | Maximum number of threads to use for this task. |
Definition at line 56 of file partition.h.
References __compare_and_swap(), __fetch_and_add(), _GLIBCXX_CALL, _GLIBCXX_VOLATILE, __gnu_parallel::_Settings::get(), __gnu_parallel::_Settings::partition_chunk_share, and __gnu_parallel::_Settings::partition_chunk_size.
Referenced by __parallel_nth_element(), __parallel_sort_qs_divide(), and __qsb_divide().
void __gnu_parallel::__parallel_random_shuffle | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_RandomNumberGenerator | __rng = _RandomNumber() |
||
) | [inline] |
Parallel random public call.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__rng | Random number generator to use. |
Definition at line 522 of file random_shuffle.h.
References __parallel_random_shuffle_drs().
void __gnu_parallel::__parallel_random_shuffle_drs | ( | _RAIter | __begin, |
_RAIter | __end, | ||
typename std::iterator_traits< _RAIter >::difference_type | __n, | ||
_ThreadIndex | __num_threads, | ||
_RandomNumberGenerator & | __rng | ||
) |
Main parallel random shuffle step.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__n | Length of sequence. |
__num_threads | Number of threads to use. |
__rng | Random number generator to use. |
Definition at line 265 of file random_shuffle.h.
References __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::__bins_end, __parallel_random_shuffle_drs_pu(), __rd_log2(), __round_up_to_pow2(), __sequential_random_shuffle(), _GLIBCXX_CALL, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_bin_proc, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_bins_begin, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_dist, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_num_bins, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_num_bits, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_num_threads, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_sd, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_seed, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_starts, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_temporaries, __gnu_parallel::_Settings::get(), __gnu_parallel::_Settings::L2_cache_size, min(), and __gnu_parallel::_Settings::TLB_size.
Referenced by __parallel_random_shuffle().
void __gnu_parallel::__parallel_random_shuffle_drs_pu | ( | _DRSSorterPU< _RAIter, _RandomNumberGenerator > * | __pus | ) |
Random shuffle code executed by each thread.
__pus | Array of thread-local data records. |
Definition at line 122 of file random_shuffle.h.
References __random_number_pow2(), __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_dist, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_num_bins, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_num_bits, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_num_threads, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_sd, __gnu_parallel::_DRSSorterPU< _RAIter, _RandomNumberGenerator >::_M_seed, __gnu_parallel::_DRandomShufflingGlobalData< _RAIter >::_M_starts, and std::partial_sum().
Referenced by __parallel_random_shuffle_drs().
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
multiway_mergesort_tag | __parallelism | ||
) | [inline] |
Choose multiway mergesort, splitting variant at run-time, for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 75 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), _GLIBCXX_CALL, and __gnu_parallel::_Settings::get().
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
multiway_mergesort_exact_tag | __parallelism | ||
) | [inline] |
Choose multiway mergesort with exact splitting, for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 99 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), and _GLIBCXX_CALL.
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
multiway_mergesort_sampling_tag | __parallelism | ||
) | [inline] |
Choose multiway mergesort with splitting by sampling, for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 120 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), and _GLIBCXX_CALL.
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
quicksort_tag | __parallelism | ||
) | [inline] |
Choose quicksort for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 140 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), __parallel_sort_qs(), and _GLIBCXX_CALL.
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
balanced_quicksort_tag | __parallelism | ||
) | [inline] |
Choose balanced quicksort for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 161 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), __parallel_sort_qsb(), and _GLIBCXX_CALL.
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
default_parallel_tag | __parallelism | ||
) | [inline] |
Choose multiway mergesort with exact splitting, for parallel sorting.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 183 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), and _GLIBCXX_CALL.
void __gnu_parallel::__parallel_sort | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
parallel_tag | __parallelism | ||
) | [inline] |
Choose a parallel sorting algorithm.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__comp | Comparator. |
__stable | Sort stable. |
Definition at line 203 of file sort.h.
References __gnu_parallel::parallel_tag::__get_num_threads(), __parallel_sort_qs(), __parallel_sort_qsb(), _GLIBCXX_CALL, and __gnu_parallel::_Settings::get().
void __gnu_parallel::__parallel_sort_qs | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
Unbalanced quicksort main call.
__begin | Begin iterator of input sequence. |
__end | End iterator input sequence, ignored. |
__comp | Comparator. |
__num_threads | Number of threads that are allowed to work on this part. |
Definition at line 154 of file quicksort.h.
References __parallel_sort_qs_conquer(), and _GLIBCXX_CALL.
Referenced by __parallel_sort().
void __gnu_parallel::__parallel_sort_qs_conquer | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
Unbalanced quicksort conquer step.
__begin | Begin iterator of subsequence. |
__end | End iterator of subsequence. |
__comp | Comparator. |
__num_threads | Number of threads that are allowed to work on this part. |
Definition at line 101 of file quicksort.h.
References __parallel_sort_qs_divide(), and __gnu_parallel::_Settings::get().
Referenced by __parallel_sort_qs().
std::iterator_traits<_RAIter>::difference_type __gnu_parallel::__parallel_sort_qs_divide | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
typename std::iterator_traits< _RAIter >::difference_type | __pivot_rank, | ||
typename std::iterator_traits< _RAIter >::difference_type | __num_samples, | ||
_ThreadIndex | __num_threads | ||
) |
Unbalanced quicksort divide step.
__begin | Begin iterator of subsequence. |
__end | End iterator of subsequence. |
__comp | Comparator. |
__pivot_rank | Desired __rank of the pivot. |
__num_samples | Choose pivot from that many samples. |
__num_threads | Number of threads that are allowed to work on this part. |
Definition at line 51 of file quicksort.h.
References __parallel_partition(), and min().
Referenced by __parallel_sort_qs_conquer().
void __gnu_parallel::__parallel_sort_qsb | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
Top-level quicksort routine.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__comp | Comparator. |
__num_threads | Number of threads that are allowed to work on this part. |
Definition at line 430 of file balanced_quicksort.h.
References __qsb_conquer(), __rd_log2(), _GLIBCXX_CALL, __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_elements_leftover, and std::make_pair().
Referenced by __parallel_sort().
_OutputIterator __gnu_parallel::__parallel_unique_copy | ( | _IIter | __first, |
_IIter | __last, | ||
_OutputIterator | __result, | ||
_BinaryPredicate | __binary_pred | ||
) |
Parallel std::unique_copy(), w/__o explicit equality predicate.
__first | Begin iterator of input sequence. |
__last | End iterator of input sequence. |
__result | Begin iterator of result __sequence. |
__binary_pred | Equality predicate. |
Definition at line 50 of file unique_copy.h.
References __equally_split(), and _GLIBCXX_CALL.
Referenced by __parallel_unique_copy().
_OutputIterator __gnu_parallel::__parallel_unique_copy | ( | _IIter | __first, |
_IIter | __last, | ||
_OutputIterator | __result | ||
) | [inline] |
Parallel std::unique_copy(), without explicit equality predicate.
__first | Begin iterator of input sequence. |
__last | End iterator of input sequence. |
__result | Begin iterator of result __sequence. |
Definition at line 186 of file unique_copy.h.
References __parallel_unique_copy().
void __gnu_parallel::__qsb_conquer | ( | _QSBThreadLocal< _RAIter > ** | __tls, |
_RAIter | __begin, | ||
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __iam, | ||
_ThreadIndex | __num_threads, | ||
bool | __parent_wait | ||
) |
Quicksort conquer step.
__tls | Array of thread-local storages. |
__begin | Begin iterator of subsequence. |
__end | End iterator of subsequence. |
__comp | Comparator. |
__iam | Number of the thread processing this function. |
__num_threads | Number of threads that are allowed to work on this part. |
Definition at line 171 of file balanced_quicksort.h.
References __qsb_divide(), __qsb_local_sort_with_helping(), __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_elements_leftover, and __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_initial.
Referenced by __parallel_sort_qsb().
std::iterator_traits<_RAIter>::difference_type __gnu_parallel::__qsb_divide | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
Balanced quicksort divide step.
__begin | Begin iterator of subsequence. |
__end | End iterator of subsequence. |
__comp | Comparator. |
__num_threads | Number of threads that are allowed to work on this part. |
(__end-__begin)>=1 Definition at line 100 of file balanced_quicksort.h.
References __median_of_three_iterators(), and __parallel_partition().
Referenced by __qsb_conquer().
void __gnu_parallel::__qsb_local_sort_with_helping | ( | _QSBThreadLocal< _RAIter > ** | __tls, |
_Compare & | __comp, | ||
_ThreadIndex | __iam, | ||
bool | __wait | ||
) |
Quicksort step doing load-balanced local sort.
__tls | Array of thread-local storages. |
__comp | Comparator. |
__iam | Number of the thread processing this function. |
Definition at line 247 of file balanced_quicksort.h.
References __yield(), _GLIBCXX_ASSERTIONS, __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_elements_leftover, __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_initial, __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_leftover_parts, __gnu_parallel::_QSBThreadLocal< _RAIter >::_M_num_threads, __gnu_parallel::_Settings::get(), std::make_pair(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Tp >::pop_front(), __gnu_parallel::_RestrictedBoundedConcurrentQueue< _Tp >::push_front(), and __gnu_parallel::_Settings::sort_qsb_base_case_maximal_n.
Referenced by __qsb_conquer().
int __gnu_parallel::__random_number_pow2 | ( | int | __logp, |
_RandomNumberGenerator & | __rng | ||
) | [inline] |
Generate a random number in [0,2^__logp).
__logp | Logarithm (basis 2) of the upper range __bound. |
__rng | Random number generator to use. |
Definition at line 115 of file random_shuffle.h.
Referenced by __parallel_random_shuffle_drs_pu(), and __sequential_random_shuffle().
_Size __gnu_parallel::__rd_log2 | ( | _Size | __n | ) | [inline] |
Calculates the rounded-down logarithm of __n
for base 2.
__n | Argument. |
Definition at line 102 of file parallel/base.h.
Referenced by __parallel_random_shuffle_drs(), __parallel_sort_qsb(), __round_up_to_pow2(), __sequential_random_shuffle(), __gnu_parallel::_LoserTreeBase< _Tp, _Compare >::_LoserTreeBase(), multiseq_partition(), and multiseq_selection().
_Tp __gnu_parallel::__round_up_to_pow2 | ( | _Tp | __x | ) |
Round up to the next greater power of 2.
__x | _Integer to round up |
Definition at line 248 of file random_shuffle.h.
References __rd_log2().
Referenced by __parallel_random_shuffle_drs(), __sequential_random_shuffle(), and multiseq_selection().
__RAIter1 __gnu_parallel::__search_template | ( | __RAIter1 | __begin1, |
__RAIter1 | __end1, | ||
__RAIter2 | __begin2, | ||
__RAIter2 | __end2, | ||
_Pred | __pred | ||
) |
Parallel std::search.
__begin1 | Begin iterator of first sequence. |
__end1 | End iterator of first sequence. |
__begin2 | Begin iterator of second sequence. |
__end2 | End iterator of second sequence. |
__pred | Find predicate. |
Definition at line 81 of file search.h.
References __calc_borders(), __equally_split(), _GLIBCXX_CALL, and min().
_RAIter3 __gnu_parallel::__sequential_multiway_merge | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
const typename std::iterator_traits< typename std::iterator_traits< _RAIterIterator >::value_type::first_type >::value_type & | __sentinel, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Sequential multi-way merging switch.
The _GLIBCXX_PARALLEL_DECISION is based on the branching factor and runtime settings.
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, possibly larger than the number of elements available. |
__sentinel | The sequences have __a __sentinel element. |
Definition at line 920 of file multiway_merge.h.
References __is_sorted(), __merge_advance(), _GLIBCXX_CALL, and _GLIBCXX_PARALLEL_LENGTH.
Referenced by multiway_merge(), and multiway_merge_sentinels().
void __gnu_parallel::__sequential_random_shuffle | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_RandomNumberGenerator & | __rng | ||
) |
Sequential cache-efficient random shuffle.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__rng | Random number generator to use. |
Definition at line 410 of file random_shuffle.h.
References __random_number_pow2(), __rd_log2(), __round_up_to_pow2(), __gnu_parallel::_Settings::get(), __gnu_parallel::_Settings::L2_cache_size, min(), std::partial_sum(), and __gnu_parallel::_Settings::TLB_size.
Referenced by __parallel_random_shuffle_drs().
void __gnu_parallel::__shrink | ( | std::vector< _IIter > & | __os_starts, |
size_t & | __count_to_two, | ||
size_t & | __range_length | ||
) |
Combines two ranges into one and thus halves the number of ranges.
__os_starts | Start positions worked on (oversampled). |
__count_to_two | Counts up to 2. |
__range_length | Current length of a chunk. |
Definition at line 70 of file list_partition.h.
References std::vector< _Tp, _Alloc >::size().
Referenced by __shrink_and_double().
void __gnu_parallel::__shrink_and_double | ( | std::vector< _IIter > & | __os_starts, |
size_t & | __count_to_two, | ||
size_t & | __range_length, | ||
const bool | __make_twice | ||
) |
Shrinks and doubles the ranges.
__os_starts | Start positions worked on (oversampled). |
__count_to_two | Counts up to 2. |
__range_length | Current length of a chunk. |
__make_twice | Whether the __os_starts is allowed to be grown or not |
Definition at line 50 of file list_partition.h.
References __shrink(), std::vector< _Tp, _Alloc >::resize(), and std::vector< _Tp, _Alloc >::size().
Referenced by list_partition().
void __gnu_parallel::__yield | ( | ) | [inline] |
Yield the control to another thread, without waiting for the end to the time slice.
Definition at line 360 of file parallel/compatibility.h.
Referenced by __for_each_template_random_access_workstealing(), and __qsb_local_sort_with_helping().
size_t __gnu_parallel::list_partition | ( | const _IIter | __begin, |
const _IIter | __end, | ||
_IIter * | __starts, | ||
size_t * | __lengths, | ||
const int | __num_parts, | ||
_FunctorType & | __f, | ||
int | __oversampling = 0 |
||
) |
Splits a sequence given by input iterators into parts of almost equal size.
The function needs only one pass over the sequence.
__begin | Begin iterator of input sequence. |
__end | End iterator of input sequence. |
__starts | Start iterators for the resulting parts, dimension __num_parts+1 . For convenience, __starts [__num_parts] contains the end iterator of the sequence. |
__lengths | Length of the resulting parts. |
__num_parts | Number of parts to split the sequence into. |
__f | Functor to be applied to each element by traversing __it |
__oversampling | Oversampling factor. If 0, then the partitions will differ in at most {{__end} - {__begin}} __elements. Otherwise, the ratio between the longest and the shortest part is bounded by 1/({__oversampling} {num_parts}) |
Definition at line 101 of file list_partition.h.
References __shrink_and_double(), and std::vector< _Tp, _Alloc >::size().
const _Tp& __gnu_parallel::max | ( | const _Tp & | __a, |
const _Tp & | __b | ||
) | [inline] |
Equivalent to std::max.
Definition at line 150 of file parallel/base.h.
Referenced by __parallel_nth_element(), multiseq_partition(), and multiseq_selection().
const _Tp& __gnu_parallel::min | ( | const _Tp & | __a, |
const _Tp & | __b | ||
) | [inline] |
Equivalent to std::min.
Definition at line 144 of file parallel/base.h.
Referenced by __for_each_template_random_access_workstealing(), __parallel_random_shuffle_drs(), __parallel_sort_qs_divide(), __search_template(), __sequential_random_shuffle(), multiseq_partition(), and multiseq_selection().
void __gnu_parallel::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 sequence. The sequences are passed via a sequence of random-access iterator pairs, none of the sequences may be empty. If there are several equal elements across the split, the ones on the __left side will be chosen from sequences with smaller number.
__begin_seqs | Begin of the sequence of iterator pairs. |
__end_seqs | End of the sequence of iterator pairs. |
__rank | The global rank to partition at. |
__begin_offsets | A random-access __sequence __begin where the __result will be stored in. Each element of the sequence is an iterator that points to the first element on the greater part of the respective __sequence. |
__comp | The ordering functor, defaults to std::less<_Tp>. |
Definition at line 122 of file multiseq_selection.h.
References __rd_log2(), _GLIBCXX_CALL, std::vector< _Tp, _Alloc >::begin(), std::distance(), std::priority_queue< _Tp, _Sequence, _Compare >::empty(), std::vector< _Tp, _Alloc >::end(), std::make_pair(), max(), min(), std::priority_queue< _Tp, _Sequence, _Compare >::pop(), std::priority_queue< _Tp, _Sequence, _Compare >::push(), std::vector< _Tp, _Alloc >::push_back(), and std::priority_queue< _Tp, _Sequence, _Compare >::top().
Referenced by multiway_merge_exact_splitting().
_Tp __gnu_parallel::multiseq_selection | ( | _RanSeqs | __begin_seqs, |
_RanSeqs | __end_seqs, | ||
_RankType | __rank, | ||
_RankType & | __offset, | ||
_Compare | __comp = std::less<_Tp>() |
||
) |
Selects the element at a certain global __rank from several sorted sequences.
The sequences are passed via a sequence of random-access iterator pairs, none of the sequences may be empty.
__begin_seqs | Begin of the sequence of iterator pairs. |
__end_seqs | End of the sequence of iterator pairs. |
__rank | The global rank to partition at. |
__offset | The rank of the selected element in the global subsequence of elements equal to the selected element. If the selected element is unique, this number is 0. |
__comp | The ordering functor, defaults to std::less. |
Definition at line 388 of file multiseq_selection.h.
References __rd_log2(), __round_up_to_pow2(), _GLIBCXX_CALL, std::vector< _Tp, _Alloc >::begin(), std::distance(), std::priority_queue< _Tp, _Sequence, _Compare >::empty(), std::vector< _Tp, _Alloc >::end(), std::make_pair(), max(), min(), std::priority_queue< _Tp, _Sequence, _Compare >::pop(), std::priority_queue< _Tp, _Sequence, _Compare >::push(), std::vector< _Tp, _Alloc >::push_back(), and std::priority_queue< _Tp, _Sequence, _Compare >::top().
_RAIterOut __gnu_parallel::multiway_merge | ( | _RAIterPairIterator | __seqs_begin, |
_RAIterPairIterator | __seqs_end, | ||
_RAIterOut | __target, | ||
_DifferenceTp | __length, | ||
_Compare | __comp, | ||
__gnu_parallel::sequential_tag | |||
) |
Multiway Merge Frontend.
Merge the sequences specified by seqs_begin and __seqs_end into __target. __seqs_begin and __seqs_end must point to a sequence of pairs. These pairs must contain an iterator to the beginning of a sequence in their first entry and an iterator the _M_end of the same sequence in their second entry.
Ties are broken arbitrarily. See stable_multiway_merge for a variant that breaks ties by sequence number but is slower.
The first entries of the pairs (i.e. the begin iterators) will be moved forward.
The output sequence has to provide enough space for all elements that are written to it.
This function will merge the input sequences:
Example:
int sequences[10][10]; for (int __i = 0; __i < 10; ++__i) for (int __j = 0; __i < 10; ++__j) sequences[__i][__j] = __j;
int __out[33]; std::vector<std::pair<int*> > seqs; for (int __i = 0; __i < 10; ++__i) { seqs.push(std::make_pair<int*>(sequences[__i], sequences[__i] + 10)) }
multiway_merge(seqs.begin(), seqs.end(), __target, std::less<int>(), 33);
_RAIterPairIterator | iterator over sequence of pairs of iterators |
_RAIterOut | iterator over target sequence |
_DifferenceTp | difference type for the sequence |
_Compare | strict weak ordering type to compare elements in sequences |
__seqs_begin | __begin of sequence __sequence |
__seqs_end | _M_end of sequence __sequence |
__target | target sequence to merge to. |
__comp | strict weak ordering to use for element comparison. |
__length | Maximum length to merge, possibly larger than the number of elements available. |
Definition at line 1418 of file multiway_merge.h.
References __sequential_multiway_merge(), and _GLIBCXX_CALL.
_RAIter3 __gnu_parallel::multiway_merge_3_variant | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Highly efficient 3-way merging procedure.
Merging is done with the algorithm implementation described by Peter Sanders. Basically, the idea is to minimize the number of necessary comparison after merging an element. The implementation trick that makes this fast is that the order of the sequences is stored in the instruction pointer (translated into labels in C++).
This works well for merging up to 4 sequences.
Note that making the merging stable does not come at a performance hit.
Whether the merging is done guarded or unguarded is selected by the used iterator class.
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, less equal than the total number of elements available. |
Definition at line 241 of file multiway_merge.h.
References _GLIBCXX_CALL.
_RAIter3 __gnu_parallel::multiway_merge_4_variant | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Highly efficient 4-way merging procedure.
Merging is done with the algorithm implementation described by Peter Sanders. Basically, the idea is to minimize the number of necessary comparison after merging an element. The implementation trick that makes this fast is that the order of the sequences is stored in the instruction pointer (translated into goto labels in C++).
This works well for merging up to 4 sequences.
Note that making the merging stable does not come at a performance hit.
Whether the merging is done guarded or unguarded is selected by the used iterator class.
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, less equal than the total number of elements available. |
Definition at line 360 of file multiway_merge.h.
References _GLIBCXX_CALL.
void __gnu_parallel::multiway_merge_exact_splitting | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_DifferenceType | __length, | ||
_DifferenceType | __total_length, | ||
_Compare | __comp, | ||
std::vector< std::pair< _DifferenceType, _DifferenceType > > * | __pieces | ||
) |
Exact splitting for parallel multiway-merge routine.
None of the passed sequences may be empty.
Definition at line 1120 of file multiway_merge.h.
References __equally_split(), _GLIBCXX_PARALLEL_LENGTH, std::vector< _Tp, _Alloc >::begin(), std::vector< _Tp, _Alloc >::end(), multiseq_partition(), and std::vector< _Tp, _Alloc >::resize().
Referenced by __parallel_merge_advance().
_RAIter3 __gnu_parallel::multiway_merge_loser_tree | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Multi-way merging procedure for a high branching factor, guarded case.
This merging variant uses a LoserTree class as selected by _LT
.
Stability is selected through the used LoserTree class _LT
.
At least one non-empty sequence is required.
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, less equal than the total number of elements available. |
Definition at line 491 of file multiway_merge.h.
References _GLIBCXX_CALL, and _GLIBCXX_PARALLEL_LENGTH.
_RAIter3 __gnu_parallel::multiway_merge_loser_tree_sentinel | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
const typename std::iterator_traits< typename std::iterator_traits< _RAIterIterator >::value_type::first_type >::value_type & | __sentinel, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Multi-way merging procedure for a high branching factor, requiring sentinels to exist.
UnguardedLoserTree | _Loser Tree variant to use for the unguarded merging. |
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, less equal than the total number of elements available. |
Definition at line 662 of file multiway_merge.h.
References __is_sorted(), and _GLIBCXX_CALL.
_RAIter3 __gnu_parallel::multiway_merge_loser_tree_unguarded | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
const typename std::iterator_traits< typename std::iterator_traits< _RAIterIterator >::value_type::first_type >::value_type & | __sentinel, | ||
_DifferenceTp | __length, | ||
_Compare | __comp | ||
) |
Multi-way merging procedure for a high branching factor, unguarded case.
Merging is done using the LoserTree class _LT
.
Stability is selected by the used LoserTrees.
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, less equal than the total number of elements available. |
Definition at line 574 of file multiway_merge.h.
References _GLIBCXX_CALL.
void __gnu_parallel::multiway_merge_sampling_splitting | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_DifferenceType | __length, | ||
_DifferenceType | __total_length, | ||
_Compare | __comp, | ||
std::vector< std::pair< _DifferenceType, _DifferenceType > > * | __pieces | ||
) |
Sampling based splitting for parallel multiway-merge routine.
Definition at line 1035 of file multiway_merge.h.
References _GLIBCXX_PARALLEL_LENGTH, __gnu_parallel::_Settings::get(), and __gnu_parallel::_Settings::merge_oversampling.
_RAIterOut __gnu_parallel::multiway_merge_sentinels | ( | _RAIterPairIterator | __seqs_begin, |
_RAIterPairIterator | __seqs_end, | ||
_RAIterOut | __target, | ||
_DifferenceTp | __length, | ||
_Compare | __comp, | ||
__gnu_parallel::sequential_tag | |||
) |
Multiway Merge Frontend.
Merge the sequences specified by seqs_begin and __seqs_end into __target. __seqs_begin and __seqs_end must point to a sequence of pairs. These pairs must contain an iterator to the beginning of a sequence in their first entry and an iterator the _M_end of the same sequence in their second entry.
Ties are broken arbitrarily. See stable_multiway_merge for a variant that breaks ties by sequence number but is slower.
The first entries of the pairs (i.e. the begin iterators) will be moved forward accordingly.
The output sequence has to provide enough space for all elements that are written to it.
This function will merge the input sequences:
You have to take care that the element the _M_end iterator points to is readable and contains a value that is greater than any other non-sentinel value in all sequences.
Example:
int sequences[10][11]; for (int __i = 0; __i < 10; ++__i) for (int __j = 0; __i < 11; ++__j) sequences[__i][__j] = __j; // __last one is sentinel!
int __out[33]; std::vector<std::pair<int*> > seqs; for (int __i = 0; __i < 10; ++__i) { seqs.push(std::make_pair<int*>(sequences[__i], sequences[__i] + 10)) }
multiway_merge(seqs.begin(), seqs.end(), __target, std::less<int>(), 33);
__i
, __seqs_begin
[__i].second must be the end marker of the sequence, but also reference the one more __sentinel element._RAIterPairIterator | iterator over sequence of pairs of iterators |
_RAIterOut | iterator over target sequence |
_DifferenceTp | difference type for the sequence |
_Compare | strict weak ordering type to compare elements in sequences |
__seqs_begin | __begin of sequence __sequence |
__seqs_end | _M_end of sequence __sequence |
__target | target sequence to merge to. |
__comp | strict weak ordering to use for element comparison. |
__length | Maximum length to merge, possibly larger than the number of elements available. |
Definition at line 1782 of file multiway_merge.h.
References __sequential_multiway_merge(), and _GLIBCXX_CALL.
_RAIter3 __gnu_parallel::parallel_multiway_merge | ( | _RAIterIterator | __seqs_begin, |
_RAIterIterator | __seqs_end, | ||
_RAIter3 | __target, | ||
_Splitter | __splitter, | ||
_DifferenceTp | __length, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
Parallel multi-way merge routine.
The _GLIBCXX_PARALLEL_DECISION is based on the branching factor and runtime settings.
Must not be called if the number of sequences is 1.
_Splitter | functor to split input (either __exact or sampling based) |
__stable | Stable merging incurs a performance penalty. |
__sentinel | Ignored. |
__seqs_begin | Begin iterator of iterator pair input sequence. |
__seqs_end | End iterator of iterator pair input sequence. |
__target | Begin iterator of output sequence. |
__comp | Comparator. |
__length | Maximum length to merge, possibly larger than the number of elements available. |
Definition at line 1225 of file multiway_merge.h.
References __is_sorted(), _GLIBCXX_CALL, _GLIBCXX_PARALLEL_LENGTH, __gnu_parallel::_Settings::get(), std::make_pair(), and __gnu_parallel::_Settings::merge_oversampling.
Referenced by __parallel_merge_advance().
void __gnu_parallel::parallel_sort_mwms | ( | _RAIter | __begin, |
_RAIter | __end, | ||
_Compare | __comp, | ||
_ThreadIndex | __num_threads | ||
) |
PMWMS main call.
__begin | Begin iterator of sequence. |
__end | End iterator of sequence. |
__comp | Comparator. |
__num_threads | Number of threads to use. |
Definition at line 395 of file multiway_mergesort.h.
References _GLIBCXX_CALL, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_num_threads, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_offsets, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_pieces, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_samples, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_source, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_starts, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_temporary, __gnu_parallel::_Settings::get(), std::vector< _Tp, _Alloc >::resize(), and __gnu_parallel::_Settings::sort_mwms_oversampling.
void __gnu_parallel::parallel_sort_mwms_pu | ( | _PMWMSSortingData< _RAIter > * | __sd, |
_Compare & | __comp | ||
) |
PMWMS code executed by each thread.
__sd | Pointer to algorithm data. |
__comp | Comparator. |
Definition at line 308 of file multiway_mergesort.h.
References __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_num_threads, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_pieces, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_source, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_starts, __gnu_parallel::_PMWMSSortingData< _RAIter >::_M_temporary, __gnu_parallel::_Settings::get(), std::make_pair(), __gnu_parallel::_Settings::sort_mwms_oversampling, and std::uninitialized_copy().
const int __gnu_parallel::_CASable_bits [static] |
Number of bits of _CASable.
Definition at line 130 of file types.h.
Referenced by __decode2(), and __encode2().
const _CASable __gnu_parallel::_CASable_mask [static] |
_CASable with the right half of bits set to 1.
Definition at line 133 of file types.h.
Referenced by __decode2().