Vector Optimized Library of Kernels 3.3.0
Architecture-tuned implementations of math kernels
Loading...
Searching...
No Matches
qa_utils.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2011 - 2020, 2022 Free Software Foundation, Inc.
4 *
5 * This file is part of VOLK
6 *
7 * SPDX-License-Identifier: LGPL-3.0-or-later
8 */
9
10#ifndef VOLK_QA_UTILS_H
11#define VOLK_QA_UTILS_H
12
13#include <stdbool.h> // for bool, false
14#include <volk/volk.h> // for volk_func_desc_t
15#include <cstdlib> // for NULL
16#include <map> // for map
17#include <string> // for string, basic_string
18#include <vector> // for vector
19
20#include "volk/volk_complex.h" // for lv_32fc_t
21
22/************************************************
23 * Warmup time configuration *
24 ************************************************/
26void volk_test_set_warmup_ms(double ms);
28
29/************************************************
30 * VOLK QA type definitions *
31 ************************************************/
37 int size;
38 std::string str;
39};
40
42{
43public:
44 std::string name;
45 double time;
46 std::string units;
47 bool pass;
48};
49
51{
52public:
53 std::string name;
54 std::string config_name;
55 unsigned int vlen;
56 unsigned int iter;
57 std::map<std::string, volk_test_time_t> results;
58 std::string best_arch_a;
59 std::string best_arch_u;
60};
61
63{
64private:
65 float _tol;
66 lv_32fc_t _scalar;
67 unsigned int _vlen;
68 unsigned int _iter;
69 bool _benchmark_mode;
70 bool _absolute_mode;
71 std::string _kernel_regex;
72 std::vector<float> _float_edge_cases;
73 std::vector<lv_32fc_t> _complex_edge_cases;
74
75public:
76 // ctor
79 unsigned int vlen,
80 unsigned int iter,
81 bool benchmark_mode,
82 std::string kernel_regex)
83 : _tol(tol),
84 _scalar(scalar),
85 _vlen(vlen),
86 _iter(iter),
87 _benchmark_mode(benchmark_mode),
88 _absolute_mode(false),
89 _kernel_regex(kernel_regex){};
90 // setters
91 void set_tol(float tol) { _tol = tol; };
92 void set_scalar(lv_32fc_t scalar) { _scalar = scalar; };
93 void set_vlen(unsigned int vlen) { _vlen = vlen; };
94 void set_iter(unsigned int iter) { _iter = iter; };
95 void set_benchmark(bool benchmark) { _benchmark_mode = benchmark; };
96 void set_regex(std::string regex) { _kernel_regex = regex; };
97 void add_float_edge_cases(const std::vector<float>& edge_cases)
98 {
99 _float_edge_cases = edge_cases;
100 };
101 void add_complex_edge_cases(const std::vector<lv_32fc_t>& edge_cases)
102 {
103 _complex_edge_cases = edge_cases;
104 };
105 // getters
106 float tol() { return _tol; };
107 lv_32fc_t scalar() { return _scalar; };
108 unsigned int vlen() { return _vlen; };
109 unsigned int iter() { return _iter; };
110 bool benchmark_mode() { return _benchmark_mode; };
111 bool absolute_mode() { return _absolute_mode; };
112 std::string kernel_regex() { return _kernel_regex; };
113 const std::vector<float>& float_edge_cases() const { return _float_edge_cases; };
114 const std::vector<lv_32fc_t>& complex_edge_cases() const
115 {
116 return _complex_edge_cases;
117 };
119 {
120 volk_test_params_t t(*this);
121 t._tol = tol;
122 t._absolute_mode = true;
123 return t;
124 }
126 {
127 volk_test_params_t t(*this);
128 t._tol = tol;
129 return t;
130 }
131};
132
134{
135private:
136 volk_func_desc_t _desc;
137 void (*_kernel_ptr)();
138 std::string _name;
139 volk_test_params_t _test_parameters;
140 std::string _puppet_master_name;
141
142public:
143 volk_func_desc_t desc() { return _desc; };
144 void (*kernel_ptr())() { return _kernel_ptr; };
145 std::string name() { return _name; };
146 std::string puppet_master_name() { return _puppet_master_name; };
147 volk_test_params_t test_parameters() { return _test_parameters; };
148 // normal ctor
150 void (*t_kernel_ptr)(),
151 std::string name,
153 : _desc(desc),
154 _kernel_ptr(t_kernel_ptr),
155 _name(name),
156 _test_parameters(test_parameters),
157 _puppet_master_name("NULL"){};
158 // ctor for puppets
160 void (*t_kernel_ptr)(),
161 std::string name,
162 std::string puppet_master_name,
164 : _desc(desc),
165 _kernel_ptr(t_kernel_ptr),
166 _name(name),
167 _test_parameters(test_parameters),
168 _puppet_master_name(puppet_master_name){};
169};
170
171/************************************************
172 * VOLK QA functions *
173 ************************************************/
175
176float uniform(void);
177void random_floats(float* buf, unsigned n);
178
180 void* data,
181 volk_type_t type,
182 unsigned int n,
183 const std::vector<float>& float_edge_cases = std::vector<float>(),
184 const std::vector<lv_32fc_t>& complex_edge_cases = std::vector<lv_32fc_t>());
185
187 void (*)(),
188 std::string,
190 std::vector<volk_test_results_t>* results = NULL,
191 std::string puppet_master_name = "NULL");
192
193bool run_volk_tests(
195 void (*)(),
196 std::string,
197 float,
198 lv_32fc_t,
199 unsigned int,
200 unsigned int,
201 std::vector<volk_test_results_t>* results = NULL,
202 std::string puppet_master_name = "NULL",
203 bool absolute_mode = false,
204 bool benchmark_mode = false,
205 const std::vector<float>& float_edge_cases = std::vector<float>(),
206 const std::vector<lv_32fc_t>& complex_edge_cases = std::vector<lv_32fc_t>());
207
208#define VOLK_PROFILE(func, test_params, results) \
209 run_volk_tests(func##_get_func_desc(), \
210 (void (*)())func##_manual, \
211 std::string(#func), \
212 test_params, \
213 results, \
214 "NULL")
215#define VOLK_PUPPET_PROFILE(func, puppet_master_func, test_params, results) \
216 run_volk_tests(func##_get_func_desc(), \
217 (void (*)())func##_manual, \
218 std::string(#func), \
219 test_params, \
220 results, \
221 std::string(#puppet_master_func))
222typedef void (*volk_fn_1arg)(void*,
223 unsigned int,
224 const char*); // one input, operate in place
225typedef void (*volk_fn_2arg)(void*, void*, unsigned int, const char*);
226typedef void (*volk_fn_3arg)(void*, void*, void*, unsigned int, const char*);
227typedef void (*volk_fn_4arg)(void*, void*, void*, void*, unsigned int, const char*);
228typedef void (*volk_fn_1arg_s32f)(
229 void*, float, unsigned int, const char*); // one input vector, one scalar float input
230typedef void (*volk_fn_2arg_s32f)(void*, void*, float, unsigned int, const char*);
231typedef void (*volk_fn_3arg_s32f)(void*, void*, void*, float, unsigned int, const char*);
232typedef void (*volk_fn_1arg_s32fc)(
233 void*,
234 lv_32fc_t*,
235 unsigned int,
236 const char*); // one input vector, one scalar float input
237typedef void (*volk_fn_2arg_s32fc)(void*, void*, lv_32fc_t*, unsigned int, const char*);
238typedef void (*volk_fn_3arg_s32fc)(
239 void*, void*, void*, lv_32fc_t*, unsigned int, const char*);
240
241#endif // VOLK_QA_UTILS_H
volk_func_desc_t desc()
Definition qa_utils.h:143
std::string puppet_master_name()
Definition qa_utils.h:146
void(*)() kernel_ptr()
Definition qa_utils.h:144
volk_test_params_t test_parameters()
Definition qa_utils.h:147
volk_test_case_t(volk_func_desc_t desc, void(*t_kernel_ptr)(), std::string name, std::string puppet_master_name, volk_test_params_t test_parameters)
Definition qa_utils.h:159
std::string name()
Definition qa_utils.h:145
volk_test_case_t(volk_func_desc_t desc, void(*t_kernel_ptr)(), std::string name, volk_test_params_t test_parameters)
Definition qa_utils.h:149
Definition qa_utils.h:63
lv_32fc_t scalar()
Definition qa_utils.h:107
unsigned int iter()
Definition qa_utils.h:109
volk_test_params_t make_absolute(float tol)
Definition qa_utils.h:118
volk_test_params_t make_tol(float tol)
Definition qa_utils.h:125
unsigned int vlen()
Definition qa_utils.h:108
void set_tol(float tol)
Definition qa_utils.h:91
bool absolute_mode()
Definition qa_utils.h:111
void set_iter(unsigned int iter)
Definition qa_utils.h:94
void set_benchmark(bool benchmark)
Definition qa_utils.h:95
void set_scalar(lv_32fc_t scalar)
Definition qa_utils.h:92
void set_vlen(unsigned int vlen)
Definition qa_utils.h:93
std::string kernel_regex()
Definition qa_utils.h:112
const std::vector< float > & float_edge_cases() const
Definition qa_utils.h:113
volk_test_params_t(float tol, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, bool benchmark_mode, std::string kernel_regex)
Definition qa_utils.h:77
const std::vector< lv_32fc_t > & complex_edge_cases() const
Definition qa_utils.h:114
void add_complex_edge_cases(const std::vector< lv_32fc_t > &edge_cases)
Definition qa_utils.h:101
void add_float_edge_cases(const std::vector< float > &edge_cases)
Definition qa_utils.h:97
void set_regex(std::string regex)
Definition qa_utils.h:96
float tol()
Definition qa_utils.h:106
bool benchmark_mode()
Definition qa_utils.h:110
Definition qa_utils.h:51
std::string name
Definition qa_utils.h:53
std::string config_name
Definition qa_utils.h:54
unsigned int iter
Definition qa_utils.h:56
std::map< std::string, volk_test_time_t > results
Definition qa_utils.h:57
std::string best_arch_a
Definition qa_utils.h:58
std::string best_arch_u
Definition qa_utils.h:59
unsigned int vlen
Definition qa_utils.h:55
Definition qa_utils.h:42
double time
Definition qa_utils.h:45
std::string name
Definition qa_utils.h:44
std::string units
Definition qa_utils.h:46
bool pass
Definition qa_utils.h:47
void volk_test_reset_warmup()
Definition qa_utils.cc:39
volk_type_t volk_type_from_string(std::string)
Definition qa_utils.cc:207
void(* volk_fn_1arg)(void *, unsigned int, const char *)
Definition qa_utils.h:222
void volk_test_set_warmup_ms(double ms)
Definition qa_utils.cc:38
void(* volk_fn_3arg_s32fc)(void *, void *, void *, lv_32fc_t *, unsigned int, const char *)
Definition qa_utils.h:238
void(* volk_fn_3arg)(void *, void *, void *, unsigned int, const char *)
Definition qa_utils.h:226
void(* volk_fn_2arg_s32fc)(void *, void *, lv_32fc_t *, unsigned int, const char *)
Definition qa_utils.h:237
void(* volk_fn_2arg_s32f)(void *, void *, float, unsigned int, const char *)
Definition qa_utils.h:230
void load_random_data(void *data, volk_type_t type, unsigned int n, const std::vector< float > &float_edge_cases=std::vector< float >(), const std::vector< lv_32fc_t > &complex_edge_cases=std::vector< lv_32fc_t >())
Definition qa_utils.cc:51
float uniform(void)
void(* volk_fn_1arg_s32fc)(void *, lv_32fc_t *, unsigned int, const char *)
Definition qa_utils.h:232
double volk_test_get_warmup_ms()
Definition qa_utils.cc:37
void(* volk_fn_4arg)(void *, void *, void *, void *, unsigned int, const char *)
Definition qa_utils.h:227
void(* volk_fn_2arg)(void *, void *, unsigned int, const char *)
Definition qa_utils.h:225
void(* volk_fn_1arg_s32f)(void *, float, unsigned int, const char *)
Definition qa_utils.h:228
bool run_volk_tests(volk_func_desc_t, void(*)(), std::string, volk_test_params_t, std::vector< volk_test_results_t > *results=NULL, std::string puppet_master_name="NULL")
Definition qa_utils.cc:758
void(* volk_fn_3arg_s32f)(void *, void *, void *, float, unsigned int, const char *)
Definition qa_utils.h:231
void random_floats(float *buf, unsigned n)
Definition qa_utils.h:32
bool is_signed
Definition qa_utils.h:35
bool is_complex
Definition qa_utils.h:36
bool is_scalar
Definition qa_utils.h:34
std::string str
Definition qa_utils.h:38
bool is_float
Definition qa_utils.h:33
int size
Definition qa_utils.h:37
__VOLK_DECL_BEGIN struct volk_func_desc volk_func_desc_t
float complex lv_32fc_t
Definition volk_complex.h:74