@@ -35,9 +35,51 @@ static void ippsort(benchmark::State &state, Args &&...args)
35
35
}
36
36
}
37
37
38
- BENCH_SORT (ippsort, uint64_t )
39
- BENCH_SORT(ippsort, int64_t )
40
- BENCH_SORT(ippsort, uint32_t )
41
- BENCH_SORT(ippsort, int32_t )
38
+ template <typename T, class ... Args>
39
+ static void ippargsort (benchmark::State &state, Args &&...args)
40
+ {
41
+ auto args_tuple = std::make_tuple (std::move (args)...);
42
+ size_t arrsize = std::get<0 >(args_tuple);
43
+ /* IPP set up */
44
+ int bufsize = 10 ;
45
+ if constexpr (std::is_same_v<T, float >) {
46
+ ippsSortRadixIndexGetBufferSize (arrsize, ipp32f, &bufsize);
47
+ }
48
+ else if constexpr (std::is_same_v<T, double >) {
49
+ ippsSortRadixIndexGetBufferSize (arrsize, ipp64f, &bufsize);
50
+ }
51
+ else if constexpr (std::is_same_v<T, int32_t >) {
52
+ ippsSortRadixIndexGetBufferSize (arrsize, ipp32s, &bufsize);
53
+ }
54
+ unsigned char *temp = new unsigned char [bufsize];
55
+
56
+ // set up array
57
+ std::string arrtype = std::get<1 >(args_tuple);
58
+ std::vector<T> arr = get_array<T>(arrtype, arrsize);
59
+ std::vector<T> arr_bkp = arr;
60
+ std::vector<int32_t > arg (arrsize);
61
+ std::iota (arg.begin (), arg.end (), 0 );
62
+
63
+ // benchmark
64
+ for (auto _ : state) {
65
+ if constexpr (std::is_same_v<T, float >) {
66
+ ippsSortRadixIndexAscend_32f (arr.data (), 4 , arg.data (), arrsize, temp);
67
+ }
68
+ else if constexpr (std::is_same_v<T, double >) {
69
+ ippsSortRadixIndexAscend_64f (arr.data (), 8 , arg.data (), arrsize, temp);
70
+ }
71
+ else if constexpr (std::is_same_v<T, int32_t >) {
72
+ ippsSortRadixIndexAscend_32s (arr.data (), 4 , arg.data (), arrsize, temp);
73
+ }
74
+ state.PauseTiming ();
75
+ arr = arr_bkp;
76
+ std::iota (arg.begin (), arg.end (), 0 );
77
+ state.ResumeTiming ();
78
+ }
79
+ }
80
+
42
81
BENCH_SORT (ippsort, double )
43
82
BENCH_SORT(ippsort, float )
83
+ BENCH_SORT(ippargsort, double )
84
+ BENCH_SORT(ippargsort, float )
85
+ BENCH_SORT(ippargsort, int32_t )
0 commit comments