blob: fc4858fa29f7951efd4a76be7109fcae3e05f3dc [file] [log] [blame]
Sadik Armagan3c24f432020-10-19 17:35:30 +01001//
Colm Donelan35a06892023-02-06 15:01:57 +00002// Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved.
Sadik Armagan3c24f432020-10-19 17:35:30 +01003// 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;
Jan Eilersf39f8d82021-10-26 16:57:34 +010062 for (size_t i = 0; i < num_options; ++i)
63 {
64 // Process backends
65 if (std::string(options_keys[i]) == std::string("backends"))
66 {
67 // The backend option is a comma separated string of backendIDs that needs to be split
68 std::vector<armnn::BackendId> backends;
69 char* dup = strdup(options_values[i]);
70 char* pch = std::strtok(dup, ",");
71 while (pch != NULL)
72 {
73 backends.push_back(pch);
74 pch = strtok (NULL, ",");
75 }
76 this->SetBackends(backends);
77 }
78 // Process dynamic-backends-path
79 else if (std::string(options_keys[i]) == std::string("dynamic-backends-path"))
80 {
81 runtimeOptions.m_DynamicBackendsPath = std::string(options_values[i]);
82 }
83 // Process logging level
84 else if (std::string(options_keys[i]) == std::string("logging-severity"))
85 {
86 this->SetLoggingSeverity(options_values[i]);
87 }
88 // Process GPU backend options
89 else if (std::string(options_keys[i]) == std::string("gpu-tuning-level"))
90 {
91 armnn::BackendOptions option("GpuAcc", {{"TuningLevel", atoi(options_values[i])}});
92 runtimeOptions.m_BackendOptions.push_back(option);
93 }
94 else if (std::string(options_keys[i]) == std::string("gpu-mlgo-tuning-file"))
95 {
96 armnn::BackendOptions option("GpuAcc", {{"MLGOTuningFilePath", std::string(options_values[i])}});
97 optimizerOptions.m_ModelOptions.push_back(option);
98 }
99 else if (std::string(options_keys[i]) == std::string("gpu-tuning-file"))
100 {
101 armnn::BackendOptions option("GpuAcc", {{"TuningFile", std::string(options_values[i])}});
102 runtimeOptions.m_BackendOptions.push_back(option);
103 }
104 else if (std::string(options_keys[i]) == std::string("gpu-enable-profiling"))
105 {
106 runtimeOptions.m_EnableGpuProfiling = (*options_values[i] != '0');
107 }
108 else if (std::string(options_keys[i]) == std::string("gpu-kernel-profiling-enabled"))
109 {
110 armnn::BackendOptions option("GpuAcc", {{"KernelProfilingEnabled",
111 armnn::stringUtils::StringToBool(options_values[i])}});
112 runtimeOptions.m_BackendOptions.push_back(option);
113 }
114 else if (std::string(options_keys[i]) == std::string("save-cached-network"))
115 {
116 armnn::BackendOptions option("GpuAcc", {{"SaveCachedNetwork",
117 armnn::stringUtils::StringToBool(options_values[i])}});
118 optimizerOptions.m_ModelOptions.push_back(option);
119 }
120 else if (std::string(options_keys[i]) == std::string("cached-network-filepath"))
121 {
122 armnn::BackendOptions option("GpuAcc", {{"CachedNetworkFilePath", std::string(options_values[i])}});
123 optimizerOptions.m_ModelOptions.push_back(option);
124 }
125 // Process GPU & CPU backend options
126 else if (std::string(options_keys[i]) == std::string("enable-fast-math"))
127 {
128 armnn::BackendOptions modelOptionGpu("GpuAcc", {{"FastMathEnabled",
129 armnn::stringUtils::StringToBool(options_values[i])}});
130 optimizerOptions.m_ModelOptions.push_back(modelOptionGpu);
131
132 armnn::BackendOptions modelOptionCpu("CpuAcc", {{"FastMathEnabled",
133 armnn::stringUtils::StringToBool(options_values[i])}});
134 optimizerOptions.m_ModelOptions.push_back(modelOptionCpu);
135 }
136 // Process CPU backend options
137 else if (std::string(options_keys[i]) == std::string("number-of-threads"))
138 {
139 unsigned int numberOfThreads = armnn::numeric_cast<unsigned int>(atoi(options_values[i]));
140 armnn::BackendOptions modelOption("CpuAcc", {{"NumberOfThreads", numberOfThreads}});
141 optimizerOptions.m_ModelOptions.push_back(modelOption);
142 }
143 // Process reduce-fp32-to-fp16 option
144 else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-fp16"))
145 {
146 optimizerOptions.m_ReduceFp32ToFp16 = armnn::stringUtils::StringToBool(options_values[i]);
147 }
Jan Eilersf39f8d82021-10-26 16:57:34 +0100148 // Process debug-data
149 else if (std::string(options_keys[i]) == std::string("debug-data"))
150 {
151 optimizerOptions.m_Debug = armnn::stringUtils::StringToBool(options_values[i]);
152 }
Mike Kelly80512b02022-05-16 23:10:42 +0100153 // Infer output-shape
154 else if (std::string(options_keys[i]) == std::string("infer-output-shape"))
155 {
156 armnn::BackendOptions backendOption("ShapeInferenceMethod",
157 {
158 { "InferAndValidate", armnn::stringUtils::StringToBool(options_values[i]) }
159 });
160 optimizerOptions.m_ModelOptions.push_back(backendOption);
161 }
162 // Allow expanded dims
163 else if (std::string(options_keys[i]) == std::string("allow-expanded-dims"))
164 {
165 armnn::BackendOptions backendOption("AllowExpandedDims",
166 {
167 { "AllowExpandedDims", armnn::stringUtils::StringToBool(options_values[i]) }
168 });
169 optimizerOptions.m_ModelOptions.push_back(backendOption);
170 }
Jan Eilersf39f8d82021-10-26 16:57:34 +0100171 // Process memory-import
172 else if (std::string(options_keys[i]) == std::string("memory-import"))
173 {
174 optimizerOptions.m_ImportEnabled = armnn::stringUtils::StringToBool(options_values[i]);
175 }
176 // Process enable-internal-profiling
177 else if (std::string(options_keys[i]) == std::string("enable-internal-profiling"))
178 {
179 internalProfilingState = *options_values[i] != '0';
180 optimizerOptions.m_ProfilingEnabled = internalProfilingState;
181 }
182 // Process internal-profiling-detail
183 else if (std::string(options_keys[i]) == std::string("internal-profiling-detail"))
184 {
185 uint32_t detailLevel = static_cast<uint32_t>(std::stoul(options_values[i]));
186 switch (detailLevel)
187 {
188 case 1:
189 internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
190 break;
191 case 2:
192 internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsOnly;
193 break;
194 default:
195 internalProfilingDetail = armnn::ProfilingDetailsMethod::Undefined;
196 break;
197 }
198 }
199 // Process enable-external-profiling
200 else if (std::string(options_keys[i]) == std::string("enable-external-profiling"))
201 {
Colm Donelan35a06892023-02-06 15:01:57 +0000202 runtimeOptions.m_ProfilingOptions.m_EnableProfiling =
203 armnn::stringUtils::StringToBool(options_values[i]);
Jan Eilersf39f8d82021-10-26 16:57:34 +0100204 }
Colm Donelan35a06892023-02-06 15:01:57 +0000205 // Process timeline-profiling
Jan Eilersf39f8d82021-10-26 16:57:34 +0100206 else if (std::string(options_keys[i]) == std::string("timeline-profiling"))
207 {
Colm Donelan35a06892023-02-06 15:01:57 +0000208 runtimeOptions.m_ProfilingOptions.m_TimelineEnabled = armnn::stringUtils::StringToBool(options_values[i]);
Jan Eilersf39f8d82021-10-26 16:57:34 +0100209 }
Colm Donelan35a06892023-02-06 15:01:57 +0000210 // Process outgoing-capture-file
Jan Eilersf39f8d82021-10-26 16:57:34 +0100211 else if (std::string(options_keys[i]) == std::string("outgoing-capture-file"))
212 {
Colm Donelan35a06892023-02-06 15:01:57 +0000213 runtimeOptions.m_ProfilingOptions.m_OutgoingCaptureFile = options_values[i];
Jan Eilersf39f8d82021-10-26 16:57:34 +0100214 }
Colm Donelan35a06892023-02-06 15:01:57 +0000215 // Process incoming-capture-file
Jan Eilersf39f8d82021-10-26 16:57:34 +0100216 else if (std::string(options_keys[i]) == std::string("incoming-capture-file"))
217 {
Colm Donelan35a06892023-02-06 15:01:57 +0000218 runtimeOptions.m_ProfilingOptions.m_IncomingCaptureFile = options_values[i];
Jan Eilersf39f8d82021-10-26 16:57:34 +0100219 }
Colm Donelan35a06892023-02-06 15:01:57 +0000220 // Process file-only-external-profiling
Jan Eilersf39f8d82021-10-26 16:57:34 +0100221 else if (std::string(options_keys[i]) == std::string("file-only-external-profiling"))
222 {
Colm Donelan35a06892023-02-06 15:01:57 +0000223 runtimeOptions.m_ProfilingOptions.m_FileOnly = armnn::stringUtils::StringToBool(options_values[i]);
Jan Eilersf39f8d82021-10-26 16:57:34 +0100224 }
Colm Donelan35a06892023-02-06 15:01:57 +0000225 // Process counter-capture-period
Jan Eilersf39f8d82021-10-26 16:57:34 +0100226 else if (std::string(options_keys[i]) == std::string("counter-capture-period"))
227 {
Colm Donelan35a06892023-02-06 15:01:57 +0000228 runtimeOptions.m_ProfilingOptions.m_CapturePeriod = static_cast<uint32_t>(std::stoul(options_values[i]));
Jan Eilersf39f8d82021-10-26 16:57:34 +0100229 }
Colm Donelan35a06892023-02-06 15:01:57 +0000230 // Process profiling-file-format
Jan Eilersf39f8d82021-10-26 16:57:34 +0100231 else if (std::string(options_keys[i]) == std::string("profiling-file-format"))
232 {
Colm Donelan35a06892023-02-06 15:01:57 +0000233 runtimeOptions.m_ProfilingOptions.m_FileFormat = options_values[i];
Jan Eilersf39f8d82021-10-26 16:57:34 +0100234 }
Colm Donelan35a06892023-02-06 15:01:57 +0000235 // Process serialize-to-dot
Jan Eilersf39f8d82021-10-26 16:57:34 +0100236 else if (std::string(options_keys[i]) == std::string("serialize-to-dot"))
237 {
238 this->SetSerializeToDot(options_values[i]);
239 }
Sadik Armaganca565c12022-08-16 12:17:24 +0100240
241 // Process disable-tflite-runtime-fallback
242 else if (std::string(options_keys[i]) == std::string("disable-tflite-runtime-fallback"))
243 {
244 this->DisableTfLiteRuntimeFallback(armnn::stringUtils::StringToBool(options_values[i]));
245 }
Jan Eilersf39f8d82021-10-26 16:57:34 +0100246 else
247 {
248 throw armnn::Exception("Unknown option for the ArmNN Delegate given: " + std::string(options_keys[i]));
249 }
250 }
251
252 this->SetRuntimeOptions(runtimeOptions);
253 this->SetOptimizerOptions(optimizerOptions);
254 this->SetInternalProfilingParams(internalProfilingState, internalProfilingDetail);
Jan Eilersf39f8d82021-10-26 16:57:34 +0100255}
Sadik Armagan3c24f432020-10-19 17:35:30 +0100256} // namespace armnnDelegate