ArmNN  NotReleased
Runtime Class Referencefinal

#include <Runtime.hpp>

Inheritance diagram for Runtime:
IRuntime

Public Member Functions

virtual Status LoadNetwork (NetworkId &networkIdOut, IOptimizedNetworkPtr network) override
 
virtual Status LoadNetwork (NetworkId &networkIdOut, IOptimizedNetworkPtr network, std::string &errorMessage) override
 
virtual Status LoadNetwork (NetworkId &networkIdOut, IOptimizedNetworkPtr network, std::string &errorMessage, const INetworkProperties &networkProperties) override
 
virtual TensorInfo GetInputTensorInfo (NetworkId networkId, LayerBindingId layerId) const override
 
virtual TensorInfo GetOutputTensorInfo (NetworkId networkId, LayerBindingId layerId) const override
 
virtual Status EnqueueWorkload (NetworkId networkId, const InputTensors &inputTensors, const OutputTensors &outputTensors) override
 Evaluates a network using input in inputTensors and outputs filled into outputTensors. More...
 
virtual Status UnloadNetwork (NetworkId networkId) override
 
virtual const IDeviceSpecGetDeviceSpec () const override
 
virtual const std::shared_ptr< IProfilerGetProfiler (NetworkId networkId) const override
 
virtual void RegisterDebugCallback (NetworkId networkId, const DebugCallbackFunction &func) override
 
 Runtime (const CreationOptions &options)
 Creates a runtime for workload execution. More...
 
 ~Runtime ()
 

Friends

void RuntimeLoadedNetworksReserve (armnn::Runtime *runtime)
 

Additional Inherited Members

- Static Public Member Functions inherited from IRuntime
static IRuntimeCreateRaw (const CreationOptions &options)
 
static IRuntimePtr Create (const CreationOptions &options)
 
static void Destroy (IRuntime *runtime)
 
- Protected Member Functions inherited from IRuntime
 ~IRuntime ()
 

Detailed Description

Definition at line 23 of file Runtime.hpp.

Constructor & Destructor Documentation

◆ Runtime()

Runtime ( const CreationOptions options)

Creates a runtime for workload execution.

Definition at line 155 of file Runtime.cpp.

References ProfilingService::AddBackendProfilingContext(), DeviceSpec::AddSupportedBackends(), ARMNN_LOG, ARMNN_VERSION, armnn::BackendRegistryInstance(), ProfilingService::ConfigureProfilingService(), BackendRegistry::GetFactory(), armnn::info, ProfilingService::Instance(), IRuntime::CreationOptions::m_DynamicBackendsPath, and IRuntime::CreationOptions::m_ProfilingOptions.

Referenced by Runtime::GetDeviceSpec().

156  : m_NetworkIdCounter(0)
157 {
158  ARMNN_LOG(info) << "ArmNN v" << ARMNN_VERSION << "\n";
159 
160  // pass configuration info to the profiling service
162 
163  // Load any available/compatible dynamic backend before the runtime
164  // goes through the backend registry
165  LoadDynamicBackends(options.m_DynamicBackendsPath);
166 
167  BackendIdSet supportedBackends;
168  for (const auto& id : BackendRegistryInstance().GetBackendIds())
169  {
170  // Store backend contexts for the supported ones
171  try {
172  auto factoryFun = BackendRegistryInstance().GetFactory(id);
173  auto backend = factoryFun();
174  BOOST_ASSERT(backend.get() != nullptr);
175 
176  auto context = backend->CreateBackendContext(options);
177 
178  // backends are allowed to return nullptrs if they
179  // don't wish to create a backend specific context
180  if (context)
181  {
182  m_BackendContexts.emplace(std::make_pair(id, std::move(context)));
183  }
184  supportedBackends.emplace(id);
185 
186  unique_ptr<armnn::profiling::IBackendProfiling> profilingIface =
187  std::make_unique<armnn::profiling::BackendProfiling>(armnn::profiling::BackendProfiling(
189 
190  // Backends may also provide a profiling context. Ask for it now.
191  auto profilingContext = backend->CreateBackendProfilingContext(options, profilingIface);
192  // Backends that don't support profiling will return a null profiling context.
193  if (profilingContext)
194  {
195  // Pass the context onto the profiling service.
197  }
198  }
199  catch (const BackendUnavailableException&)
200  {
201  // Ignore backends which are unavailable
202  }
203 
204  }
205  m_DeviceSpec.AddSupportedBackends(supportedBackends);
206 }
FactoryFunction GetFactory(const BackendId &id) const
#define ARMNN_LOG(severity)
Definition: Logging.hpp:163
void AddBackendProfilingContext(const BackendId backendId, std::shared_ptr< armnn::profiling::IBackendProfilingContext > profilingContext)
void AddSupportedBackends(const BackendIdSet &backendIds, bool isDynamic=false)
Definition: DeviceSpec.hpp:30
#define ARMNN_VERSION
Definition: Version.hpp:24
BackendRegistry & BackendRegistryInstance()
static ProfilingService & Instance()
std::unordered_set< BackendId > BackendIdSet
Definition: BackendId.hpp:191
ProfilingState ConfigureProfilingService(const ExternalProfilingOptions &options, bool resetProfilingService=false)
armnn::Runtime::CreationOptions::ExternalProfilingOptions options
Class for non-fatal exceptions raised while initialising a backend.
Definition: Exceptions.hpp:68

◆ ~Runtime()

~Runtime ( )

Definition at line 208 of file Runtime.cpp.

References DeviceSpec::ClearDynamicBackends(), DynamicBackendUtils::DeregisterDynamicBackends(), DeviceSpec::GetDynamicBackends(), and Runtime::UnloadNetwork().

Referenced by Runtime::GetDeviceSpec().

209 {
210  std::vector<int> networkIDs;
211  try
212  {
213  // Coverity fix: The following code may throw an exception of type std::length_error.
214  std::transform(m_LoadedNetworks.begin(), m_LoadedNetworks.end(),
215  std::back_inserter(networkIDs),
216  [](const auto &pair) { return pair.first; });
217  }
218  catch (const std::exception& e)
219  {
220  // Coverity fix: BOOST_LOG_TRIVIAL (typically used to report errors) may throw an
221  // exception of type std::length_error.
222  // Using stderr instead in this context as there is no point in nesting try-catch blocks here.
223  std::cerr << "WARNING: An error has occurred when getting the IDs of the networks to unload: " << e.what()
224  << "\nSome of the loaded networks may not be unloaded" << std::endl;
225  }
226  // We then proceed to unload all the networks which IDs have been appended to the list
227  // up to the point the exception was thrown (if any).
228 
229  for (auto networkID : networkIDs)
230  {
231  try
232  {
233  // Coverity fix: UnloadNetwork() may throw an exception of type std::length_error,
234  // boost::log::v2s_mt_posix::odr_violation or boost::log::v2s_mt_posix::system_error
235  UnloadNetwork(networkID);
236  }
237  catch (const std::exception& e)
238  {
239  // Coverity fix: BOOST_LOG_TRIVIAL (typically used to report errors) may throw an
240  // exception of type std::length_error.
241  // Using stderr instead in this context as there is no point in nesting try-catch blocks here.
242  std::cerr << "WARNING: An error has occurred when unloading network " << networkID << ": " << e.what()
243  << std::endl;
244  }
245  }
246 
247 
248  // Clear all dynamic backends.
250  m_DeviceSpec.ClearDynamicBackends();
251  m_BackendContexts.clear();
252 }
virtual Status UnloadNetwork(NetworkId networkId) override
Definition: Runtime.cpp:105
void ClearDynamicBackends()
Definition: DeviceSpec.hpp:39
const BackendIdSet & GetDynamicBackends() const
Definition: DeviceSpec.hpp:48
static void DeregisterDynamicBackends(const BackendIdSet &dynamicBackends)

Member Function Documentation

◆ EnqueueWorkload()

Status EnqueueWorkload ( NetworkId  networkId,
const InputTensors inputTensors,
const OutputTensors outputTensors 
)
overridevirtual

Evaluates a network using input in inputTensors and outputs filled into outputTensors.

Implements IRuntime.

Definition at line 271 of file Runtime.cpp.

References LoadedNetwork::EnqueueWorkload(), and LoadedNetwork::FreeWorkingMemory().

274 {
275  LoadedNetwork* loadedNetwork = GetLoadedNetworkPtr(networkId);
276 
277  static thread_local NetworkId lastId = networkId;
278  if (lastId != networkId)
279  {
280  LoadedNetworkFuncSafe(lastId, [](LoadedNetwork* network)
281  {
282  network->FreeWorkingMemory();
283  });
284  }
285  lastId=networkId;
286 
287  return loadedNetwork->EnqueueWorkload(inputTensors, outputTensors);
288 }
Status EnqueueWorkload(const InputTensors &inputTensors, const OutputTensors &outputTensors)
int NetworkId
Definition: IRuntime.hpp:19

◆ GetDeviceSpec()

virtual const IDeviceSpec& GetDeviceSpec ( ) const
inlineoverridevirtual

◆ GetInputTensorInfo()

TensorInfo GetInputTensorInfo ( NetworkId  networkId,
LayerBindingId  layerId 
) const
overridevirtual

Implements IRuntime.

Definition at line 260 of file Runtime.cpp.

References LoadedNetwork::GetInputTensorInfo().

261 {
262  return GetLoadedNetworkPtr(networkId)->GetInputTensorInfo(layerId);
263 }
TensorInfo GetInputTensorInfo(LayerBindingId layerId) const

◆ GetOutputTensorInfo()

TensorInfo GetOutputTensorInfo ( NetworkId  networkId,
LayerBindingId  layerId 
) const
overridevirtual

Implements IRuntime.

Definition at line 265 of file Runtime.cpp.

References LoadedNetwork::GetOutputTensorInfo().

266 {
267  return GetLoadedNetworkPtr(networkId)->GetOutputTensorInfo(layerId);
268 }
TensorInfo GetOutputTensorInfo(LayerBindingId layerId) const

◆ GetProfiler()

const std::shared_ptr< IProfiler > GetProfiler ( NetworkId  networkId) const
overridevirtual

Gets the profiler corresponding to the given network id.

Parameters
networkIdThe id of the network for which to get the profile.
Returns
A pointer to the requested profiler, or nullptr if not found.

Implements IRuntime.

Definition at line 143 of file Runtime.cpp.

Referenced by Runtime::GetDeviceSpec().

144 {
145  auto it = m_LoadedNetworks.find(networkId);
146  if (it != m_LoadedNetworks.end())
147  {
148  auto& loadedNetwork = it->second;
149  return loadedNetwork->GetProfiler();
150  }
151 
152  return nullptr;
153 }

◆ LoadNetwork() [1/3]

Status LoadNetwork ( NetworkId networkIdOut,
IOptimizedNetworkPtr  network 
)
overridevirtual

Loads a complete network into the Runtime.

Parameters
[out]networkIdOut- Unique identifier for the network is returned in this reference.
[in]network- Complete network to load into the Runtime. The runtime takes ownership of the network once passed in.
Returns
armnn::Status

Implements IRuntime.

Definition at line 47 of file Runtime.cpp.

Referenced by BOOST_AUTO_TEST_CASE().

48 {
49  std::string ignoredErrorMessage;
50  return LoadNetwork(networkIdOut, std::move(inNetwork), ignoredErrorMessage);
51 }
virtual Status LoadNetwork(NetworkId &networkIdOut, IOptimizedNetworkPtr network) override
Definition: Runtime.cpp:47

◆ LoadNetwork() [2/3]

Status LoadNetwork ( NetworkId networkIdOut,
IOptimizedNetworkPtr  network,
std::string &  errorMessage 
)
overridevirtual

Load a complete network into the IRuntime.

Parameters
[out]networkIdOutUnique identifier for the network is returned in this reference.
[in]networkComplete network to load into the IRuntime.
[out]errorMessageError message if there were any errors. The runtime takes ownership of the network once passed in.
Returns
armnn::Status

Implements IRuntime.

Definition at line 53 of file Runtime.cpp.

56 {
57  INetworkProperties networkProperties;
58  return LoadNetwork(networkIdOut, std::move(inNetwork), errorMessage, networkProperties);
59 }
virtual Status LoadNetwork(NetworkId &networkIdOut, IOptimizedNetworkPtr network) override
Definition: Runtime.cpp:47

◆ LoadNetwork() [3/3]

Status LoadNetwork ( NetworkId networkIdOut,
IOptimizedNetworkPtr  network,
std::string &  errorMessage,
const INetworkProperties networkProperties 
)
overridevirtual

Implements IRuntime.

Definition at line 61 of file Runtime.cpp.

References armnn::Failure, ProfilingService::IncrementCounterValue(), ProfilingService::Instance(), LoadedNetwork::MakeLoadedNetwork(), and armnn::Success.

65 {
66  IOptimizedNetwork* rawNetwork = inNetwork.release();
67 
68  networkIdOut = GenerateNetworkId();
69 
70  for (auto&& context : m_BackendContexts)
71  {
72  context.second->BeforeLoadNetwork(networkIdOut);
73  }
74 
75  unique_ptr<LoadedNetwork> loadedNetwork = LoadedNetwork::MakeLoadedNetwork(
76  std::unique_ptr<OptimizedNetwork>(boost::polymorphic_downcast<OptimizedNetwork*>(rawNetwork)),
77  errorMessage,
78  networkProperties);
79 
80  if (!loadedNetwork)
81  {
82  return Status::Failure;
83  }
84 
85  {
86  std::lock_guard<std::mutex> lockGuard(m_Mutex);
87 
88  // Stores the network
89  m_LoadedNetworks[networkIdOut] = std::move(loadedNetwork);
90  }
91 
92  for (auto&& context : m_BackendContexts)
93  {
94  context.second->AfterLoadNetwork(networkIdOut);
95  }
96 
97  if (profiling::ProfilingService::Instance().IsProfilingEnabled())
98  {
99  profiling::ProfilingService::Instance().IncrementCounterValue(armnn::profiling::NETWORK_LOADS);
100  }
101 
102  return Status::Success;
103 }
static std::unique_ptr< LoadedNetwork > MakeLoadedNetwork(std::unique_ptr< OptimizedNetwork > net, std::string &errorMessage, const INetworkProperties &networkProperties)
uint32_t IncrementCounterValue(uint16_t counterUid) override
static ProfilingService & Instance()

◆ RegisterDebugCallback()

void RegisterDebugCallback ( NetworkId  networkId,
const DebugCallbackFunction func 
)
overridevirtual

Registers a callback function to debug layers performing custom computations on intermediate tensors.

Parameters
networkIdThe id of the network to register the callback.
funccallback function to pass to the debug layer.

Implements IRuntime.

Definition at line 290 of file Runtime.cpp.

References DeviceSpec::AddSupportedBackends(), DynamicBackendUtils::CreateDynamicBackends(), DynamicBackendUtils::GetBackendPaths(), DynamicBackendUtils::GetSharedObjects(), LoadedNetwork::RegisterDebugCallback(), and DynamicBackendUtils::RegisterDynamicBackends().

Referenced by Runtime::GetDeviceSpec().

291 {
292  LoadedNetwork* loadedNetwork = GetLoadedNetworkPtr(networkId);
293  loadedNetwork->RegisterDebugCallback(func);
294 }
void RegisterDebugCallback(const DebugCallbackFunction &func)

◆ UnloadNetwork()

Status UnloadNetwork ( NetworkId  networkId)
overridevirtual

Unloads a network from the Runtime. At the moment this only removes the network from the m_Impl->m_Network. This might need more work in the future to be AndroidNN compliant.

Parameters
[in]networkIdUnique identifier for the network to be unloaded. Generated in LoadNetwork().
Returns
armnn::Status

Implements IRuntime.

Definition at line 105 of file Runtime.cpp.

References ARMNN_LOG, armnn::debug, armnn::Failure, ProfilingService::IncrementCounterValue(), ProfilingService::Instance(), armnn::Success, and armnn::warning.

Referenced by BOOST_AUTO_TEST_CASE(), and Runtime::~Runtime().

106 {
107  bool unloadOk = true;
108  for (auto&& context : m_BackendContexts)
109  {
110  unloadOk &= context.second->BeforeUnloadNetwork(networkId);
111  }
112 
113  if (!unloadOk)
114  {
115  ARMNN_LOG(warning) << "Runtime::UnloadNetwork(): failed to unload "
116  "network with ID:" << networkId << " because BeforeUnloadNetwork failed";
117  return Status::Failure;
118  }
119 
120  {
121  std::lock_guard<std::mutex> lockGuard(m_Mutex);
122 
123  if (m_LoadedNetworks.erase(networkId) == 0)
124  {
125  ARMNN_LOG(warning) << "WARNING: Runtime::UnloadNetwork(): " << networkId << " not found!";
126  return Status::Failure;
127  }
128  if (profiling::ProfilingService::Instance().IsProfilingEnabled())
129  {
130  profiling::ProfilingService::Instance().IncrementCounterValue(armnn::profiling::NETWORK_UNLOADS);
131  }
132  }
133 
134  for (auto&& context : m_BackendContexts)
135  {
136  context.second->AfterUnloadNetwork(networkId);
137  }
138 
139  ARMNN_LOG(debug) << "Runtime::UnloadNetwork(): Unloaded network with ID: " << networkId;
140  return Status::Success;
141 }
#define ARMNN_LOG(severity)
Definition: Logging.hpp:163
uint32_t IncrementCounterValue(uint16_t counterUid) override
static ProfilingService & Instance()

Friends And Related Function Documentation

◆ RuntimeLoadedNetworksReserve

void RuntimeLoadedNetworksReserve ( armnn::Runtime runtime)
friend

Definition at line 28 of file RuntimeTests.cpp.

Referenced by Runtime::GetDeviceSpec().

29 {
30  runtime->m_LoadedNetworks.reserve(1);
31 }

The documentation for this class was generated from the following files: