Vector Optimized Library of Kernels  3.3.0
Architecture-tuned implementations of math kernels
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  ************************************************/
26 void volk_test_set_warmup_ms(double ms);
28 
29 /************************************************
30  * VOLK QA type definitions *
31  ************************************************/
32 struct volk_type_t {
33  bool is_float;
34  bool is_scalar;
35  bool is_signed;
36  bool is_complex;
37  int size;
38  std::string str;
39 };
40 
42 {
43 public:
44  std::string name;
45  double time;
46  std::string units;
47  bool pass;
48 };
49 
51 {
52 public:
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 {
64 private:
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 
75 public:
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 {
135 private:
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 
142 public:
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 
176 float uniform(void);
177 void random_floats(float* buf, unsigned n);
178 
179 void load_random_data(
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 
193 bool 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))
222 typedef void (*volk_fn_1arg)(void*,
223  unsigned int,
224  const char*); // one input, operate in place
225 typedef void (*volk_fn_2arg)(void*, void*, unsigned int, const char*);
226 typedef void (*volk_fn_3arg)(void*, void*, void*, unsigned int, const char*);
227 typedef void (*volk_fn_4arg)(void*, void*, void*, void*, unsigned int, const char*);
229  void*, float, unsigned int, const char*); // one input vector, one scalar float input
230 typedef void (*volk_fn_2arg_s32f)(void*, void*, float, unsigned int, const char*);
231 typedef void (*volk_fn_3arg_s32f)(void*, void*, void*, float, unsigned int, const char*);
233  void*,
234  lv_32fc_t*,
235  unsigned int,
236  const char*); // one input vector, one scalar float input
237 typedef void (*volk_fn_2arg_s32fc)(void*, void*, lv_32fc_t*, unsigned int, const char*);
239  void*, void*, void*, lv_32fc_t*, unsigned int, const char*);
240 
241 #endif // VOLK_QA_UTILS_H
volk_test_params_t::set_regex
void set_regex(std::string regex)
Definition: qa_utils.h:96
volk_test_time_t
Definition: qa_utils.h:42
volk_fn_2arg
void(* volk_fn_2arg)(void *, void *, unsigned int, const char *)
Definition: qa_utils.h:225
volk_test_results_t::results
std::map< std::string, volk_test_time_t > results
Definition: qa_utils.h:57
volk_test_results_t
Definition: qa_utils.h:51
volk_test_case_t::desc
volk_func_desc_t desc()
Definition: qa_utils.h:143
volk_test_params_t::vlen
unsigned int vlen()
Definition: qa_utils.h:108
volk_test_params_t
Definition: qa_utils.h:63
load_random_data
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
volk_test_time_t::pass
bool pass
Definition: qa_utils.h:47
volk_type_t::str
std::string str
Definition: qa_utils.h:38
volk_type_t::size
int size
Definition: qa_utils.h:37
volk_test_params_t::add_float_edge_cases
void add_float_edge_cases(const std::vector< float > &edge_cases)
Definition: qa_utils.h:97
volk_test_time_t::name
std::string name
Definition: qa_utils.h:44
volk_test_params_t::make_tol
volk_test_params_t make_tol(float tol)
Definition: qa_utils.h:125
volk_type_t::is_scalar
bool is_scalar
Definition: qa_utils.h:34
volk_test_results_t::config_name
std::string config_name
Definition: qa_utils.h:54
void
VOLK_API void
Call into a specific implementation given by name.
Definition: volk.tmpl.h:103
volk_test_params_t::make_absolute
volk_test_params_t make_absolute(float tol)
Definition: qa_utils.h:118
run_volk_tests
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
volk_test_case_t
Definition: qa_utils.h:134
volk_test_params_t::set_scalar
void set_scalar(lv_32fc_t scalar)
Definition: qa_utils.h:92
volk_test_case_t::kernel_ptr
void(*)() kernel_ptr()
Definition: qa_utils.h:144
volk_test_case_t::puppet_master_name
std::string puppet_master_name()
Definition: qa_utils.h:146
volk_test_time_t::time
double time
Definition: qa_utils.h:45
volk_fn_4arg
void(* volk_fn_4arg)(void *, void *, void *, void *, unsigned int, const char *)
Definition: qa_utils.h:227
volk_test_get_warmup_ms
double volk_test_get_warmup_ms()
Definition: qa_utils.cc:37
volk_test_params_t::set_tol
void set_tol(float tol)
Definition: qa_utils.h:91
volk_test_results_t::vlen
unsigned int vlen
Definition: qa_utils.h:55
volk_fn_3arg_s32fc
void(* volk_fn_3arg_s32fc)(void *, void *, void *, lv_32fc_t *, unsigned int, const char *)
Definition: qa_utils.h:238
volk_test_results_t::best_arch_u
std::string best_arch_u
Definition: qa_utils.h:59
volk_type_t::is_complex
bool is_complex
Definition: qa_utils.h:36
uniform
float uniform(void)
volk_test_params_t::absolute_mode
bool absolute_mode()
Definition: qa_utils.h:111
volk_fn_3arg_s32f
void(* volk_fn_3arg_s32f)(void *, void *, void *, float, unsigned int, const char *)
Definition: qa_utils.h:231
volk_test_results_t::name
std::string name
Definition: qa_utils.h:53
volk_fn_2arg_s32fc
void(* volk_fn_2arg_s32fc)(void *, void *, lv_32fc_t *, unsigned int, const char *)
Definition: qa_utils.h:237
random_floats
void random_floats(float *buf, unsigned n)
plot_best_vs_generic.data
data
Definition: plot_best_vs_generic.py:23
volk_test_params_t::complex_edge_cases
const std::vector< lv_32fc_t > & complex_edge_cases() const
Definition: qa_utils.h:114
volk_test_params_t::iter
unsigned int iter()
Definition: qa_utils.h:109
volk_type_t
Definition: qa_utils.h:32
volk_test_reset_warmup
void volk_test_reset_warmup()
Definition: qa_utils.cc:39
volk_type_from_string
volk_type_t volk_type_from_string(std::string)
Definition: qa_utils.cc:207
volk_test_params_t::tol
float tol()
Definition: qa_utils.h:106
volk_test_params_t::volk_test_params_t
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
volk_test_params_t::benchmark_mode
bool benchmark_mode()
Definition: qa_utils.h:110
volk_fn_3arg
void(* volk_fn_3arg)(void *, void *, void *, unsigned int, const char *)
Definition: qa_utils.h:226
volk_fn_2arg_s32f
void(* volk_fn_2arg_s32f)(void *, void *, float, unsigned int, const char *)
Definition: qa_utils.h:230
volk_type_t::is_signed
bool is_signed
Definition: qa_utils.h:35
volk_test_params_t::add_complex_edge_cases
void add_complex_edge_cases(const std::vector< lv_32fc_t > &edge_cases)
Definition: qa_utils.h:101
volk_test_time_t::units
std::string units
Definition: qa_utils.h:46
volk_test_case_t::test_parameters
volk_test_params_t test_parameters()
Definition: qa_utils.h:147
volk_func_desc_t
__VOLK_DECL_BEGIN struct volk_func_desc volk_func_desc_t
Get description parameters for this kernel.
Definition: volk.tmpl.h:91
lv_32fc_t
float complex lv_32fc_t
Definition: volk_complex.h:74
volk_complex.h
volk_test_set_warmup_ms
void volk_test_set_warmup_ms(double ms)
Definition: qa_utils.cc:38
volk_test_params_t::kernel_regex
std::string kernel_regex()
Definition: qa_utils.h:112
volk_test_params_t::set_benchmark
void set_benchmark(bool benchmark)
Definition: qa_utils.h:95
volk_test_case_t::name
std::string name()
Definition: qa_utils.h:145
volk_fn_1arg
void(* volk_fn_1arg)(void *, unsigned int, const char *)
Definition: qa_utils.h:222
volk_test_params_t::float_edge_cases
const std::vector< float > & float_edge_cases() const
Definition: qa_utils.h:113
volk_test_params_t::set_iter
void set_iter(unsigned int iter)
Definition: qa_utils.h:94
volk_test_case_t::volk_test_case_t
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
volk_test_results_t::iter
unsigned int iter
Definition: qa_utils.h:56
volk_type_t::is_float
bool is_float
Definition: qa_utils.h:33
volk_test_case_t::volk_test_case_t
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
volk_test_params_t::set_vlen
void set_vlen(unsigned int vlen)
Definition: qa_utils.h:93
volk_fn_1arg_s32f
void(* volk_fn_1arg_s32f)(void *, float, unsigned int, const char *)
Definition: qa_utils.h:228
volk_test_params_t::scalar
lv_32fc_t scalar()
Definition: qa_utils.h:107
volk_fn_1arg_s32fc
void(* volk_fn_1arg_s32fc)(void *, lv_32fc_t *, unsigned int, const char *)
Definition: qa_utils.h:232
volk_test_results_t::best_arch_a
std::string best_arch_a
Definition: qa_utils.h:58