xref: /aosp_15_r20/external/armnn/delegate/common/src/DelegateOptions.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include <DelegateOptions.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/NumericCast.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/StringUtils.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker namespace armnnDelegate
11*89c4ff92SAndroid Build Coastguard Worker {
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker struct DelegateOptionsImpl
14*89c4ff92SAndroid Build Coastguard Worker {
15*89c4ff92SAndroid Build Coastguard Worker     ~DelegateOptionsImpl() = default;
16*89c4ff92SAndroid Build Coastguard Worker     DelegateOptionsImpl() = default;
17*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptionsImplarmnnDelegate::DelegateOptionsImpl18*89c4ff92SAndroid Build Coastguard Worker     explicit DelegateOptionsImpl(armnn::Compute computeDevice,
19*89c4ff92SAndroid Build Coastguard Worker                         const std::vector<armnn::BackendOptions>& backendOptions,
20*89c4ff92SAndroid Build Coastguard Worker                         const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
21*89c4ff92SAndroid Build Coastguard Worker                         : p_Backends({computeDevice}), p_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel)
22*89c4ff92SAndroid Build Coastguard Worker     {
23*89c4ff92SAndroid Build Coastguard Worker         p_RuntimeOptions.m_BackendOptions = backendOptions;
24*89c4ff92SAndroid Build Coastguard Worker     }
25*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptionsImplarmnnDelegate::DelegateOptionsImpl26*89c4ff92SAndroid Build Coastguard Worker     explicit DelegateOptionsImpl(const std::vector<armnn::BackendId>& backends,
27*89c4ff92SAndroid Build Coastguard Worker                                  const std::vector<armnn::BackendOptions>& backendOptions,
28*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
29*89c4ff92SAndroid Build Coastguard Worker             : p_Backends(backends), p_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel)
30*89c4ff92SAndroid Build Coastguard Worker     {
31*89c4ff92SAndroid Build Coastguard Worker         p_RuntimeOptions.m_BackendOptions = backendOptions;
32*89c4ff92SAndroid Build Coastguard Worker     }
33*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptionsImplarmnnDelegate::DelegateOptionsImpl34*89c4ff92SAndroid Build Coastguard Worker     explicit DelegateOptionsImpl(armnn::Compute computeDevice,
35*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::OptimizerOptionsOpaque& optimizerOptions,
36*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
37*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::DebugCallbackFunction>& func)
38*89c4ff92SAndroid Build Coastguard Worker             : p_Backends({computeDevice}),
39*89c4ff92SAndroid Build Coastguard Worker               p_RuntimeOptions(),
40*89c4ff92SAndroid Build Coastguard Worker               p_OptimizerOptions(optimizerOptions),
41*89c4ff92SAndroid Build Coastguard Worker               m_LoggingSeverity(logSeverityLevel),
42*89c4ff92SAndroid Build Coastguard Worker               p_DebugCallbackFunc(func)
43*89c4ff92SAndroid Build Coastguard Worker     {
44*89c4ff92SAndroid Build Coastguard Worker     }
45*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptionsImplarmnnDelegate::DelegateOptionsImpl46*89c4ff92SAndroid Build Coastguard Worker     explicit DelegateOptionsImpl(const std::vector<armnn::BackendId>& backends,
47*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::OptimizerOptionsOpaque& optimizerOptions,
48*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
49*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::DebugCallbackFunction>& func)
50*89c4ff92SAndroid Build Coastguard Worker             : p_Backends(backends),
51*89c4ff92SAndroid Build Coastguard Worker               p_RuntimeOptions(),
52*89c4ff92SAndroid Build Coastguard Worker               p_OptimizerOptions(optimizerOptions),
53*89c4ff92SAndroid Build Coastguard Worker               m_LoggingSeverity(logSeverityLevel),
54*89c4ff92SAndroid Build Coastguard Worker               p_DebugCallbackFunc(func)
55*89c4ff92SAndroid Build Coastguard Worker     {
56*89c4ff92SAndroid Build Coastguard Worker     }
57*89c4ff92SAndroid Build Coastguard Worker 
58*89c4ff92SAndroid Build Coastguard Worker     /// Which backend to run Delegate on.
59*89c4ff92SAndroid Build Coastguard Worker     /// Examples of possible values are: CpuRef, CpuAcc, GpuAcc.
60*89c4ff92SAndroid Build Coastguard Worker     /// CpuRef as default.
61*89c4ff92SAndroid Build Coastguard Worker     std::vector<armnn::BackendId> p_Backends = {armnn::Compute::CpuRef };
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker     /// Creation options for the ArmNN runtime
64*89c4ff92SAndroid Build Coastguard Worker     /// Contains options for global settings that are valid for the whole lifetime of ArmNN
65*89c4ff92SAndroid Build Coastguard Worker     /// i.e. BackendOptions, DynamicBackendPath, ExternalProfilingOptions and more
66*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions p_RuntimeOptions;
67*89c4ff92SAndroid Build Coastguard Worker 
68*89c4ff92SAndroid Build Coastguard Worker     /// Options for the optimization step for the network
69*89c4ff92SAndroid Build Coastguard Worker     armnn::OptimizerOptionsOpaque p_OptimizerOptions;
70*89c4ff92SAndroid Build Coastguard Worker 
71*89c4ff92SAndroid Build Coastguard Worker     /// Internal profiling options. Written to INetworkProperties during model load.
72*89c4ff92SAndroid Build Coastguard Worker     /// Indicates whether internal profiling is enabled or not.
73*89c4ff92SAndroid Build Coastguard Worker     bool m_InternalProfilingEnabled = false;
74*89c4ff92SAndroid Build Coastguard Worker 
75*89c4ff92SAndroid Build Coastguard Worker     /// Sets the level of detail output by the profiling. Options are DetailsWithEvents = 1 and DetailsOnly = 2
76*89c4ff92SAndroid Build Coastguard Worker     armnn::ProfilingDetailsMethod p_InternalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
77*89c4ff92SAndroid Build Coastguard Worker 
78*89c4ff92SAndroid Build Coastguard Worker     /// Severity level for logging within ArmNN that will be used on creation of the delegate
79*89c4ff92SAndroid Build Coastguard Worker     armnn::Optional<armnn::LogSeverity> m_LoggingSeverity;
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker     /// A callback function to debug layers performing custom computations on intermediate tensors.
82*89c4ff92SAndroid Build Coastguard Worker     /// If a function is not registered, and debug is enabled in OptimizerOptions,
83*89c4ff92SAndroid Build Coastguard Worker     /// debug will print information of the intermediate tensors.
84*89c4ff92SAndroid Build Coastguard Worker     armnn::Optional<armnn::DebugCallbackFunction> p_DebugCallbackFunc;
85*89c4ff92SAndroid Build Coastguard Worker 
86*89c4ff92SAndroid Build Coastguard Worker     /// If not empty then the optimized model will be serialized to a file with this file name in "dot" format.
87*89c4ff92SAndroid Build Coastguard Worker     std::string m_SerializeToDot = "";
88*89c4ff92SAndroid Build Coastguard Worker 
89*89c4ff92SAndroid Build Coastguard Worker     /// Option to disable TfLite Runtime fallback for unsupported operators.
90*89c4ff92SAndroid Build Coastguard Worker     bool m_DisableTfLiteRuntimeFallback = false;
91*89c4ff92SAndroid Build Coastguard Worker 
92*89c4ff92SAndroid Build Coastguard Worker };
93*89c4ff92SAndroid Build Coastguard Worker 
94*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::~DelegateOptions() = default;
95*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions()96*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions()
97*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>())
98*89c4ff92SAndroid Build Coastguard Worker {
99*89c4ff92SAndroid Build Coastguard Worker }
100*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(DelegateOptions const & other)101*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(DelegateOptions const &other)
102*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>(*other.p_DelegateOptionsImpl))
103*89c4ff92SAndroid Build Coastguard Worker {
104*89c4ff92SAndroid Build Coastguard Worker }
105*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(armnn::Compute computeDevice,const std::vector<armnn::BackendOptions> & backendOptions,const armnn::Optional<armnn::LogSeverity> logSeverityLevel)106*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(armnn::Compute computeDevice,
107*89c4ff92SAndroid Build Coastguard Worker                                  const std::vector<armnn::BackendOptions>& backendOptions,
108*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
109*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>(computeDevice, backendOptions, logSeverityLevel))
110*89c4ff92SAndroid Build Coastguard Worker {
111*89c4ff92SAndroid Build Coastguard Worker }
112*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(const std::vector<armnn::BackendId> & backends,const std::vector<armnn::BackendOptions> & backendOptions,const armnn::Optional<armnn::LogSeverity> logSeverityLevel)113*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(const std::vector<armnn::BackendId>& backends,
114*89c4ff92SAndroid Build Coastguard Worker                                  const std::vector<armnn::BackendOptions>& backendOptions,
115*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity> logSeverityLevel)
116*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>(backends, backendOptions, logSeverityLevel))
117*89c4ff92SAndroid Build Coastguard Worker {
118*89c4ff92SAndroid Build Coastguard Worker }
119*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(armnn::Compute computeDevice,const armnn::OptimizerOptionsOpaque & optimizerOptions,const armnn::Optional<armnn::LogSeverity> & logSeverityLevel,const armnn::Optional<armnn::DebugCallbackFunction> & func)120*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(armnn::Compute computeDevice,
121*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::OptimizerOptionsOpaque& optimizerOptions,
122*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
123*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::DebugCallbackFunction>& func)
124*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>(computeDevice, optimizerOptions,
125*89c4ff92SAndroid Build Coastguard Worker                                                                   logSeverityLevel, func))
126*89c4ff92SAndroid Build Coastguard Worker {
127*89c4ff92SAndroid Build Coastguard Worker }
128*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(const std::vector<armnn::BackendId> & backends,const armnn::OptimizerOptionsOpaque & optimizerOptions,const armnn::Optional<armnn::LogSeverity> & logSeverityLevel,const armnn::Optional<armnn::DebugCallbackFunction> & func)129*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(const std::vector<armnn::BackendId>& backends,
130*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::OptimizerOptionsOpaque& optimizerOptions,
131*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::LogSeverity>& logSeverityLevel,
132*89c4ff92SAndroid Build Coastguard Worker                                  const armnn::Optional<armnn::DebugCallbackFunction>& func)
133*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>(backends, optimizerOptions,
134*89c4ff92SAndroid Build Coastguard Worker                                                                   logSeverityLevel, func))
135*89c4ff92SAndroid Build Coastguard Worker {
136*89c4ff92SAndroid Build Coastguard Worker }
137*89c4ff92SAndroid Build Coastguard Worker 
DelegateOptions(char const * const * options_keys,char const * const * options_values,size_t num_options,void (* report_error)(const char *))138*89c4ff92SAndroid Build Coastguard Worker DelegateOptions::DelegateOptions(char const* const* options_keys,
139*89c4ff92SAndroid Build Coastguard Worker                                  char const* const* options_values,
140*89c4ff92SAndroid Build Coastguard Worker                                  size_t num_options,
141*89c4ff92SAndroid Build Coastguard Worker                                  void (*report_error)(const char*))
142*89c4ff92SAndroid Build Coastguard Worker     : p_DelegateOptionsImpl(std::make_unique<DelegateOptionsImpl>())
143*89c4ff92SAndroid Build Coastguard Worker {
144*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions runtimeOptions;
145*89c4ff92SAndroid Build Coastguard Worker     armnn::OptimizerOptionsOpaque optimizerOptions;
146*89c4ff92SAndroid Build Coastguard Worker     bool internalProfilingState = false;
147*89c4ff92SAndroid Build Coastguard Worker     armnn::ProfilingDetailsMethod internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
148*89c4ff92SAndroid Build Coastguard Worker     for (size_t i = 0; i < num_options; ++i)
149*89c4ff92SAndroid Build Coastguard Worker     {
150*89c4ff92SAndroid Build Coastguard Worker         // Process backends
151*89c4ff92SAndroid Build Coastguard Worker         if (std::string(options_keys[i]) == std::string("backends"))
152*89c4ff92SAndroid Build Coastguard Worker         {
153*89c4ff92SAndroid Build Coastguard Worker             // The backend option is a comma separated string of backendIDs that needs to be split
154*89c4ff92SAndroid Build Coastguard Worker             std::vector<armnn::BackendId> backends;
155*89c4ff92SAndroid Build Coastguard Worker             char* dup = strdup(options_values[i]);
156*89c4ff92SAndroid Build Coastguard Worker             char* pch = std::strtok(dup, ",");
157*89c4ff92SAndroid Build Coastguard Worker             while (pch != NULL)
158*89c4ff92SAndroid Build Coastguard Worker             {
159*89c4ff92SAndroid Build Coastguard Worker                 backends.push_back(pch);
160*89c4ff92SAndroid Build Coastguard Worker                 pch = strtok (NULL, ",");
161*89c4ff92SAndroid Build Coastguard Worker             }
162*89c4ff92SAndroid Build Coastguard Worker             SetBackends(backends);
163*89c4ff92SAndroid Build Coastguard Worker         }
164*89c4ff92SAndroid Build Coastguard Worker             // Process dynamic-backends-path
165*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("dynamic-backends-path"))
166*89c4ff92SAndroid Build Coastguard Worker         {
167*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_DynamicBackendsPath = std::string(options_values[i]);
168*89c4ff92SAndroid Build Coastguard Worker         }
169*89c4ff92SAndroid Build Coastguard Worker             // Process logging level
170*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("logging-severity"))
171*89c4ff92SAndroid Build Coastguard Worker         {
172*89c4ff92SAndroid Build Coastguard Worker             SetLoggingSeverity(options_values[i]);
173*89c4ff92SAndroid Build Coastguard Worker         }
174*89c4ff92SAndroid Build Coastguard Worker             // Process GPU backend options
175*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("gpu-tuning-level"))
176*89c4ff92SAndroid Build Coastguard Worker         {
177*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"TuningLevel",
178*89c4ff92SAndroid Build Coastguard Worker                                                      atoi(options_values[i])}});
179*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_BackendOptions.push_back(option);
180*89c4ff92SAndroid Build Coastguard Worker         }
181*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("gpu-mlgo-tuning-file"))
182*89c4ff92SAndroid Build Coastguard Worker         {
183*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"MLGOTuningFilePath",
184*89c4ff92SAndroid Build Coastguard Worker                                                      std::string(options_values[i])}});
185*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(option);
186*89c4ff92SAndroid Build Coastguard Worker         }
187*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("gpu-tuning-file"))
188*89c4ff92SAndroid Build Coastguard Worker         {
189*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"TuningFile",
190*89c4ff92SAndroid Build Coastguard Worker                                                      std::string(options_values[i])}});
191*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_BackendOptions.push_back(option);
192*89c4ff92SAndroid Build Coastguard Worker         }
193*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("gpu-enable-profiling"))
194*89c4ff92SAndroid Build Coastguard Worker         {
195*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_EnableGpuProfiling = (*options_values[i] != '0');
196*89c4ff92SAndroid Build Coastguard Worker         }
197*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("gpu-kernel-profiling-enabled"))
198*89c4ff92SAndroid Build Coastguard Worker         {
199*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"KernelProfilingEnabled",
200*89c4ff92SAndroid Build Coastguard Worker                                                      armnn::stringUtils::StringToBool(options_values[i])}});
201*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_BackendOptions.push_back(option);
202*89c4ff92SAndroid Build Coastguard Worker         }
203*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("save-cached-network"))
204*89c4ff92SAndroid Build Coastguard Worker         {
205*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"SaveCachedNetwork",
206*89c4ff92SAndroid Build Coastguard Worker                                                      armnn::stringUtils::StringToBool(options_values[i])}});
207*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(option);
208*89c4ff92SAndroid Build Coastguard Worker         }
209*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("cached-network-filepath"))
210*89c4ff92SAndroid Build Coastguard Worker         {
211*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions option("GpuAcc", {{"CachedNetworkFilePath",
212*89c4ff92SAndroid Build Coastguard Worker                                                      std::string(options_values[i])}});
213*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(option);
214*89c4ff92SAndroid Build Coastguard Worker         }
215*89c4ff92SAndroid Build Coastguard Worker             // Process GPU & CPU backend options
216*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("enable-fast-math"))
217*89c4ff92SAndroid Build Coastguard Worker         {
218*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions modelOptionGpu("GpuAcc", {{"FastMathEnabled",
219*89c4ff92SAndroid Build Coastguard Worker                                                  armnn::stringUtils::StringToBool(options_values[i])}});
220*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(modelOptionGpu);
221*89c4ff92SAndroid Build Coastguard Worker 
222*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions modelOptionCpu("CpuAcc", {{"FastMathEnabled",
223*89c4ff92SAndroid Build Coastguard Worker                                                  armnn::stringUtils::StringToBool(options_values[i])}});
224*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(modelOptionCpu);
225*89c4ff92SAndroid Build Coastguard Worker         }
226*89c4ff92SAndroid Build Coastguard Worker             // Process CPU backend options
227*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("number-of-threads"))
228*89c4ff92SAndroid Build Coastguard Worker         {
229*89c4ff92SAndroid Build Coastguard Worker             unsigned int numberOfThreads = armnn::numeric_cast<unsigned int>(atoi(options_values[i]));
230*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions modelOption("CpuAcc",
231*89c4ff92SAndroid Build Coastguard Worker                                               {{"NumberOfThreads", numberOfThreads}});
232*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(modelOption);
233*89c4ff92SAndroid Build Coastguard Worker         }
234*89c4ff92SAndroid Build Coastguard Worker             // Process reduce-fp32-to-fp16 option
235*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-fp16"))
236*89c4ff92SAndroid Build Coastguard Worker         {
237*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.SetReduceFp32ToFp16(armnn::stringUtils::StringToBool(options_values[i]));
238*89c4ff92SAndroid Build Coastguard Worker         }
239*89c4ff92SAndroid Build Coastguard Worker             // Process debug-data
240*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("debug-data"))
241*89c4ff92SAndroid Build Coastguard Worker         {
242*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.SetDebugEnabled(armnn::stringUtils::StringToBool(options_values[i]));
243*89c4ff92SAndroid Build Coastguard Worker         }
244*89c4ff92SAndroid Build Coastguard Worker             // Infer output-shape
245*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("infer-output-shape"))
246*89c4ff92SAndroid Build Coastguard Worker         {
247*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions backendOption("ShapeInferenceMethod",
248*89c4ff92SAndroid Build Coastguard Worker             {
249*89c4ff92SAndroid Build Coastguard Worker                 { "InferAndValidate", armnn::stringUtils::StringToBool(options_values[i]) }
250*89c4ff92SAndroid Build Coastguard Worker             });
251*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(backendOption);
252*89c4ff92SAndroid Build Coastguard Worker         }
253*89c4ff92SAndroid Build Coastguard Worker             // Allow expanded dims
254*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("allow-expanded-dims"))
255*89c4ff92SAndroid Build Coastguard Worker         {
256*89c4ff92SAndroid Build Coastguard Worker             armnn::BackendOptions backendOption("AllowExpandedDims",
257*89c4ff92SAndroid Build Coastguard Worker             {
258*89c4ff92SAndroid Build Coastguard Worker                 { "AllowExpandedDims", armnn::stringUtils::StringToBool(options_values[i]) }
259*89c4ff92SAndroid Build Coastguard Worker             });
260*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.AddModelOption(backendOption);
261*89c4ff92SAndroid Build Coastguard Worker         }
262*89c4ff92SAndroid Build Coastguard Worker             // Process memory-import
263*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("memory-import"))
264*89c4ff92SAndroid Build Coastguard Worker         {
265*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.SetImportEnabled(armnn::stringUtils::StringToBool(options_values[i]));
266*89c4ff92SAndroid Build Coastguard Worker         }
267*89c4ff92SAndroid Build Coastguard Worker             // Process enable-internal-profiling
268*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("enable-internal-profiling"))
269*89c4ff92SAndroid Build Coastguard Worker         {
270*89c4ff92SAndroid Build Coastguard Worker             internalProfilingState = *options_values[i] != '0';
271*89c4ff92SAndroid Build Coastguard Worker             optimizerOptions.SetProfilingEnabled(internalProfilingState);
272*89c4ff92SAndroid Build Coastguard Worker         }
273*89c4ff92SAndroid Build Coastguard Worker             // Process internal-profiling-detail
274*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("internal-profiling-detail"))
275*89c4ff92SAndroid Build Coastguard Worker         {
276*89c4ff92SAndroid Build Coastguard Worker             uint32_t detailLevel = static_cast<uint32_t>(std::stoul(options_values[i]));
277*89c4ff92SAndroid Build Coastguard Worker             switch (detailLevel)
278*89c4ff92SAndroid Build Coastguard Worker             {
279*89c4ff92SAndroid Build Coastguard Worker                 case 1:
280*89c4ff92SAndroid Build Coastguard Worker                     internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents;
281*89c4ff92SAndroid Build Coastguard Worker                     break;
282*89c4ff92SAndroid Build Coastguard Worker                 case 2:
283*89c4ff92SAndroid Build Coastguard Worker                     internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsOnly;
284*89c4ff92SAndroid Build Coastguard Worker                     break;
285*89c4ff92SAndroid Build Coastguard Worker                 default:
286*89c4ff92SAndroid Build Coastguard Worker                     internalProfilingDetail = armnn::ProfilingDetailsMethod::Undefined;
287*89c4ff92SAndroid Build Coastguard Worker                     break;
288*89c4ff92SAndroid Build Coastguard Worker             }
289*89c4ff92SAndroid Build Coastguard Worker         }
290*89c4ff92SAndroid Build Coastguard Worker             // Process enable-external-profiling
291*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("enable-external-profiling"))
292*89c4ff92SAndroid Build Coastguard Worker         {
293*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_EnableProfiling =
294*89c4ff92SAndroid Build Coastguard Worker                 armnn::stringUtils::StringToBool(options_values[i]);
295*89c4ff92SAndroid Build Coastguard Worker         }
296*89c4ff92SAndroid Build Coastguard Worker         // Process timeline-profiling
297*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("timeline-profiling"))
298*89c4ff92SAndroid Build Coastguard Worker         {
299*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_TimelineEnabled =
300*89c4ff92SAndroid Build Coastguard Worker                 armnn::stringUtils::StringToBool(options_values[i]);
301*89c4ff92SAndroid Build Coastguard Worker         }
302*89c4ff92SAndroid Build Coastguard Worker         // Process outgoing-capture-file
303*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("outgoing-capture-file"))
304*89c4ff92SAndroid Build Coastguard Worker         {
305*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_OutgoingCaptureFile = options_values[i];
306*89c4ff92SAndroid Build Coastguard Worker         }
307*89c4ff92SAndroid Build Coastguard Worker         // Process incoming-capture-file
308*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("incoming-capture-file"))
309*89c4ff92SAndroid Build Coastguard Worker         {
310*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_IncomingCaptureFile = options_values[i];
311*89c4ff92SAndroid Build Coastguard Worker         }
312*89c4ff92SAndroid Build Coastguard Worker         // Process file-only-external-profiling
313*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("file-only-external-profiling"))
314*89c4ff92SAndroid Build Coastguard Worker         {
315*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_FileOnly =
316*89c4ff92SAndroid Build Coastguard Worker                     armnn::stringUtils::StringToBool(options_values[i]);
317*89c4ff92SAndroid Build Coastguard Worker         }
318*89c4ff92SAndroid Build Coastguard Worker         // Process counter-capture-period
319*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("counter-capture-period"))
320*89c4ff92SAndroid Build Coastguard Worker         {
321*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_CapturePeriod =
322*89c4ff92SAndroid Build Coastguard Worker                     static_cast<uint32_t>(std::stoul(options_values[i]));
323*89c4ff92SAndroid Build Coastguard Worker         }
324*89c4ff92SAndroid Build Coastguard Worker         // Process profiling-file-format
325*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("profiling-file-format"))
326*89c4ff92SAndroid Build Coastguard Worker         {
327*89c4ff92SAndroid Build Coastguard Worker             runtimeOptions.m_ProfilingOptions.m_FileFormat = options_values[i];
328*89c4ff92SAndroid Build Coastguard Worker         }
329*89c4ff92SAndroid Build Coastguard Worker         // Process serialize-to-dot
330*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("serialize-to-dot"))
331*89c4ff92SAndroid Build Coastguard Worker         {
332*89c4ff92SAndroid Build Coastguard Worker             SetSerializeToDot(options_values[i]);
333*89c4ff92SAndroid Build Coastguard Worker         }
334*89c4ff92SAndroid Build Coastguard Worker 
335*89c4ff92SAndroid Build Coastguard Worker         // Process disable-tflite-runtime-fallback
336*89c4ff92SAndroid Build Coastguard Worker         else if (std::string(options_keys[i]) == std::string("disable-tflite-runtime-fallback"))
337*89c4ff92SAndroid Build Coastguard Worker         {
338*89c4ff92SAndroid Build Coastguard Worker             this->DisableTfLiteRuntimeFallback(armnn::stringUtils::StringToBool(options_values[i]));
339*89c4ff92SAndroid Build Coastguard Worker         }
340*89c4ff92SAndroid Build Coastguard Worker         else
341*89c4ff92SAndroid Build Coastguard Worker         {
342*89c4ff92SAndroid Build Coastguard Worker             throw armnn::Exception("Unknown option for the ArmNN Delegate given: " +
343*89c4ff92SAndroid Build Coastguard Worker                 std::string(options_keys[i]));
344*89c4ff92SAndroid Build Coastguard Worker         }
345*89c4ff92SAndroid Build Coastguard Worker     }
346*89c4ff92SAndroid Build Coastguard Worker 
347*89c4ff92SAndroid Build Coastguard Worker     SetRuntimeOptions(runtimeOptions);
348*89c4ff92SAndroid Build Coastguard Worker     SetOptimizerOptions(optimizerOptions);
349*89c4ff92SAndroid Build Coastguard Worker     SetInternalProfilingParams(internalProfilingState, internalProfilingDetail);
350*89c4ff92SAndroid Build Coastguard Worker }
351*89c4ff92SAndroid Build Coastguard Worker 
GetBackends() const352*89c4ff92SAndroid Build Coastguard Worker const std::vector<armnn::BackendId>& DelegateOptions::GetBackends() const
353*89c4ff92SAndroid Build Coastguard Worker {
354*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_Backends;
355*89c4ff92SAndroid Build Coastguard Worker }
356*89c4ff92SAndroid Build Coastguard Worker 
SetBackends(const std::vector<armnn::BackendId> & backends)357*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetBackends(const std::vector<armnn::BackendId>& backends)
358*89c4ff92SAndroid Build Coastguard Worker {
359*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_Backends = backends;
360*89c4ff92SAndroid Build Coastguard Worker }
361*89c4ff92SAndroid Build Coastguard Worker 
SetDynamicBackendsPath(const std::string & dynamicBackendsPath)362*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetDynamicBackendsPath(const std::string& dynamicBackendsPath)
363*89c4ff92SAndroid Build Coastguard Worker {
364*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_RuntimeOptions.m_DynamicBackendsPath = dynamicBackendsPath;
365*89c4ff92SAndroid Build Coastguard Worker }
366*89c4ff92SAndroid Build Coastguard Worker 
GetDynamicBackendsPath() const367*89c4ff92SAndroid Build Coastguard Worker const std::string& DelegateOptions::GetDynamicBackendsPath() const
368*89c4ff92SAndroid Build Coastguard Worker {
369*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_RuntimeOptions.m_DynamicBackendsPath;
370*89c4ff92SAndroid Build Coastguard Worker }
371*89c4ff92SAndroid Build Coastguard Worker 
SetGpuProfilingState(bool gpuProfilingState)372*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetGpuProfilingState(bool gpuProfilingState)
373*89c4ff92SAndroid Build Coastguard Worker {
374*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_RuntimeOptions.m_EnableGpuProfiling = gpuProfilingState;
375*89c4ff92SAndroid Build Coastguard Worker }
376*89c4ff92SAndroid Build Coastguard Worker 
GetGpuProfilingState()377*89c4ff92SAndroid Build Coastguard Worker bool DelegateOptions::GetGpuProfilingState()
378*89c4ff92SAndroid Build Coastguard Worker {
379*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_RuntimeOptions.m_EnableGpuProfiling;
380*89c4ff92SAndroid Build Coastguard Worker }
381*89c4ff92SAndroid Build Coastguard Worker 
GetBackendOptions() const382*89c4ff92SAndroid Build Coastguard Worker const std::vector<armnn::BackendOptions>& DelegateOptions::GetBackendOptions() const
383*89c4ff92SAndroid Build Coastguard Worker {
384*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_RuntimeOptions.m_BackendOptions;
385*89c4ff92SAndroid Build Coastguard Worker }
386*89c4ff92SAndroid Build Coastguard Worker 
AddBackendOption(const armnn::BackendOptions & option)387*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::AddBackendOption(const armnn::BackendOptions& option)
388*89c4ff92SAndroid Build Coastguard Worker {
389*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_RuntimeOptions.m_BackendOptions.push_back(option);
390*89c4ff92SAndroid Build Coastguard Worker }
391*89c4ff92SAndroid Build Coastguard Worker 
SetLoggingSeverity(const armnn::LogSeverity & level)392*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetLoggingSeverity(const armnn::LogSeverity& level)
393*89c4ff92SAndroid Build Coastguard Worker {
394*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->m_LoggingSeverity = level;
395*89c4ff92SAndroid Build Coastguard Worker }
396*89c4ff92SAndroid Build Coastguard Worker 
SetLoggingSeverity(const std::string & level)397*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetLoggingSeverity(const std::string& level)
398*89c4ff92SAndroid Build Coastguard Worker {
399*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->m_LoggingSeverity = armnn::StringToLogLevel(level);
400*89c4ff92SAndroid Build Coastguard Worker }
401*89c4ff92SAndroid Build Coastguard Worker 
GetLoggingSeverity()402*89c4ff92SAndroid Build Coastguard Worker armnn::LogSeverity DelegateOptions::GetLoggingSeverity()
403*89c4ff92SAndroid Build Coastguard Worker {
404*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->m_LoggingSeverity.value();
405*89c4ff92SAndroid Build Coastguard Worker }
406*89c4ff92SAndroid Build Coastguard Worker 
IsLoggingEnabled()407*89c4ff92SAndroid Build Coastguard Worker bool DelegateOptions::IsLoggingEnabled()
408*89c4ff92SAndroid Build Coastguard Worker {
409*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->m_LoggingSeverity.has_value();
410*89c4ff92SAndroid Build Coastguard Worker }
411*89c4ff92SAndroid Build Coastguard Worker 
GetOptimizerOptions() const412*89c4ff92SAndroid Build Coastguard Worker const armnn::OptimizerOptionsOpaque& DelegateOptions::GetOptimizerOptions() const
413*89c4ff92SAndroid Build Coastguard Worker {
414*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_OptimizerOptions;
415*89c4ff92SAndroid Build Coastguard Worker }
416*89c4ff92SAndroid Build Coastguard Worker 
SetOptimizerOptions(const armnn::OptimizerOptionsOpaque & optimizerOptions)417*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetOptimizerOptions(const armnn::OptimizerOptionsOpaque& optimizerOptions)
418*89c4ff92SAndroid Build Coastguard Worker {
419*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_OptimizerOptions = optimizerOptions;
420*89c4ff92SAndroid Build Coastguard Worker }
421*89c4ff92SAndroid Build Coastguard Worker 
GetDebugCallbackFunction() const422*89c4ff92SAndroid Build Coastguard Worker const armnn::Optional<armnn::DebugCallbackFunction>& DelegateOptions::GetDebugCallbackFunction() const
423*89c4ff92SAndroid Build Coastguard Worker {
424*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_DebugCallbackFunc;
425*89c4ff92SAndroid Build Coastguard Worker }
426*89c4ff92SAndroid Build Coastguard Worker 
SetInternalProfilingParams(bool internalProfilingState,const armnn::ProfilingDetailsMethod & internalProfilingDetail)427*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetInternalProfilingParams(bool internalProfilingState,
428*89c4ff92SAndroid Build Coastguard Worker                                 const armnn::ProfilingDetailsMethod& internalProfilingDetail)
429*89c4ff92SAndroid Build Coastguard Worker {
430*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->m_InternalProfilingEnabled = internalProfilingState;
431*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_InternalProfilingDetail = internalProfilingDetail;
432*89c4ff92SAndroid Build Coastguard Worker }
433*89c4ff92SAndroid Build Coastguard Worker 
GetInternalProfilingState() const434*89c4ff92SAndroid Build Coastguard Worker bool DelegateOptions::GetInternalProfilingState() const
435*89c4ff92SAndroid Build Coastguard Worker {
436*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->m_InternalProfilingEnabled;
437*89c4ff92SAndroid Build Coastguard Worker }
438*89c4ff92SAndroid Build Coastguard Worker 
GetInternalProfilingDetail() const439*89c4ff92SAndroid Build Coastguard Worker const armnn::ProfilingDetailsMethod& DelegateOptions::GetInternalProfilingDetail() const
440*89c4ff92SAndroid Build Coastguard Worker {
441*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_InternalProfilingDetail;
442*89c4ff92SAndroid Build Coastguard Worker }
443*89c4ff92SAndroid Build Coastguard Worker 
SetSerializeToDot(const std::string & serializeToDotFile)444*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetSerializeToDot(const std::string& serializeToDotFile)
445*89c4ff92SAndroid Build Coastguard Worker {
446*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->m_SerializeToDot = serializeToDotFile;
447*89c4ff92SAndroid Build Coastguard Worker }
448*89c4ff92SAndroid Build Coastguard Worker 
GetSerializeToDot() const449*89c4ff92SAndroid Build Coastguard Worker const std::string& DelegateOptions::GetSerializeToDot() const
450*89c4ff92SAndroid Build Coastguard Worker {
451*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->m_SerializeToDot;
452*89c4ff92SAndroid Build Coastguard Worker }
453*89c4ff92SAndroid Build Coastguard Worker 
SetRuntimeOptions(const armnn::IRuntime::CreationOptions & runtimeOptions)454*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::SetRuntimeOptions(const armnn::IRuntime::CreationOptions& runtimeOptions)
455*89c4ff92SAndroid Build Coastguard Worker {
456*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->p_RuntimeOptions = runtimeOptions;
457*89c4ff92SAndroid Build Coastguard Worker }
458*89c4ff92SAndroid Build Coastguard Worker 
GetRuntimeOptions()459*89c4ff92SAndroid Build Coastguard Worker const armnn::IRuntime::CreationOptions& DelegateOptions::GetRuntimeOptions()
460*89c4ff92SAndroid Build Coastguard Worker {
461*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->p_RuntimeOptions;
462*89c4ff92SAndroid Build Coastguard Worker }
463*89c4ff92SAndroid Build Coastguard Worker 
DisableTfLiteRuntimeFallback(bool fallbackState)464*89c4ff92SAndroid Build Coastguard Worker void DelegateOptions::DisableTfLiteRuntimeFallback(bool fallbackState)
465*89c4ff92SAndroid Build Coastguard Worker {
466*89c4ff92SAndroid Build Coastguard Worker     p_DelegateOptionsImpl->m_DisableTfLiteRuntimeFallback = fallbackState;
467*89c4ff92SAndroid Build Coastguard Worker }
468*89c4ff92SAndroid Build Coastguard Worker 
TfLiteRuntimeFallbackDisabled()469*89c4ff92SAndroid Build Coastguard Worker bool DelegateOptions::TfLiteRuntimeFallbackDisabled()
470*89c4ff92SAndroid Build Coastguard Worker {
471*89c4ff92SAndroid Build Coastguard Worker     return p_DelegateOptionsImpl->m_DisableTfLiteRuntimeFallback;
472*89c4ff92SAndroid Build Coastguard Worker }
473*89c4ff92SAndroid Build Coastguard Worker 
474*89c4ff92SAndroid Build Coastguard Worker } // namespace armnnDelegate
475