7
7
8
8
static int check_cpu_feature_support (std::string_view cpufeature)
9
9
{
10
- const char * disable_avx512 = std::getenv (" XSS_DISABLE_AVX512" );
10
+ const char * disable_avx512 = std::getenv (" XSS_DISABLE_AVX512" );
11
11
12
12
if ((cpufeature == " avx512_spr" ) && (!disable_avx512))
13
13
#ifdef __FLT16_MAX__
@@ -100,34 +100,40 @@ dispatch_requested(std::string_view cpurequested,
100
100
}
101
101
102
102
/* runtime dispatch mechanism */
103
- #define DISPATCH (func, TYPE, ... ) \
103
+ #define DISPATCH (func, TYPE, ISA ) \
104
104
DECLARE_INTERNAL_##func(TYPE) static __attribute__ ((constructor)) void \
105
105
CAT(CAT(resolve_, func), TYPE)(void ) \
106
106
{ \
107
107
CAT (CAT (internal_, func), TYPE) = &xss::scalar::func<TYPE>; \
108
108
__builtin_cpu_init (); \
109
- std::string_view preferred_cpu = find_preferred_cpu ({__VA_ARGS__} ); \
110
- if constexpr (dispatch_requested (" avx512" , {__VA_ARGS__} )) { \
109
+ std::string_view preferred_cpu = find_preferred_cpu (ISA ); \
110
+ if constexpr (dispatch_requested (" avx512" , ISA )) { \
111
111
if (preferred_cpu.find (" avx512" ) != std::string_view::npos) { \
112
112
CAT (CAT (internal_, func), TYPE) = &xss::avx512::func<TYPE>; \
113
113
return ; \
114
114
} \
115
115
} \
116
- else if constexpr (dispatch_requested (" avx2" , {__VA_ARGS__} )) { \
116
+ if constexpr (dispatch_requested (" avx2" , ISA )) { \
117
117
if (preferred_cpu.find (" avx2" ) != std::string_view::npos) { \
118
118
CAT (CAT (internal_, func), TYPE) = &xss::avx2::func<TYPE>; \
119
119
return ; \
120
120
} \
121
121
} \
122
122
}
123
123
124
+ #define ISA_LIST (...) \
125
+ std::initializer_list<std::string_view> \
126
+ { \
127
+ __VA_ARGS__ \
128
+ }
129
+
124
130
namespace x86simdsort {
125
131
#ifdef __FLT16_MAX__
126
- DISPATCH (qsort, _Float16, " avx512_spr" )
127
- DISPATCH(qselect, _Float16, " avx512_spr" )
128
- DISPATCH(partial_qsort, _Float16, " avx512_spr" )
129
- DISPATCH(argsort, _Float16, " none" )
130
- DISPATCH(argselect, _Float16, " none" )
132
+ DISPATCH (qsort, _Float16, ISA_LIST( " avx512_spr" ) )
133
+ DISPATCH(qselect, _Float16, ISA_LIST( " avx512_spr" ) )
134
+ DISPATCH(partial_qsort, _Float16, ISA_LIST( " avx512_spr" ) )
135
+ DISPATCH(argsort, _Float16, ISA_LIST( " none" ) )
136
+ DISPATCH(argselect, _Float16, ISA_LIST( " none" ) )
131
137
#endif
132
138
133
139
#define DISPATCH_ALL (func, ISA_16BIT, ISA_32BIT, ISA_64BIT ) \
@@ -140,10 +146,25 @@ DISPATCH(argselect, _Float16, "none")
140
146
DISPATCH (func, uint64_t , ISA_64BIT) \
141
147
DISPATCH (func, double , ISA_64BIT)
142
148
143
- DISPATCH_ALL (qsort, (" avx512_icl" ), (" avx512_skx" ), (" avx512_skx" ))
144
- DISPATCH_ALL (qselect, (" avx512_icl" ), (" avx512_skx" ), (" avx512_skx" ))
145
- DISPATCH_ALL (partial_qsort, (" avx512_icl" ), (" avx512_skx" ), (" avx512_skx" ))
146
- DISPATCH_ALL (argsort, " none" , " avx512_skx" , " avx512_skx" )
147
- DISPATCH_ALL (argselect, " none" , " avx512_skx" , " avx512_skx" )
149
+ DISPATCH_ALL (qsort,
150
+ (ISA_LIST(" avx512_icl" )),
151
+ (ISA_LIST(" avx512_skx" , " avx2" )),
152
+ (ISA_LIST(" avx512_skx" )))
153
+ DISPATCH_ALL (qselect,
154
+ (ISA_LIST(" avx512_icl" )),
155
+ (ISA_LIST(" avx512_skx" , " avx2" )),
156
+ (ISA_LIST(" avx512_skx" )))
157
+ DISPATCH_ALL (partial_qsort,
158
+ (ISA_LIST(" avx512_icl" )),
159
+ (ISA_LIST(" avx512_skx" , " avx2" )),
160
+ (ISA_LIST(" avx512_skx" )))
161
+ DISPATCH_ALL (argsort,
162
+ (ISA_LIST(" none" )),
163
+ (ISA_LIST(" avx512_skx" )),
164
+ (ISA_LIST(" avx512_skx" )))
165
+ DISPATCH_ALL (argselect,
166
+ (ISA_LIST(" none" )),
167
+ (ISA_LIST(" avx512_skx" )),
168
+ (ISA_LIST(" avx512_skx" )))
148
169
149
170
} // namespace x86simdsort
0 commit comments