15 #include <arm_compute/runtime/CL/CLTensor.h> 16 #include <arm_compute/runtime/CL/CLSubTensor.h> 17 #include <arm_compute/runtime/IMemoryGroup.h> 18 #include <arm_compute/runtime/MemoryGroup.h> 19 #include <arm_compute/core/TensorShape.h> 20 #include <arm_compute/core/Coordinates.h> 22 #include <include/CL/cl_ext.h> 23 #include <arm_compute/core/CL/CLKernelLibrary.h> 31 virtual arm_compute::ICLTensor&
GetTensor() = 0;
32 virtual arm_compute::ICLTensor
const&
GetTensor()
const = 0;
34 virtual void SetMemoryGroup(
const std::shared_ptr<arm_compute::IMemoryGroup>& memoryGroup) = 0;
41 : m_ImportFlags(importFlags)
43 armnn::armcomputetensorutils::BuildArmComputeTensor(m_Tensor, tensorInfo);
49 : m_ImportFlags(importFlags)
51 armnn::armcomputetensorutils::BuildArmComputeTensor(m_Tensor, tensorInfo, dataLayout);
54 arm_compute::CLTensor&
GetTensor()
override {
return m_Tensor; }
55 arm_compute::CLTensor
const&
GetTensor()
const override {
return m_Tensor; }
59 virtual const void*
Map(
bool blocking =
true)
const override 62 return static_cast<const void*
>(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes());
65 virtual void Unmap()
const override {}
71 return m_Tensor.info()->data_type();
74 virtual void SetMemoryGroup(
const std::shared_ptr<arm_compute::IMemoryGroup>& memoryGroup)
override 81 return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes());
86 return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape());
91 m_ImportFlags = importFlags;
101 if (m_ImportFlags & static_cast<MemorySourceFlags>(source))
105 const cl_import_properties_arm importProperties[] =
108 CL_IMPORT_TYPE_HOST_ARM,
112 return ClImport(importProperties, memory);
116 const cl_import_properties_arm importProperties[] =
119 CL_IMPORT_TYPE_DMA_BUF_ARM,
123 return ClImport(importProperties, memory);
139 bool ClImport(
const cl_import_properties_arm* importProperties,
void* memory)
141 const size_t totalBytes = m_Tensor.info()->total_size();
142 cl_int
error = CL_SUCCESS;
143 cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().
get(),
144 CL_MEM_READ_WRITE, importProperties, memory, totalBytes, &error);
145 if (error != CL_SUCCESS)
150 cl::Buffer wrappedBuffer(buffer);
155 bool imported = (status.error_code() == arm_compute::ErrorCode::OK);
165 void CopyOutTo(
void* memory)
const override 170 case arm_compute::DataType::F32:
171 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
172 static_cast<float*>(memory));
174 case arm_compute::DataType::U8:
175 case arm_compute::DataType::QASYMM8:
176 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
177 static_cast<uint8_t*>(memory));
179 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
180 case arm_compute::DataType::QASYMM8_SIGNED:
181 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
182 static_cast<int8_t*>(memory));
184 case arm_compute::DataType::F16:
185 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
186 static_cast<armnn::Half*>(memory));
188 case arm_compute::DataType::S16:
189 case arm_compute::DataType::QSYMM16:
190 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
191 static_cast<int16_t*>(memory));
193 case arm_compute::DataType::S32:
194 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
195 static_cast<int32_t*>(memory));
211 case arm_compute::DataType::F32:
212 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
215 case arm_compute::DataType::U8:
216 case arm_compute::DataType::QASYMM8:
217 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
220 case arm_compute::DataType::F16:
221 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
224 case arm_compute::DataType::S16:
225 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
226 case arm_compute::DataType::QASYMM8_SIGNED:
227 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
230 case arm_compute::DataType::QSYMM16:
231 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
234 case arm_compute::DataType::S32:
235 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
246 arm_compute::CLTensor m_Tensor;
254 const arm_compute::TensorShape& shape,
256 : m_Tensor(&parent->
GetTensor(), shape, coords)
258 parentHandle = parent;
261 arm_compute::CLSubTensor&
GetTensor()
override {
return m_Tensor; }
262 arm_compute::CLSubTensor
const&
GetTensor()
const override {
return m_Tensor; }
267 virtual const void*
Map(
bool blocking =
true)
const override 270 return static_cast<const void*
>(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes());
272 virtual void Unmap()
const override {}
278 return m_Tensor.info()->data_type();
281 virtual void SetMemoryGroup(
const std::shared_ptr<arm_compute::IMemoryGroup>& memoryGroup)
override 288 return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes());
293 return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape());
298 void CopyOutTo(
void* memory)
const override 303 case arm_compute::DataType::F32:
304 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
305 static_cast<float*>(memory));
307 case arm_compute::DataType::U8:
308 case arm_compute::DataType::QASYMM8:
309 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
310 static_cast<uint8_t*>(memory));
312 case arm_compute::DataType::F16:
313 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
314 static_cast<armnn::Half*>(memory));
316 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
317 case arm_compute::DataType::QASYMM8_SIGNED:
318 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
319 static_cast<int8_t*>(memory));
321 case arm_compute::DataType::S16:
322 case arm_compute::DataType::QSYMM16:
323 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
324 static_cast<int16_t*>(memory));
326 case arm_compute::DataType::S32:
327 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
328 static_cast<int32_t*>(memory));
344 case arm_compute::DataType::F32:
345 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
348 case arm_compute::DataType::U8:
349 case arm_compute::DataType::QASYMM8:
350 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
353 case arm_compute::DataType::F16:
354 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
357 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
358 case arm_compute::DataType::QASYMM8_SIGNED:
359 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
362 case arm_compute::DataType::S16:
363 case arm_compute::DataType::QSYMM16:
364 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
367 case arm_compute::DataType::S32:
368 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
379 mutable arm_compute::CLSubTensor m_Tensor;
ClImportTensorHandle(const TensorInfo &tensorInfo, MemorySourceFlags importFlags)
ClImportTensorHandle(const TensorInfo &tensorInfo, DataLayout dataLayout, MemorySourceFlags importFlags)
virtual const void * Map(bool blocking=true) const override
Map the tensor data for access.
arm_compute::CLTensor const & GetTensor() const override
virtual void SetMemoryGroup(const std::shared_ptr< arm_compute::IMemoryGroup > &memoryGroup) override
virtual arm_compute::DataType GetDataType() const override
virtual ITensorHandle * GetParent() const override
Get the parent tensor if this is a subtensor.
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
virtual void Manage() override
Indicate to the memory manager that this resource is active.
virtual void SetMemoryGroup(const std::shared_ptr< arm_compute::IMemoryGroup > &memoryGroup)=0
virtual void Unmap() const override
Unmap the tensor data.
arm_compute::CLTensor & GetTensor() override
unsigned int MemorySourceFlags
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
virtual void Manage() override
Indicate to the memory manager that this resource is active.
virtual void SetMemoryGroup(const std::shared_ptr< arm_compute::IMemoryGroup > &memoryGroup) override
virtual void Allocate() override
Indicate to the memory manager that this resource is no longer active.
void SetImportFlags(MemorySourceFlags importFlags)
MemorySourceFlags GetImportFlags() const override
Get flags describing supported import sources.
virtual arm_compute::DataType GetDataType() const =0
virtual const void * Map(bool blocking=true) const override
Map the tensor data for access.
TensorShape GetShape() const override
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
virtual bool Import(void *memory, MemorySource source) override
Import externally allocated memory.
#define ARMNN_ASSERT(COND)
TensorShape GetShape() const override
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
virtual void CopyOutTo(void *memory) const =0
Testing support to be able to verify and set tensor data content.
TensorShape GetStrides() const override
Get the strides for each dimension ordered from largest to smallest where the smallest value is the s...
virtual const void * Map(bool blocking=true) const =0
Map the tensor data for access.
virtual void Unmap() const =0
Unmap the tensor data.
MemorySource
Define the Memory Source to reduce copies.
TensorShape GetStrides() const override
Get the strides for each dimension ordered from largest to smallest where the smallest value is the s...
virtual void CopyInFrom(const void *memory)=0
virtual ITensorHandle * GetParent() const override
Get the parent tensor if this is a subtensor.
virtual arm_compute::ICLTensor & GetTensor()=0
ClImportSubTensorHandle(IClImportTensorHandle *parent, const arm_compute::TensorShape &shape, const arm_compute::Coordinates &coords)
arm_compute::CLSubTensor & GetTensor() override
arm_compute::CLSubTensor const & GetTensor() const override
virtual void Unmap() const override
Unmap the tensor data.
virtual arm_compute::DataType GetDataType() const override
virtual void Allocate() override
Indicate to the memory manager that this resource is no longer active.