blob: f3e13c90c6a2f35d5555a093ba857c16f52c94c0 [file] [log] [blame]
Sadik Armagan3c24f432020-10-19 17:35:30 +01001//
2// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <DelegateOptions.hpp>
Jan Eilersf39f8d82021-10-26 16:57:34 +01007#include <armnn/utility/NumericCast.hpp>
8#include <armnn/utility/StringUtils.hpp>
Sadik Armagan3c24f432020-10-19 17:35:30 +01009
10namespace armnnDelegate
11{
12
Sadik Armagan4189cc52020-11-11 18:01:48 +000013DelegateOptions::DelegateOptions(armnn::Compute computeDevice,
Jan Eilers2cd18472020-12-15 10:42:38 +000014 const std::vector<armnn::BackendOptions>& backendOptions,
15 const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
Jan Eilersb1c62f12021-10-26 14:56:47 +010016 : m_Backends({computeDevice}), m_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel)
Sadik Armagan3c24f432020-10-19 17:35:30 +010017{
Jan Eilersb1c62f12021-10-26 14:56:47 +010018 m_RuntimeOptions.m_BackendOptions = backendOptions;
Sadik Armagan3c24f432020-10-19 17:35:30 +010019}
20
Sadik Armagan4189cc52020-11-11 18:01:48 +000021DelegateOptions::DelegateOptions(const std::vector<armnn::BackendId>& backends,
Jan Eilers2cd18472020-12-15 10:42:38 +000022 const std::vector<armnn::BackendOptions>& backendOptions,
23 const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
Jan Eilersb1c62f12021-10-26 14:56:47 +010024 : m_Backends(backends), m_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel)
Sadik Armagan3c24f432020-10-19 17:35:30 +010025{
Jan Eilersb1c62f12021-10-26 14:56:47 +010026 m_RuntimeOptions.m_BackendOptions = backendOptions;
Sadik Armagan3c24f432020-10-19 17:35:30 +010027}
28
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000029DelegateOptions::DelegateOptions(armnn::Compute computeDevice,
30 const armnn::OptimizerOptions& optimizerOptions,
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000031 const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
32 const armnn::Optional<armnn::DebugCallbackFunction>& func)
33 : m_Backends({computeDevice}),
Jan Eilersb1c62f12021-10-26 14:56:47 +010034 m_RuntimeOptions(),
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000035 m_OptimizerOptions(optimizerOptions),
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000036 m_LoggingSeverity(logSeverityLevel),
37 m_DebugCallbackFunc(func)
38{
39}
40
41DelegateOptions::DelegateOptions(const std::vector<armnn::BackendId>& backends,
42 const armnn::OptimizerOptions& optimizerOptions,
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000043 const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
44 const armnn::Optional<armnn::DebugCallbackFunction>& func)
45 : m_Backends(backends),
Jan Eilersb1c62f12021-10-26 14:56:47 +010046 m_RuntimeOptions(),
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000047 m_OptimizerOptions(optimizerOptions),
Narumol Prangnawarat0b51d5a2021-01-20 15:58:29 +000048 m_LoggingSeverity(logSeverityLevel),
49 m_DebugCallbackFunc(func)
50{
51}
52
Jan Eilersf39f8d82021-10-26 16:57:34 +010053DelegateOptions::DelegateOptions(char const* const* options_keys,
54 char const* const* options_values,
55 size_t num_options,
56 void (*report_error)(const char*))
57{
58 armnn::IRuntime::CreationOptions runtimeOptions;
59 armnn::OptimizerOptions optimizerOptions;
60 bool internalProfilingState = false;
61 armnn::ProfilingDetailsMethod internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000062 arm::pipe::ProfilingOptions extProfilingParams;
Jan Eilersf39f8d82021-10-26 16:57:34 +010063 for (size_t i = 0; i < num_options; ++i)
64 {
65 // Process backends
66 if (std::string(options_keys[i]) == std::string("backends"))
67 {
68 // The backend option is a comma separated string of backendIDs that needs to be split
69 std::vector<armnn::BackendId> backends;
70 char* dup = strdup(options_values[i]);
71 char* pch = std::strtok(dup, ",");
72 while (pch != NULL)
73 {
74 backends.push_back(pch);
75 pch = strtok (NULL, ",");
76 }
77 this->SetBackends(backends);
78 }
79 // Process dynamic-backends-path
80 else if (std::string(options_keys[i]) == std::string("dynamic-backends-path"))
81 {
82 runtimeOptions.m_DynamicBackendsPath = std::string(options_values[i]);
83 }
84 // Process logging level
85 else if (std::string(options_keys[i]) == std::string("logging-severity"))
86 {
87 this->SetLoggingSeverity(options_values[i]);
88 }
89 // Process GPU backend options
90 else if (std::string(options_keys[i]) == std::string("gpu-tuning-level"))
91 {
92 armnn::BackendOptions option("GpuAcc", {{"TuningLevel", atoi(options_values[i])}});
93 runtimeOptions.m_BackendOptions.push_back(option);
94 }
95 else if (std::string(options_keys[i]) == std::string("gpu-mlgo-tuning-file"))
96 {
97 armnn::BackendOptions option("GpuAcc", {{"MLGOTuningFilePath", std::string(options_values[i])}});
98 optimizerOptions.m_ModelOptions.push_back(option);
99 }
100 else if (std::string(options_keys[i]) == std::string("gpu-tuning-file"))
101 {
102 armnn::BackendOptions option("GpuAcc", {{"TuningFile", std::string(options_values[i])}});
103 runtimeOptions.m_BackendOptions.push_back(option);
104 }
105 else if (std::string(options_keys[i]) == std::string("gpu-enable-profiling"))
106 {
107 runtimeOptions.m_EnableGpuProfiling = (*options_values[i] != '0');
108 }
109 else if (std::string(options_keys[i]) == std::string("gpu-kernel-profiling-enabled"))
110 {
111 armnn::BackendOptions option("GpuAcc", {{"KernelProfilingEnabled",
112 armnn::stringUtils::StringToBool(options_values[i])}});
113 runtimeOptions.m_BackendOptions.push_back(option);
114 }
115 else if (std::string(options_keys[i]) == std::string("save-cached-network"))
116 {
117 armnn::BackendOptions option("GpuAcc", {{"SaveCachedNetwork",
118 armnn::stringUtils::StringToBool(options_values[i])}});
119 optimizerOptions.m_ModelOptions.push_back(option);
120 }
121 else if (std::string(options_keys[i]) == std::string("cached-network-filepath"))
122 {
123 armnn::BackendOptions option("GpuAcc", {{"CachedNetworkFilePath", std::string(options_values[i])}});
124 optimizerOptions.m_ModelOptions.push_back(option);
125 }
126 // Process GPU & CPU backend options
127 else if (std::string(options_keys[i]) == std::string("enable-fast-math"))
128 {
129 armnn::BackendOptions modelOptionGpu("GpuAcc", {{"FastMathEnabled",
130 armnn::stringUtils::StringToBool(options_values[i])}});
131 optimizerOptions.m_ModelOptions.push_back(modelOptionGpu);
132
133 armnn::BackendOptions modelOptionCpu("CpuAcc", {{"FastMathEnabled",
134 armnn::stringUtils::StringToBool(options_values[i])}});
135 optimizerOptions.m_ModelOptions.push_back(modelOptionCpu);
136 }
137 // Process CPU backend options
138 else if (std::string(options_keys[i]) == std::string("number-of-threads"))
139 {
140 unsigned int numberOfThreads = armnn::numeric_cast<unsigned int>(atoi(options_values[i]));
141 armnn::BackendOptions modelOption("CpuAcc", {{"NumberOfThreads", numberOfThreads}});
142 optimizerOptions.m_ModelOptions.push_back(modelOption);
143 }
144 // Process reduce-fp32-to-fp16 option
145 else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-fp16"))
146 {
147 optimizerOptions.m_ReduceFp32ToFp16 = armnn::stringUtils::StringToBool(options_values[i]);
148 }
149 // Process reduce-fp32-to-bf16 option
150 else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-bf16"))
151 {
152 optimizerOptions.m_ReduceFp32ToBf16 = armnn::stringUtils::StringToBool(options_values[i]);
153 }
154 // Process debug-data
155 else if (std::string(options_keys[i]) == std::string("debug-data"))
156 {
157 optimizerOptions.m_Debug = armnn::stringUtils::StringToBool(options_values[i]);
158 }
Mike Kelly80512b02022-05-16 23:10:42 +0100159 // Infer output-shape
160 else if (std::string(options_keys[i]) == std::string("infer-output-shape"))
161 {
162 armnn::BackendOptions backendOption("ShapeInferenceMethod",
163 {
164 { "InferAndValidate", armnn::stringUtils::StringToBool(options_values[i]) }
165 });
166 optimizerOptions.m_ModelOptions.push_back(backendOption);
167 }
168 // Allow expanded dims
169 else if (std::string(options_keys[i]) == std::string("allow-expanded-dims"))
170 {
171 armnn::BackendOptions backendOption("AllowExpandedDims",
172 {
173 { "AllowExpandedDims", armnn::stringUtils::StringToBool(options_values[i]) }
174 });
175 optimizerOptions.m_ModelOptions.push_back(backendOption);
176 }
Jan Eilersf39f8d82021-10-26 16:57:34 +0100177 // Process memory-import
178 else if (std::string(options_keys[i]) == std::string("memory-import"))
179 {
180 optimizerOptions.m_ImportEnabled = armnn::stringUtils::StringToBool(options_values[i]);
181 }
182 // Process enable-internal-profiling
183 else if (std::string(options_keys[i]) == std::string("enable-internal-profiling"))
184 {
185 internalProfilingState = *options_values[i] != '0';
186 optimizerOptions.m_ProfilingEnabled = internalProfilingState;
187 }
188 // Process internal-profiling-detail
189 else if (std::string(options_keys[i]) == std::string("internal-profiling-detail"))
190 {
191 uint32_t detailLevel = static_cast<uint32_t>(std::stoul(options_values[i]));
192 switch (detailLevel)
193 {
194 case 1:
195 internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
196 break;
197 case 2:
198 internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsOnly;
199 break;
200 default:
201 internalProfilingDetail = armnn::ProfilingDetailsMethod::Undefined;
202 break;
203 }
204 }
205 // Process enable-external-profiling
206 else if (std::string(options_keys[i]) == std::string("enable-external-profiling"))
207 {
208 extProfilingParams.m_EnableProfiling = armnn::stringUtils::StringToBool(options_values[i]);
209 }
210 // Process timeline-profiling
211 else if (std::string(options_keys[i]) == std::string("timeline-profiling"))
212 {
213 extProfilingParams.m_TimelineEnabled = armnn::stringUtils::StringToBool(options_values[i]);
214 }
215 // Process outgoing-capture-file
216 else if (std::string(options_keys[i]) == std::string("outgoing-capture-file"))
217 {
218 extProfilingParams.m_OutgoingCaptureFile = options_values[i];
219 }
220 // Process incoming-capture-file
221 else if (std::string(options_keys[i]) == std::string("incoming-capture-file"))
222 {
223 extProfilingParams.m_IncomingCaptureFile = options_values[i];
224 }
225 // Process file-only-external-profiling
226 else if (std::string(options_keys[i]) == std::string("file-only-external-profiling"))
227 {
228 extProfilingParams.m_FileOnly = armnn::stringUtils::StringToBool(options_values[i]);
229 }
230 // Process counter-capture-period
231 else if (std::string(options_keys[i]) == std::string("counter-capture-period"))
232 {
233 extProfilingParams.m_CapturePeriod = static_cast<uint32_t>(std::stoul(options_values[i]));
234 }
235 // Process profiling-file-format
236 else if (std::string(options_keys[i]) == std::string("profiling-file-format"))
237 {
238 extProfilingParams.m_FileFormat = options_values[i];
239 }
240 // Process serialize-to-dot
241 else if (std::string(options_keys[i]) == std::string("serialize-to-dot"))
242 {
243 this->SetSerializeToDot(options_values[i]);
244 }
245 else
246 {
247 throw armnn::Exception("Unknown option for the ArmNN Delegate given: " + std::string(options_keys[i]));
248 }
249 }
250
251 this->SetRuntimeOptions(runtimeOptions);
252 this->SetOptimizerOptions(optimizerOptions);
253 this->SetInternalProfilingParams(internalProfilingState, internalProfilingDetail);
254 this->SetExternalProfilingParams(extProfilingParams);
255}
Sadik Armagan3c24f432020-10-19 17:35:30 +0100256} // namespace armnnDelegate