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), m_Imported(false)
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);
146 if (!m_Imported && !m_Tensor.buffer())
150 m_Tensor.allocator()->import_memory(cl::Buffer(static_cast<cl_mem>(memory)));
151 m_Imported = bool(status);
160 else if (!m_Imported && m_Tensor.buffer())
163 "ClImportTensorHandle::Import Attempting to import on an already allocated tensor");
171 m_Tensor.allocator()->import_memory(cl::Buffer(static_cast<cl_mem>(memory)));
172 m_Imported = bool(status);
196 bool ClImport(
const cl_import_properties_arm* importProperties,
void* memory,
bool isProtected =
false)
198 size_t totalBytes = m_Tensor.info()->total_size();
201 auto cachelineAlignment =
202 arm_compute::CLKernelLibrary::get().get_device().getInfo<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE>();
203 auto roundedSize = cachelineAlignment + totalBytes - (totalBytes % cachelineAlignment);
205 cl_int
error = CL_SUCCESS;
209 buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().
get(),
210 CL_MEM_HOST_NO_ACCESS, importProperties, memory, roundedSize, &error);
214 buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().
get(),
215 CL_MEM_READ_WRITE, importProperties, memory, roundedSize, &error);
218 if (error != CL_SUCCESS)
220 throw MemoryImportException(
"ClImportTensorHandle::Invalid imported memory" + std::to_string(error));
223 cl::Buffer wrappedBuffer(buffer);
228 bool imported = (status.error_code() == arm_compute::ErrorCode::OK);
238 void CopyOutTo(
void* memory)
const override 243 case arm_compute::DataType::F32:
244 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
245 static_cast<float*>(memory));
247 case arm_compute::DataType::U8:
248 case arm_compute::DataType::QASYMM8:
249 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
250 static_cast<uint8_t*>(memory));
252 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
253 case arm_compute::DataType::QASYMM8_SIGNED:
254 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
255 static_cast<int8_t*>(memory));
257 case arm_compute::DataType::F16:
258 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
259 static_cast<armnn::Half*>(memory));
261 case arm_compute::DataType::S16:
262 case arm_compute::DataType::QSYMM16:
263 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
264 static_cast<int16_t*>(memory));
266 case arm_compute::DataType::S32:
267 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
268 static_cast<int32_t*>(memory));
284 case arm_compute::DataType::F32:
285 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
288 case arm_compute::DataType::U8:
289 case arm_compute::DataType::QASYMM8:
290 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
293 case arm_compute::DataType::F16:
294 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
297 case arm_compute::DataType::S16:
298 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
299 case arm_compute::DataType::QASYMM8_SIGNED:
300 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
303 case arm_compute::DataType::QSYMM16:
304 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
307 case arm_compute::DataType::S32:
308 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
319 arm_compute::CLTensor m_Tensor;
328 const arm_compute::TensorShape& shape,
330 : m_Tensor(&parent->
GetTensor(), shape, coords)
332 parentHandle = parent;
335 arm_compute::CLSubTensor&
GetTensor()
override {
return m_Tensor; }
336 arm_compute::CLSubTensor
const&
GetTensor()
const override {
return m_Tensor; }
341 virtual const void*
Map(
bool blocking =
true)
const override 344 return static_cast<const void*
>(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes());
346 virtual void Unmap()
const override {}
352 return m_Tensor.info()->data_type();
355 virtual void SetMemoryGroup(
const std::shared_ptr<arm_compute::IMemoryGroup>& memoryGroup)
override 362 return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes());
367 return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape());
372 void CopyOutTo(
void* memory)
const override 377 case arm_compute::DataType::F32:
378 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
379 static_cast<float*>(memory));
381 case arm_compute::DataType::U8:
382 case arm_compute::DataType::QASYMM8:
383 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
384 static_cast<uint8_t*>(memory));
386 case arm_compute::DataType::F16:
387 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
388 static_cast<armnn::Half*>(memory));
390 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
391 case arm_compute::DataType::QASYMM8_SIGNED:
392 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
393 static_cast<int8_t*>(memory));
395 case arm_compute::DataType::S16:
396 case arm_compute::DataType::QSYMM16:
397 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
398 static_cast<int16_t*>(memory));
400 case arm_compute::DataType::S32:
401 armcomputetensorutils::CopyArmComputeITensorData(this->
GetTensor(),
402 static_cast<int32_t*>(memory));
418 case arm_compute::DataType::F32:
419 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const float*>(memory),
422 case arm_compute::DataType::U8:
423 case arm_compute::DataType::QASYMM8:
424 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory),
427 case arm_compute::DataType::F16:
428 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const armnn::Half*>(memory),
431 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
432 case arm_compute::DataType::QASYMM8_SIGNED:
433 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory),
436 case arm_compute::DataType::S16:
437 case arm_compute::DataType::QSYMM16:
438 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int16_t*>(memory),
441 case arm_compute::DataType::S32:
442 armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int32_t*>(memory),
453 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.