1*3e777be0SXin Li //
2*3e777be0SXin Li // Copyright © 2017, 2023 Arm Ltd. All rights reserved.
3*3e777be0SXin Li // SPDX-License-Identifier: MIT
4*3e777be0SXin Li //
5*3e777be0SXin Li
6*3e777be0SXin Li #define LOG_TAG "ArmnnDriver"
7*3e777be0SXin Li
8*3e777be0SXin Li #include "ArmnnDevice.hpp"
9*3e777be0SXin Li
10*3e777be0SXin Li #include <OperationsUtils.h>
11*3e777be0SXin Li
12*3e777be0SXin Li #include <log/log.h>
13*3e777be0SXin Li
14*3e777be0SXin Li #include <memory>
15*3e777be0SXin Li #include <string>
16*3e777be0SXin Li
17*3e777be0SXin Li using namespace android;
18*3e777be0SXin Li
19*3e777be0SXin Li namespace
20*3e777be0SXin Li {
21*3e777be0SXin Li
GetBackendString(const armnn_driver::DriverOptions & options)22*3e777be0SXin Li std::string GetBackendString(const armnn_driver::DriverOptions& options)
23*3e777be0SXin Li {
24*3e777be0SXin Li std::stringstream backends;
25*3e777be0SXin Li for (auto&& b : options.GetBackends())
26*3e777be0SXin Li {
27*3e777be0SXin Li backends << b << " ";
28*3e777be0SXin Li }
29*3e777be0SXin Li return backends.str();
30*3e777be0SXin Li }
31*3e777be0SXin Li
32*3e777be0SXin Li } // anonymous namespace
33*3e777be0SXin Li
34*3e777be0SXin Li namespace armnn_driver
35*3e777be0SXin Li {
36*3e777be0SXin Li
ArmnnDevice(DriverOptions options)37*3e777be0SXin Li ArmnnDevice::ArmnnDevice(DriverOptions options)
38*3e777be0SXin Li : m_Runtime(nullptr, nullptr)
39*3e777be0SXin Li , m_ClTunedParameters(nullptr)
40*3e777be0SXin Li , m_Options(std::move(options))
41*3e777be0SXin Li {
42*3e777be0SXin Li ALOGV("ArmnnDevice::ArmnnDevice()");
43*3e777be0SXin Li
44*3e777be0SXin Li armnn::ConfigureLogging(false, m_Options.IsVerboseLoggingEnabled(), armnn::LogSeverity::Trace);
45*3e777be0SXin Li if (m_Options.IsVerboseLoggingEnabled())
46*3e777be0SXin Li {
47*3e777be0SXin Li SetMinimumLogSeverity(base::VERBOSE);
48*3e777be0SXin Li }
49*3e777be0SXin Li else
50*3e777be0SXin Li {
51*3e777be0SXin Li SetMinimumLogSeverity(base::INFO);
52*3e777be0SXin Li }
53*3e777be0SXin Li
54*3e777be0SXin Li armnn::IRuntime::CreationOptions runtimeOptions;
55*3e777be0SXin Li
56*3e777be0SXin Li #if defined(ARMCOMPUTECL_ENABLED)
57*3e777be0SXin Li try
58*3e777be0SXin Li {
59*3e777be0SXin Li if (!m_Options.GetClTunedParametersFile().empty())
60*3e777be0SXin Li {
61*3e777be0SXin Li m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(),
62*3e777be0SXin Li m_Options.GetClTuningLevel());
63*3e777be0SXin Li try
64*3e777be0SXin Li {
65*3e777be0SXin Li m_ClTunedParameters->Load(m_Options.GetClTunedParametersFile().c_str());
66*3e777be0SXin Li }
67*3e777be0SXin Li catch (std::exception& error)
68*3e777be0SXin Li {
69*3e777be0SXin Li // This is only a warning because the file won't exist the first time you are generating it.
70*3e777be0SXin Li ALOGW("ArmnnDevice: Failed to load CL tuned parameters file '%s': %s",
71*3e777be0SXin Li m_Options.GetClTunedParametersFile().c_str(), error.what());
72*3e777be0SXin Li }
73*3e777be0SXin Li runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters;
74*3e777be0SXin Li }
75*3e777be0SXin Li }
76*3e777be0SXin Li catch (const armnn::ClRuntimeUnavailableException& error)
77*3e777be0SXin Li {
78*3e777be0SXin Li ALOGE("ArmnnDevice: Failed to setup CL runtime: %s. Device will be unavailable.", error.what());
79*3e777be0SXin Li }
80*3e777be0SXin Li catch (std::exception& error)
81*3e777be0SXin Li {
82*3e777be0SXin Li ALOGE("ArmnnDevice: Unknown exception: %s. Device will be unavailable.", error.what());
83*3e777be0SXin Li }
84*3e777be0SXin Li #endif
85*3e777be0SXin Li runtimeOptions.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled();
86*3e777be0SXin Li m_Runtime = armnn::IRuntime::Create(runtimeOptions);
87*3e777be0SXin Li
88*3e777be0SXin Li std::vector<armnn::BackendId> backends;
89*3e777be0SXin Li
90*3e777be0SXin Li if (m_Runtime)
91*3e777be0SXin Li {
92*3e777be0SXin Li const armnn::BackendIdSet supportedDevices = m_Runtime->GetDeviceSpec().GetSupportedBackends();
93*3e777be0SXin Li for (auto &backend : m_Options.GetBackends())
94*3e777be0SXin Li {
95*3e777be0SXin Li if (std::find(supportedDevices.cbegin(), supportedDevices.cend(), backend) == supportedDevices.cend())
96*3e777be0SXin Li {
97*3e777be0SXin Li ALOGW("ArmnnDevice: Requested unknown backend %s", backend.Get().c_str());
98*3e777be0SXin Li }
99*3e777be0SXin Li else
100*3e777be0SXin Li {
101*3e777be0SXin Li if (m_Options.isAsyncModelExecutionEnabled() &&
102*3e777be0SXin Li armnn::HasCapability(armnn::BackendOptions::BackendOption{"AsyncExecution", false}, backend))
103*3e777be0SXin Li {
104*3e777be0SXin Li ALOGV("ArmnnDevice: ArmNN does not support AsyncExecution with the following backend: %s",
105*3e777be0SXin Li backend.Get().c_str());
106*3e777be0SXin Li }
107*3e777be0SXin Li else
108*3e777be0SXin Li {
109*3e777be0SXin Li backends.push_back(backend);
110*3e777be0SXin Li }
111*3e777be0SXin Li }
112*3e777be0SXin Li }
113*3e777be0SXin Li }
114*3e777be0SXin Li
115*3e777be0SXin Li if (backends.empty())
116*3e777be0SXin Li {
117*3e777be0SXin Li // No known backend specified
118*3e777be0SXin Li throw armnn::InvalidArgumentException("ArmnnDevice: No known backend specified.");
119*3e777be0SXin Li }
120*3e777be0SXin Li
121*3e777be0SXin Li m_Options.SetBackends(backends);
122*3e777be0SXin Li ALOGV("ArmnnDevice: Created device with the following backends: %s",
123*3e777be0SXin Li GetBackendString(m_Options).c_str());
124*3e777be0SXin Li }
125*3e777be0SXin Li
126*3e777be0SXin Li } // namespace armnn_driver
127