GCC Code Coverage Report


Directory: ./
File: lib/qa_utils.h
Date: 2023-10-23 23:10:04
Exec Total Coverage
Lines: 42 47 89.4%
Functions: 18 23 78.3%
Branches: 4 8 50.0%

Line Branch Exec Source
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 * VOLK QA type definitions *
24 ************************************************/
25 struct volk_type_t {
26 bool is_float;
27 bool is_scalar;
28 bool is_signed;
29 bool is_complex;
30 int size;
31 std::string str;
32 };
33
34 class volk_test_time_t
35 {
36 public:
37 std::string name;
38 double time;
39 std::string units;
40 bool pass;
41 };
42
43 class volk_test_results_t
44 {
45 public:
46 std::string name;
47 std::string config_name;
48 unsigned int vlen;
49 unsigned int iter;
50 std::map<std::string, volk_test_time_t> results;
51 std::string best_arch_a;
52 std::string best_arch_u;
53 };
54
55 class volk_test_params_t
56 {
57 private:
58 float _tol;
59 lv_32fc_t _scalar;
60 unsigned int _vlen;
61 unsigned int _iter;
62 bool _benchmark_mode;
63 bool _absolute_mode;
64 std::string _kernel_regex;
65
66 public:
67 // ctor
68 282 volk_test_params_t(float tol,
69 lv_32fc_t scalar,
70 unsigned int vlen,
71 unsigned int iter,
72 bool benchmark_mode,
73 std::string kernel_regex)
74 282 : _tol(tol),
75 282 _scalar(scalar),
76 282 _vlen(vlen),
77 282 _iter(iter),
78 282 _benchmark_mode(benchmark_mode),
79 282 _absolute_mode(false),
80 282 _kernel_regex(kernel_regex){};
81 // setters
82 282 void set_tol(float tol) { _tol = tol; };
83 564 void set_scalar(lv_32fc_t scalar) { _scalar = scalar; };
84 void set_vlen(unsigned int vlen) { _vlen = vlen; };
85 void set_iter(unsigned int iter) { _iter = iter; };
86 void set_benchmark(bool benchmark) { _benchmark_mode = benchmark; };
87 void set_regex(std::string regex) { _kernel_regex = regex; };
88 // getters
89 236 float tol() { return _tol; };
90 236 lv_32fc_t scalar() { return _scalar; };
91 236 unsigned int vlen() { return _vlen; };
92 236 unsigned int iter() { return _iter; };
93 236 bool benchmark_mode() { return _benchmark_mode; };
94 236 bool absolute_mode() { return _absolute_mode; };
95 std::string kernel_regex() { return _kernel_regex; };
96 1410 volk_test_params_t make_absolute(float tol)
97 {
98 1410 volk_test_params_t t(*this);
99 1410 t._tol = tol;
100 1410 t._absolute_mode = true;
101 1410 return t;
102 }
103 1410 volk_test_params_t make_tol(float tol)
104 {
105 1410 volk_test_params_t t(*this);
106 1410 t._tol = tol;
107 1410 return t;
108 }
109 };
110
111 class volk_test_case_t
112 {
113 private:
114 volk_func_desc_t _desc;
115 void (*_kernel_ptr)();
116 std::string _name;
117 volk_test_params_t _test_parameters;
118 std::string _puppet_master_name;
119
120 public:
121 236 volk_func_desc_t desc() { return _desc; };
122 236 void (*kernel_ptr())() { return _kernel_ptr; };
123 19706 std::string name() { return _name; };
124 236 std::string puppet_master_name() { return _puppet_master_name; };
125 236 volk_test_params_t test_parameters() { return _test_parameters; };
126 // normal ctor
127 29610 volk_test_case_t(volk_func_desc_t desc,
128 void (*t_kernel_ptr)(),
129 std::string name,
130 volk_test_params_t test_parameters)
131 29610 : _desc(desc),
132 29610 _kernel_ptr(t_kernel_ptr),
133 29610 _name(name),
134
1/2
✓ Branch 1 taken 29610 times.
✗ Branch 2 not taken.
29610 _test_parameters(test_parameters),
135
1/2
✓ Branch 1 taken 29610 times.
✗ Branch 2 not taken.
88830 _puppet_master_name("NULL"){};
136 // ctor for puppets
137 3666 volk_test_case_t(volk_func_desc_t desc,
138 void (*t_kernel_ptr)(),
139 std::string name,
140 std::string puppet_master_name,
141 volk_test_params_t test_parameters)
142 3666 : _desc(desc),
143 3666 _kernel_ptr(t_kernel_ptr),
144 3666 _name(name),
145
1/2
✓ Branch 1 taken 3666 times.
✗ Branch 2 not taken.
3666 _test_parameters(test_parameters),
146
1/2
✓ Branch 1 taken 3666 times.
✗ Branch 2 not taken.
3666 _puppet_master_name(puppet_master_name){};
147 };
148
149 /************************************************
150 * VOLK QA functions *
151 ************************************************/
152 volk_type_t volk_type_from_string(std::string);
153
154 float uniform(void);
155 void random_floats(float* buf, unsigned n);
156
157 bool run_volk_tests(volk_func_desc_t,
158 void (*)(),
159 std::string,
160 volk_test_params_t,
161 std::vector<volk_test_results_t>* results = NULL,
162 std::string puppet_master_name = "NULL");
163
164 bool run_volk_tests(volk_func_desc_t,
165 void (*)(),
166 std::string,
167 float,
168 lv_32fc_t,
169 unsigned int,
170 unsigned int,
171 std::vector<volk_test_results_t>* results = NULL,
172 std::string puppet_master_name = "NULL",
173 bool absolute_mode = false,
174 bool benchmark_mode = false);
175
176 #define VOLK_PROFILE(func, test_params, results) \
177 run_volk_tests(func##_get_func_desc(), \
178 (void (*)())func##_manual, \
179 std::string(#func), \
180 test_params, \
181 results, \
182 "NULL")
183 #define VOLK_PUPPET_PROFILE(func, puppet_master_func, test_params, results) \
184 run_volk_tests(func##_get_func_desc(), \
185 (void (*)())func##_manual, \
186 std::string(#func), \
187 test_params, \
188 results, \
189 std::string(#puppet_master_func))
190 typedef void (*volk_fn_1arg)(void*,
191 unsigned int,
192 const char*); // one input, operate in place
193 typedef void (*volk_fn_2arg)(void*, void*, unsigned int, const char*);
194 typedef void (*volk_fn_3arg)(void*, void*, void*, unsigned int, const char*);
195 typedef void (*volk_fn_4arg)(void*, void*, void*, void*, unsigned int, const char*);
196 typedef void (*volk_fn_1arg_s32f)(
197 void*, float, unsigned int, const char*); // one input vector, one scalar float input
198 typedef void (*volk_fn_2arg_s32f)(void*, void*, float, unsigned int, const char*);
199 typedef void (*volk_fn_3arg_s32f)(void*, void*, void*, float, unsigned int, const char*);
200 typedef void (*volk_fn_1arg_s32fc)(
201 void*,
202 lv_32fc_t,
203 unsigned int,
204 const char*); // one input vector, one scalar float input
205 typedef void (*volk_fn_2arg_s32fc)(void*, void*, lv_32fc_t, unsigned int, const char*);
206 typedef void (*volk_fn_3arg_s32fc)(
207 void*, void*, void*, lv_32fc_t, unsigned int, const char*);
208
209 #endif // VOLK_QA_UTILS_H
210