@@ -160,6 +160,68 @@ namespace x86simdsort {
160
160
return ; \
161
161
} \
162
162
} \
163
+ }\
164
+ static void (CAT(CAT(*internal_kv_select_, TYPE1), TYPE2))( \
165
+ TYPE1 *, TYPE2 *, size_t , size_t , bool ) \
166
+ = NULL; \
167
+ template <> \
168
+ void keyvalue_select (TYPE1 *key, TYPE2 *val, size_t k, size_t arrsize, bool hasnan) \
169
+ { \
170
+ (CAT (CAT (*internal_kv_select_, TYPE1), TYPE2))( \
171
+ key, val, k, arrsize, hasnan); \
172
+ } \
173
+ static __attribute__ ((constructor)) void CAT( \
174
+ CAT (resolve_keyvalue_select_, TYPE1), TYPE2)(void ) \
175
+ { \
176
+ CAT (CAT (internal_kv_select_, TYPE1), TYPE2) \
177
+ = &xss::scalar::keyvalue_select<TYPE1, TYPE2>; \
178
+ __builtin_cpu_init (); \
179
+ std::string_view preferred_cpu = find_preferred_cpu (ISA); \
180
+ if constexpr (dispatch_requested (" avx512" , ISA)) { \
181
+ if (preferred_cpu.find (" avx512" ) != std::string_view::npos) { \
182
+ CAT (CAT (internal_kv_select_, TYPE1), TYPE2) \
183
+ = &xss::avx512::keyvalue_select<TYPE1, TYPE2>; \
184
+ return ; \
185
+ } \
186
+ } \
187
+ if constexpr (dispatch_requested (" avx2" , ISA)) { \
188
+ if (preferred_cpu.find (" avx2" ) != std::string_view::npos) { \
189
+ CAT (CAT (internal_kv_select_, TYPE1), TYPE2) \
190
+ = &xss::avx2::keyvalue_select<TYPE1, TYPE2>; \
191
+ return ; \
192
+ } \
193
+ } \
194
+ } \
195
+ static void (CAT(CAT(*internal_kv_partial_sort_, TYPE1), TYPE2))( \
196
+ TYPE1 *, TYPE2 *, size_t , size_t , bool ) \
197
+ = NULL; \
198
+ template <> \
199
+ void keyvalue_partial_sort (TYPE1 *key, TYPE2 *val, size_t k, size_t arrsize, bool hasnan) \
200
+ { \
201
+ (CAT (CAT (*internal_kv_partial_sort_, TYPE1), TYPE2))( \
202
+ key, val, k, arrsize, hasnan); \
203
+ } \
204
+ static __attribute__ ((constructor)) void CAT( \
205
+ CAT (resolve_keyvalue_partial_sort_, TYPE1), TYPE2)(void ) \
206
+ { \
207
+ CAT (CAT (internal_kv_partial_sort_, TYPE1), TYPE2) \
208
+ = &xss::scalar::keyvalue_partial_sort<TYPE1, TYPE2>; \
209
+ __builtin_cpu_init (); \
210
+ std::string_view preferred_cpu = find_preferred_cpu (ISA); \
211
+ if constexpr (dispatch_requested (" avx512" , ISA)) { \
212
+ if (preferred_cpu.find (" avx512" ) != std::string_view::npos) { \
213
+ CAT (CAT (internal_kv_partial_sort_, TYPE1), TYPE2) \
214
+ = &xss::avx512::keyvalue_partial_sort<TYPE1, TYPE2>; \
215
+ return ; \
216
+ } \
217
+ } \
218
+ if constexpr (dispatch_requested (" avx2" , ISA)) { \
219
+ if (preferred_cpu.find (" avx2" ) != std::string_view::npos) { \
220
+ CAT (CAT (internal_kv_partial_sort_, TYPE1), TYPE2) \
221
+ = &xss::avx2::keyvalue_partial_sort<TYPE1, TYPE2>; \
222
+ return ; \
223
+ } \
224
+ } \
163
225
}
164
226
165
227
#define ISA_LIST (...) \
0 commit comments