blob: 71135cb13e437771eb4d57127bc409ac0ca7ef65 [file] [log] [blame]
Sadik Armagan8f397a12022-06-17 15:38:22 +01001//
Cathal Corbett0e5a1312022-12-21 13:54:55 +00002// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved.
Sadik Armagan8f397a12022-06-17 15:38:22 +01003// SPDX-License-Identifier: MIT
4//
5
6#define LOG_TAG "arm-armnn-sl"
7
8#include "ArmnnDevice.hpp"
9
10#include <LegacyUtils.h>
11#include <OperationsUtils.h>
12
13#include <log/log.h>
14
15#include <memory>
16#include <string>
17
18#ifdef __ANDROID__
19#include <android/log.h>
20#endif
21
22namespace
23{
24
25std::string GetBackendString(const armnn_driver::DriverOptions& options)
26{
27 std::stringstream backends;
28 for (auto&& b : options.GetBackends())
29 {
30 backends << b << " ";
31 }
32 return backends.str();
33}
34
35} // anonymous namespace
36
37namespace armnn_driver
38{
39
40using namespace android::nn;
41
42ArmnnDevice::ArmnnDevice(DriverOptions options)
43 : m_Runtime(nullptr, nullptr)
44 , m_ClTunedParameters(nullptr)
45 , m_Options(std::move(options))
46{
47 // First check if the DriverOptions is happy.
48 if (options.ShouldExit())
49 {
50 // Is this a good or bad exit?
51 if (options.GetExitCode() != EXIT_SUCCESS)
52 {
53 throw armnn::InvalidArgumentException("ArmnnDevice: Insufficient or illegal options specified.");
54 }
55 else
56 {
57 throw armnn::InvalidArgumentException("ArmnnDevice: Nothing to do.");
58 }
59 }
60
61 initVLogMask();
62 VLOG(DRIVER) << "ArmnnDevice::ArmnnDevice()";
63
64#ifdef __ANDROID__
65 __android_log_print(ANDROID_LOG_DEBUG, "ARMNN_SL", "ArmnnDevice::ArmnnDevice()");
66#endif
67
68 armnn::ConfigureLogging(false, m_Options.IsVerboseLoggingEnabled(), armnn::LogSeverity::Trace);
69 if (m_Options.IsVerboseLoggingEnabled())
70 {
71 SetMinimumLogSeverity(android::base::VERBOSE);
72 }
73 else
74 {
75 SetMinimumLogSeverity(android::base::INFO);
76 }
Sadik Armagan8f397a12022-06-17 15:38:22 +010077 armnn::IRuntime::CreationOptions runtimeOptions;
78
Sadik Armagana5c8fd62022-08-04 15:56:05 +010079 if (std::find(m_Options.GetBackends().begin(),
80 m_Options.GetBackends().end(),
81 armnn::Compute::GpuAcc) != m_Options.GetBackends().end())
Sadik Armagan8f397a12022-06-17 15:38:22 +010082 {
Sadik Armagana5c8fd62022-08-04 15:56:05 +010083 try
Sadik Armagan8f397a12022-06-17 15:38:22 +010084 {
Sadik Armagana5c8fd62022-08-04 15:56:05 +010085 if (!m_Options.GetClTunedParametersFile().empty())
Sadik Armagan8f397a12022-06-17 15:38:22 +010086 {
Sadik Armagana5c8fd62022-08-04 15:56:05 +010087 m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(),
88 m_Options.GetClTuningLevel());
89 try
90 {
91 m_ClTunedParameters->Load(m_Options.GetClTunedParametersFile().c_str());
92 }
93 catch (std::exception& error)
94 {
95 // This is only a warning because the file won't exist the first time you are generating it.
96 VLOG(DRIVER) << "ArmnnDevice: Failed to load CL tuned parameters file "
97 << m_Options.GetClTunedParametersFile().c_str() << " : " << error.what();
98 }
99 runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters;
Sadik Armagan8f397a12022-06-17 15:38:22 +0100100 }
Sadik Armagana5c8fd62022-08-04 15:56:05 +0100101 }
102 catch (const armnn::ClRuntimeUnavailableException& error)
103 {
104 VLOG(DRIVER) << "ArmnnDevice: Failed to setup CL runtime: %s. Device will be unavailable." << error.what();
105 }
106 catch (std::exception& error)
107 {
108 VLOG(DRIVER) << "ArmnnDevice: Unknown exception: %s. Device will be unavailable." << error.what();
Sadik Armagan8f397a12022-06-17 15:38:22 +0100109 }
110 }
Sadik Armagan8f397a12022-06-17 15:38:22 +0100111 runtimeOptions.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled();
112 m_Runtime = armnn::IRuntime::Create(runtimeOptions);
113
114 std::vector<armnn::BackendId> backends;
115
116 if (m_Runtime)
117 {
118 const armnn::BackendIdSet supportedDevices = m_Runtime->GetDeviceSpec().GetSupportedBackends();
119 for (auto &backend : m_Options.GetBackends())
120 {
121 if (std::find(supportedDevices.cbegin(), supportedDevices.cend(), backend) == supportedDevices.cend())
122 {
123 VLOG(DRIVER) << "ArmnnDevice: Requested unknown backend " << backend.Get().c_str();
124 }
125 else
126 {
Cathal Corbett0e5a1312022-12-21 13:54:55 +0000127 if (m_Options.isAsyncModelExecutionEnabled() &&
128 armnn::HasCapability(armnn::BackendOptions::BackendOption{"AsyncExecution", false}, backend))
129 {
130 VLOG(DRIVER) << "ArmnnDevice: ArmNN does not support AsyncExecution with the following backend: "
131 << backend.Get().c_str();
132 }
133 else
134 {
135 backends.push_back(backend);
136 }
Sadik Armagan8f397a12022-06-17 15:38:22 +0100137 }
138 }
139 }
140
141 if (backends.empty())
142 {
143 // No known backend specified
144 throw armnn::InvalidArgumentException("ArmnnDevice: No known backend specified.");
145 }
146
147 m_Options.SetBackends(backends);
148 VLOG(DRIVER) << "ArmnnDevice: Created device with the following backends: " << GetBackendString(m_Options).c_str();
149
150#ifdef __ANDROID__
151 __android_log_print(ANDROID_LOG_DEBUG,
152 "ARMNN_SL",
153 "ArmnnDevice: Created device with the following backends: %s",
154 GetBackendString(m_Options).c_str());
155#endif
156}
157
158} // namespace armnn_driver