diff options
Diffstat (limited to 'arm_compute/runtime/CL')
-rw-r--r-- | arm_compute/runtime/CL/CLScheduler.h | 33 | ||||
-rw-r--r-- | arm_compute/runtime/CL/CLTuner.h | 73 | ||||
-rw-r--r-- | arm_compute/runtime/CL/ICLTuner.h | 44 |
3 files changed, 144 insertions, 6 deletions
diff --git a/arm_compute/runtime/CL/CLScheduler.h b/arm_compute/runtime/CL/CLScheduler.h index 3f3a8de753..11affebc48 100644 --- a/arm_compute/runtime/CL/CLScheduler.h +++ b/arm_compute/runtime/CL/CLScheduler.h @@ -30,6 +30,7 @@ #include "arm_compute/core/CL/OpenCL.h" #include "arm_compute/core/Error.h" #include "arm_compute/core/Types.h" +#include "arm_compute/runtime/CL/CLTuner.h" namespace arm_compute { @@ -41,6 +42,10 @@ class CLScheduler private: /** Constructor */ CLScheduler(); + /** Prevent instances of this class from being copied (As this class contains pointers) */ + CLScheduler(const CLScheduler &) = delete; + /** Prevent instances of this class from being copied (As this class contains pointers) */ + CLScheduler &operator=(const CLScheduler &) = delete; public: /** Access the scheduler singleton. @@ -50,11 +55,13 @@ public: static CLScheduler &get(); /** Initialises the context and command queue used by the scheduler to default values * and sets a default device and kernel path for the @ref CLKernelLibrary. + * + * @param[in] cl_tuner (Optional) Pointer to ICLTuner (default=nullptr) */ - void default_init() + void default_init(ICLTuner *cl_tuner = nullptr) { CLKernelLibrary::get().init("./cl_kernels/", cl::Context::getDefault(), cl::Device::getDefault()); - init(cl::Context::getDefault(), cl::CommandQueue::getDefault(), cl::Device::getDefault()); + init(cl::Context::getDefault(), cl::CommandQueue::getDefault(), cl::Device::getDefault(), cl_tuner); } /** Schedule the execution of the passed kernel if possible. * @@ -65,17 +72,20 @@ public: /** Initialises the context and command queue to be used by the scheduler. * - * @param[in] context A CL context. - * @param[in] queue A CL command queue. - * @param[in] device A CL device. + * @param[in] context A CL context. + * @param[in] queue A CL command queue. + * @param[in] device A CL device. + * @param[in] cl_tuner (Optional) Pointer to OpenCL tuner (default=nullptr) + * Note: It is caller's responsibility to release the allocated memory for CLTuner */ void init(cl::Context context = cl::Context::getDefault(), cl::CommandQueue queue = cl::CommandQueue::getDefault(), - cl::Device device = cl::Device::getDefault()) + cl::Device device = cl::Device::getDefault(), ICLTuner *cl_tuner = nullptr) { _context = std::move(context); _queue = std::move(queue); _target = get_target_from_device(device); _is_initialised = true; + _cl_tuner = cl_tuner; } /** Accessor for the associated CL context. @@ -153,10 +163,21 @@ public: } private: + /** Tune OpenCL kernel + * + * @note This method uses a brute force approach to find the optimal LWS + * + * @param[in] kernel Kernel to tune + * + * @return The optimal LWS for the specified kernel + */ + cl::NDRange tune_kernel(ICLKernel &kernel); + cl::Context _context; cl::CommandQueue _queue; GPUTarget _target; bool _is_initialised; + ICLTuner *_cl_tuner; }; } #endif /* __ARM_COMPUTE_CLSCHEDULER_H__ */ diff --git a/arm_compute/runtime/CL/CLTuner.h b/arm_compute/runtime/CL/CLTuner.h new file mode 100644 index 0000000000..8a7b96aa09 --- /dev/null +++ b/arm_compute/runtime/CL/CLTuner.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 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_CLTUNER_H__ +#define __ARM_COMPUTE_CLTUNER_H__ + +#include "arm_compute/core/CL/OpenCL.h" +#include "arm_compute/runtime/CL/ICLTuner.h" + +#include <unordered_map> + +namespace arm_compute +{ +class ICLKernel; + +/** Basic implementation of the OpenCL tuner interface */ +class CLTuner : public ICLTuner +{ +public: + /** Constructor */ + CLTuner(); + + /** Destructor */ + ~CLTuner() = default; + + /** Import LWS table + * + * @param[in] lws_table The unordered_map container to import + */ + void import_lws_table(const std::unordered_map<std::string, cl::NDRange> &lws_table); + + /** Export LWS table + * + * return The lws table as unordered_map container + */ + const std::unordered_map<std::string, cl::NDRange> &export_lws_table(); + + // Inherited methods overridden: + void tune_kernel(ICLKernel &kernel) override; + +private: + /** Find optimal LWS using brute-force approach + * + * @param[in] kernel OpenCL kernel to be tuned with LWS + * + * @return The optimal LWS to use + */ + cl::NDRange find_optimal_lws(ICLKernel &kernel); + + std::unordered_map<std::string, cl::NDRange> _lws_table; +}; +} +#endif /*__ARM_COMPUTE_CLTUNER_H__ */ diff --git a/arm_compute/runtime/CL/ICLTuner.h b/arm_compute/runtime/CL/ICLTuner.h new file mode 100644 index 0000000000..c71835c0aa --- /dev/null +++ b/arm_compute/runtime/CL/ICLTuner.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2017 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_ICLTUNER_H__ +#define __ARM_COMPUTE_ICLTUNER_H__ + +namespace arm_compute +{ +class ICLKernel; + +/** Basic interface for tuning the OpenCL kernels */ +class ICLTuner +{ +public: + /** Virtual destructor */ + virtual ~ICLTuner() = default; + /** Tune OpenCL kernel + * + * @param[in] kernel Kernel to tune + */ + virtual void tune_kernel(ICLKernel &kernel) = 0; +}; +} +#endif /*__ARM_COMPUTE_ICLTUNER_H__ */ |