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 <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,
120 CL_IMPORT_DMA_BUF_DATA_CONSISTENCY_WITH_HOST_ARM,
125 return ClImport(importProperties, memory);
130 const cl_import_properties_arm importProperties[] =
133 CL_IMPORT_TYPE_DMA_BUF_ARM,
134 CL_IMPORT_TYPE_PROTECTED_ARM,
139 return ClImport(importProperties, memory,
true);
154 bool ClImport(
const cl_import_properties_arm* importProperties,
void* memory,
bool isProtected =
false)
156 size_t totalBytes = m_Tensor.info()->total_size();
159 auto cachelineAlignment =
160 arm_compute::CLKernelLibrary::get().get_device().getInfo<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE>();
161 auto roundedSize = cachelineAlignment + totalBytes - (totalBytes % cachelineAlignment);
163 cl_int
error = CL_SUCCESS;
167 buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().
get(),
168 CL_MEM_HOST_NO_ACCESS, importProperties, memory, roundedSize, &error);
172 buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().
get(),
173 CL_MEM_READ_WRITE, importProperties, memory, roundedSize, &error);
176 if (error != CL_SUCCESS)
178 throw MemoryImportException(
"ClImportTensorHandle::Invalid imported memory" + std::to_string(error));
181 cl::Buffer wrappedBuffer(buffer);
186 bool imported = (status.error_code() == arm_compute::ErrorCode::OK);
196 void CopyOutTo(
void* memory)
const override 201 case arm_compute::DataType::F32:
202 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
203 static_cast<float*>(memory));
205 case arm_compute::DataType::U8:
206 case arm_compute::DataType::QASYMM8:
207 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
208 static_cast<uint8_t*>(memory));
210 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
211 case arm_compute::DataType::QASYMM8_SIGNED:
212 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
213 static_cast<int8_t*>(memory));
215 case arm_compute::DataType::F16:
216 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
217 static_cast<armnn::Half*>(memory));
219 case arm_compute::DataType::S16:
220 case arm_compute::DataType::QSYMM16:
221 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
222 static_cast<int16_t*>(memory));
224 case arm_compute::DataType::S32:
225 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
226 static_cast<int32_t*>(memory));
242 case arm_compute::DataType::F32:
243 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
246 case arm_compute::DataType::U8:
247 case arm_compute::DataType::QASYMM8:
248 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
251 case arm_compute::DataType::F16:
252 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
255 case arm_compute::DataType::S16:
256 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
257 case arm_compute::DataType::QASYMM8_SIGNED:
258 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
261 case arm_compute::DataType::QSYMM16:
262 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
265 case arm_compute::DataType::S32:
266 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
277 arm_compute::CLTensor m_Tensor;
285 const arm_compute::TensorShape& shape,
287 : m_Tensor(&parent->
GetTensor(), shape, coords)
289 parentHandle = parent;
292 arm_compute::CLSubTensor&
GetTensor()
override {
return m_Tensor; }
293 arm_compute::CLSubTensor
const&
GetTensor()
const override {
return m_Tensor; }
298 virtual const void*
Map(
bool blocking =
true)
const override 301 return static_cast<const void*
>(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes());
303 virtual void Unmap()
const override {}
309 return m_Tensor.info()->data_type();
312 virtual void SetMemoryGroup(
const std::shared_ptr<arm_compute::IMemoryGroup>& memoryGroup)
override 319 return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes());
324 return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape());
329 void CopyOutTo(
void* memory)
const override 334 case arm_compute::DataType::F32:
335 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
336 static_cast<float*>(memory));
338 case arm_compute::DataType::U8:
339 case arm_compute::DataType::QASYMM8:
340 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
341 static_cast<uint8_t*>(memory));
343 case arm_compute::DataType::F16:
344 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
345 static_cast<armnn::Half*>(memory));
347 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
348 case arm_compute::DataType::QASYMM8_SIGNED:
349 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
350 static_cast<int8_t*>(memory));
352 case arm_compute::DataType::S16:
353 case arm_compute::DataType::QSYMM16:
354 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
355 static_cast<int16_t*>(memory));
357 case arm_compute::DataType::S32:
358 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
359 static_cast<int32_t*>(memory));
375 case arm_compute::DataType::F32:
376 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
379 case arm_compute::DataType::U8:
380 case arm_compute::DataType::QASYMM8:
381 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
384 case arm_compute::DataType::F16:
385 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
388 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
389 case arm_compute::DataType::QASYMM8_SIGNED:
390 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
393 case arm_compute::DataType::S16:
394 case arm_compute::DataType::QSYMM16:
395 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
398 case arm_compute::DataType::S32:
399 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
410 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.