blob: 10919a7ba50b23ec2f5ae6fba9f70efa4fc6d824 [file] [log] [blame]
telsoa01ce3e84a2018-08-31 09:31:35 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beck93e48982018-09-05 13:05:09 +01003// SPDX-License-Identifier: MIT
telsoa01ce3e84a2018-08-31 09:31:35 +01004//
5
6#define LOG_TAG "ArmnnDriver"
7
8#include "DriverOptions.hpp"
9#include "Utils.hpp"
10
11#include <log/log.h>
12#include "SystemPropertiesUtils.hpp"
13
14#include <OperationsUtils.h>
15
16#include <boost/algorithm/string/predicate.hpp>
17#include <boost/program_options.hpp>
18
19#include <cassert>
20#include <functional>
21#include <string>
22#include <sstream>
23
24using namespace android;
25using namespace std;
26
27namespace armnn_driver
28{
29
Nikhil Raj77605822018-09-03 11:25:56 +010030DriverOptions::DriverOptions(armnn::Compute computeDevice, bool fp16Enabled)
telsoa01ce3e84a2018-08-31 09:31:35 +010031 : m_ComputeDevice(computeDevice)
32 , m_VerboseLogging(false)
33 , m_ClTunedParametersMode(armnn::IGpuAccTunedParameters::Mode::UseTunedParameters)
34 , m_EnableGpuProfiling(false)
Nikhil Raj77605822018-09-03 11:25:56 +010035 , m_fp16Enabled(fp16Enabled)
telsoa01ce3e84a2018-08-31 09:31:35 +010036{
37}
38
39DriverOptions::DriverOptions(int argc, char** argv)
40 : m_ComputeDevice(armnn::Compute::GpuAcc)
41 , m_VerboseLogging(false)
42 , m_ClTunedParametersMode(armnn::IGpuAccTunedParameters::Mode::UseTunedParameters)
43 , m_EnableGpuProfiling(false)
44 , m_fp16Enabled(false)
45{
46 namespace po = boost::program_options;
47
48 std::string computeDeviceAsString;
49 std::string unsupportedOperationsAsString;
50 std::string clTunedParametersModeAsString;
51
52 po::options_description optionsDesc("Options");
53 optionsDesc.add_options()
54 ("compute,c",
55 po::value<std::string>(&computeDeviceAsString)->default_value("GpuAcc"),
56 "Which device to run layers on by default. Possible values are: CpuRef, CpuAcc, GpuAcc")
57
58 ("verbose-logging,v",
59 po::bool_switch(&m_VerboseLogging),
60 "Turns verbose logging on")
61
62 ("request-inputs-and-outputs-dump-dir,d",
63 po::value<std::string>(&m_RequestInputsAndOutputsDumpDir)->default_value(""),
64 "If non-empty, the directory where request inputs and outputs should be dumped")
65
66 ("unsupported-operations,u",
67 po::value<std::string>(&unsupportedOperationsAsString)->default_value(""),
68 "If non-empty, a comma-separated list of operation indices which the driver will forcibly "
69 "consider unsupported")
70
71 ("cl-tuned-parameters-file,t",
72 po::value<std::string>(&m_ClTunedParametersFile)->default_value(""),
73 "If non-empty, the given file will be used to load/save CL tuned parameters. "
74 "See also --cl-tuned-parameters-mode")
75
76 ("cl-tuned-parameters-mode,m",
77 po::value<std::string>(&clTunedParametersModeAsString)->default_value("UseTunedParameters"),
78 "If 'UseTunedParameters' (the default), will read CL tuned parameters from the file specified by "
79 "--cl-tuned-parameters-file. "
80 "If 'UpdateTunedParameters', will also find the optimum parameters when preparing new networks and update "
81 "the file accordingly.")
82
83 ("gpu-profiling,p",
84 po::bool_switch(&m_EnableGpuProfiling),
surmeh01205bb992018-09-11 12:41:24 +010085 "Turns GPU profiling on")
telsoa01ce3e84a2018-08-31 09:31:35 +010086
87 ("fp16-enabled,f",
88 po::bool_switch(&m_fp16Enabled),
89 "Enables support for relaxed computation from Float32 to Float16");
90
91 po::variables_map variablesMap;
92 try
93 {
94 po::store(po::parse_command_line(argc, argv, optionsDesc), variablesMap);
95 po::notify(variablesMap);
96 }
97 catch (const po::error& e)
98 {
99 ALOGW("An error occurred attempting to parse program options: %s", e.what());
100 }
101
102 if (computeDeviceAsString == "CpuRef")
103 {
104 m_ComputeDevice = armnn::Compute::CpuRef;
105 }
106 else if (computeDeviceAsString == "GpuAcc")
107 {
108 m_ComputeDevice = armnn::Compute::GpuAcc;
109 }
110 else if (computeDeviceAsString == "CpuAcc")
111 {
112 m_ComputeDevice = armnn::Compute::CpuAcc;
113 }
114 else
115 {
116 ALOGW("Requested unknown compute device %s. Defaulting to compute id %s",
117 computeDeviceAsString.c_str(), GetComputeDeviceAsCString(m_ComputeDevice));
118 }
119
120 if (!unsupportedOperationsAsString.empty())
121 {
122 std::istringstream argStream(unsupportedOperationsAsString);
123
124 std::string s;
125 while (!argStream.eof())
126 {
127 std::getline(argStream, s, ',');
128 try
129 {
130 unsigned int operationIdx = std::stoi(s);
131 m_ForcedUnsupportedOperations.insert(operationIdx);
132 }
133 catch (const std::invalid_argument&)
134 {
135 ALOGW("Ignoring invalid integer argument in -u/--unsupported-operations value: %s", s.c_str());
136 }
137 }
138 }
139
140 if (!m_ClTunedParametersFile.empty())
141 {
142 // The mode is only relevant if the file path has been provided
143 if (clTunedParametersModeAsString == "UseTunedParameters")
144 {
145 m_ClTunedParametersMode = armnn::IGpuAccTunedParameters::Mode::UseTunedParameters;
146 }
147 else if (clTunedParametersModeAsString == "UpdateTunedParameters")
148 {
149 m_ClTunedParametersMode = armnn::IGpuAccTunedParameters::Mode::UpdateTunedParameters;
150 }
151 else
152 {
153 ALOGW("Requested unknown cl-tuned-parameters-mode '%s'. Defaulting to UseTunedParameters",
154 clTunedParametersModeAsString.c_str());
155 }
156 }
157}
158
159} // namespace armnn_driver