35 class CLTuningParametersList :
public ICLTuningParametersList
40 std::vector<unsigned int> _lws_x{0};
41 std::vector<unsigned int> _lws_y{0};
42 std::vector<unsigned int> _lws_z{0};
43 std::vector<int> _wbsm{0};
48 CLTuningParametersList() =
default;
50 CLTuningParametersList(
const CLTuningParametersList &) =
default;
52 CLTuningParametersList(CLTuningParametersList &&) noexcept(true) =
default;
54 CLTuningParametersList &operator=(const CLTuningParametersList &) =
default;
56 CLTuningParametersList &operator=(CLTuningParametersList &&) noexcept(true) =
default;
58 virtual ~CLTuningParametersList() =
default;
61 virtual
size_t size() override;
65 class CLTuningParametersListExhaustive : public CLTuningParametersList
69 CLTuningParametersListExhaustive() =
delete;
71 CLTuningParametersListExhaustive(
const cl::NDRange &gws, CLTuningInfo tuning_info);
73 CLTuningParametersListExhaustive(
const CLTuningParametersListExhaustive &) =
default;
75 CLTuningParametersListExhaustive(CLTuningParametersListExhaustive &&) noexcept(true) =
default;
77 CLTuningParametersListExhaustive &operator=(const CLTuningParametersListExhaustive &) =
default;
79 CLTuningParametersListExhaustive &operator=(CLTuningParametersListExhaustive &&) noexcept(true) =
default;
81 ~CLTuningParametersListExhaustive() =
default;
84 CLTuningParams operator[](
size_t) override;
88 class CLTuningParametersListNormal : public CLTuningParametersList
92 CLTuningParametersListNormal(
const cl::NDRange &gws, CLTuningInfo tuning_info);
94 CLTuningParametersListNormal(
const CLTuningParametersListNormal &) =
default;
96 CLTuningParametersListNormal(CLTuningParametersListNormal &&) noexcept(true) =
default;
98 CLTuningParametersListNormal &operator=(const CLTuningParametersListNormal &) =
default;
100 CLTuningParametersListNormal &operator=(CLTuningParametersListNormal &&) noexcept(true) =
default;
102 ~CLTuningParametersListNormal() =
default;
105 CLTuningParams operator[](
size_t) override;
108 CLTuningParametersListNormal() =
default;
120 initialize_lws_values(std::vector<
unsigned int> &lws,
unsigned int gws,
unsigned int lws_max,
bool mod_let_one);
124 class CLTuningParametersListRapid : public CLTuningParametersListNormal
128 CLTuningParametersListRapid() =
delete;
130 CLTuningParametersListRapid(
const cl::NDRange &gws, CLTuningInfo tuning_info);
132 CLTuningParametersListRapid(
const CLTuningParametersListRapid &) =
default;
134 CLTuningParametersListRapid(CLTuningParametersListRapid &&) noexcept(true) =
default;
136 CLTuningParametersListRapid &operator=(const CLTuningParametersListRapid &) =
default;
138 CLTuningParametersListRapid &operator=(CLTuningParametersListRapid &&) noexcept(true) =
default;
140 virtual ~CLTuningParametersListRapid() =
default;
149 void initialize_lws_values(std::vector<
unsigned int> &lws,
unsigned int lws_max);
152 size_t CLTuningParametersList::size()
154 return search_space_shape.total_size();
157 CLTuningParams CLTuningParametersListExhaustive::operator[](
size_t index)
161 return CLTuningParams(coords[0] + 1U, coords[1] + 1U, coords[2] + 1U,
static_cast<int>(coords[3]));
164 CLTuningParametersListExhaustive::CLTuningParametersListExhaustive(
const cl::NDRange &gws, CLTuningInfo tuning_info)
170 search_space_shape[0] = lws_x_max;
171 search_space_shape[1] = lws_y_max;
172 search_space_shape[2] = lws_z_max;
173 search_space_shape[3] = 1;
174 if (tuning_info.tune_wbsm)
176 _wbsm = {-3, -2, -1, 0, 1, 2, 3};
177 search_space_shape[3] = _wbsm.size();
181 CLTuningParams CLTuningParametersListNormal::operator[](
size_t index)
185 return CLTuningParams(_lws_x[coords[0]], _lws_y[coords[1]], _lws_z[coords[2]], _wbsm[coords[3]]);
188 CLTuningParametersListNormal::CLTuningParametersListNormal(
const cl::NDRange &gws, CLTuningInfo tuning_info)
198 initialize_lws_values(_lws_x, gws[0], lws_x_max,
200 initialize_lws_values(_lws_y, gws[1], lws_y_max,
202 initialize_lws_values(_lws_z, gws[2], lws_z_max,
false);
204 search_space_shape[0] = _lws_x.size();
205 search_space_shape[1] = _lws_y.size();
206 search_space_shape[2] = _lws_z.size();
207 search_space_shape[3] = 1;
208 if (tuning_info.tune_wbsm)
210 _wbsm = {-2, -1, 0, 1, 2};
211 search_space_shape[3] = _wbsm.size();
215 void CLTuningParametersListNormal::initialize_lws_values(std::vector<unsigned int> &lws,
217 unsigned int lws_max,
222 for (
unsigned int i = 2; i <= lws_max; ++i)
225 const bool is_power_of_two = (i & (i - 1)) == 0;
228 const bool mod_cond = mod_let_one ? (gws % i) <= 1 : (gws % i) == 0;
230 if (mod_cond || is_power_of_two)
237 CLTuningParametersListRapid::CLTuningParametersListRapid(
const cl::NDRange &gws, CLTuningInfo tuning_info)
239 const auto lws_x_max = std::min(
static_cast<unsigned int>(gws[0]), 8u);
240 const auto lws_y_max = std::min(
static_cast<unsigned int>(gws[1]), 4u);
241 const auto lws_z_max = std::min(
static_cast<unsigned int>(gws[2]), 4u);
247 initialize_lws_values(_lws_x, lws_x_max);
248 initialize_lws_values(_lws_y, lws_y_max);
249 initialize_lws_values(_lws_z, lws_z_max);
251 search_space_shape[0] = _lws_x.size();
252 search_space_shape[1] = _lws_y.size();
253 search_space_shape[2] = _lws_z.size();
254 search_space_shape[3] = 1;
255 if (tuning_info.tune_wbsm)
258 search_space_shape[3] = _wbsm.size();
262 void CLTuningParametersListRapid::initialize_lws_values(std::vector<unsigned int> &lws,
unsigned int lws_max)
266 for (
unsigned int i = 2; i <= lws_max; i *= 4)
277 return std::make_unique<CLTuningParametersListExhaustive>(gws, tuning_info);
279 return std::make_unique<CLTuningParametersListNormal>(gws, tuning_info);
281 return std::make_unique<CLTuningParametersListRapid>(gws, tuning_info);