ArmNN
 21.05
ClBackend Class Reference

#include <ClBackend.hpp>

Inheritance diagram for ClBackend:
IBackendInternal IBackend

Public Member Functions

 ClBackend ()=default
 
 ~ClBackend ()=default
 
const BackendIdGetId () const override
 
IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager () const override
 
IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory (const IBackendInternal::IMemoryManagerSharedPtr &memoryManager=nullptr) const override
 
IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory (TensorHandleFactoryRegistry &registry) const override
 
IWorkloadFactoryPtr CreateWorkloadFactory (const IMemoryManagerSharedPtr &memoryManager, const ModelOptions &modelOptions) const override
 
IWorkloadFactoryPtr CreateWorkloadFactory (class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry, const ModelOptions &modelOptions) const override
 
IWorkloadFactoryPtr CreateWorkloadFactory (class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry, const ModelOptions &modelOptions, MemorySourceFlags inputFlags, MemorySourceFlags outputFlags) const override
 
std::vector< ITensorHandleFactory::FactoryIdGetHandleFactoryPreferences () const override
 (Optional) Returns a vector of supported TensorHandleFactory ids in preference order. More...
 
void RegisterTensorHandleFactories (TensorHandleFactoryRegistry &registry) override
 (Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented. More...
 
void RegisterTensorHandleFactories (TensorHandleFactoryRegistry &registry, MemorySourceFlags inputFlags, MemorySourceFlags outputFlags) override
 (Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented. More...
 
IBackendInternal::IBackendContextPtr CreateBackendContext (const IRuntime::CreationOptions &) const override
 Create the runtime context of the backend. More...
 
IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext (const IRuntime::CreationOptions &, IBackendProfilingPtr &backendProfiling) override
 Create context specifically used for profiling interaction from backends. More...
 
IBackendInternal::Optimizations GetOptimizations () const override
 
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport () const override
 
IBackendInternal::ILayerSupportSharedPtr GetLayerSupport (const ModelOptions &modelOptions) const override
 
OptimizationViews OptimizeSubgraphView (const SubgraphView &subgraph, const ModelOptions &modelOptions) const override
 
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext (const ModelOptions &modelOptions) const override
 
bool HasCapability (BackendCapability capabilityClass) const override
 Returns true if backend support the capability false otherwise. More...
 
- Public Member Functions inherited from IBackendInternal
 ~IBackendInternal () override=default
 Allow backends created by the factory function to be destroyed through IBackendInternal. More...
 
virtual ISubGraphConverterPtr CreateSubGraphConverter (const std::shared_ptr< SubGraph > &subGraph) const
 
virtual SubGraphUniquePtr OptimizeSubGraph (const SubGraph &subGraph, bool &optimizationAttempted) const
 
virtual OptimizationViews OptimizeSubgraphView (const SubgraphView &subgraph) const
 
bool SupportsTensorAllocatorAPI () const
 
ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory ()
 

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< armnn::profiling::IBackendProfilingContext >
 This is the bridge between backend and backend profiling we'll keep it in the backend namespace. More...
 
using IBackendProfilingPtr = std::unique_ptr< armnn::profiling::IBackendProfiling >
 
using OptimizationPtr = std::unique_ptr< Optimization >
 
using Optimizations = std::vector< OptimizationPtr >
 
using ILayerSupportSharedPtr = std::shared_ptr< ILayerSupport >
 
using IBackendSpecificModelContextPtr = std::shared_ptr< IBackendModelContext >
 
using IMemoryManagerUniquePtr = std::unique_ptr< IMemoryManager >
 
using IMemoryManagerSharedPtr = std::shared_ptr< IMemoryManager >
 
using GraphUniquePtr = std::unique_ptr< Graph >
 
using SubgraphViewUniquePtr = std::unique_ptr< SubgraphView >
 
using supported = std::unique_ptr< ISubGraphConverter >
 
using instead = std::unique_ptr< SubGraph >
 
- 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 16 of file ClBackend.hpp.

Constructor & Destructor Documentation

◆ ClBackend()

ClBackend ( )
default

◆ ~ClBackend()

~ClBackend ( )
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 139 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

140 {
141  return IBackendContextPtr{new ClBackendContext{options}};
142 }
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 144 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

146 {
148 }
std::shared_ptr< armnn::profiling::IBackendProfilingContext > IBackendProfilingContextPtr
This is the bridge between backend and backend profiling we&#39;ll keep it in the backend namespace...

◆ CreateBackendSpecificModelContext()

IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext ( const ModelOptions modelOptions) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 155 of file ClBackend.cpp.

Referenced by ClBackend::CreateWorkloadFactory(), ClBackend::GetId(), ClBackend::GetLayerSupport(), and ClBackend::OptimizeSubgraphView().

157 {
158  return IBackendSpecificModelContextPtr{new ClBackendModelContext{modelOptions}};
159 }
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr

◆ CreateMemoryManager()

IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager ( ) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 49 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

50 {
51  return std::make_unique<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
52 }

◆ CreateWorkloadFactory() [1/5]

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

Implements IBackendInternal.

Definition at line 54 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

56 {
57  return std::make_unique<ClWorkloadFactory>(
58  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager));
59 }

◆ CreateWorkloadFactory() [2/5]

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( TensorHandleFactoryRegistry registry) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 68 of file ClBackend.cpp.

References armnn::Malloc, TensorHandleFactoryRegistry::RegisterFactory(), and TensorHandleFactoryRegistry::RegisterMemoryManager().

70 {
71  auto memoryManager = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
72 
73  registry.RegisterMemoryManager(memoryManager);
74  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(memoryManager));
75  registry.RegisterFactory(std::make_unique<ClImportTensorHandleFactory>(
76  static_cast<MemorySourceFlags>(MemorySource::Malloc), static_cast<MemorySourceFlags>(MemorySource::Malloc)));
77 
78  return std::make_unique<ClWorkloadFactory>(
79  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager));
80 }

◆ CreateWorkloadFactory() [3/5]

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( const IMemoryManagerSharedPtr memoryManager,
const ModelOptions modelOptions 
) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 61 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext().

63 {
64  return std::make_unique<ClWorkloadFactory>(
65  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
66 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:155

◆ CreateWorkloadFactory() [4/5]

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( class TensorHandleFactoryRegistry tensorHandleFactoryRegistry,
const ModelOptions modelOptions 
) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 82 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext(), armnn::Malloc, TensorHandleFactoryRegistry::RegisterFactory(), and TensorHandleFactoryRegistry::RegisterMemoryManager().

84 {
85  auto memoryManager = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
86 
87  registry.RegisterMemoryManager(memoryManager);
88  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(memoryManager));
89  registry.RegisterFactory(std::make_unique<ClImportTensorHandleFactory>(
90  static_cast<MemorySourceFlags>(MemorySource::Malloc), static_cast<MemorySourceFlags>(MemorySource::Malloc)));
91 
92  return std::make_unique<ClWorkloadFactory>(
93  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
94 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:155

◆ CreateWorkloadFactory() [5/5]

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( class TensorHandleFactoryRegistry tensorHandleFactoryRegistry,
const ModelOptions modelOptions,
MemorySourceFlags  inputFlags,
MemorySourceFlags  outputFlags 
) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 96 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext(), TensorHandleFactoryRegistry::RegisterFactory(), and TensorHandleFactoryRegistry::RegisterMemoryManager().

101 {
102  auto memoryManager = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
103 
104  registry.RegisterMemoryManager(memoryManager);
105  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(memoryManager));
106  registry.RegisterFactory(std::make_unique<ClImportTensorHandleFactory>(inputFlags, outputFlags));
107 
108  return std::make_unique<ClWorkloadFactory>(
109  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
110 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:155

◆ GetHandleFactoryPreferences()

std::vector< ITensorHandleFactory::FactoryId > GetHandleFactoryPreferences ( ) const
overridevirtual

(Optional) Returns a vector of supported TensorHandleFactory ids in preference order.

Reimplemented from IBackendInternal.

Definition at line 112 of file ClBackend.cpp.

References ClTensorHandleFactory::GetIdStatic(), and ClImportTensorHandleFactory::GetIdStatic().

Referenced by ClBackend::GetId().

113 {
114  return std::vector<ITensorHandleFactory::FactoryId> {ClTensorHandleFactory::GetIdStatic(),
116 }
static const FactoryId & GetIdStatic()

◆ GetId()

◆ GetIdStatic()

const BackendId & GetIdStatic ( )
static

Definition at line 43 of file ClBackend.cpp.

References armnn::ClBackendId().

Referenced by ClBackend::GetId().

44 {
45  static const BackendId s_Id{ClBackendId()};
46  return s_Id;
47 }
constexpr const char * ClBackendId()
Definition: ClBackendId.hpp:10

◆ GetLayerSupport() [1/2]

IBackendInternal::ILayerSupportSharedPtr GetLayerSupport ( ) const
overridevirtual

Implements IBackendInternal.

Definition at line 161 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

162 {
163  static ILayerSupportSharedPtr layerSupport
164  {
166  };
167  return layerSupport;
168 }
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr

◆ GetLayerSupport() [2/2]

IBackendInternal::ILayerSupportSharedPtr GetLayerSupport ( const ModelOptions modelOptions) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 170 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext().

171 {
172  static ILayerSupportSharedPtr layerSupport
173  {
174  new ClLayerSupport(CreateBackendSpecificModelContext(modelOptions))
175  };
176  return layerSupport;
177 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:155
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr

◆ GetOptimizations()

IBackendInternal::Optimizations GetOptimizations ( ) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 150 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

151 {
152  return Optimizations{};
153 }
std::vector< OptimizationPtr > Optimizations

◆ HasCapability()

bool HasCapability ( BackendCapability  ) const
overridevirtual

Returns true if backend support the capability false otherwise.

Reimplemented from IBackendInternal.

Definition at line 179 of file ClBackend.cpp.

References armnn::gpuAccCapabilities.

Referenced by ClBackend::GetId().

180 {
181  auto search = gpuAccCapabilities.find(capabilityClass);
182  if (search != gpuAccCapabilities.end())
183  {
184  return true;
185  }
186  return false;
187 }
const std::set< armnn::BackendCapability > gpuAccCapabilities
Definition: ClBackend.hpp:12

◆ OptimizeSubgraphView()

OptimizationViews OptimizeSubgraphView ( const SubgraphView subgraph,
const ModelOptions modelOptions 
) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 189 of file ClBackend.cpp.

References armnn::Activation, armnn::Addition, OptimizationViews::AddUntouchedSubgraph(), armnn::BatchNormalization, SubgraphView::begin(), Layer::BeginOutputSlots(), armnn::ClAdditionValidate(), armnn::ClBatchNormalizationValidate(), armnn::ClConvolution2dWorkloadValidate(), armnn::ClDepthwiseConvolutionWorkloadValidate(), armnn::ClDivisionWorkloadValidate(), armnn::ClFullyConnectedWorkloadValidate(), armnn::ClMultiplicationWorkloadValidate(), armnn::ClSubtractionValidate(), armnn::Convolution2d, ClBackend::CreateBackendSpecificModelContext(), armnn::DepthwiseConvolution2d, armnn::Division, SubgraphView::end(), Layer::EndOutputSlots(), armnn::FullyConnected, Layer::GetAdditionalInformation(), InputSlot::GetConnectedOutputSlot(), Layer::GetGuid(), Layer::GetInputSlot(), Layer::GetName(), LayerWithParameters< Parameters >::GetParameters(), OptimizationViews::GetSubstitutions(), OutputSlot::GetTensorInfo(), Layer::GetType(), ClBackendModelContext::IsFastMathEnabled(), BatchNormalizationLayer::m_Beta, FullyConnectedLayer::m_Bias, DepthwiseConvolution2dLayer::m_Bias, Convolution2dLayer::m_Bias, Convolution2dDescriptor::m_BiasEnabled, DepthwiseConvolution2dDescriptor::m_BiasEnabled, BatchNormalizationLayer::m_Gamma, BatchNormalizationLayer::m_Mean, BatchNormalizationLayer::m_Variance, FullyConnectedLayer::m_Weight, DepthwiseConvolution2dLayer::m_Weight, Convolution2dLayer::m_Weight, armnn::Multiplication, armnn::ReportUntouchedLayers(), and armnn::Subtraction.

Referenced by ClBackend::GetId().

191 {
192  OptimizationViews optimizationViews;
193 
194  auto it = subgraph.end();
195  bool isFastMathEnabled = false;
196  std::map<LayerGuid, Layer*> untouched;
197 
198  while (it != subgraph.begin())
199  {
200  --it;
201  Layer& base = **it;
202  untouched.insert({base.GetGuid(), &base});
203  }
204 
205  it = subgraph.end();
206 #if defined(ARMCOMPUTECL_ENABLED)
208 
209  if (modelContextPtr)
210  {
211  auto clModelOptions = dynamic_cast<ClBackendModelContext*>(modelContextPtr.get());
212  if (clModelOptions)
213  {
214  isFastMathEnabled = clModelOptions->IsFastMathEnabled();
215  }
216  }
217 #endif
218  while (it != subgraph.begin())
219  {
220  --it;
221  Layer& base = **it;
222 
223  if ((base.GetType() == LayerType::DepthwiseConvolution2d || base.GetType() == LayerType::Convolution2d
224  || base.GetType() == LayerType::BatchNormalization || base.GetType() == LayerType::FullyConnected
225  || base.GetType() == LayerType::Addition || base.GetType() == LayerType::Multiplication
226  || base.GetType() == LayerType::Subtraction || base.GetType() == LayerType::Division)
227  && (base.GetAdditionalInformation<ActivationDescriptor>() == nullptr))
228  {
229  for (auto output = base.BeginOutputSlots(); output != base.EndOutputSlots(); ++output)
230  {
231  if (output->GetNumConnections() == 1)
232  {
233  for (auto&& childInput : output->GetConnections())
234  {
235  if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) &&
236  (checkDataTypeInputandOutput(childInput->GetOwningLayer())))
237  {
238  Layer& child = childInput->GetOwningLayer();
239 
240  auto* activationLayer = PolymorphicDowncast<ActivationLayer*>(&child);
241 
242  const std::string name = std::string("fused-") + child.GetName() + std::string("-into-") +
243  base.GetName();
244 
245  // Get params from activation layer
246  ActivationDescriptor activationDesc = activationLayer->GetParameters();
247 
248  if (base.GetType() == LayerType::Convolution2d)
249  {
250  Convolution2dLayer* baseLayer = PolymorphicDowncast<Convolution2dLayer*>(&base);
251 
252  Optional<TensorInfo> biases;
253 
254  if (baseLayer->GetParameters().m_BiasEnabled)
255  {
256  biases = baseLayer->m_Bias->GetTensorInfo();
257  }
258 
260  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
261  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
262  baseLayer->GetParameters(),
263  baseLayer->m_Weight->GetTensorInfo(),
264  biases,
265  isFastMathEnabled,
266  &activationDesc);
267 
268  if (status)
269  {
270  FuseLayerWithWeightsAndBiases<Convolution2dLayer>(optimizationViews,
271  baseLayer,
272  activationLayer,
273  activationDesc,
274  name);
275  untouched.erase(baseLayer->GetGuid());
276  untouched.erase(activationLayer->GetGuid());
277  }
278  }
279  else if (base.GetType() == LayerType::DepthwiseConvolution2d)
280  {
281  DepthwiseConvolution2dLayer* baseLayer =
282  PolymorphicDowncast<DepthwiseConvolution2dLayer*>(&base);
283 
284  Optional<TensorInfo> biases;
285 
286  if (baseLayer->GetParameters().m_BiasEnabled)
287  {
288  biases = baseLayer->m_Bias->GetTensorInfo();
289  }
290 
292  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
293  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
294  baseLayer->GetParameters(),
295  baseLayer->m_Weight->GetTensorInfo(),
296  biases,
297  &activationDesc);
298 
299  if (status)
300  {
301  FuseLayerWithWeightsAndBiases<DepthwiseConvolution2dLayer>(optimizationViews,
302  baseLayer,
303  activationLayer,
304  activationDesc,
305  name);
306  untouched.erase(baseLayer->GetGuid());
307  untouched.erase(activationLayer->GetGuid());
308  }
309  }
310  else if (base.GetType() == LayerType::FullyConnected)
311  {
312  FullyConnectedLayer* baseLayer = PolymorphicDowncast<FullyConnectedLayer*>(&base);
313 
315  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
316  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
317  baseLayer->m_Weight->GetTensorInfo(),
318  baseLayer->m_Bias->GetTensorInfo(),
319  baseLayer->GetParameters(),
320  &activationDesc);
321 
322  if (status)
323  {
324  FuseLayerWithWeightsAndBiases<FullyConnectedLayer>(optimizationViews,
325  baseLayer,
326  activationLayer,
327  activationDesc,
328  name);
329  untouched.erase(baseLayer->GetGuid());
330  untouched.erase(activationLayer->GetGuid());
331  }
332  }
333  else if (base.GetType() == LayerType::BatchNormalization)
334  {
335  BatchNormalizationLayer* baseLayer =
336  PolymorphicDowncast<BatchNormalizationLayer*>(&base);
337 
339  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
340  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
341  baseLayer->m_Mean->GetTensorInfo(),
342  baseLayer->m_Variance->GetTensorInfo(),
343  baseLayer->m_Beta->GetTensorInfo(),
344  baseLayer->m_Gamma->GetTensorInfo(),
345  baseLayer->GetParameters(),
346  &activationDesc);
347 
348  if (status)
349  {
350  BatchNormalizationLayer* replacementLayer =
351  FuseLayerWithParameters<BatchNormalizationLayer>(optimizationViews,
352  baseLayer,
353  activationLayer,
354  activationDesc,
355  name);
356 
357  replacementLayer->m_Beta = std::move(baseLayer->m_Beta);
358  replacementLayer->m_Gamma = std::move(baseLayer->m_Gamma);
359  replacementLayer->m_Mean = std::move(baseLayer->m_Mean);
360  replacementLayer->m_Variance = std::move(baseLayer->m_Variance);
361  untouched.erase(baseLayer->GetGuid());
362  untouched.erase(activationLayer->GetGuid());
363  }
364  }
365  else if (base.GetType() == LayerType::Addition)
366  {
367  AdditionLayer* baseLayer = PolymorphicDowncast<AdditionLayer*>(&base);
368 
370  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
371  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
372  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
373  &activationDesc);
374 
375  if (status)
376  {
377  FuseLayerWithoutParameters<AdditionLayer>(optimizationViews,
378  baseLayer,
379  activationLayer,
380  activationDesc,
381  name);
382  untouched.erase(baseLayer->GetGuid());
383  untouched.erase(activationLayer->GetGuid());
384  }
385  }
386  else if (base.GetType() == LayerType::Division)
387  {
388  DivisionLayer* baseLayer = PolymorphicDowncast<DivisionLayer*>(&base);
389 
391  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
392  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
393  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
394  &activationDesc);
395 
396  if (status)
397  {
398  FuseLayerWithoutParameters<DivisionLayer>(optimizationViews,
399  baseLayer,
400  activationLayer,
401  activationDesc,
402  name);
403  untouched.erase(baseLayer->GetGuid());
404  untouched.erase(activationLayer->GetGuid());
405  }
406  }
407  else if (base.GetType() == LayerType::Multiplication)
408  {
409  MultiplicationLayer* baseLayer = PolymorphicDowncast<MultiplicationLayer*>(&base);
410 
412  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
413  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
414  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
415  &activationDesc);
416 
417  if (status)
418  {
419  FuseLayerWithoutParameters<MultiplicationLayer>(optimizationViews,
420  baseLayer,
421  activationLayer,
422  activationDesc,
423  name);
424  untouched.erase(baseLayer->GetGuid());
425  untouched.erase(activationLayer->GetGuid());
426  }
427  }
428  else if (base.GetType() == LayerType::Subtraction)
429  {
430  SubtractionLayer* baseLayer = PolymorphicDowncast<SubtractionLayer*>(&base);
431 
433  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
434  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
435  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
436  &activationDesc);
437 
438  if (status)
439  {
440  FuseLayerWithoutParameters<SubtractionLayer>(optimizationViews,
441  baseLayer,
442  activationLayer,
443  activationDesc,
444  name);
445  untouched.erase(baseLayer->GetGuid());
446  untouched.erase(activationLayer->GetGuid());
447  }
448  }
449  }
450  }
451  }
452  }
453  }
454  }
455 
456  if (optimizationViews.GetSubstitutions().empty())
457  {
458  optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
459  }
460  else
461  {
462  ReportUntouchedLayers(optimizationViews, untouched);
463  }
464 
465  return optimizationViews;
466 }
arm_compute::Status ClAdditionValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
arm_compute::Status ClFullyConnectedWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &weights, const TensorInfo &biases, const FullyConnectedDescriptor &descriptor, const ActivationDescriptor *activationDescriptor)
arm_compute::Status ClDivisionWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
void ReportUntouchedLayers(OptimizationViews &optimizationViews, std::map< LayerGuid, Layer *> untouched)
arm_compute::Status ClSubtractionValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
arm_compute::Status ClConvolution2dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const Convolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, bool isFastMathEnabled, const ActivationDescriptor *activationDescriptor)
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:155
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr
arm_compute::Status ClMultiplicationWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
Status
enumeration
Definition: Types.hpp:30
arm_compute::Status ClBatchNormalizationValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &desc, const ActivationDescriptor *activationDescriptor)
arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, const ActivationDescriptor *activationDescriptor)

◆ RegisterTensorHandleFactories() [1/2]

void RegisterTensorHandleFactories ( TensorHandleFactoryRegistry )
overridevirtual

(Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.

Reimplemented from IBackendInternal.

Definition at line 118 of file ClBackend.cpp.

References armnn::Malloc, TensorHandleFactoryRegistry::RegisterFactory(), and TensorHandleFactoryRegistry::RegisterMemoryManager().

Referenced by ClBackend::GetId().

119 {
120  auto mgr = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
121 
122  registry.RegisterMemoryManager(mgr);
123  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(mgr));
124  registry.RegisterFactory(std::make_unique<ClImportTensorHandleFactory>(
125  static_cast<MemorySourceFlags>(MemorySource::Malloc), static_cast<MemorySourceFlags>(MemorySource::Malloc)));
126 }

◆ RegisterTensorHandleFactories() [2/2]

void RegisterTensorHandleFactories ( TensorHandleFactoryRegistry registry,
MemorySourceFlags  inputFlags,
MemorySourceFlags  outputFlags 
)
overridevirtual

(Optional) Register TensorHandleFactories Either this method or CreateMemoryManager() and IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.

Reimplemented from IBackendInternal.

Definition at line 128 of file ClBackend.cpp.

References TensorHandleFactoryRegistry::RegisterFactory(), and TensorHandleFactoryRegistry::RegisterMemoryManager().

131 {
132  auto mgr = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
133 
134  registry.RegisterMemoryManager(mgr);
135  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(mgr));
136  registry.RegisterFactory(std::make_unique<ClImportTensorHandleFactory>(inputFlags, outputFlags));
137 }

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