ArmNN
 21.02
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
 
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...
 
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
 
- 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 12 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 104 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

105 {
106  return IBackendContextPtr{new ClBackendContext{options}};
107 }
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 109 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

111 {
113 }
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 120 of file ClBackend.cpp.

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

122 {
123  return IBackendSpecificModelContextPtr{new ClBackendModelContext{modelOptions}};
124 }
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr

◆ CreateMemoryManager()

IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager ( ) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 48 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

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

◆ CreateWorkloadFactory() [1/4]

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

Implements IBackendInternal.

Definition at line 53 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

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

◆ CreateWorkloadFactory() [2/4]

IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory ( TensorHandleFactoryRegistry registry) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 67 of file ClBackend.cpp.

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

69 {
70  auto memoryManager = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
71 
72  registry.RegisterMemoryManager(memoryManager);
73  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(memoryManager));
74 
75  return std::make_unique<ClWorkloadFactory>(
76  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager));
77 }

◆ CreateWorkloadFactory() [3/4]

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

Reimplemented from IBackendInternal.

Definition at line 60 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext().

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

◆ CreateWorkloadFactory() [4/4]

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

Reimplemented from IBackendInternal.

Definition at line 79 of file ClBackend.cpp.

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

81 {
82  auto memoryManager = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
83 
84  registry.RegisterMemoryManager(memoryManager);
85  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(memoryManager));
86 
87  return std::make_unique<ClWorkloadFactory>(
88  PolymorphicPointerDowncast<ClMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
89 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:120

◆ 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 91 of file ClBackend.cpp.

References ClTensorHandleFactory::GetIdStatic().

Referenced by ClBackend::GetId().

92 {
93  return std::vector<ITensorHandleFactory::FactoryId> {ClTensorHandleFactory::GetIdStatic()};
94 }
static const FactoryId & GetIdStatic()

◆ GetId()

◆ GetIdStatic()

const BackendId & GetIdStatic ( )
static

Definition at line 42 of file ClBackend.cpp.

References armnn::ClBackendId().

Referenced by ClBackend::GetId().

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

◆ GetLayerSupport() [1/2]

IBackendInternal::ILayerSupportSharedPtr GetLayerSupport ( ) const
overridevirtual

Implements IBackendInternal.

Definition at line 126 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

127 {
128  static ILayerSupportSharedPtr layerSupport
129  {
131  };
132  return layerSupport;
133 }
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 135 of file ClBackend.cpp.

References ClBackend::CreateBackendSpecificModelContext().

136 {
137  static ILayerSupportSharedPtr layerSupport
138  {
139  new ClLayerSupport(CreateBackendSpecificModelContext(modelOptions))
140  };
141  return layerSupport;
142 }
IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions &modelOptions) const override
Definition: ClBackend.cpp:120
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr

◆ GetOptimizations()

IBackendInternal::Optimizations GetOptimizations ( ) const
overridevirtual

Reimplemented from IBackendInternal.

Definition at line 115 of file ClBackend.cpp.

Referenced by ClBackend::GetId().

116 {
117  return Optimizations{};
118 }
std::vector< OptimizationPtr > Optimizations

◆ OptimizeSubgraphView()

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

Reimplemented from IBackendInternal.

Definition at line 144 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().

146 {
147  OptimizationViews optimizationViews;
148 
149  auto it = subgraph.end();
150  bool isFastMathEnabled = false;
151  std::map<LayerGuid, Layer*> untouched;
152 
153  while (it != subgraph.begin())
154  {
155  --it;
156  Layer& base = **it;
157  untouched.insert({base.GetGuid(), &base});
158  }
159 
160  it = subgraph.end();
161 #if defined(ARMCOMPUTECL_ENABLED)
163 
164  if (modelContextPtr)
165  {
166  auto clModelOptions = dynamic_cast<ClBackendModelContext*>(modelContextPtr.get());
167  if (clModelOptions)
168  {
169  isFastMathEnabled = clModelOptions->IsFastMathEnabled();
170  }
171  }
172 #endif
173  while (it != subgraph.begin())
174  {
175  --it;
176  Layer& base = **it;
177 
178  if ((base.GetType() == LayerType::DepthwiseConvolution2d || base.GetType() == LayerType::Convolution2d
179  || base.GetType() == LayerType::BatchNormalization || base.GetType() == LayerType::FullyConnected
180  || base.GetType() == LayerType::Addition || base.GetType() == LayerType::Multiplication
181  || base.GetType() == LayerType::Subtraction || base.GetType() == LayerType::Division)
182  && (base.GetAdditionalInformation<ActivationDescriptor>() == nullptr))
183  {
184  for (auto output = base.BeginOutputSlots(); output != base.EndOutputSlots(); ++output)
185  {
186  if (output->GetNumConnections() == 1)
187  {
188  for (auto&& childInput : output->GetConnections())
189  {
190  if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) &&
191  (checkDataTypeInputandOutput(childInput->GetOwningLayer())))
192  {
193  Layer& child = childInput->GetOwningLayer();
194 
195  auto* activationLayer = PolymorphicDowncast<ActivationLayer*>(&child);
196 
197  const std::string name = std::string("fused-") + child.GetName() + std::string("-into-") +
198  base.GetName();
199 
200  // Get params from activation layer
201  ActivationDescriptor activationDesc = activationLayer->GetParameters();
202 
203  if (base.GetType() == LayerType::Convolution2d)
204  {
205  Convolution2dLayer* baseLayer = PolymorphicDowncast<Convolution2dLayer*>(&base);
206 
207  Optional<TensorInfo> biases;
208 
209  if (baseLayer->GetParameters().m_BiasEnabled)
210  {
211  biases = baseLayer->m_Bias->GetTensorInfo();
212  }
213 
215  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
216  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
217  baseLayer->GetParameters(),
218  baseLayer->m_Weight->GetTensorInfo(),
219  biases,
220  isFastMathEnabled,
221  &activationDesc);
222 
223  if (status)
224  {
225  FuseLayerWithWeightsAndBiases<Convolution2dLayer>(optimizationViews,
226  baseLayer,
227  activationLayer,
228  activationDesc,
229  name);
230  untouched.erase(baseLayer->GetGuid());
231  untouched.erase(activationLayer->GetGuid());
232  }
233  }
234  else if (base.GetType() == LayerType::DepthwiseConvolution2d)
235  {
236  DepthwiseConvolution2dLayer* baseLayer =
237  PolymorphicDowncast<DepthwiseConvolution2dLayer*>(&base);
238 
239  Optional<TensorInfo> biases;
240 
241  if (baseLayer->GetParameters().m_BiasEnabled)
242  {
243  biases = baseLayer->m_Bias->GetTensorInfo();
244  }
245 
247  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
248  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
249  baseLayer->GetParameters(),
250  baseLayer->m_Weight->GetTensorInfo(),
251  biases,
252  &activationDesc);
253 
254  if (status)
255  {
256  FuseLayerWithWeightsAndBiases<DepthwiseConvolution2dLayer>(optimizationViews,
257  baseLayer,
258  activationLayer,
259  activationDesc,
260  name);
261  untouched.erase(baseLayer->GetGuid());
262  untouched.erase(activationLayer->GetGuid());
263  }
264  }
265  else if (base.GetType() == LayerType::FullyConnected)
266  {
267  FullyConnectedLayer* baseLayer = PolymorphicDowncast<FullyConnectedLayer*>(&base);
268 
270  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
271  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
272  baseLayer->m_Weight->GetTensorInfo(),
273  baseLayer->m_Bias->GetTensorInfo(),
274  baseLayer->GetParameters(),
275  &activationDesc);
276 
277  if (status)
278  {
279  FuseLayerWithWeightsAndBiases<FullyConnectedLayer>(optimizationViews,
280  baseLayer,
281  activationLayer,
282  activationDesc,
283  name);
284  untouched.erase(baseLayer->GetGuid());
285  untouched.erase(activationLayer->GetGuid());
286  }
287  }
288  else if (base.GetType() == LayerType::BatchNormalization)
289  {
290  BatchNormalizationLayer* baseLayer =
291  PolymorphicDowncast<BatchNormalizationLayer*>(&base);
292 
294  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
295  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
296  baseLayer->m_Mean->GetTensorInfo(),
297  baseLayer->m_Variance->GetTensorInfo(),
298  baseLayer->m_Beta->GetTensorInfo(),
299  baseLayer->m_Gamma->GetTensorInfo(),
300  baseLayer->GetParameters(),
301  &activationDesc);
302 
303  if (status)
304  {
305  BatchNormalizationLayer* replacementLayer =
306  FuseLayerWithParameters<BatchNormalizationLayer>(optimizationViews,
307  baseLayer,
308  activationLayer,
309  activationDesc,
310  name);
311 
312  replacementLayer->m_Beta = std::move(baseLayer->m_Beta);
313  replacementLayer->m_Gamma = std::move(baseLayer->m_Gamma);
314  replacementLayer->m_Mean = std::move(baseLayer->m_Mean);
315  replacementLayer->m_Variance = std::move(baseLayer->m_Variance);
316  untouched.erase(baseLayer->GetGuid());
317  untouched.erase(activationLayer->GetGuid());
318  }
319  }
320  else if (base.GetType() == LayerType::Addition)
321  {
322  AdditionLayer* baseLayer = PolymorphicDowncast<AdditionLayer*>(&base);
323 
325  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
326  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
327  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
328  &activationDesc);
329 
330  if (status)
331  {
332  FuseLayerWithoutParameters<AdditionLayer>(optimizationViews,
333  baseLayer,
334  activationLayer,
335  activationDesc,
336  name);
337  untouched.erase(baseLayer->GetGuid());
338  untouched.erase(activationLayer->GetGuid());
339  }
340  }
341  else if (base.GetType() == LayerType::Division)
342  {
343  DivisionLayer* baseLayer = PolymorphicDowncast<DivisionLayer*>(&base);
344 
346  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
347  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
348  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
349  &activationDesc);
350 
351  if (status)
352  {
353  FuseLayerWithoutParameters<DivisionLayer>(optimizationViews,
354  baseLayer,
355  activationLayer,
356  activationDesc,
357  name);
358  untouched.erase(baseLayer->GetGuid());
359  untouched.erase(activationLayer->GetGuid());
360  }
361  }
362  else if (base.GetType() == LayerType::Multiplication)
363  {
364  MultiplicationLayer* baseLayer = PolymorphicDowncast<MultiplicationLayer*>(&base);
365 
367  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
368  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
369  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
370  &activationDesc);
371 
372  if (status)
373  {
374  FuseLayerWithoutParameters<MultiplicationLayer>(optimizationViews,
375  baseLayer,
376  activationLayer,
377  activationDesc,
378  name);
379  untouched.erase(baseLayer->GetGuid());
380  untouched.erase(activationLayer->GetGuid());
381  }
382  }
383  else if (base.GetType() == LayerType::Subtraction)
384  {
385  SubtractionLayer* baseLayer = PolymorphicDowncast<SubtractionLayer*>(&base);
386 
388  baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
389  baseLayer->GetInputSlot(1).GetConnectedOutputSlot()->GetTensorInfo(),
390  activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(),
391  &activationDesc);
392 
393  if (status)
394  {
395  FuseLayerWithoutParameters<SubtractionLayer>(optimizationViews,
396  baseLayer,
397  activationLayer,
398  activationDesc,
399  name);
400  untouched.erase(baseLayer->GetGuid());
401  untouched.erase(activationLayer->GetGuid());
402  }
403  }
404  }
405  }
406  }
407  }
408  }
409  }
410 
411  if (optimizationViews.GetSubstitutions().empty())
412  {
413  optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
414  }
415  else
416  {
417  ReportUntouchedLayers(optimizationViews, untouched);
418  }
419 
420  return optimizationViews;
421 }
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:120
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:26
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()

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 96 of file ClBackend.cpp.

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

Referenced by ClBackend::GetId().

97 {
98  auto mgr = std::make_shared<ClMemoryManager>(std::make_unique<arm_compute::CLBufferAllocator>());
99 
100  registry.RegisterMemoryManager(mgr);
101  registry.RegisterFactory(std::make_unique<ClTensorHandleFactory>(mgr));
102 }

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