ArmNN
 20.08
ClTensorHandleFactory.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 
8 #include "ClTensorHandle.hpp"
9 
11 
12 #include <arm_compute/runtime/CL/CLTensor.h>
13 #include <arm_compute/core/Coordinates.h>
14 #include <arm_compute/runtime/CL/CLSubTensor.h>
15 
16 
17 namespace armnn
18 {
19 
21 
22 std::unique_ptr<ITensorHandle> ClTensorHandleFactory::CreateSubTensorHandle(ITensorHandle& parent,
23  const TensorShape& subTensorShape,
24  const unsigned int* subTensorOrigin) const
25 {
27  arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
28 
29  coords.set_num_dimensions(subTensorShape.GetNumDimensions());
30  for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); ++i)
31  {
32  // Arm compute indexes tensor coords in reverse order.
33  unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
34  coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
35  }
36 
37  const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(
38  parent.GetShape());
39 
40  // In order for ACL to support subtensors the concat axis cannot be on x or y and the values of x and y
41  // must match the parent shapes
42  if (coords.x() != 0 || coords.y() != 0)
43  {
44  return nullptr;
45  }
46  if ((parentShape.x() != shape.x()) || (parentShape.y() != shape.y()))
47  {
48  return nullptr;
49  }
50 
51  if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape))
52  {
53  return nullptr;
54  }
55 
56  return std::make_unique<ClSubTensorHandle>(
57  PolymorphicDowncast<IClTensorHandle *>(&parent), shape, coords);
58 }
59 
60 std::unique_ptr<ITensorHandle> ClTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
61 {
62  return ClTensorHandleFactory::CreateTensorHandle(tensorInfo, true);
63 }
64 
65 std::unique_ptr<ITensorHandle> ClTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
66  DataLayout dataLayout) const
67 {
68  return ClTensorHandleFactory::CreateTensorHandle(tensorInfo, dataLayout, true);
69 }
70 
71 std::unique_ptr<ITensorHandle> ClTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
72  const bool IsMemoryManaged) const
73 {
74  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
75  if (IsMemoryManaged)
76  {
77  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
78  }
79  return tensorHandle;
80 }
81 
82 std::unique_ptr<ITensorHandle> ClTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
83  DataLayout dataLayout,
84  const bool IsMemoryManaged) const
85 {
86  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
87  if (IsMemoryManaged)
88  {
89  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
90  }
91  return tensorHandle;
92 }
93 
95 {
96  static const FactoryId s_Id(ClTensorHandleFactoryId());
97  return s_Id;
98 }
99 
101 {
102  return GetIdStatic();
103 }
104 
106 {
107  return true;
108 }
109 
111 {
112  return m_ExportFlags;
113 }
114 
116 {
117  return m_ImportFlags;
118 }
119 
120 } // namespace armnn
static const FactoryId & GetIdStatic()
bool SupportsSubTensors() const override
DataLayout
Definition: Types.hpp:49
MemorySourceFlags GetImportFlags() const override
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
unsigned int MemorySourceFlags
Copyright (c) 2020 ARM Limited.
std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, const TensorShape &subTensorShape, const unsigned int *subTensorOrigin) const override
MemorySourceFlags GetExportFlags() const override
constexpr const char * ClTensorHandleFactoryId()
ITensorHandleFactory::FactoryId FactoryId
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const override
virtual TensorShape GetShape() const =0
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
Definition: Tensor.cpp:175
const FactoryId & GetId() const override