ArmNN
 22.05
MockBackend Class Reference

#include <MockBackend.hpp>

Inheritance diagram for MockBackend:
IBackendInternal IBackend

Public Member Functions

 MockBackend ()=default
 
 ~MockBackend ()=default
 
const BackendIdGetId () const override
 
IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory (const IBackendInternal::IMemoryManagerSharedPtr &memoryManager=nullptr) const override
 
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport () const override
 
IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager () const override
 
IBackendInternal::IBackendContextPtr CreateBackendContext (const IRuntime::CreationOptions &) const override
 Create the runtime context of the backend. More...
 
IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext (const IRuntime::CreationOptions &creationOptions, IBackendProfilingPtr &backendProfiling) override
 Create context specifically used for profiling interaction from backends. More...
 
OptimizationViews OptimizeSubgraphView (const SubgraphView &subgraph) const override
 
std::unique_ptr< ICustomAllocatorGetDefaultAllocator () const override
 Returns the default memory allocator for the backend. More...
 
- Public Member Functions inherited from IBackendInternal
 ~IBackendInternal () override=default
 Allow backends created by the factory function to be destroyed through IBackendInternal. More...
 
virtual IWorkloadFactoryPtr CreateWorkloadFactory (class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry) const
 
virtual IWorkloadFactoryPtr CreateWorkloadFactory (const IMemoryManagerSharedPtr &memoryManager, const ModelOptions &modelOptions) const
 
virtual IWorkloadFactoryPtr CreateWorkloadFactory (class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry, const ModelOptions &modelOptions) const
 
virtual IWorkloadFactoryPtr CreateWorkloadFactory (class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry, const ModelOptions &modelOptions, MemorySourceFlags inputFlags, MemorySourceFlags outputFlags) const
 
virtual IBackendSpecificModelContextPtr CreateBackendSpecificModelContext (const ModelOptions &modelOptions) const
 
virtual ILayerSupportSharedPtr GetLayerSupport (const ModelOptions &modelOptions) const
 
virtual OptimizationViews OptimizeSubgraphView (const SubgraphView &subgraph, const ModelOptions &modelOptions) const
 
bool SupportsTensorAllocatorAPI () const
 
ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory ()
 
virtual std::vector< ITensorHandleFactory::FactoryIdGetHandleFactoryPreferences () const
 (Optional) Returns a vector of supported TensorHandleFactory ids in preference order. More...
 
virtual void RegisterTensorHandleFactories (class TensorHandleFactoryRegistry &)
 (Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented. More...
 
virtual void RegisterTensorHandleFactories (class TensorHandleFactoryRegistry &registry, MemorySourceFlags inputFlags, MemorySourceFlags outputFlags)
 (Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented. More...
 
virtual BackendCapabilities GetCapabilities () const
 Returns a BackendCapability if the backend lists the capability The BackendCapability must then be inspected to check whether or not that BackendCapability is supported Otherwise returns an EmptyOptional if the BackendCapability is unlisted. More...
 
virtual bool HasCapability (BackendCapability) const
 Returns true if backend support the capability false otherwise. More...
 
virtual bool UseCustomMemoryAllocator (std::shared_ptr< ICustomAllocator > allocator, armnn::Optional< std::string &> errMsg)
 Signals the backend to use a custom memory allocator provided by the user. More...
 
virtual unsigned int GetNumberOfCacheFiles () const
 Returns the number of files cached if backend supports caching. More...
 

Static Public Member Functions

static const BackendIdGetIdStatic ()
 
- Static Public Member Functions inherited from IBackendInternal
static constexpr BackendVersion GetApiVersion ()
 Returns the version of the Backend API. More...
 

Additional Inherited Members

- Public Types inherited from IBackendInternal
using IWorkloadFactoryPtr = std::unique_ptr< IWorkloadFactory >
 
using IBackendContextPtr = std::unique_ptr< IBackendContext >
 
using IBackendProfilingContextPtr = std::shared_ptr< arm::pipe::IBackendProfilingContext >
 This is the bridge between backend and backend profiling we'll keep it in the backend namespace. More...
 
using IBackendProfilingPtr = std::unique_ptr< arm::pipe::IBackendProfiling >
 
using ILayerSupportSharedPtr = std::shared_ptr< ILayerSupport >
 
using IBackendSpecificModelContextPtr = std::shared_ptr< IBackendModelContext >
 
using IMemoryManagerUniquePtr = std::unique_ptr< IMemoryManager >
 
using IMemoryManagerSharedPtr = std::shared_ptr< IMemoryManager >
 
- Protected Member Functions inherited from IBackendInternal
 IBackendInternal ()=default
 Creation must be done through a specific backend interface. More...
 
- Protected Member Functions inherited from IBackend
 IBackend ()
 
virtual ~IBackend ()
 

Detailed Description

Definition at line 18 of file MockBackend.hpp.

Constructor & Destructor Documentation

◆ MockBackend()

MockBackend ( )
default

◆ ~MockBackend()

~MockBackend ( )
default

Member Function Documentation

◆ CreateBackendContext()

IBackendInternal::IBackendContextPtr CreateBackendContext ( const IRuntime::CreationOptions ) const
overridevirtual

Create the runtime context of the backend.

Implementations may return a default-constructed IBackendContextPtr if no context is needed at runtime. Implementations must throw BackendUnavailableException if the backend cannot be used (for example, necessary accelerator hardware is not present). The default implementation always returns a default-constructed pointer.

Reimplemented from IBackendInternal.

Definition at line 133 of file MockBackend.cpp.

Referenced by MockBackend::GetId().

134 {
135  return IBackendContextPtr{};
136 }
std::unique_ptr< IBackendContext > IBackendContextPtr

◆ CreateBackendProfilingContext()

IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext ( const IRuntime::CreationOptions creationOptions,
IBackendProfilingPtr backendProfiling 
)
overridevirtual

Create context specifically used for profiling interaction from backends.

Reimplemented from IBackendInternal.

Definition at line 138 of file MockBackend.cpp.

References armnn::IgnoreUnused(), MockBackendProfilingService::Instance(), and MockBackendProfilingService::SetProfilingContextPtr().

Referenced by MockBackend::GetId().

140 {
141  IgnoreUnused(options);
142  std::shared_ptr<armnn::MockBackendProfilingContext> context =
143  std::make_shared<MockBackendProfilingContext>(backendProfiling);
145  return context;
146 }
void SetProfilingContextPtr(std::shared_ptr< MockBackendProfilingContext > shared)
void IgnoreUnused(Ts &&...)
static MockBackendProfilingService & Instance()

◆ CreateMemoryManager()

IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager ( ) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 148 of file MockBackend.cpp.

Referenced by MockBackend::GetId().

149 {
150  return IMemoryManagerUniquePtr{};
151 }
std::unique_ptr< IMemoryManager > IMemoryManagerUniquePtr

◆ CreateWorkloadFactory()

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( const IBackendInternal::IMemoryManagerSharedPtr memoryManager = nullptr) const
overridevirtual

Implements IBackendInternal.

Definition at line 127 of file MockBackend.cpp.

Referenced by MockBackend::GetId().

129 {
130  return IWorkloadFactoryPtr{};
131 }
std::unique_ptr< IWorkloadFactory > IWorkloadFactoryPtr

◆ GetDefaultAllocator()

std::unique_ptr< ICustomAllocator > GetDefaultAllocator ( ) const
overridevirtual

Returns the default memory allocator for the backend.

Returns
- Returns unique pointer to the Default Allocator of the Backend

Reimplemented from IBackendInternal.

Definition at line 298 of file MockBackend.cpp.

Referenced by MockBackend::GetId().

299 {
300  return std::make_unique<DefaultAllocator>();
301 }

◆ GetId()

◆ GetIdStatic()

const BackendId & GetIdStatic ( )
static

Definition at line 17 of file MockBackend.cpp.

References armnn::MockBackendId().

Referenced by MockBackend::GetId(), MockBackendInitialiser::MockBackendInitialiser(), TEST_SUITE(), and MockBackendInitialiser::~MockBackendInitialiser().

18 {
19  static const BackendId s_Id{MockBackendId()};
20  return s_Id;
21 }
constexpr const char * MockBackendId()

◆ GetLayerSupport()

IBackendInternal::ILayerSupportSharedPtr GetLayerSupport ( ) const
overridevirtual

Implements IBackendInternal.

Definition at line 153 of file MockBackend.cpp.

Referenced by MockBackend::GetId().

154 {
155  static ILayerSupportSharedPtr layerSupport{new MockLayerSupport};
156  return layerSupport;
157 }
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr

◆ OptimizeSubgraphView()

OptimizationViews OptimizeSubgraphView ( const SubgraphView subgraph) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 159 of file MockBackend.cpp.

References OptimizationViews::AddFailedSubgraph(), OptimizationViews::AddSubstitution(), OptimizationViews::AddUntouchedSubgraph(), ARMNN_ASSERT, SubgraphView::GetIConnectableLayers(), OptimizationViews::GetINetwork(), armnn::Input, armnn::IsLayerOptimizable(), IWorkloadFactory::IsLayerSupported(), armnn::MockBackendId(), armnn::Output, and SubgraphViewSelector::SelectSubgraphs().

Referenced by MockBackend::GetId().

160 {
161  // Prepare the optimization views
162  OptimizationViews optimizationViews;
163 
164  // Get the layers of the input sub-graph
165  const SubgraphView::IConnectableLayers& subgraphLayers = subgraph.GetIConnectableLayers();
166 
167  // Parse the layers
168  SubgraphView::IConnectableLayers supportedLayers;
169  SubgraphView::IConnectableLayers unsupportedLayers;
170  SubgraphView::IConnectableLayers untouchedLayers;
171  std::for_each(subgraphLayers.begin(),
172  subgraphLayers.end(),
173  [&](IConnectableLayer* layer)
174  {
175  bool supported = IsLayerSupported(PolymorphicDowncast<Layer*>(layer));
176  if (supported)
177  {
178  // Layer supported, check if it's optimizable
179  bool optimizable = IsLayerOptimizable(PolymorphicDowncast<Layer*>(layer));
180  if (optimizable)
181  {
182  // Layer fully supported
183  supportedLayers.push_back(layer);
184  }
185  else
186  {
187  // Layer supported but not optimizable
188  untouchedLayers.push_back(layer);
189  }
190  }
191  else
192  {
193  // Layer unsupported
194  unsupportedLayers.push_back(layer);
195  }
196  });
197 
198  // Check if there are supported layers
199  if (!supportedLayers.empty())
200  {
201  // Select the layers that are neither inputs or outputs, but that are optimizable
202  auto supportedSubgraphSelector = [](const Layer& layer)
203  {
204  return layer.GetType() != LayerType::Input &&
205  layer.GetType() != LayerType::Output &&
206  IsLayerSupported(layer) &&
207  IsLayerOptimizable(layer);
208  };
209 
210  // Apply the subgraph selector to the supported layers to group them into sub-graphs were appropriate
211  SubgraphView mutableSubgraph(subgraph);
212  SubgraphViewSelector::Subgraphs supportedSubgraphs =
213  SubgraphViewSelector::SelectSubgraphs(mutableSubgraph, supportedSubgraphSelector);
214 
215  // Create a substitution pair for each supported sub-graph
216  std::for_each(supportedSubgraphs.begin(),
217  supportedSubgraphs.end(),
218  [&optimizationViews](const SubgraphView::SubgraphViewPtr& supportedSubgraph)
219  {
220  ARMNN_ASSERT(supportedSubgraph != nullptr);
221 
222  CompiledBlobPtr blobPtr;
223  BackendId backend = MockBackendId();
224 
225  IConnectableLayer* preCompiledLayer =
226  optimizationViews.GetINetwork()->AddPrecompiledLayer(
227  PreCompiledDescriptor(supportedSubgraph->GetNumInputSlots(),
228  supportedSubgraph->GetNumOutputSlots()),
229  std::move(blobPtr),
230  backend,
231  nullptr);
232 
233  SubgraphView substitutionSubgraph(*supportedSubgraph);
234  SubgraphView replacementSubgraph(preCompiledLayer);
235 
236  optimizationViews.AddSubstitution({ substitutionSubgraph, replacementSubgraph });
237  });
238  }
239 
240  // Check if there are unsupported layers
241  if (!unsupportedLayers.empty())
242  {
243  // Select the layers that are neither inputs or outputs, and are not optimizable
244  auto unsupportedSubgraphSelector = [](const Layer& layer)
245  {
246  return layer.GetType() != LayerType::Input &&
247  layer.GetType() != LayerType::Output &&
248  !IsLayerSupported(layer);
249  };
250 
251  // Apply the subgraph selector to the unsupported layers to group them into sub-graphs were appropriate
252  SubgraphView mutableSubgraph(subgraph);
253  SubgraphViewSelector::Subgraphs unsupportedSubgraphs =
254  SubgraphViewSelector::SelectSubgraphs(mutableSubgraph, unsupportedSubgraphSelector);
255 
256  // Add each unsupported sub-graph to the list of failed sub-graphs in the optimizization views
257  std::for_each(unsupportedSubgraphs.begin(),
258  unsupportedSubgraphs.end(),
259  [&optimizationViews](const SubgraphView::SubgraphViewPtr& unsupportedSubgraph)
260  {
261  ARMNN_ASSERT(unsupportedSubgraph != nullptr);
262 
263  optimizationViews.AddFailedSubgraph(SubgraphView(*unsupportedSubgraph));
264  });
265  }
266 
267  // Check if there are untouched layers
268  if (!untouchedLayers.empty())
269  {
270  // Select the layers that are neither inputs or outputs, that are supported but that and are not optimizable
271  auto untouchedSubgraphSelector = [](const Layer& layer)
272  {
273  return layer.GetType() != LayerType::Input &&
274  layer.GetType() != LayerType::Output &&
275  IsLayerSupported(layer) &&
276  !IsLayerOptimizable(layer);
277  };
278 
279  // Apply the subgraph selector to the untouched layers to group them into sub-graphs were appropriate
280  SubgraphView mutableSubgraph(subgraph);
281  SubgraphViewSelector::Subgraphs untouchedSubgraphs =
282  SubgraphViewSelector::SelectSubgraphs(mutableSubgraph, untouchedSubgraphSelector);
283 
284  // Add each untouched sub-graph to the list of untouched sub-graphs in the optimizization views
285  std::for_each(untouchedSubgraphs.begin(),
286  untouchedSubgraphs.end(),
287  [&optimizationViews](const SubgraphView::SubgraphViewPtr& untouchedSubgraph)
288  {
289  ARMNN_ASSERT(untouchedSubgraph != nullptr);
290 
291  optimizationViews.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
292  });
293  }
294 
295  return optimizationViews;
296 }
bool IsLayerSupported(const armnn::Layer *layer)
Definition: MockBackend.cpp:60
constexpr const char * MockBackendId()
std::unique_ptr< void, CompiledBlobDeleter > CompiledBlobPtr
Definition: INetwork.hpp:245
std::unique_ptr< SubgraphView > SubgraphViewPtr
std::list< IConnectableLayer * > IConnectableLayers
std::vector< SubgraphViewPtr > Subgraphs
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
bool IsLayerOptimizable(const armnn::Layer *layer)
Definition: MockBackend.cpp:85
static Subgraphs SelectSubgraphs(Graph &graph, const LayerSelectorFunction &selector)
Selects subgraphs from a graph based on the selector function and the algorithm.

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