Skip to content

Commit 59e298d

Browse files
authored
Merge pull request #173 from r-devulap/postgres
Expose C-API's for some of the keyvalue qsort
2 parents d6e0d49 + 3829f41 commit 59e298d

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

example.c

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include <stdio.h>
2+
#include <stdint.h>
3+
#include <stdlib.h>
4+
#include <stdbool.h>
5+
6+
// declare function here, linker will find this when linked to
7+
// libx86simdsortcpp.so
8+
void keyvalue_qsort_float_sizet(float *, size_t *, size_t);
9+
void keyvalue_qsort_float_uint32(float *, uint32_t *, uint32_t);
10+
void keyvalue_qsort_sizet_sizet(size_t *, size_t *, size_t);
11+
void keyvalue_qsort_sizet_uint32(size_t *, uint32_t *, uint32_t);
12+
void keyvalue_qsort_uint32_sizet(uint32_t *, size_t *, size_t);
13+
void keyvalue_qsort_uint32_uint32(uint32_t *, uint32_t *, uint32_t);
14+
void keyvalue_qsort_int32_sizet(int32_t *, size_t *, size_t);
15+
void keyvalue_qsort_int32_uint32(int32_t *, uint32_t *, uint32_t);
16+
17+
// struct definition, we will sort an array of these:
18+
struct Point {
19+
int x;
20+
int y;
21+
float distance;
22+
size_t metric;
23+
};
24+
25+
#define SWAP(a, b, type) \
26+
{ \
27+
type temp = a; \
28+
a = b; \
29+
b = temp; \
30+
}
31+
32+
// Function to sort an array of objects:
33+
void object_qsort(struct Point *arr, size_t size)
34+
{
35+
/* (1) Create and initialize arrays of key and value */
36+
size_t *key = malloc(size * sizeof(size_t));
37+
size_t *arg = malloc(size * sizeof(size_t));
38+
bool *done = malloc(size * sizeof(bool));
39+
for (size_t ii = 0; ii < size; ++ii) {
40+
key[ii] = arr[ii].metric;
41+
arg[ii] = ii;
42+
done[ii] = false;
43+
}
44+
45+
/* (2) IndexSort using the keyvalue_qsort */
46+
keyvalue_qsort_sizet_sizet(key, arg, size);
47+
48+
/* (3) Permute obj array in-place */
49+
for (size_t ii = 0; ii < size; ++ii) {
50+
if (done[ii]) { continue; }
51+
done[ii] = true;
52+
size_t prev_j = ii;
53+
size_t jj = arg[ii];
54+
while (ii != jj) {
55+
SWAP(arr[prev_j], arr[jj], struct Point);
56+
done[jj] = true;
57+
prev_j = jj;
58+
jj = arg[jj];
59+
}
60+
}
61+
free(key);
62+
free(arg);
63+
free(done);
64+
}
65+
66+
int main()
67+
{
68+
const size_t size = 10;
69+
struct Point arr[size];
70+
71+
// Initialize:
72+
for (size_t ii = 0; ii < size; ++ii) {
73+
arr[ii].distance = (float)rand() / RAND_MAX;
74+
arr[ii].metric = rand() % 100;
75+
}
76+
77+
// sort:
78+
object_qsort(arr, size);
79+
80+
// check if it is sorted:
81+
printf("arr = ");
82+
for (size_t ii = 0; ii < size; ++ii) {
83+
printf("%ld, ", arr[ii].metric);
84+
}
85+
printf("\n");
86+
return 0;
87+
}

lib/x86simdsort.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,47 @@ DISPATCH_KEYVALUE_SORT_FORTYPE(int32_t)
265265
DISPATCH_KEYVALUE_SORT_FORTYPE(float)
266266

267267
} // namespace x86simdsort
268+
//
269+
270+
extern "C" {
271+
XSS_EXPORT_SYMBOL
272+
void keyvalue_qsort_float_uint32(float *key, uint32_t *val, uint32_t size)
273+
{
274+
x86simdsort::keyvalue_qsort(key, val, size, true);
275+
}
276+
XSS_EXPORT_SYMBOL
277+
void keyvalue_qsort_float_sizet(float *key, size_t *val, size_t size)
278+
{
279+
x86simdsort::keyvalue_qsort(key, val, size, true);
280+
}
281+
XSS_EXPORT_SYMBOL
282+
void keyvalue_qsort_sizet_uint32(size_t *key, uint32_t *val, uint32_t size)
283+
{
284+
x86simdsort::keyvalue_qsort(key, val, size, true);
285+
}
286+
XSS_EXPORT_SYMBOL
287+
void keyvalue_qsort_sizet_sizet(size_t *key, size_t *val, size_t size)
288+
{
289+
x86simdsort::keyvalue_qsort(key, val, size, true);
290+
}
291+
XSS_EXPORT_SYMBOL
292+
void keyvalue_qsort_int32_uint32(int32_t *key, uint32_t *val, uint32_t size)
293+
{
294+
x86simdsort::keyvalue_qsort(key, val, size, true);
295+
}
296+
XSS_EXPORT_SYMBOL
297+
void keyvalue_qsort_int32_sizet(int32_t *key, size_t *val, size_t size)
298+
{
299+
x86simdsort::keyvalue_qsort(key, val, size, true);
300+
}
301+
XSS_EXPORT_SYMBOL
302+
void keyvalue_qsort_uint32_uint32(uint32_t *key, uint32_t *val, uint32_t size)
303+
{
304+
x86simdsort::keyvalue_qsort(key, val, size, true);
305+
}
306+
XSS_EXPORT_SYMBOL
307+
void keyvalue_qsort_uint32_sizet(uint32_t *key, size_t *val, size_t size)
308+
{
309+
x86simdsort::keyvalue_qsort(key, val, size, true);
310+
}
311+
}

0 commit comments

Comments
 (0)