From c577f2c6a3b4ddb6ba87a882723c53a248afbeba Mon Sep 17 00:00:00 2001 From: telsoa01 Date: Fri, 31 Aug 2018 09:22:23 +0100 Subject: Release 18.08 --- src/armnn/backends/NeonTensorHandle.hpp | 73 +++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 8 deletions(-) (limited to 'src/armnn/backends/NeonTensorHandle.hpp') diff --git a/src/armnn/backends/NeonTensorHandle.hpp b/src/armnn/backends/NeonTensorHandle.hpp index 684a5e1bfc..3818d2c9b2 100644 --- a/src/armnn/backends/NeonTensorHandle.hpp +++ b/src/armnn/backends/NeonTensorHandle.hpp @@ -7,11 +7,14 @@ #include "OutputHandler.hpp" #include "ArmComputeTensorUtils.hpp" +#include +#include #include #include #include #include +#include namespace armnn { @@ -22,6 +25,7 @@ public: virtual arm_compute::ITensor& GetTensor() = 0; virtual arm_compute::ITensor const& GetTensor() const = 0; virtual arm_compute::DataType GetDataType() const = 0; + virtual void SetMemoryGroup(const std::shared_ptr& memoryGroup) = 0; }; class NeonTensorHandle : public INeonTensorHandle @@ -34,47 +38,100 @@ public: arm_compute::ITensor& GetTensor() override { return m_Tensor; } arm_compute::ITensor const& GetTensor() const override { return m_Tensor; } + virtual void Allocate() override { armnn::armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_Tensor); }; + virtual void Manage() override + { + BOOST_ASSERT(m_MemoryGroup != nullptr); + m_MemoryGroup->manage(&m_Tensor); + } + virtual ITensorHandle::Type GetType() const override { return ITensorHandle::Neon; } + virtual ITensorHandle* GetParent() const override { return nullptr; } + virtual arm_compute::DataType GetDataType() const override { return m_Tensor.info()->data_type(); } + virtual void SetMemoryGroup(const std::shared_ptr& memoryGroup) override + { + m_MemoryGroup = boost::polymorphic_pointer_downcast(memoryGroup); + } + + virtual const void* Map(bool /* blocking = true */) const override + { + return static_cast(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes()); + } + virtual void Unmap() const override {} + + + TensorShape GetStrides() const override + { + return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes()); + } + + TensorShape GetShape() const override + { + return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape()); + } + private: arm_compute::Tensor m_Tensor; + std::shared_ptr m_MemoryGroup; }; class NeonSubTensorHandle : public INeonTensorHandle { public: - NeonSubTensorHandle(arm_compute::ITensor& parent, - const arm_compute::TensorShape& shape, - const arm_compute::Coordinates& coords) - : m_Tensor(&parent, shape, coords) + NeonSubTensorHandle(INeonTensorHandle* parent, + const arm_compute::TensorShape& shape, + const arm_compute::Coordinates& coords) + : m_Tensor(&parent->GetTensor(), shape, coords) { + parentHandle = parent; } arm_compute::ITensor& GetTensor() override { return m_Tensor; } arm_compute::ITensor const& GetTensor() const override { return m_Tensor; } - virtual void Allocate() override - { - }; + + virtual void Allocate() override {} + virtual void Manage() override {} virtual ITensorHandle::Type GetType() const override { return ITensorHandle::Neon; } + virtual ITensorHandle* GetParent() const override { return parentHandle; } + virtual arm_compute::DataType GetDataType() const override { return m_Tensor.info()->data_type(); } + virtual void SetMemoryGroup(const std::shared_ptr&) override {} + + virtual const void* Map(bool /* blocking = true */) const override + { + return static_cast(m_Tensor.buffer() + m_Tensor.info()->offset_first_element_in_bytes()); + } + virtual void Unmap() const override {} + + TensorShape GetStrides() const override + { + return armcomputetensorutils::GetStrides(m_Tensor.info()->strides_in_bytes()); + } + + TensorShape GetShape() const override + { + return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape()); + } private: - arm_compute::SubTensor m_Tensor; + arm_compute::SubTensor m_Tensor; + ITensorHandle* parentHandle = nullptr; }; } -- cgit v1.2.1