Skip to content

Commit 92b7797

Browse files
author
Raghuveer Devulapalli
committed
Update benchmarks to use x86simdsort shared library
1 parent 3899385 commit 92b7797

13 files changed

+302
-402
lines changed

benchmarks/bench-argsort.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include "bench-qsort-common.h"
2+
3+
template <typename T>
4+
std::vector<int64_t> stdargsort(const std::vector<T> &array)
5+
{
6+
std::vector<int64_t> indices(array.size());
7+
std::iota(indices.begin(), indices.end(), 0);
8+
std::sort(indices.begin(),
9+
indices.end(),
10+
[&array](int64_t left, int64_t right) -> bool {
11+
// sort indices according to corresponding array element
12+
return array[left] < array[right];
13+
});
14+
15+
return indices;
16+
}
17+
18+
template <typename T, class... Args>
19+
static void scalarargsort(benchmark::State &state, Args &&...args)
20+
{
21+
// get args
22+
auto args_tuple = std::make_tuple(std::move(args)...);
23+
size_t arrsize = std::get<0>(args_tuple);
24+
std::string arrtype = std::get<1>(args_tuple);
25+
// set up array
26+
std::vector<T> arr = get_array<T>(arrtype, arrsize);
27+
std::vector<T> arr_bkp = arr;
28+
std::vector<int64_t> inx;
29+
// benchmark
30+
for (auto _ : state) {
31+
inx = stdargsort(arr);
32+
}
33+
}
34+
35+
template <typename T, class... Args>
36+
static void simdargsort(benchmark::State &state, Args &&...args)
37+
{
38+
// get args
39+
auto args_tuple = std::make_tuple(std::move(args)...);
40+
size_t arrsize = std::get<0>(args_tuple);
41+
std::string arrtype = std::get<1>(args_tuple);
42+
// set up array
43+
std::vector<T> arr = get_array<T>(arrtype, arrsize);
44+
std::vector<T> arr_bkp = arr;
45+
std::vector<int64_t> inx;
46+
// benchmark
47+
for (auto _ : state) {
48+
inx = x86simdsort::argsort(arr.data(), arrsize);
49+
}
50+
}
51+
52+
#define BENCH_BOTH(type) \
53+
BENCH_SORT(simdargsort, type) \
54+
BENCH_SORT(scalarargsort, type)
55+
56+
BENCH_BOTH(int64_t)
57+
BENCH_BOTH(uint64_t)
58+
BENCH_BOTH(double)
59+
BENCH_BOTH(int32_t)
60+
BENCH_BOTH(uint32_t)
61+
BENCH_BOTH(float)

benchmarks/bench-argsort.hpp

Lines changed: 0 additions & 96 deletions
This file was deleted.

benchmarks/bench-partial-qsort.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "bench-qsort-common.h"
2+
3+
template <typename T, class... Args>
4+
static void simdpartialsort(benchmark::State &state, Args &&...args)
5+
{
6+
// Perform setup here
7+
auto args_tuple = std::make_tuple(std::move(args)...);
8+
int64_t ARRSIZE = std::get<0>(args_tuple);
9+
int64_t k = std::get<1>(args_tuple);
10+
std::vector<T> arr;
11+
std::vector<T> arr_bkp;
12+
13+
/* Initialize elements */
14+
arr = get_uniform_rand_array<T>(ARRSIZE);
15+
arr_bkp = arr;
16+
17+
/* call simdpartialsort */
18+
for (auto _ : state) {
19+
x86simdsort::partial_qsort<T>(arr.data(), k, ARRSIZE);
20+
21+
state.PauseTiming();
22+
arr = arr_bkp;
23+
state.ResumeTiming();
24+
}
25+
}
26+
27+
template <typename T, class... Args>
28+
static void scalarpartialsort(benchmark::State &state, Args &&...args)
29+
{
30+
// Perform setup here
31+
auto args_tuple = std::make_tuple(std::move(args)...);
32+
int64_t ARRSIZE = std::get<0>(args_tuple);
33+
int64_t k = std::get<1>(args_tuple);
34+
std::vector<T> arr;
35+
std::vector<T> arr_bkp;
36+
37+
/* Initialize elements */
38+
arr = get_uniform_rand_array<T>(ARRSIZE);
39+
arr_bkp = arr;
40+
41+
/* call std::partial_sort */
42+
for (auto _ : state) {
43+
std::partial_sort(arr.begin(), arr.begin() + k, arr.end());
44+
45+
state.PauseTiming();
46+
arr = arr_bkp;
47+
state.ResumeTiming();
48+
}
49+
}
50+
51+
#define BENCH_BOTH_PARTIAL(type) \
52+
BENCH_PARTIAL(simdpartialsort, type) \
53+
BENCH_PARTIAL(scalarpartialsort, type)
54+
55+
BENCH_BOTH_PARTIAL(uint64_t)
56+
BENCH_BOTH_PARTIAL(int64_t)
57+
BENCH_BOTH_PARTIAL(uint32_t)
58+
BENCH_BOTH_PARTIAL(int32_t)
59+
BENCH_BOTH_PARTIAL(uint16_t)
60+
BENCH_BOTH_PARTIAL(int16_t)
61+
BENCH_BOTH_PARTIAL(float)
62+
BENCH_BOTH_PARTIAL(double)

benchmarks/bench-partial-qsort.hpp

Lines changed: 0 additions & 102 deletions
This file was deleted.

benchmarks/bench-qselect.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "bench-qsort-common.h"
2+
3+
template <typename T, class... Args>
4+
static void simdqselect(benchmark::State &state, Args &&...args)
5+
{
6+
// Perform setup here
7+
auto args_tuple = std::make_tuple(std::move(args)...);
8+
int64_t ARRSIZE = std::get<0>(args_tuple);
9+
int64_t k = std::get<1>(args_tuple);
10+
std::vector<T> arr;
11+
std::vector<T> arr_bkp;
12+
13+
/* Initialize elements */
14+
arr = get_uniform_rand_array<T>(ARRSIZE);
15+
arr_bkp = arr;
16+
17+
/* call avx512 quickselect */
18+
for (auto _ : state) {
19+
x86simdsort::qselect<T>(arr.data(), k, ARRSIZE);
20+
21+
state.PauseTiming();
22+
arr = arr_bkp;
23+
state.ResumeTiming();
24+
}
25+
}
26+
27+
template <typename T, class... Args>
28+
static void scalarqselect(benchmark::State &state, Args &&...args)
29+
{
30+
// Perform setup here
31+
auto args_tuple = std::make_tuple(std::move(args)...);
32+
int64_t ARRSIZE = std::get<0>(args_tuple);
33+
int64_t k = std::get<1>(args_tuple);
34+
std::vector<T> arr;
35+
std::vector<T> arr_bkp;
36+
37+
/* Initialize elements */
38+
arr = get_uniform_rand_array<T>(ARRSIZE);
39+
arr_bkp = arr;
40+
41+
/* call std::nth_element */
42+
for (auto _ : state) {
43+
std::nth_element(arr.begin(), arr.begin() + k, arr.end());
44+
45+
state.PauseTiming();
46+
arr = arr_bkp;
47+
state.ResumeTiming();
48+
}
49+
}
50+
51+
#define BENCH_BOTH_QSELECT(type) \
52+
BENCH_PARTIAL(simdqselect, type) \
53+
BENCH_PARTIAL(scalarqselect, type)
54+
55+
BENCH_BOTH_QSELECT(uint64_t)
56+
BENCH_BOTH_QSELECT(int64_t)
57+
BENCH_BOTH_QSELECT(uint32_t)
58+
BENCH_BOTH_QSELECT(int32_t)
59+
BENCH_BOTH_QSELECT(uint16_t)
60+
BENCH_BOTH_QSELECT(int16_t)
61+
BENCH_BOTH_QSELECT(float)
62+
BENCH_BOTH_QSELECT(double)

0 commit comments

Comments
 (0)