blob: 09ec329e4cdeddc97850007912e3c3a3bb2915a8 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
2 * Copyright (c) 2016, 2017 ARM Limited.
3 *
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#include "arm_compute/core/CL/CLHelpers.h"
25#include "arm_compute/core/CL/CLTypes.h"
26#include "arm_compute/core/Error.h"
27#include "arm_compute/core/Types.h"
28
29#include <map>
Moritz Pflanzere9978592017-09-15 15:08:12 +010030#include <regex>
Anthony Barbier6ff3b192017-09-04 18:44:23 +010031#include <vector>
32
33namespace
34{
Moritz Pflanzere9978592017-09-15 15:08:12 +010035arm_compute::GPUTarget get_bifrost_target(const std::string &version)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010036{
Moritz Pflanzere9978592017-09-15 15:08:12 +010037 if(version == "70")
Anthony Barbier6ff3b192017-09-04 18:44:23 +010038 {
Moritz Pflanzere9978592017-09-15 15:08:12 +010039 return arm_compute::GPUTarget::G70;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010040 }
Moritz Pflanzere9978592017-09-15 15:08:12 +010041 else
42 {
43 return arm_compute::GPUTarget::BIFROST;
44 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +010045}
46
Moritz Pflanzere9978592017-09-15 15:08:12 +010047arm_compute::GPUTarget get_midgard_target(const std::string &version)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010048{
Moritz Pflanzere9978592017-09-15 15:08:12 +010049 switch(version[0])
Anthony Barbier6ff3b192017-09-04 18:44:23 +010050 {
Moritz Pflanzere9978592017-09-15 15:08:12 +010051 case '6':
52 return arm_compute::GPUTarget::T600;
53 case '7':
54 return arm_compute::GPUTarget::T700;
55 case '8':
56 return arm_compute::GPUTarget::T800;
57 default:
58 return arm_compute::GPUTarget::MIDGARD;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010059 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +010060}
61} // namespace
62
63namespace arm_compute
64{
65std::string get_cl_type_from_data_type(const DataType &dt)
66{
67 switch(dt)
68 {
69 case DataType::U8:
70 return "uchar";
Georgios Pinitase5f8fd62017-06-23 18:03:44 +010071 case DataType::QS8:
72 return "qs8";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010073 case DataType::S8:
74 return "char";
Michel Iwaniec00633802017-10-12 14:14:15 +010075 case DataType::QASYMM8:
76 return "uchar";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010077 case DataType::U16:
78 return "ushort";
79 case DataType::S16:
80 return "short";
Gian Marco Iodice5cb4c422017-06-23 10:38:25 +010081 case DataType::QS16:
82 return "qs16";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010083 case DataType::U32:
84 return "uint";
85 case DataType::S32:
86 return "int";
Michalis Spyroudef665a2017-08-14 11:26:37 +010087 case DataType::QS32:
88 return "qs32";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010089 case DataType::U64:
90 return "ulong";
91 case DataType::S64:
92 return "long";
93 case DataType::F16:
94 return "half";
95 case DataType::F32:
96 return "float";
97 default:
98 ARM_COMPUTE_ERROR("Unsupported input data type.");
99 return "";
100 }
101}
102
SiCong Lic51b72f2017-07-28 14:46:20 +0100103std::string get_data_size_from_data_type(const DataType &dt)
104{
105 switch(dt)
106 {
107 case DataType::U8:
108 case DataType::QS8:
109 case DataType::S8:
Michel Iwaniec00633802017-10-12 14:14:15 +0100110 case DataType::QASYMM8:
SiCong Lic51b72f2017-07-28 14:46:20 +0100111 return "8";
112 case DataType::U16:
113 case DataType::S16:
114 case DataType::QS16:
115 case DataType::F16:
116 return "16";
117 case DataType::U32:
118 case DataType::S32:
119 case DataType::F32:
120 return "32";
121 case DataType::U64:
122 case DataType::S64:
123 return "64";
124 default:
125 ARM_COMPUTE_ERROR("Unsupported input data type.");
126 return "0";
127 }
128}
129
Georgios Pinitasac4e8732017-07-05 17:02:25 +0100130std::string get_underlying_cl_type_from_data_type(const DataType &dt)
131{
132 switch(dt)
133 {
134 case DataType::QS8:
135 return "char";
136 case DataType::QS16:
137 return "short";
Michalis Spyroudef665a2017-08-14 11:26:37 +0100138 case DataType::QS32:
139 return "int";
Georgios Pinitasac4e8732017-07-05 17:02:25 +0100140 default:
141 return get_cl_type_from_data_type(dt);
142 }
143}
144
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100145const std::string &string_from_target(GPUTarget target)
146{
147 static std::map<GPUTarget, const std::string> gpu_target_map =
148 {
149 { GPUTarget::MIDGARD, "midgard" },
150 { GPUTarget::BIFROST, "bifrost" },
151 { GPUTarget::T600, "t600" },
152 { GPUTarget::T700, "t700" },
153 { GPUTarget::T800, "t800" },
154 { GPUTarget::G70, "g70" }
155 };
156
157 return gpu_target_map[target];
158}
159
160GPUTarget get_target_from_device(cl::Device &device)
161{
Moritz Pflanzere9978592017-09-15 15:08:12 +0100162 size_t name_size = 0;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100163
164 // Query device name size
165 cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, 0, nullptr, &name_size);
166 ARM_COMPUTE_ERROR_ON_MSG((err != 0) || (name_size == 0), "clGetDeviceInfo failed to return valid information");
Georgios Pinitas30f02152017-09-27 11:20:48 +0100167 ARM_COMPUTE_UNUSED(err);
Moritz Pflanzere9978592017-09-15 15:08:12 +0100168
169 std::vector<char> name_buffer(name_size);
170
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100171 // Query device name
Moritz Pflanzere9978592017-09-15 15:08:12 +0100172 err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, name_size, name_buffer.data(), nullptr);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100173 ARM_COMPUTE_ERROR_ON_MSG(err != 0, "clGetDeviceInfo failed to return valid information");
174 ARM_COMPUTE_UNUSED(err);
175
Moritz Pflanzere9978592017-09-15 15:08:12 +0100176 std::regex mali_regex(R"(Mali-([TG])(\d+))");
177 std::string device_name(name_buffer.begin(), name_buffer.end());
178 std::smatch name_parts;
179 const bool found_mali = std::regex_search(device_name, name_parts, mali_regex);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100180
Moritz Pflanzere9978592017-09-15 15:08:12 +0100181 if(!found_mali)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100182 {
Moritz Pflanzere9978592017-09-15 15:08:12 +0100183 ARM_COMPUTE_INFO("Can't find valid Mali GPU. Target is set to MIDGARD.");
184 return GPUTarget::MIDGARD;
185 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100186
Moritz Pflanzere9978592017-09-15 15:08:12 +0100187 const char target = name_parts.str(1)[0];
188 const std::string &version = name_parts.str(2);
189
190 switch(target)
191 {
192 case 'T':
193 return get_midgard_target(version);
194 case 'G':
195 return get_bifrost_target(version);
196 default:
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100197 ARM_COMPUTE_INFO("Mali GPU unknown. Target is set to the default one.");
Moritz Pflanzere9978592017-09-15 15:08:12 +0100198 return GPUTarget::MIDGARD;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100199 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100200}
201
202GPUTarget get_arch_from_target(GPUTarget target)
203{
204 return (target & GPUTarget::GPU_ARCH_MASK);
205}
steniu0134702472017-07-11 09:22:58 +0100206
207bool non_uniform_workgroup_support(const cl::Device &device)
208{
209 std::vector<char> extension;
210 size_t extension_size = 0;
211 cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_EXTENSIONS, 0, nullptr, &extension_size);
212 ARM_COMPUTE_ERROR_ON_MSG((err != 0) || (extension_size == 0), "clGetDeviceInfo failed to return valid information");
Georgios Pinitas30f02152017-09-27 11:20:48 +0100213 ARM_COMPUTE_UNUSED(err);
steniu0134702472017-07-11 09:22:58 +0100214 // Resize vector
215 extension.resize(extension_size);
216 // Query extension
217 err = clGetDeviceInfo(device.get(), CL_DEVICE_EXTENSIONS, extension_size, extension.data(), nullptr);
218 ARM_COMPUTE_ERROR_ON_MSG(err != 0, "clGetDeviceInfo failed to return valid information");
219 ARM_COMPUTE_UNUSED(err);
220
221 std::string extension_str(extension.begin(), extension.end());
222 auto pos = extension_str.find("cl_arm_non_uniform_work_group_size");
223 return (pos != std::string::npos);
224}
225
226CLVersion get_cl_version(const cl::Device &device)
227{
228 std::vector<char> version;
229 size_t version_size = 0;
230 cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_VERSION, 0, nullptr, &version_size);
231 ARM_COMPUTE_ERROR_ON_MSG((err != 0) || (version_size == 0), "clGetDeviceInfo failed to return valid information");
Georgios Pinitas30f02152017-09-27 11:20:48 +0100232 ARM_COMPUTE_UNUSED(err);
233
steniu0134702472017-07-11 09:22:58 +0100234 // Resize vector
235 version.resize(version_size);
236 // Query version
237 err = clGetDeviceInfo(device.get(), CL_DEVICE_VERSION, version_size, version.data(), nullptr);
238 ARM_COMPUTE_ERROR_ON_MSG(err != 0, "clGetDeviceInfo failed to return valid information");
239 ARM_COMPUTE_UNUSED(err);
240
241 std::string version_str(version.begin(), version.end());
242 if(version_str.find("OpenCL 2") != std::string::npos)
243 {
244 return CLVersion::CL20;
245 }
246 else if(version_str.find("OpenCL 1.2") != std::string::npos)
247 {
248 return CLVersion::CL12;
249 }
250 else if(version_str.find("OpenCL 1.1") != std::string::npos)
251 {
252 return CLVersion::CL11;
253 }
254 else if(version_str.find("OpenCL 1.0") != std::string::npos)
255 {
256 return CLVersion::CL10;
257 }
258
259 return CLVersion::UNKNOWN;
260}
261
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100262} // namespace arm_compute