@@ -72,7 +72,7 @@ X86_SIMD_SORT_INLINE arrsize_t kvpartition(type_t1 *keys,
72
72
for (int32_t i = (right - left) % vtype1::numlanes; i > 0 ; --i) {
73
73
*smallest = std::min (*smallest, keys[left]);
74
74
*biggest = std::max (*biggest, keys[left]);
75
- if (keys[left] > pivot) {
75
+ if (keys[left] >= pivot) {
76
76
right--;
77
77
std::swap (keys[left], keys[right]);
78
78
std::swap (indexes[left], indexes[right]);
@@ -204,12 +204,13 @@ X86_SIMD_SORT_INLINE arrsize_t kvpartition_unrolled(type_t1 *keys,
204
204
return kvpartition<vtype1, vtype2>(
205
205
keys, indexes, left, right, pivot, smallest, biggest);
206
206
}
207
+
207
208
/* make array length divisible by vtype1::numlanes , shortening the array */
208
209
for (int32_t i = ((right - left) % (num_unroll * vtype1::numlanes)); i > 0 ;
209
210
--i) {
210
211
*smallest = std::min (*smallest, keys[left]);
211
212
*biggest = std::max (*biggest, keys[left]);
212
- if (keys[left] > pivot) {
213
+ if (keys[left] >= pivot) {
213
214
right--;
214
215
std::swap (keys[left], keys[right]);
215
216
std::swap (indexes[left], indexes[right]);
@@ -386,21 +387,27 @@ X86_SIMD_SORT_INLINE void kvsort_(type1_t *keys,
386
387
* Base case: use bitonic networks to sort arrays <= 128
387
388
*/
388
389
if (right + 1 - left <= 128 ) {
389
-
390
390
kvsort_n<vtype1, vtype2, 128 >(
391
391
keys + left, indexes + left, (int32_t )(right + 1 - left));
392
392
return ;
393
393
}
394
394
395
+ // Ascending comparator for this vtype
396
+ using comparator = Comparator<vtype1, false >;
395
397
type1_t pivot;
396
- auto pivot_result = get_pivot_smart<vtype1, type1_t >(keys, left, right);
398
+ auto pivot_result
399
+ = get_pivot_smart<vtype1, comparator, type1_t >(keys, left, right);
397
400
pivot = pivot_result.pivot ;
398
401
402
+ if (pivot_result.result == pivot_result_t ::Sorted) { return ; }
403
+
399
404
type1_t smallest = vtype1::type_max ();
400
405
type1_t biggest = vtype1::type_min ();
401
406
arrsize_t pivot_index = kvpartition_unrolled<vtype1, vtype2, 4 >(
402
407
keys, indexes, left, right + 1 , pivot, &smallest, &biggest);
403
408
409
+ if (pivot_result.result == pivot_result_t ::Only2Values) { return ; }
410
+
404
411
#ifdef XSS_COMPILE_OPENMP
405
412
if (pivot != smallest) {
406
413
bool parallel_left = (pivot_index - left) > task_threshold;
0 commit comments