blob: 9130e05121e50aa71562f1034cbe080ae4b8de4c [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Gian Marco Iodiceb0c50372019-03-15 10:13:05 +00002 * Copyright (c) 2016-2019 ARM Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#ifndef __ARM_COMPUTE_CLHELPERS_H__
25#define __ARM_COMPUTE_CLHELPERS_H__
26
Michele Di Giorgiob8fc60f2018-04-25 11:58:07 +010027#include "arm_compute/core/CL/CLTypes.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010028#include "arm_compute/core/CL/OpenCL.h"
Michele Di Giorgiob8fc60f2018-04-25 11:58:07 +010029#include "arm_compute/core/GPUTarget.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010030#include "arm_compute/core/Helpers.h"
Moritz Pflanzerd0ae8b82017-06-29 14:51:57 +010031#include "support/ToolchainSupport.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010032
33#include <string>
34
35namespace arm_compute
36{
Pablo Tellodb8485a2019-09-24 11:03:47 +010037class CLCoreRuntimeContext;
38class CLBuildOptions;
39
Anthony Barbier6ff3b192017-09-04 18:44:23 +010040enum class DataType;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010041
42/** Max vector width of an OpenCL vector */
Anthony Barbier7068f992017-10-26 15:23:08 +010043static constexpr unsigned int max_cl_vector_width = 16;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010044
45/** Translates a tensor data type to the appropriate OpenCL type.
46 *
47 * @param[in] dt @ref DataType to be translated to OpenCL type.
48 *
49 * @return The string specifying the OpenCL type to be used.
50 */
51std::string get_cl_type_from_data_type(const DataType &dt);
52
Michele Di Giorgiodf4cf572019-10-09 15:32:39 +010053/** Translates a tensor data type to the appropriate OpenCL promoted type.
54 *
55 * @param[in] dt @ref DataType to be used to get the promoted OpenCL type.
56 *
57 * @return The string specifying the OpenCL type to be used.
58 */
59std::string get_cl_promoted_type_from_data_type(const DataType &dt);
60
61/** Translates the element size to an unsigned integer data type
62 *
63 * @param[in] element_size Size in bytes of an element.
64 *
65 * @return The string specifying the OpenCL type to be used.
66 */
67std::string get_cl_unsigned_type_from_element_size(size_t element_size);
68
Giorgio Arena73023022018-09-04 14:55:55 +010069/** Translates a tensor data type to the appropriate OpenCL select type.
70 *
71 * @param[in] dt @ref DataType to be translated to OpenCL select type.
72 *
73 * @return The string specifying the OpenCL select type to be used.
74 */
75std::string get_cl_select_type_from_data_type(const DataType &dt);
76
SiCong Lic51b72f2017-07-28 14:46:20 +010077/** Get the size of a data type in number of bits.
78 *
79 * @param[in] dt @ref DataType.
80 *
81 * @return Number of bits in the data type specified.
82 */
83std::string get_data_size_from_data_type(const DataType &dt);
84
Georgios Pinitasac4e8732017-07-05 17:02:25 +010085/** Translates fixed point tensor data type to the underlying OpenCL type.
86 *
87 * @param[in] dt @ref DataType to be translated to OpenCL type.
88 *
89 * @return The string specifying the underlying OpenCL type to be used.
90 */
91std::string get_underlying_cl_type_from_data_type(const DataType &dt);
92
Anthony Barbier6ff3b192017-09-04 18:44:23 +010093/** Helper function to get the GPU target from CL device
94 *
95 * @param[in] device A CL device
96 *
97 * @return the GPU target
98 */
Anthony Barbierb6eb3532018-08-08 13:20:04 +010099GPUTarget get_target_from_device(const cl::Device &device);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100100
steniu0134702472017-07-11 09:22:58 +0100101/** Helper function to get the highest OpenCL version supported
102 *
103 * @param[in] device A CL device
104 *
105 * @return the highest OpenCL version supported
106 */
107CLVersion get_cl_version(const cl::Device &device);
Vidhya Sudhan Loganathaneb8a3992018-04-10 12:23:22 +0100108
109/** Helper function to check whether a given extension is supported
110 *
111 * @param[in] device A CL device
112 * @param[in] extension_name Name of the extension to be checked
113 *
114 * @return True if the extension is supported
115 */
116bool device_supports_extension(const cl::Device &device, const char *extension_name);
117
Matthew Bentham6f31f8c2017-10-27 11:50:06 +0100118/** Helper function to check whether the cl_khr_fp16 extension is supported
119 *
120 * @param[in] device A CL device
121 *
122 * @return True if the extension is supported
123 */
Anthony Barbierd727e852018-04-20 11:05:29 +0100124bool fp16_supported(const cl::Device &device);
steniu0134702472017-07-11 09:22:58 +0100125/** Helper function to check whether the arm_non_uniform_work_group_size extension is supported
126 *
127 * @param[in] device A CL device
128 *
129 * @return True if the extension is supported
130 */
Anthony Barbierd727e852018-04-20 11:05:29 +0100131bool arm_non_uniform_workgroup_supported(const cl::Device &device);
Michalis Spyroue03342e2018-01-15 14:39:13 +0000132/** Helper function to check whether the cl_arm_integer_dot_product_int8 extension is supported
133 *
134 * @param[in] device A CL device
135 *
136 * @return True if the extension is supported
137 */
138bool dot8_supported(const cl::Device &device);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100139
Giorgio Arenaeff8d952018-07-02 15:29:57 +0100140/** Helper function to check whether the cl_arm_integer_dot_product_accumulate_int8 extension is supported
141 *
142 * @param[in] device A CL device
143 *
144 * @return True if the extension is supported
145 */
146bool dot8_acc_supported(const cl::Device &device);
147
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100148/** This function checks if the Winograd configuration (defined through the output tile, kernel size and the data layout) is supported on OpenCL
149 *
150 * @param[in] output_tile Output tile for the Winograd filtering algorithm
151 * @param[in] kernel_size Kernel size for the Winograd filtering algorithm
152 * @param[in] data_layout Data layout of the input tensor
153 *
154 * @return True if the configuration is supported
155 */
156bool cl_winograd_convolution_layer_supported(const Size2D &output_tile, const Size2D &kernel_size, DataLayout data_layout);
Vidhya Sudhan Loganathan5e96be72018-12-18 14:17:00 +0000157
158/** Helper function to get the preferred native vector width size for built-in scalar types that can be put into vectors
159 *
160 * @param[in] device A CL device
161 * @param[in] dt data type
162 *
163 * @return preferred vector width
164 */
165size_t preferred_vector_width(const cl::Device &device, DataType dt);
Gian Marco Iodiceb0c50372019-03-15 10:13:05 +0000166
167/** Helper function to check if "dummy work-items" are preferred to have a power of two NDRange
168 * In case dummy work-items is enabled, it is OpenCL kernel responsibility to check if the work-item is out-of range or not
169 *
170 * @param[in] device A CL device
171 *
172 * @return True if dummy work-items should be preferred to dispatch the NDRange
173 */
174bool preferred_dummy_work_items_support(const cl::Device &device);
Pablo Tellodb8485a2019-09-24 11:03:47 +0100175
176/** Creates an opencl kernel
177 *
178 * @param[in] ctx A context to be used to create the opencl kernel.
179 * @param[in] kernel_name The kernel name.
180 * @param[in] build_opts The build options to be used for the opencl kernel compilation.
181 *
182 * @return An opencl kernel
183 */
184cl::Kernel create_opencl_kernel(CLCoreRuntimeContext *ctx, const std::string &kernel_name, const CLBuildOptions &build_opts);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100185}
Anthony Barbierac69aa12017-07-03 17:39:37 +0100186#endif /* __ARM_COMPUTE_CLHELPERS_H__ */