/* * Copyright (c) 2020-2021 Arm Limited. * * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef ARM_COMPUTE_CLTUNING_PARAMS_H #define ARM_COMPUTE_CLTUNING_PARAMS_H #include "arm_compute/core/CL/OpenCL.h" #include "arm_compute/runtime/CL/CLTunerTypes.h" #include "support/StringSupport.h" #include namespace arm_compute { /**< OpenCL tuner parameters */ class CLTuningParams { public: CLTuningParams(const CLTuningParams &) = default; CLTuningParams(unsigned int lws_x = 0, unsigned int lws_y = 0, unsigned int lws_z = 0, int wbsm = 0) : _lws(lws_x, lws_y, lws_z), _wbsm(wbsm) { } CLTuningParams(cl::NDRange lws, cl_int wbsm = 0) : _lws(lws), _wbsm(wbsm) { } CLTuningParams(cl_int wbsm) : CLTuningParams(cl::NullRange, wbsm) { } void set_lws(cl::NDRange lws) { _lws = lws; } cl::NDRange get_lws() const { return _lws; } void set_wbsm(cl_int wbsm) { _wbsm = wbsm; } cl_int get_wbsm() const { return _wbsm; } std::string to_string(CLTuningInfo tuning_info) { std::string tuning_params_string = ""; tuning_params_string += ";" + support::cpp11::to_string(_lws[0]) + ";" + support::cpp11::to_string(_lws[1]) + ";" + support::cpp11::to_string(_lws[2]); if(tuning_info.tune_wbsm) { tuning_params_string += ";" + support::cpp11::to_string(_wbsm); } return tuning_params_string; } bool from_string(CLTuningInfo tuning_info, std::string tuning_params_string) { std::replace(tuning_params_string.begin(), tuning_params_string.end(), ';', ' '); std::vector array; std::stringstream ss(tuning_params_string); std::string temp; while(ss >> temp) { array.push_back(temp); } // Read 3 values for lws if(array.size() < 3) { return false; } const unsigned int lws_0 = support::cpp11::stoi(array[0]); const unsigned int lws_1 = support::cpp11::stoi(array[1]); const unsigned int lws_2 = support::cpp11::stoi(array[2]); if(lws_0 == 0 && lws_1 == 0 && lws_2 == 0) { // If lws values are 0, cl::NullRange has to be used // otherwise the lws object will be badly created _lws = cl::NullRange; } else { _lws = cl::NDRange(lws_0, lws_1, lws_2); } array.erase(array.begin(), array.begin() + 3); if(tuning_info.tune_wbsm) { if(array.size() < 1) { return false; } _wbsm = support::cpp11::stoi(array[0]); array.erase(array.begin()); } return true; } private: cl::NDRange _lws; cl_int _wbsm; }; } // namespace arm_compute #endif /*ARM_COMPUTE_CLTUNING_PARAMS_H */