blob: 54e3e525b416a552733d18f50e6f4b79126c8dc0 [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"
Georgios Pinitas3faea252017-10-30 14:13:50 +000027#include "arm_compute/core/Log.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010028#include "arm_compute/core/Types.h"
29
30#include <map>
Moritz Pflanzere9978592017-09-15 15:08:12 +010031#include <regex>
Anthony Barbier6ff3b192017-09-04 18:44:23 +010032#include <vector>
33
34namespace
35{
Moritz Pflanzere9978592017-09-15 15:08:12 +010036arm_compute::GPUTarget get_bifrost_target(const std::string &version)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010037{
Moritz Pflanzere9978592017-09-15 15:08:12 +010038 if(version == "70")
Anthony Barbier6ff3b192017-09-04 18:44:23 +010039 {
Moritz Pflanzere9978592017-09-15 15:08:12 +010040 return arm_compute::GPUTarget::G70;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010041 }
Moritz Pflanzere9978592017-09-15 15:08:12 +010042 else
43 {
44 return arm_compute::GPUTarget::BIFROST;
45 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +010046}
47
Moritz Pflanzere9978592017-09-15 15:08:12 +010048arm_compute::GPUTarget get_midgard_target(const std::string &version)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010049{
Moritz Pflanzere9978592017-09-15 15:08:12 +010050 switch(version[0])
Anthony Barbier6ff3b192017-09-04 18:44:23 +010051 {
Moritz Pflanzere9978592017-09-15 15:08:12 +010052 case '6':
53 return arm_compute::GPUTarget::T600;
54 case '7':
55 return arm_compute::GPUTarget::T700;
56 case '8':
57 return arm_compute::GPUTarget::T800;
58 default:
59 return arm_compute::GPUTarget::MIDGARD;
Anthony Barbier6ff3b192017-09-04 18:44:23 +010060 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +010061}
Matthew Bentham6f31f8c2017-10-27 11:50:06 +010062
63bool extension_support(const cl::Device &device, const char *extension_name)
64{
65 std::string extensions = device.getInfo<CL_DEVICE_EXTENSIONS>();
66 auto pos = extensions.find(extension_name);
67 return (pos != std::string::npos);
68}
Anthony Barbier6ff3b192017-09-04 18:44:23 +010069} // namespace
70
71namespace arm_compute
72{
73std::string get_cl_type_from_data_type(const DataType &dt)
74{
75 switch(dt)
76 {
77 case DataType::U8:
78 return "uchar";
Georgios Pinitase5f8fd62017-06-23 18:03:44 +010079 case DataType::QS8:
80 return "qs8";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010081 case DataType::S8:
82 return "char";
Michel Iwaniec00633802017-10-12 14:14:15 +010083 case DataType::QASYMM8:
84 return "uchar";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010085 case DataType::U16:
86 return "ushort";
87 case DataType::S16:
88 return "short";
Gian Marco Iodice5cb4c422017-06-23 10:38:25 +010089 case DataType::QS16:
90 return "qs16";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010091 case DataType::U32:
92 return "uint";
93 case DataType::S32:
94 return "int";
Michalis Spyroudef665a2017-08-14 11:26:37 +010095 case DataType::QS32:
96 return "qs32";
Anthony Barbier6ff3b192017-09-04 18:44:23 +010097 case DataType::U64:
98 return "ulong";
99 case DataType::S64:
100 return "long";
101 case DataType::F16:
102 return "half";
103 case DataType::F32:
104 return "float";
105 default:
106 ARM_COMPUTE_ERROR("Unsupported input data type.");
107 return "";
108 }
109}
110
SiCong Lic51b72f2017-07-28 14:46:20 +0100111std::string get_data_size_from_data_type(const DataType &dt)
112{
113 switch(dt)
114 {
115 case DataType::U8:
116 case DataType::QS8:
117 case DataType::S8:
Michel Iwaniec00633802017-10-12 14:14:15 +0100118 case DataType::QASYMM8:
SiCong Lic51b72f2017-07-28 14:46:20 +0100119 return "8";
120 case DataType::U16:
121 case DataType::S16:
122 case DataType::QS16:
123 case DataType::F16:
124 return "16";
125 case DataType::U32:
126 case DataType::S32:
127 case DataType::F32:
128 return "32";
129 case DataType::U64:
130 case DataType::S64:
131 return "64";
132 default:
133 ARM_COMPUTE_ERROR("Unsupported input data type.");
134 return "0";
135 }
136}
137
Georgios Pinitasac4e8732017-07-05 17:02:25 +0100138std::string get_underlying_cl_type_from_data_type(const DataType &dt)
139{
140 switch(dt)
141 {
142 case DataType::QS8:
143 return "char";
144 case DataType::QS16:
145 return "short";
Michalis Spyroudef665a2017-08-14 11:26:37 +0100146 case DataType::QS32:
147 return "int";
Georgios Pinitasac4e8732017-07-05 17:02:25 +0100148 default:
149 return get_cl_type_from_data_type(dt);
150 }
151}
152
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100153const std::string &string_from_target(GPUTarget target)
154{
155 static std::map<GPUTarget, const std::string> gpu_target_map =
156 {
157 { GPUTarget::MIDGARD, "midgard" },
158 { GPUTarget::BIFROST, "bifrost" },
159 { GPUTarget::T600, "t600" },
160 { GPUTarget::T700, "t700" },
161 { GPUTarget::T800, "t800" },
162 { GPUTarget::G70, "g70" }
163 };
164
165 return gpu_target_map[target];
166}
167
168GPUTarget get_target_from_device(cl::Device &device)
169{
Moritz Pflanzere9978592017-09-15 15:08:12 +0100170 size_t name_size = 0;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100171
172 // Query device name size
173 cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, 0, nullptr, &name_size);
174 ARM_COMPUTE_ERROR_ON_MSG((err != 0) || (name_size == 0), "clGetDeviceInfo failed to return valid information");
Georgios Pinitas30f02152017-09-27 11:20:48 +0100175 ARM_COMPUTE_UNUSED(err);
Moritz Pflanzere9978592017-09-15 15:08:12 +0100176
177 std::vector<char> name_buffer(name_size);
178
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100179 // Query device name
Moritz Pflanzere9978592017-09-15 15:08:12 +0100180 err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, name_size, name_buffer.data(), nullptr);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100181 ARM_COMPUTE_ERROR_ON_MSG(err != 0, "clGetDeviceInfo failed to return valid information");
182 ARM_COMPUTE_UNUSED(err);
183
Moritz Pflanzere9978592017-09-15 15:08:12 +0100184 std::regex mali_regex(R"(Mali-([TG])(\d+))");
185 std::string device_name(name_buffer.begin(), name_buffer.end());
186 std::smatch name_parts;
187 const bool found_mali = std::regex_search(device_name, name_parts, mali_regex);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100188
Moritz Pflanzere9978592017-09-15 15:08:12 +0100189 if(!found_mali)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100190 {
Georgios Pinitas3faea252017-10-30 14:13:50 +0000191 ARM_COMPUTE_LOG_INFO_MSG_CORE("Can't find valid Mali GPU. Target is set to MIDGARD.");
Moritz Pflanzere9978592017-09-15 15:08:12 +0100192 return GPUTarget::MIDGARD;
193 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100194
Moritz Pflanzere9978592017-09-15 15:08:12 +0100195 const char target = name_parts.str(1)[0];
196 const std::string &version = name_parts.str(2);
197
198 switch(target)
199 {
200 case 'T':
201 return get_midgard_target(version);
202 case 'G':
203 return get_bifrost_target(version);
204 default:
Georgios Pinitas3faea252017-10-30 14:13:50 +0000205 ARM_COMPUTE_LOG_INFO_MSG_CORE("Mali GPU unknown. Target is set to the default one.");
Moritz Pflanzere9978592017-09-15 15:08:12 +0100206 return GPUTarget::MIDGARD;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100207 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100208}
209
210GPUTarget get_arch_from_target(GPUTarget target)
211{
212 return (target & GPUTarget::GPU_ARCH_MASK);
213}
steniu0134702472017-07-11 09:22:58 +0100214
215bool non_uniform_workgroup_support(const cl::Device &device)
216{
Matthew Bentham6f31f8c2017-10-27 11:50:06 +0100217 return extension_support(device, "cl_arm_non_uniform_work_group_size");
218}
steniu0134702472017-07-11 09:22:58 +0100219
Matthew Bentham6f31f8c2017-10-27 11:50:06 +0100220bool fp16_support(const cl::Device &device)
221{
222 return extension_support(device, "cl_khr_fp16");
steniu0134702472017-07-11 09:22:58 +0100223}
224
225CLVersion get_cl_version(const cl::Device &device)
226{
227 std::vector<char> version;
228 size_t version_size = 0;
229 cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_VERSION, 0, nullptr, &version_size);
230 ARM_COMPUTE_ERROR_ON_MSG((err != 0) || (version_size == 0), "clGetDeviceInfo failed to return valid information");
Georgios Pinitas30f02152017-09-27 11:20:48 +0100231 ARM_COMPUTE_UNUSED(err);
232
steniu0134702472017-07-11 09:22:58 +0100233 // Resize vector
234 version.resize(version_size);
235 // Query version
236 err = clGetDeviceInfo(device.get(), CL_DEVICE_VERSION, version_size, version.data(), nullptr);
237 ARM_COMPUTE_ERROR_ON_MSG(err != 0, "clGetDeviceInfo failed to return valid information");
238 ARM_COMPUTE_UNUSED(err);
239
240 std::string version_str(version.begin(), version.end());
241 if(version_str.find("OpenCL 2") != std::string::npos)
242 {
243 return CLVersion::CL20;
244 }
245 else if(version_str.find("OpenCL 1.2") != std::string::npos)
246 {
247 return CLVersion::CL12;
248 }
249 else if(version_str.find("OpenCL 1.1") != std::string::npos)
250 {
251 return CLVersion::CL11;
252 }
253 else if(version_str.find("OpenCL 1.0") != std::string::npos)
254 {
255 return CLVersion::CL10;
256 }
257
258 return CLVersion::UNKNOWN;
259}
260
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100261} // namespace arm_compute