@@ -366,7 +366,8 @@ X86_SIMD_SORT_INLINE void kvsort_(type1_t *keys,
366
366
type2_t *indexes,
367
367
arrsize_t left,
368
368
arrsize_t right,
369
- int max_iters)
369
+ int max_iters,
370
+ arrsize_t task_threshold)
370
371
{
371
372
/*
372
373
* Resort to std::sort if quicksort isnt making any progress
@@ -391,14 +392,44 @@ X86_SIMD_SORT_INLINE void kvsort_(type1_t *keys,
391
392
type1_t biggest = vtype1::type_min ();
392
393
arrsize_t pivot_index = kvpartition_unrolled<vtype1, vtype2, 4 >(
393
394
keys, indexes, left, right + 1 , pivot, &smallest, &biggest);
395
+
396
+
397
+ #if defined(XSS_USE_OPENMP) && defined(_OPENMP)
398
+ if (pivot != smallest) {
399
+ bool parallelLeft = (pivot_index - left) > task_threshold;
400
+ if (parallelLeft){
401
+ #pragma omp task if(parallelLeft)
402
+ kvsort_<vtype1, vtype2>(
403
+ keys, indexes, left, pivot_index - 1 , max_iters - 1 , task_threshold);
404
+ }else {
405
+ kvsort_<vtype1, vtype2>(
406
+ keys, indexes, left, pivot_index - 1 , max_iters - 1 , task_threshold);
407
+ }
408
+ }
409
+ if (pivot != biggest) {
410
+ bool parallelRight = (right - pivot_index) > task_threshold;
411
+
412
+ if (parallelRight){
413
+ #pragma omp task if(parallelRight)
414
+ kvsort_<vtype1, vtype2>(
415
+ keys, indexes, pivot_index, right, max_iters - 1 , task_threshold);
416
+ }else {
417
+ kvsort_<vtype1, vtype2>(
418
+ keys, indexes, pivot_index, right, max_iters - 1 , task_threshold);
419
+ }
420
+ }
421
+ #else
422
+ UNUSED (task_threshold);
423
+
394
424
if (pivot != smallest) {
395
425
kvsort_<vtype1, vtype2>(
396
- keys, indexes, left, pivot_index - 1 , max_iters - 1 );
426
+ keys, indexes, left, pivot_index - 1 , max_iters - 1 , 0 );
397
427
}
398
428
if (pivot != biggest) {
399
429
kvsort_<vtype1, vtype2>(
400
- keys, indexes, pivot_index, right, max_iters - 1 );
430
+ keys, indexes, pivot_index, right, max_iters - 1 , 0 );
401
431
}
432
+ #endif
402
433
}
403
434
404
435
template <typename vtype1,
@@ -486,7 +517,20 @@ X86_SIMD_SORT_INLINE void xss_qsort_kv(
486
517
UNUSED (hasnan);
487
518
}
488
519
489
- kvsort_<keytype, valtype>(keys, indexes, 0 , arrsize - 1 , maxiters);
520
+ #if defined(XSS_USE_OPENMP) && defined(_OPENMP)
521
+ bool useParallel = arrsize > 10000 ;
522
+ arrsize_t taskThreshold = std::max ((arrsize_t ) 10000 , arrsize / 100 );
523
+ if (useParallel){
524
+ #pragma omp parallel
525
+ #pragma omp single
526
+ kvsort_<keytype, valtype>(keys, indexes, 0 , arrsize - 1 , maxiters, taskThreshold);
527
+ }else {
528
+ kvsort_<keytype, valtype>(keys, indexes, 0 , arrsize - 1 , maxiters, taskThreshold);
529
+ }
530
+ #else
531
+ kvsort_<keytype, valtype>(keys, indexes, 0 , arrsize - 1 , maxiters, 0 );
532
+ #endif
533
+
490
534
replace_inf_with_nan (keys, arrsize, nan_count);
491
535
492
536
if (descending) {
0 commit comments