xref: /aosp_15_r20/external/armnn/shim/sl/canonical/DriverOptions.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2022-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 #define LOG_TAG "arm-armnn-sl"
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include "DriverOptions.hpp"
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include "CanonicalUtils.hpp"
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Version.hpp>
13*89c4ff92SAndroid Build Coastguard Worker #include <log/log.h>
14*89c4ff92SAndroid Build Coastguard Worker #include "SystemPropertiesUtils.hpp"
15*89c4ff92SAndroid Build Coastguard Worker 
16*89c4ff92SAndroid Build Coastguard Worker #include <OperationsUtils.h>
17*89c4ff92SAndroid Build Coastguard Worker 
18*89c4ff92SAndroid Build Coastguard Worker #include <cxxopts/cxxopts.hpp>
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
21*89c4ff92SAndroid Build Coastguard Worker #include <cassert>
22*89c4ff92SAndroid Build Coastguard Worker #include <functional>
23*89c4ff92SAndroid Build Coastguard Worker #include <string>
24*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker using namespace android;
27*89c4ff92SAndroid Build Coastguard Worker using namespace std;
28*89c4ff92SAndroid Build Coastguard Worker 
29*89c4ff92SAndroid Build Coastguard Worker namespace armnn_driver
30*89c4ff92SAndroid Build Coastguard Worker {
31*89c4ff92SAndroid Build Coastguard Worker 
DriverOptions(armnn::Compute computeDevice,bool fp16Enabled)32*89c4ff92SAndroid Build Coastguard Worker DriverOptions::DriverOptions(armnn::Compute computeDevice, bool fp16Enabled)
33*89c4ff92SAndroid Build Coastguard Worker     : m_Backends({computeDevice})
34*89c4ff92SAndroid Build Coastguard Worker     , m_VerboseLogging(false)
35*89c4ff92SAndroid Build Coastguard Worker     , m_RequestInputsAndOutputsDumpDir(std::string(""))
36*89c4ff92SAndroid Build Coastguard Worker     , m_ServiceName(std::string("armnn_sl"))
37*89c4ff92SAndroid Build Coastguard Worker     , m_ForcedUnsupportedOperations({})
38*89c4ff92SAndroid Build Coastguard Worker     , m_ClTunedParametersMode(armnn::IGpuAccTunedParameters::Mode::UseTunedParameters)
39*89c4ff92SAndroid Build Coastguard Worker     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
40*89c4ff92SAndroid Build Coastguard Worker     , m_EnableGpuProfiling(false)
41*89c4ff92SAndroid Build Coastguard Worker     , m_fp16Enabled(fp16Enabled)
42*89c4ff92SAndroid Build Coastguard Worker     , m_FastMathEnabled(false)
43*89c4ff92SAndroid Build Coastguard Worker     , m_ShouldExit(false)
44*89c4ff92SAndroid Build Coastguard Worker     , m_ExitCode(EXIT_SUCCESS)
45*89c4ff92SAndroid Build Coastguard Worker     , m_CachedNetworkFilePath(std::string(""))
46*89c4ff92SAndroid Build Coastguard Worker     , m_SaveCachedNetwork(false)
47*89c4ff92SAndroid Build Coastguard Worker     , m_NumberOfThreads(0)
48*89c4ff92SAndroid Build Coastguard Worker     , m_EnableAsyncModelExecution(false)
49*89c4ff92SAndroid Build Coastguard Worker     , m_ArmnnNumberOfThreads(1)
50*89c4ff92SAndroid Build Coastguard Worker {
51*89c4ff92SAndroid Build Coastguard Worker }
52*89c4ff92SAndroid Build Coastguard Worker 
DriverOptions(const std::vector<armnn::BackendId> & backends,bool fp16Enabled)53*89c4ff92SAndroid Build Coastguard Worker DriverOptions::DriverOptions(const std::vector<armnn::BackendId>& backends, bool fp16Enabled)
54*89c4ff92SAndroid Build Coastguard Worker     : m_Backends(backends)
55*89c4ff92SAndroid Build Coastguard Worker     , m_VerboseLogging(false)
56*89c4ff92SAndroid Build Coastguard Worker     , m_RequestInputsAndOutputsDumpDir(std::string(""))
57*89c4ff92SAndroid Build Coastguard Worker     , m_ServiceName(std::string("armnn_sl"))
58*89c4ff92SAndroid Build Coastguard Worker     , m_ForcedUnsupportedOperations({})
59*89c4ff92SAndroid Build Coastguard Worker     , m_ClTunedParametersMode(armnn::IGpuAccTunedParameters::Mode::UseTunedParameters)
60*89c4ff92SAndroid Build Coastguard Worker     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
61*89c4ff92SAndroid Build Coastguard Worker     , m_EnableGpuProfiling(false)
62*89c4ff92SAndroid Build Coastguard Worker     , m_fp16Enabled(fp16Enabled)
63*89c4ff92SAndroid Build Coastguard Worker     , m_FastMathEnabled(false)
64*89c4ff92SAndroid Build Coastguard Worker     , m_ShouldExit(false)
65*89c4ff92SAndroid Build Coastguard Worker     , m_ExitCode(EXIT_SUCCESS)
66*89c4ff92SAndroid Build Coastguard Worker     , m_CachedNetworkFilePath(std::string(""))
67*89c4ff92SAndroid Build Coastguard Worker     , m_SaveCachedNetwork(false)
68*89c4ff92SAndroid Build Coastguard Worker     , m_NumberOfThreads(0)
69*89c4ff92SAndroid Build Coastguard Worker     , m_EnableAsyncModelExecution(false)
70*89c4ff92SAndroid Build Coastguard Worker     , m_ArmnnNumberOfThreads(1)
71*89c4ff92SAndroid Build Coastguard Worker {
72*89c4ff92SAndroid Build Coastguard Worker }
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker // This default constructor will example an environment variable called
75*89c4ff92SAndroid Build Coastguard Worker // ARMNN_SL_OPTIONS.  It will parse the parameters using the existing cxx
76*89c4ff92SAndroid Build Coastguard Worker // opts mechanism.
DriverOptions()77*89c4ff92SAndroid Build Coastguard Worker DriverOptions::DriverOptions()
78*89c4ff92SAndroid Build Coastguard Worker     : m_VerboseLogging(false)
79*89c4ff92SAndroid Build Coastguard Worker     , m_RequestInputsAndOutputsDumpDir(std::string(""))
80*89c4ff92SAndroid Build Coastguard Worker     , m_ServiceName(std::string("armnn_sl"))
81*89c4ff92SAndroid Build Coastguard Worker     , m_ForcedUnsupportedOperations({})
82*89c4ff92SAndroid Build Coastguard Worker     , m_ClTunedParametersMode(armnn::IGpuAccTunedParameters::Mode::UseTunedParameters)
83*89c4ff92SAndroid Build Coastguard Worker     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
84*89c4ff92SAndroid Build Coastguard Worker     , m_EnableGpuProfiling(false)
85*89c4ff92SAndroid Build Coastguard Worker     , m_fp16Enabled(false)
86*89c4ff92SAndroid Build Coastguard Worker     , m_FastMathEnabled(false)
87*89c4ff92SAndroid Build Coastguard Worker     , m_ShouldExit(false)
88*89c4ff92SAndroid Build Coastguard Worker     , m_SaveCachedNetwork(false)
89*89c4ff92SAndroid Build Coastguard Worker     , m_NumberOfThreads(0)
90*89c4ff92SAndroid Build Coastguard Worker     , m_EnableAsyncModelExecution(false)
91*89c4ff92SAndroid Build Coastguard Worker     , m_ArmnnNumberOfThreads(1)
92*89c4ff92SAndroid Build Coastguard Worker {
93*89c4ff92SAndroid Build Coastguard Worker     std::string unsupportedOperationsAsString;
94*89c4ff92SAndroid Build Coastguard Worker     std::string clTunedParametersModeAsString;
95*89c4ff92SAndroid Build Coastguard Worker     std::string clTuningLevelAsString;
96*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::string> backends;
97*89c4ff92SAndroid Build Coastguard Worker     bool showHelp = false;
98*89c4ff92SAndroid Build Coastguard Worker     bool showVersion = false;
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     const char* rawEnv = std::getenv("ARMNN_SL_OPTIONS");
101*89c4ff92SAndroid Build Coastguard Worker     // If the environment variable isn't set we'll continue as if it were an empty string.
102*89c4ff92SAndroid Build Coastguard Worker     if (!rawEnv)
103*89c4ff92SAndroid Build Coastguard Worker     {
104*89c4ff92SAndroid Build Coastguard Worker         rawEnv = "";
105*89c4ff92SAndroid Build Coastguard Worker     }
106*89c4ff92SAndroid Build Coastguard Worker     string optionsAsString(rawEnv);
107*89c4ff92SAndroid Build Coastguard Worker     regex whiteSpaceRegex("\\s+");
108*89c4ff92SAndroid Build Coastguard Worker     // Tokienize the string based on whitespace.
109*89c4ff92SAndroid Build Coastguard Worker     sregex_token_iterator iter(optionsAsString.begin(), optionsAsString.end(), whiteSpaceRegex, -1);
110*89c4ff92SAndroid Build Coastguard Worker     sregex_token_iterator end;
111*89c4ff92SAndroid Build Coastguard Worker     vector<string> cliAsVector(iter, end);
112*89c4ff92SAndroid Build Coastguard Worker     // As we're pretending to be a command line, argv[0] should be an executable name.
113*89c4ff92SAndroid Build Coastguard Worker     cliAsVector.insert(cliAsVector.begin(), "ARMNN_SL_OPTIONS");
114*89c4ff92SAndroid Build Coastguard Worker     // Convert the vector of string to a vector of char* backed by the existing vector.
115*89c4ff92SAndroid Build Coastguard Worker     std::vector<char*> argVector;
116*89c4ff92SAndroid Build Coastguard Worker     for (const auto& arg : cliAsVector)
117*89c4ff92SAndroid Build Coastguard Worker     {
118*89c4ff92SAndroid Build Coastguard Worker         argVector.push_back((char*)arg.data());
119*89c4ff92SAndroid Build Coastguard Worker     }
120*89c4ff92SAndroid Build Coastguard Worker     // Terminate the array.
121*89c4ff92SAndroid Build Coastguard Worker     argVector.push_back(nullptr);
122*89c4ff92SAndroid Build Coastguard Worker     // Create usable variables.
123*89c4ff92SAndroid Build Coastguard Worker     int argc = argVector.size() - 1; // Ignore the null pointer at the end.
124*89c4ff92SAndroid Build Coastguard Worker     char** argv = argVector.data();
125*89c4ff92SAndroid Build Coastguard Worker 
126*89c4ff92SAndroid Build Coastguard Worker     cxxopts::Options optionsDesc(argv[0], "Arm NN Support Library for the Android Neural Networks API."
127*89c4ff92SAndroid Build Coastguard Worker                                           "The support library will convert Android NNAPI requests "
128*89c4ff92SAndroid Build Coastguard Worker                                           "and delegate them to available ArmNN backends.");
129*89c4ff92SAndroid Build Coastguard Worker     try
130*89c4ff92SAndroid Build Coastguard Worker     {
131*89c4ff92SAndroid Build Coastguard Worker         optionsDesc.add_options()
132*89c4ff92SAndroid Build Coastguard Worker 
133*89c4ff92SAndroid Build Coastguard Worker         ("a,enable-fast-math",
134*89c4ff92SAndroid Build Coastguard Worker                 "Enables fast_math options in backends that support it. Using the fast_math flag can "
135*89c4ff92SAndroid Build Coastguard Worker                "lead to performance improvements but may result in reduced or different precision.",
136*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(m_FastMathEnabled)->default_value("false"))
137*89c4ff92SAndroid Build Coastguard Worker 
138*89c4ff92SAndroid Build Coastguard Worker         ("c,compute","Comma separated list of backends to run layers on. "
139*89c4ff92SAndroid Build Coastguard Worker                 "Examples of possible values are: CpuRef, CpuAcc, GpuAcc",
140*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::vector<std::string>>(backends))
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker         ("d,request-inputs-and-outputs-dump-dir",
143*89c4ff92SAndroid Build Coastguard Worker          "If non-empty, the directory where request inputs and outputs should be dumped",
144*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::string>(m_RequestInputsAndOutputsDumpDir)->default_value(""))
145*89c4ff92SAndroid Build Coastguard Worker 
146*89c4ff92SAndroid Build Coastguard Worker         ("f,fp16-enabled", "Enables support for relaxed computation from Float32 to Float16",
147*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(m_fp16Enabled)->default_value("false"))
148*89c4ff92SAndroid Build Coastguard Worker 
149*89c4ff92SAndroid Build Coastguard Worker         ("h,help", "Show this help",
150*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(showHelp)->default_value("false")->implicit_value("true"))
151*89c4ff92SAndroid Build Coastguard Worker 
152*89c4ff92SAndroid Build Coastguard Worker         ("m,cl-tuned-parameters-mode",
153*89c4ff92SAndroid Build Coastguard Worker          "If 'UseTunedParameters' (the default), will read CL tuned parameters from the file specified by "
154*89c4ff92SAndroid Build Coastguard Worker          "--cl-tuned-parameters-file. "
155*89c4ff92SAndroid Build Coastguard Worker          "If 'UpdateTunedParameters', will also find the optimum parameters when preparing new networks and update "
156*89c4ff92SAndroid Build Coastguard Worker          "the file accordingly.",
157*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::string>(clTunedParametersModeAsString)->default_value("UseTunedParameters"))
158*89c4ff92SAndroid Build Coastguard Worker 
159*89c4ff92SAndroid Build Coastguard Worker         ("g,mlgo-cl-tuned-parameters-file",
160*89c4ff92SAndroid Build Coastguard Worker         "If non-empty, the given file will be used to load/save MLGO CL tuned parameters. ",
161*89c4ff92SAndroid Build Coastguard Worker         cxxopts::value<std::string>(m_ClMLGOTunedParametersFile)->default_value(""))
162*89c4ff92SAndroid Build Coastguard Worker 
163*89c4ff92SAndroid Build Coastguard Worker         ("o,cl-tuning-level",
164*89c4ff92SAndroid Build Coastguard Worker          "exhaustive: all lws values are tested "
165*89c4ff92SAndroid Build Coastguard Worker          "normal: reduced number of lws values but enough to still have the performance really close to the "
166*89c4ff92SAndroid Build Coastguard Worker          "exhaustive approach "
167*89c4ff92SAndroid Build Coastguard Worker          "rapid: only 3 lws values should be tested for each kernel ",
168*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::string>(clTuningLevelAsString)->default_value("rapid"))
169*89c4ff92SAndroid Build Coastguard Worker 
170*89c4ff92SAndroid Build Coastguard Worker         ("p,gpu-profiling", "Turns GPU profiling on",
171*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(m_EnableGpuProfiling)->default_value("false"))
172*89c4ff92SAndroid Build Coastguard Worker 
173*89c4ff92SAndroid Build Coastguard Worker         ("q,cached-network-file", "If non-empty, the given file will be used to load/save cached network. "
174*89c4ff92SAndroid Build Coastguard Worker                                    "If save-cached-network option is given will save the cached network to given file."
175*89c4ff92SAndroid Build Coastguard Worker                                    "If save-cached-network option is not given will load the cached network from given "
176*89c4ff92SAndroid Build Coastguard Worker                                    "file.",
177*89c4ff92SAndroid Build Coastguard Worker         cxxopts::value<std::string>(m_CachedNetworkFilePath)->default_value(""))
178*89c4ff92SAndroid Build Coastguard Worker 
179*89c4ff92SAndroid Build Coastguard Worker         ("s,save-cached-network",
180*89c4ff92SAndroid Build Coastguard Worker                 "Enables saving the cached network to the file given with cached-network-file option."
181*89c4ff92SAndroid Build Coastguard Worker                 " See also --cached-network-file",
182*89c4ff92SAndroid Build Coastguard Worker         cxxopts::value<bool>(m_SaveCachedNetwork)->default_value("false"))
183*89c4ff92SAndroid Build Coastguard Worker 
184*89c4ff92SAndroid Build Coastguard Worker         ("number-of-threads",
185*89c4ff92SAndroid Build Coastguard Worker          "Assign the number of threads used by the CpuAcc backend. "
186*89c4ff92SAndroid Build Coastguard Worker          "Input value must be between 1 and 64. "
187*89c4ff92SAndroid Build Coastguard Worker          "Default is set to 0 (Backend will decide number of threads to use).",
188*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<unsigned int>(m_NumberOfThreads)->default_value("0"))
189*89c4ff92SAndroid Build Coastguard Worker 
190*89c4ff92SAndroid Build Coastguard Worker         ("t,cl-tuned-parameters-file",
191*89c4ff92SAndroid Build Coastguard Worker          "If non-empty, the given file will be used to load/save CL tuned parameters. "
192*89c4ff92SAndroid Build Coastguard Worker          "See also --cl-tuned-parameters-mode",
193*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::string>(m_ClTunedParametersFile)->default_value(""))
194*89c4ff92SAndroid Build Coastguard Worker 
195*89c4ff92SAndroid Build Coastguard Worker         ("u,unsupported-operations",
196*89c4ff92SAndroid Build Coastguard Worker          "If non-empty, a comma-separated list of operation indices which the driver will forcibly "
197*89c4ff92SAndroid Build Coastguard Worker          "consider unsupported",
198*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<std::string>(unsupportedOperationsAsString)->default_value(""))
199*89c4ff92SAndroid Build Coastguard Worker 
200*89c4ff92SAndroid Build Coastguard Worker         ("v,verbose-logging", "Turns verbose logging on",
201*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(m_VerboseLogging)->default_value("false")->implicit_value("true"))
202*89c4ff92SAndroid Build Coastguard Worker 
203*89c4ff92SAndroid Build Coastguard Worker         ("V,version", "Show version information",
204*89c4ff92SAndroid Build Coastguard Worker          cxxopts::value<bool>(showVersion)->default_value("false")->implicit_value("true"))
205*89c4ff92SAndroid Build Coastguard Worker         ;
206*89c4ff92SAndroid Build Coastguard Worker     }
207*89c4ff92SAndroid Build Coastguard Worker     catch (const std::exception& e)
208*89c4ff92SAndroid Build Coastguard Worker     {
209*89c4ff92SAndroid Build Coastguard Worker         VLOG(DRIVER) << "An error occurred attempting to construct options: " << e.what();
210*89c4ff92SAndroid Build Coastguard Worker         std::cout << "An error occurred attempting to construct options: %s" << std::endl;
211*89c4ff92SAndroid Build Coastguard Worker         m_ExitCode = EXIT_FAILURE;
212*89c4ff92SAndroid Build Coastguard Worker         return;
213*89c4ff92SAndroid Build Coastguard Worker     }
214*89c4ff92SAndroid Build Coastguard Worker 
215*89c4ff92SAndroid Build Coastguard Worker     try
216*89c4ff92SAndroid Build Coastguard Worker     {
217*89c4ff92SAndroid Build Coastguard Worker         cxxopts::ParseResult result = optionsDesc.parse(argc, argv);
218*89c4ff92SAndroid Build Coastguard Worker     }
219*89c4ff92SAndroid Build Coastguard Worker     catch (const cxxopts::OptionException& e)
220*89c4ff92SAndroid Build Coastguard Worker     {
221*89c4ff92SAndroid Build Coastguard Worker         VLOG(DRIVER) << "An exception occurred attempting to parse program options: " << e.what();
222*89c4ff92SAndroid Build Coastguard Worker         std::cout << optionsDesc.help() << std::endl
223*89c4ff92SAndroid Build Coastguard Worker                   << "An exception occurred while parsing program options: " << std::endl
224*89c4ff92SAndroid Build Coastguard Worker                   << e.what() << std::endl;
225*89c4ff92SAndroid Build Coastguard Worker         m_ShouldExit = true;
226*89c4ff92SAndroid Build Coastguard Worker         m_ExitCode = EXIT_FAILURE;
227*89c4ff92SAndroid Build Coastguard Worker         return;
228*89c4ff92SAndroid Build Coastguard Worker     }
229*89c4ff92SAndroid Build Coastguard Worker     if (showHelp)
230*89c4ff92SAndroid Build Coastguard Worker     {
231*89c4ff92SAndroid Build Coastguard Worker         VLOG(DRIVER) << "Showing help and exiting";
232*89c4ff92SAndroid Build Coastguard Worker         std::cout << optionsDesc.help() << std::endl;
233*89c4ff92SAndroid Build Coastguard Worker         m_ShouldExit = true;
234*89c4ff92SAndroid Build Coastguard Worker         m_ExitCode = EXIT_SUCCESS;
235*89c4ff92SAndroid Build Coastguard Worker         return;
236*89c4ff92SAndroid Build Coastguard Worker     }
237*89c4ff92SAndroid Build Coastguard Worker     if (showVersion)
238*89c4ff92SAndroid Build Coastguard Worker     {
239*89c4ff92SAndroid Build Coastguard Worker         VLOG(DRIVER) << "Showing version and exiting";
240*89c4ff92SAndroid Build Coastguard Worker         std::cout << "ArmNN Android NN driver for the Android Neural Networks API.\n"
241*89c4ff92SAndroid Build Coastguard Worker                      "ArmNN v" << ARMNN_VERSION << std::endl;
242*89c4ff92SAndroid Build Coastguard Worker         m_ShouldExit = true;
243*89c4ff92SAndroid Build Coastguard Worker         m_ExitCode = EXIT_SUCCESS;
244*89c4ff92SAndroid Build Coastguard Worker         return;
245*89c4ff92SAndroid Build Coastguard Worker     }
246*89c4ff92SAndroid Build Coastguard Worker 
247*89c4ff92SAndroid Build Coastguard Worker     // Convert the string backend names into backendId's.
248*89c4ff92SAndroid Build Coastguard Worker     m_Backends.reserve(backends.size());
249*89c4ff92SAndroid Build Coastguard Worker     for (auto&& backend : backends)
250*89c4ff92SAndroid Build Coastguard Worker     {
251*89c4ff92SAndroid Build Coastguard Worker         m_Backends.emplace_back(backend);
252*89c4ff92SAndroid Build Coastguard Worker     }
253*89c4ff92SAndroid Build Coastguard Worker 
254*89c4ff92SAndroid Build Coastguard Worker     // If no backends have been specified then the default value is GpuAcc.
255*89c4ff92SAndroid Build Coastguard Worker     if (backends.empty())
256*89c4ff92SAndroid Build Coastguard Worker     {
257*89c4ff92SAndroid Build Coastguard Worker         VLOG(DRIVER) << "No backends have been specified, defaulting to GpuAcc.";
258*89c4ff92SAndroid Build Coastguard Worker         m_Backends.emplace_back("GpuAcc");
259*89c4ff92SAndroid Build Coastguard Worker     }
260*89c4ff92SAndroid Build Coastguard Worker 
261*89c4ff92SAndroid Build Coastguard Worker     if (!unsupportedOperationsAsString.empty())
262*89c4ff92SAndroid Build Coastguard Worker     {
263*89c4ff92SAndroid Build Coastguard Worker         std::istringstream argStream(unsupportedOperationsAsString);
264*89c4ff92SAndroid Build Coastguard Worker 
265*89c4ff92SAndroid Build Coastguard Worker         std::string s;
266*89c4ff92SAndroid Build Coastguard Worker         while (!argStream.eof())
267*89c4ff92SAndroid Build Coastguard Worker         {
268*89c4ff92SAndroid Build Coastguard Worker             std::getline(argStream, s, ',');
269*89c4ff92SAndroid Build Coastguard Worker             try
270*89c4ff92SAndroid Build Coastguard Worker             {
271*89c4ff92SAndroid Build Coastguard Worker                 unsigned int operationIdx = std::stoi(s);
272*89c4ff92SAndroid Build Coastguard Worker                 m_ForcedUnsupportedOperations.insert(operationIdx);
273*89c4ff92SAndroid Build Coastguard Worker             }
274*89c4ff92SAndroid Build Coastguard Worker             catch (const std::invalid_argument&)
275*89c4ff92SAndroid Build Coastguard Worker             {
276*89c4ff92SAndroid Build Coastguard Worker                 VLOG(DRIVER) << "Ignoring invalid integer argument in -u/--unsupported-operations value: " << s.c_str();
277*89c4ff92SAndroid Build Coastguard Worker             }
278*89c4ff92SAndroid Build Coastguard Worker         }
279*89c4ff92SAndroid Build Coastguard Worker     }
280*89c4ff92SAndroid Build Coastguard Worker 
281*89c4ff92SAndroid Build Coastguard Worker     if (!m_ClTunedParametersFile.empty())
282*89c4ff92SAndroid Build Coastguard Worker     {
283*89c4ff92SAndroid Build Coastguard Worker         // The mode is only relevant if the file path has been provided
284*89c4ff92SAndroid Build Coastguard Worker         if (clTunedParametersModeAsString == "UseTunedParameters")
285*89c4ff92SAndroid Build Coastguard Worker         {
286*89c4ff92SAndroid Build Coastguard Worker             m_ClTunedParametersMode = armnn::IGpuAccTunedParameters::Mode::UseTunedParameters;
287*89c4ff92SAndroid Build Coastguard Worker         }
288*89c4ff92SAndroid Build Coastguard Worker         else if (clTunedParametersModeAsString == "UpdateTunedParameters")
289*89c4ff92SAndroid Build Coastguard Worker         {
290*89c4ff92SAndroid Build Coastguard Worker             m_ClTunedParametersMode = armnn::IGpuAccTunedParameters::Mode::UpdateTunedParameters;
291*89c4ff92SAndroid Build Coastguard Worker         }
292*89c4ff92SAndroid Build Coastguard Worker         else
293*89c4ff92SAndroid Build Coastguard Worker         {
294*89c4ff92SAndroid Build Coastguard Worker             VLOG(DRIVER) << "Requested unknown cl-tuned-parameters-mode "
295*89c4ff92SAndroid Build Coastguard Worker                           << clTunedParametersModeAsString.c_str() << ". Defaulting to UseTunedParameters";
296*89c4ff92SAndroid Build Coastguard Worker         }
297*89c4ff92SAndroid Build Coastguard Worker 
298*89c4ff92SAndroid Build Coastguard Worker         if (clTuningLevelAsString == "exhaustive")
299*89c4ff92SAndroid Build Coastguard Worker         {
300*89c4ff92SAndroid Build Coastguard Worker             m_ClTuningLevel = armnn::IGpuAccTunedParameters::TuningLevel::Exhaustive;
301*89c4ff92SAndroid Build Coastguard Worker         }
302*89c4ff92SAndroid Build Coastguard Worker         else if (clTuningLevelAsString == "normal")
303*89c4ff92SAndroid Build Coastguard Worker         {
304*89c4ff92SAndroid Build Coastguard Worker             m_ClTuningLevel = armnn::IGpuAccTunedParameters::TuningLevel::Normal;
305*89c4ff92SAndroid Build Coastguard Worker         }
306*89c4ff92SAndroid Build Coastguard Worker         else if (clTuningLevelAsString == "rapid")
307*89c4ff92SAndroid Build Coastguard Worker         {
308*89c4ff92SAndroid Build Coastguard Worker             m_ClTuningLevel = armnn::IGpuAccTunedParameters::TuningLevel::Rapid;
309*89c4ff92SAndroid Build Coastguard Worker         }
310*89c4ff92SAndroid Build Coastguard Worker         else
311*89c4ff92SAndroid Build Coastguard Worker         {
312*89c4ff92SAndroid Build Coastguard Worker             VLOG(DRIVER) << "Requested unknown cl-tuner-mode '%s'. "
313*89c4ff92SAndroid Build Coastguard Worker                             "Defaulting to rapid" << clTuningLevelAsString.c_str();
314*89c4ff92SAndroid Build Coastguard Worker         }
315*89c4ff92SAndroid Build Coastguard Worker     }
316*89c4ff92SAndroid Build Coastguard Worker }
317*89c4ff92SAndroid Build Coastguard Worker 
318*89c4ff92SAndroid Build Coastguard Worker } // namespace armnn_driver
319