@@ -51,6 +51,8 @@ dispatch_requested(std::string_view cpurequested,
5151 return false ;
5252}
5353
54+ namespace x86simdsort {
55+
5456#define CAT_ (a, b ) a##b
5557#define CAT (a, b ) CAT_(a, b)
5658
@@ -120,6 +122,33 @@ dispatch_requested(std::string_view cpurequested,
120122 return ; \
121123 } \
122124 } \
125+ } \
126+
127+ #define DISPATCH_KEYVALUE_SORT (TYPE1, TYPE2, ISA ) \
128+ static void (CAT(CAT(*internal_kv_qsort_, TYPE1), TYPE2))(TYPE1*, TYPE2*, size_t , bool ) = NULL; \
129+ template <> \
130+ void keyvalue_qsort (TYPE1 *key, TYPE2* val, size_t arrsize, bool hasnan) \
131+ { \
132+ (CAT (CAT (*internal_kv_qsort_, TYPE1), TYPE2))(key, val, arrsize, hasnan); \
133+ } \
134+ static __attribute__ ((constructor)) void \
135+ CAT(CAT(resolve_keyvalue_qsort_, TYPE1), TYPE2)(void ) \
136+ { \
137+ CAT (CAT (internal_kv_qsort_, TYPE1), TYPE2) = &xss::scalar::keyvalue_qsort<TYPE1, TYPE2>; \
138+ __builtin_cpu_init (); \
139+ std::string_view preferred_cpu = find_preferred_cpu (ISA); \
140+ if constexpr (dispatch_requested (" avx512" , ISA)) { \
141+ if (preferred_cpu.find (" avx512" ) != std::string_view::npos) { \
142+ CAT (CAT (internal_kv_qsort_, TYPE1), TYPE2) = &xss::avx512::keyvalue_qsort<TYPE1, TYPE2>; \
143+ return ; \
144+ } \
145+ } \
146+ if constexpr (dispatch_requested (" avx2" , ISA)) { \
147+ if (preferred_cpu.find (" avx2" ) != std::string_view::npos) { \
148+ CAT (CAT (internal_kv_qsort_, TYPE1), TYPE2) = &xss::avx2::keyvalue_qsort<TYPE1, TYPE2>; \
149+ return ; \
150+ } \
151+ } \
123152 }
124153
125154#define ISA_LIST (...) \
@@ -128,7 +157,6 @@ dispatch_requested(std::string_view cpurequested,
128157 __VA_ARGS__ \
129158 }
130159
131- namespace x86simdsort {
132160#ifdef __FLT16_MAX__
133161DISPATCH (qsort, _Float16, ISA_LIST(" avx512_spr" ))
134162DISPATCH(qselect, _Float16, ISA_LIST(" avx512_spr" ))
@@ -168,4 +196,14 @@ DISPATCH_ALL(argselect,
168196 (ISA_LIST(" avx512_skx" )),
169197 (ISA_LIST(" avx512_skx" )))
170198
199+ DISPATCH_KEYVALUE_SORT (uint64_t , int64_t , (ISA_LIST(" avx512_skx" )))
200+ DISPATCH_KEYVALUE_SORT (uint64_t , uint64_t , (ISA_LIST(" avx512_skx" )))
201+ DISPATCH_KEYVALUE_SORT (uint64_t , double , (ISA_LIST(" avx512_skx" )))
202+ DISPATCH_KEYVALUE_SORT (int64_t , int64_t , (ISA_LIST(" avx512_skx" )))
203+ DISPATCH_KEYVALUE_SORT (int64_t , uint64_t , (ISA_LIST(" avx512_skx" )))
204+ DISPATCH_KEYVALUE_SORT (int64_t , double , (ISA_LIST(" avx512_skx" )))
205+ DISPATCH_KEYVALUE_SORT (double , int64_t , (ISA_LIST(" avx512_skx" )))
206+ DISPATCH_KEYVALUE_SORT (double , double , (ISA_LIST(" avx512_skx" )))
207+ DISPATCH_KEYVALUE_SORT (double , uint64_t , (ISA_LIST(" avx512_skx" )))
208+
171209} // namespace x86simdsort
0 commit comments