From fc1ffc8b03fa2475a5e89fcf979804cbb9cf7aa6 Mon Sep 17 00:00:00 2001 From: Raghuveer Devulapalli Date: Fri, 11 Apr 2025 13:54:25 -0700 Subject: [PATCH] Add early exit for argsort if array is already sorted --- src/xss-common-argsort.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/xss-common-argsort.h b/src/xss-common-argsort.h index 70eec0b..4f5c30d 100644 --- a/src/xss-common-argsort.h +++ b/src/xss-common-argsort.h @@ -596,7 +596,7 @@ X86_SIMD_SORT_INLINE void xss_argsort(T *arr, bool hasnan = false, bool descending = false) { - /* TODO optimization: on 32-bit, use full_vector for 32-bit dtype */ + using vectype = typename std::conditional, full_vector>::type; @@ -607,6 +607,7 @@ X86_SIMD_SORT_INLINE void xss_argsort(T *arr, full_vector>::type; if (arrsize > 1) { + /* simdargsort does not work for float/double arrays with nan */ if constexpr (xss::fp::is_floating_point_v) { if ((hasnan) && (array_has_nan(arr, arrsize))) { std_argsort_withnan(arr, arg, 0, arrsize); @@ -618,6 +619,11 @@ X86_SIMD_SORT_INLINE void xss_argsort(T *arr, } UNUSED(hasnan); + /* early exit for already sorted arrays: float/double with nan never reach here*/ + auto comp = descending ? Comparator::STDSortComparator + : Comparator::STDSortComparator; + if (std::is_sorted(arr, arr + arrsize, comp)) { return; } + #ifdef XSS_COMPILE_OPENMP bool use_parallel = arrsize > 10000;