| 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 |