ArmNN
 25.02
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TensorHandle.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include <armnn/Exceptions.hpp>
7 
9 
10 #include <cstring>
11 
12 namespace armnn
13 {
14 
16 {
17  TensorShape shape(tensorInfo.GetShape());
18  auto size = GetDataTypeSize(tensorInfo.GetDataType());
19  auto runningSize = size;
20  std::vector<unsigned int> strides(shape.GetNumDimensions());
21  auto lastIdx = shape.GetNumDimensions()-1;
22  for (unsigned int i=0; i < lastIdx ; i++)
23  {
24  strides[lastIdx-i] = runningSize;
25  runningSize *= shape[lastIdx-i];
26  }
27  strides[0] = runningSize;
28  return TensorShape(shape.GetNumDimensions(), strides.data());
29 }
30 
32 : m_TensorInfo(tensorInfo)
33 , m_Memory(nullptr)
34 {
35 }
36 
37 template <>
38 const void* ConstTensorHandle::GetConstTensor<void>() const
39 {
40  return m_Memory;
41 }
42 
44 : ConstTensorHandle(tensorInfo)
45 , m_MutableMemory(nullptr)
46 {
47 }
48 
49 template <>
50 void* TensorHandle::GetTensor<void>() const
51 {
52  return m_MutableMemory;
53 }
54 
56 : TensorHandle(tensorInfo)
57 {
58 }
59 
61 : ScopedTensorHandle(tensor.GetInfo())
62 {
63  CopyFrom(tensor.GetMemoryArea(), tensor.GetNumBytes());
64 }
65 
67 : ScopedTensorHandle(tensorHandle.GetTensorInfo())
68 {
69  CopyFrom(tensorHandle.GetConstTensor<void>(), tensorHandle.GetTensorInfo().GetNumBytes());
70 }
71 
73 : TensorHandle(other.GetTensorInfo())
74 {
75  CopyFrom(other);
76 }
77 
79 {
80  ::operator delete(GetTensor<void>());
81  SetMemory(nullptr);
82  CopyFrom(other);
83  return *this;
84 }
85 
87 {
88  ::operator delete(GetTensor<void>());
89 }
90 
92 {
93  if (GetTensor<void>() == nullptr)
94  {
95  SetMemory(::operator new(GetTensorInfo().GetNumBytes()));
96  }
97  else
98  {
99  throw InvalidArgumentException("TensorHandle::Allocate Trying to allocate a TensorHandle"
100  "that already has allocated memory.");
101  }
102 }
103 
104 void ScopedTensorHandle::CopyOutTo(void* memory) const
105 {
106  const void* src = GetTensor<void>();
107  if (src == nullptr)
108  {
109  throw NullPointerException("TensorHandle::CopyOutTo called with a null src pointer");
110  }
111  if (memory == nullptr)
112  {
113  throw NullPointerException("TensorHandle::CopyOutTo called with a null dest pointer");
114  }
115  memcpy(memory, src, GetTensorInfo().GetNumBytes());
116 }
117 
118 void ScopedTensorHandle::CopyInFrom(const void* memory)
119 {
120  void* dest = GetTensor<void>();
121  if (dest == nullptr)
122  {
123  throw NullPointerException("TensorHandle::CopyInFrom called with a null dest pointer");
124  }
125  if (memory == nullptr)
126  {
127  throw NullPointerException("TensorHandle::CopyInFrom called with a null src pointer");
128  }
129  memcpy(dest, memory, GetTensorInfo().GetNumBytes());
130 }
131 
132 void ScopedTensorHandle::CopyFrom(const ScopedTensorHandle& other)
133 {
134  CopyFrom(other.GetTensor<void>(), other.GetTensorInfo().GetNumBytes());
135 }
136 
137 void ScopedTensorHandle::CopyFrom(const void* srcMemory, unsigned int numBytes)
138 {
139  if (GetTensor<void>() != nullptr)
140  {
141  throw NullPointerException("TensorHandle::CopyFrom called on an already allocated TensorHandle");
142  }
143  if (GetTensorInfo().GetNumBytes() != numBytes)
144  {
145  std::stringstream msg;
146  msg << "TensorHandle:CopyFrom: Number of bytes in the tensor info (" << GetTensorInfo().GetNumBytes() <<
147  ") does not match the number of bytes being copied (" << numBytes << ")";
148  throw armnn::Exception(msg.str());
149  }
150 
151  if (srcMemory)
152  {
153  Allocate();
154  memcpy(GetTensor<void>(), srcMemory, numBytes);
155  }
156 }
157 
159 {
160  throw InvalidArgumentException("PassthroughTensorHandle::Allocate() should never be called");
161 }
162 
164 {
165  throw InvalidArgumentException("ConstPassthroughTensorHandle::Allocate() should never be called");
166 }
167 
168 } // namespace armnn
MemoryType GetMemoryArea() const
Definition: Tensor.hpp:307
unsigned int GetNumBytes() const
Definition: Tensor.hpp:304
virtual void Allocate() override
Indicate to the memory manager that this resource is no longer active.
ConstTensorHandle(const TensorInfo &tensorInfo)
const T * GetConstTensor() const
const TensorInfo & GetTensorInfo() const
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:330
Base class for all ArmNN exceptions so that users can filter to just those.
Definition: Exceptions.hpp:47
virtual void Allocate() override
Indicate to the memory manager that this resource is no longer active.
virtual void Allocate() override
Indicate to the memory manager that this resource is no longer active.
ScopedTensorHandle(const TensorInfo &tensorInfo)
ScopedTensorHandle & operator=(const ScopedTensorHandle &other)
void SetMemory(void *mem)
TensorHandle(const TensorInfo &tensorInfo)
const TensorShape & GetShape() const
Definition: Tensor.hpp:193
unsigned int GetNumBytes() const
Definition: Tensor.cpp:427
DataType GetDataType() const
Definition: Tensor.hpp:200
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
Definition: Tensor.cpp:174
Copyright (c) 2021 ARM Limited and Contributors.
TensorShape GetUnpaddedTensorStrides(const TensorInfo &tensorInfo)
constexpr unsigned int GetDataTypeSize(DataType dataType)
Definition: TypesUtils.hpp:183
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers