Skip to content

Commit 56623b1

Browse files
committed
README updates and formatting
1 parent 9c1b20f commit 56623b1

11 files changed

+442
-199
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ int32_t, double, uint64_t, int64_t]`
4545
4646
## Key-value sort routines on pairs of arrays
4747
```cpp
48-
void x86simdsort::keyvalue_qsort(T1* key, T2* val, size_t size, bool hasnan);
48+
void x86simdsort::keyvalue_qsort(T1* key, T2* val, size_t size, bool hasnan, bool descending);
49+
void x86simdsort::keyvalue_select(T1* key, T2* val, size_t k, size_t size, bool hasnan, bool descending);
50+
void x86simdsort::keyvalue_partial_sort(T1* key, T2* val, size_t k, size_t size, bool hasnan, bool descending);
4951
```
5052
Supported datatypes: `T1`, `T2` $\in$ `[float, uint32_t, int32_t, double,
5153
uint64_t, int64_t]` Note that keyvalue sort is not yet supported for 16-bit

benchmarks/bench-keyvalue.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ static void scalarkvsort(benchmark::State &state, Args &&...args)
1313
std::vector<T> key_bkp = key;
1414
// benchmark
1515
for (auto _ : state) {
16-
xss::scalar::keyvalue_qsort(key.data(), val.data(), arrsize, false, false);
16+
xss::scalar::keyvalue_qsort(
17+
key.data(), val.data(), arrsize, false, false);
1718
state.PauseTiming();
1819
key = key_bkp;
1920
state.ResumeTiming();

lib/x86simdsort-avx2.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,38 @@
3636

3737
#define DEFINE_KEYVALUE_METHODS_BASE(type1, type2) \
3838
template <> \
39-
void keyvalue_qsort(type1 *key, type2 *val, size_t arrsize, bool hasnan, bool descending) \
39+
void keyvalue_qsort(type1 *key, \
40+
type2 *val, \
41+
size_t arrsize, \
42+
bool hasnan, \
43+
bool descending) \
4044
{ \
41-
x86simdsortStatic::keyvalue_qsort(key, val, arrsize, hasnan, descending); \
45+
x86simdsortStatic::keyvalue_qsort( \
46+
key, val, arrsize, hasnan, descending); \
4247
} \
4348
template <> \
44-
void keyvalue_select(type1 *key, type2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
49+
void keyvalue_select(type1 *key, \
50+
type2 *val, \
51+
size_t k, \
52+
size_t arrsize, \
53+
bool hasnan, \
54+
bool descending) \
4555
{ \
46-
x86simdsortStatic::keyvalue_select(key, val, k, arrsize, hasnan, descending); \
56+
x86simdsortStatic::keyvalue_select( \
57+
key, val, k, arrsize, hasnan, descending); \
4758
} \
4859
template <> \
49-
void keyvalue_partial_sort(type1 *key, type2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
60+
void keyvalue_partial_sort(type1 *key, \
61+
type2 *val, \
62+
size_t k, \
63+
size_t arrsize, \
64+
bool hasnan, \
65+
bool descending) \
5066
{ \
51-
x86simdsortStatic::keyvalue_partial_sort(key, val, k, arrsize, hasnan, descending); \
67+
x86simdsortStatic::keyvalue_partial_sort( \
68+
key, val, k, arrsize, hasnan, descending); \
5269
}
53-
70+
5471
#define DEFINE_KEYVALUE_METHODS(type) \
5572
DEFINE_KEYVALUE_METHODS_BASE(type, uint64_t) \
5673
DEFINE_KEYVALUE_METHODS_BASE(type, int64_t) \

lib/x86simdsort-internal.h

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ namespace avx512 {
1212
qsort(T *arr, size_t arrsize, bool hasnan = false, bool descending = false);
1313
// key-value quicksort
1414
template <typename T1, typename T2>
15-
XSS_HIDE_SYMBOL void
16-
keyvalue_qsort(T1 *key, T2 *val, size_t arrsize, bool hasnan = false, bool descending = false);
15+
XSS_HIDE_SYMBOL void keyvalue_qsort(T1 *key,
16+
T2 *val,
17+
size_t arrsize,
18+
bool hasnan = false,
19+
bool descending = false);
1720
// quickselect
1821
template <typename T>
1922
XSS_HIDE_SYMBOL void qselect(T *arr,
@@ -23,8 +26,12 @@ namespace avx512 {
2326
bool descending = false);
2427
// key-value select
2528
template <typename T1, typename T2>
26-
XSS_HIDE_SYMBOL void
27-
keyvalue_select(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
29+
XSS_HIDE_SYMBOL void keyvalue_select(T1 *key,
30+
T2 *val,
31+
size_t k,
32+
size_t arrsize,
33+
bool hasnan = false,
34+
bool descending = false);
2835
// partial sort
2936
template <typename T>
3037
XSS_HIDE_SYMBOL void partial_qsort(T *arr,
@@ -34,8 +41,12 @@ namespace avx512 {
3441
bool descending = false);
3542
// key-value partial sort
3643
template <typename T1, typename T2>
37-
XSS_HIDE_SYMBOL void
38-
keyvalue_partial_sort(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
44+
XSS_HIDE_SYMBOL void keyvalue_partial_sort(T1 *key,
45+
T2 *val,
46+
size_t k,
47+
size_t arrsize,
48+
bool hasnan = false,
49+
bool descending = false);
3950
// argsort
4051
template <typename T>
4152
XSS_HIDE_SYMBOL std::vector<size_t> argsort(T *arr,
@@ -54,8 +65,11 @@ namespace avx2 {
5465
qsort(T *arr, size_t arrsize, bool hasnan = false, bool descending = false);
5566
// key-value quicksort
5667
template <typename T1, typename T2>
57-
XSS_HIDE_SYMBOL void
58-
keyvalue_qsort(T1 *key, T2 *val, size_t arrsize, bool hasnan = false, bool descending = false);
68+
XSS_HIDE_SYMBOL void keyvalue_qsort(T1 *key,
69+
T2 *val,
70+
size_t arrsize,
71+
bool hasnan = false,
72+
bool descending = false);
5973
// quickselect
6074
template <typename T>
6175
XSS_HIDE_SYMBOL void qselect(T *arr,
@@ -65,8 +79,12 @@ namespace avx2 {
6579
bool descending = false);
6680
// key-value select
6781
template <typename T1, typename T2>
68-
XSS_HIDE_SYMBOL void
69-
keyvalue_select(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
82+
XSS_HIDE_SYMBOL void keyvalue_select(T1 *key,
83+
T2 *val,
84+
size_t k,
85+
size_t arrsize,
86+
bool hasnan = false,
87+
bool descending = false);
7088
// partial sort
7189
template <typename T>
7290
XSS_HIDE_SYMBOL void partial_qsort(T *arr,
@@ -76,8 +94,12 @@ namespace avx2 {
7694
bool descending = false);
7795
// key-value partial sort
7896
template <typename T1, typename T2>
79-
XSS_HIDE_SYMBOL void
80-
keyvalue_partial_sort(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
97+
XSS_HIDE_SYMBOL void keyvalue_partial_sort(T1 *key,
98+
T2 *val,
99+
size_t k,
100+
size_t arrsize,
101+
bool hasnan = false,
102+
bool descending = false);
81103
// argsort
82104
template <typename T>
83105
XSS_HIDE_SYMBOL std::vector<size_t> argsort(T *arr,
@@ -96,8 +118,11 @@ namespace scalar {
96118
qsort(T *arr, size_t arrsize, bool hasnan = false, bool descending = false);
97119
// key-value quicksort
98120
template <typename T1, typename T2>
99-
XSS_HIDE_SYMBOL void
100-
keyvalue_qsort(T1 *key, T2 *val, size_t arrsize, bool hasnan = false, bool descending = false);
121+
XSS_HIDE_SYMBOL void keyvalue_qsort(T1 *key,
122+
T2 *val,
123+
size_t arrsize,
124+
bool hasnan = false,
125+
bool descending = false);
101126
// quickselect
102127
template <typename T>
103128
XSS_HIDE_SYMBOL void qselect(T *arr,
@@ -107,8 +132,12 @@ namespace scalar {
107132
bool descending = false);
108133
// key-value select
109134
template <typename T1, typename T2>
110-
XSS_HIDE_SYMBOL void
111-
keyvalue_select(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
135+
XSS_HIDE_SYMBOL void keyvalue_select(T1 *key,
136+
T2 *val,
137+
size_t k,
138+
size_t arrsize,
139+
bool hasnan = false,
140+
bool descending = false);
112141
// partial sort
113142
template <typename T>
114143
XSS_HIDE_SYMBOL void partial_qsort(T *arr,
@@ -118,8 +147,12 @@ namespace scalar {
118147
bool descending = false);
119148
// key-value partial sort
120149
template <typename T1, typename T2>
121-
XSS_HIDE_SYMBOL void
122-
keyvalue_partial_sort(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
150+
XSS_HIDE_SYMBOL void keyvalue_partial_sort(T1 *key,
151+
T2 *val,
152+
size_t k,
153+
size_t arrsize,
154+
bool hasnan = false,
155+
bool descending = false);
123156
// argsort
124157
template <typename T>
125158
XSS_HIDE_SYMBOL std::vector<size_t> argsort(T *arr,

lib/x86simdsort-scalar.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,30 +100,41 @@ namespace scalar {
100100
return arg;
101101
}
102102
template <typename T1, typename T2>
103-
void keyvalue_qsort(T1 *key, T2 *val, size_t arrsize, bool hasnan, bool descending)
103+
void keyvalue_qsort(
104+
T1 *key, T2 *val, size_t arrsize, bool hasnan, bool descending)
104105
{
105106
std::vector<size_t> arg = argsort(key, arrsize, hasnan, descending);
106107
utils::apply_permutation_in_place(key, arg);
107108
utils::apply_permutation_in_place(val, arg);
108109
}
109110
template <typename T1, typename T2>
110-
void keyvalue_select(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan, bool descending)
111+
void keyvalue_select(T1 *key,
112+
T2 *val,
113+
size_t k,
114+
size_t arrsize,
115+
bool hasnan,
116+
bool descending)
111117
{
112118
if (k == 0) return;
113119
// Note that this does a full partial sort, not just a select
114120
std::vector<size_t> arg = argsort(key, arrsize, hasnan, descending);
115121
//arg.resize(k);
116-
122+
117123
utils::apply_permutation_in_place(key, arg);
118124
utils::apply_permutation_in_place(val, arg);
119125
}
120126
template <typename T1, typename T2>
121-
void keyvalue_partial_sort(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan, bool descending)
127+
void keyvalue_partial_sort(T1 *key,
128+
T2 *val,
129+
size_t k,
130+
size_t arrsize,
131+
bool hasnan,
132+
bool descending)
122133
{
123134
if (k == 0) return;
124135
std::vector<size_t> arg = argsort(key, arrsize, hasnan, descending);
125136
//arg.resize(k);
126-
137+
127138
utils::apply_permutation_in_place(key, arg);
128139
utils::apply_permutation_in_place(val, arg);
129140
}

lib/x86simdsort-skx.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,38 @@
3636

3737
#define DEFINE_KEYVALUE_METHODS_BASE(type1, type2) \
3838
template <> \
39-
void keyvalue_qsort(type1 *key, type2 *val, size_t arrsize, bool hasnan, bool descending) \
39+
void keyvalue_qsort(type1 *key, \
40+
type2 *val, \
41+
size_t arrsize, \
42+
bool hasnan, \
43+
bool descending) \
4044
{ \
41-
x86simdsortStatic::keyvalue_qsort(key, val, arrsize, hasnan, descending); \
45+
x86simdsortStatic::keyvalue_qsort( \
46+
key, val, arrsize, hasnan, descending); \
4247
} \
4348
template <> \
44-
void keyvalue_select(type1 *key, type2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
49+
void keyvalue_select(type1 *key, \
50+
type2 *val, \
51+
size_t k, \
52+
size_t arrsize, \
53+
bool hasnan, \
54+
bool descending) \
4555
{ \
46-
x86simdsortStatic::keyvalue_select(key, val, k, arrsize, hasnan, descending); \
56+
x86simdsortStatic::keyvalue_select( \
57+
key, val, k, arrsize, hasnan, descending); \
4758
} \
4859
template <> \
49-
void keyvalue_partial_sort(type1 *key, type2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
60+
void keyvalue_partial_sort(type1 *key, \
61+
type2 *val, \
62+
size_t k, \
63+
size_t arrsize, \
64+
bool hasnan, \
65+
bool descending) \
5066
{ \
51-
x86simdsortStatic::keyvalue_partial_sort(key, val, k, arrsize, hasnan, descending); \
67+
x86simdsortStatic::keyvalue_partial_sort( \
68+
key, val, k, arrsize, hasnan, descending); \
5269
}
53-
70+
5471
#define DEFINE_KEYVALUE_METHODS(type) \
5572
DEFINE_KEYVALUE_METHODS_BASE(type, uint64_t) \
5673
DEFINE_KEYVALUE_METHODS_BASE(type, int64_t) \

lib/x86simdsort.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ namespace x86simdsort {
134134
TYPE1 *, TYPE2 *, size_t, bool, bool) \
135135
= NULL; \
136136
template <> \
137-
void keyvalue_qsort(TYPE1 *key, TYPE2 *val, size_t arrsize, bool hasnan, bool descending) \
137+
void keyvalue_qsort(TYPE1 *key, \
138+
TYPE2 *val, \
139+
size_t arrsize, \
140+
bool hasnan, \
141+
bool descending) \
138142
{ \
139143
(CAT(CAT(*internal_kv_qsort_, TYPE1), TYPE2))( \
140144
key, val, arrsize, hasnan, descending); \
@@ -160,12 +164,17 @@ namespace x86simdsort {
160164
return; \
161165
} \
162166
} \
163-
}\
167+
} \
164168
static void(CAT(CAT(*internal_kv_select_, TYPE1), TYPE2))( \
165169
TYPE1 *, TYPE2 *, size_t, size_t, bool, bool) \
166170
= NULL; \
167171
template <> \
168-
void keyvalue_select(TYPE1 *key, TYPE2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
172+
void keyvalue_select(TYPE1 *key, \
173+
TYPE2 *val, \
174+
size_t k, \
175+
size_t arrsize, \
176+
bool hasnan, \
177+
bool descending) \
169178
{ \
170179
(CAT(CAT(*internal_kv_select_, TYPE1), TYPE2))( \
171180
key, val, k, arrsize, hasnan, descending); \
@@ -196,7 +205,12 @@ namespace x86simdsort {
196205
TYPE1 *, TYPE2 *, size_t, size_t, bool, bool) \
197206
= NULL; \
198207
template <> \
199-
void keyvalue_partial_sort(TYPE1 *key, TYPE2 *val, size_t k, size_t arrsize, bool hasnan, bool descending) \
208+
void keyvalue_partial_sort(TYPE1 *key, \
209+
TYPE2 *val, \
210+
size_t k, \
211+
size_t arrsize, \
212+
bool hasnan, \
213+
bool descending) \
200214
{ \
201215
(CAT(CAT(*internal_kv_partial_sort_, TYPE1), TYPE2))( \
202216
key, val, k, arrsize, hasnan, descending); \

lib/x86simdsort.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,29 @@ argselect(T *arr, size_t k, size_t arrsize, bool hasnan = false);
4545

4646
// keyvalue sort
4747
template <typename T1, typename T2>
48-
XSS_EXPORT_SYMBOL void
49-
keyvalue_qsort(T1 *key, T2 *val, size_t arrsize, bool hasnan = false, bool descending = false);
48+
XSS_EXPORT_SYMBOL void keyvalue_qsort(T1 *key,
49+
T2 *val,
50+
size_t arrsize,
51+
bool hasnan = false,
52+
bool descending = false);
5053

5154
// keyvalue select
5255
template <typename T1, typename T2>
53-
XSS_EXPORT_SYMBOL void
54-
keyvalue_select(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
56+
XSS_EXPORT_SYMBOL void keyvalue_select(T1 *key,
57+
T2 *val,
58+
size_t k,
59+
size_t arrsize,
60+
bool hasnan = false,
61+
bool descending = false);
5562

5663
// keyvalue partial sort
5764
template <typename T1, typename T2>
58-
XSS_EXPORT_SYMBOL void
59-
keyvalue_partial_sort(T1 *key, T2 *val, size_t k, size_t arrsize, bool hasnan = false, bool descending = false);
65+
XSS_EXPORT_SYMBOL void keyvalue_partial_sort(T1 *key,
66+
T2 *val,
67+
size_t k,
68+
size_t arrsize,
69+
bool hasnan = false,
70+
bool descending = false);
6071

6172
// sort an object
6273
template <typename T, typename Func>

0 commit comments

Comments
 (0)