From 09e2f27a9da7a65eb409f3dbdfc029eb3afbb003 Mon Sep 17 00:00:00 2001 From: David Beck Date: Tue, 30 Oct 2018 11:38:41 +0000 Subject: IVGCVSW-1949 : Refactor ITensorHandle and move backend specifics to their place Change-Id: I48242425c6a6856e13ebcee1b140cbd2af94a3aa --- src/backends/backendsCommon/CpuTensorHandle.cpp | 10 ++ src/backends/backendsCommon/CpuTensorHandle.hpp | 13 +- src/backends/backendsCommon/ITensorHandle.hpp | 17 +-- .../backendsCommon/test/TensorCopyUtils.cpp | 150 +-------------------- .../backendsCommon/test/TensorCopyUtils.hpp | 4 +- src/backends/cl/ClTensorHandle.hpp | 114 +++++++++++++++- src/backends/cl/ClWorkloadFactory.cpp | 2 - src/backends/neon/NeonTensorHandle.hpp | 87 +++++++++++- src/backends/neon/NeonWorkloadFactory.cpp | 2 - 9 files changed, 221 insertions(+), 178 deletions(-) diff --git a/src/backends/backendsCommon/CpuTensorHandle.cpp b/src/backends/backendsCommon/CpuTensorHandle.cpp index 46a7cb8251..fe0c634e7c 100644 --- a/src/backends/backendsCommon/CpuTensorHandle.cpp +++ b/src/backends/backendsCommon/CpuTensorHandle.cpp @@ -84,6 +84,16 @@ void ScopedCpuTensorHandle::Allocate() } } +void ScopedCpuTensorHandle::CopyOutTo(void* memory) const +{ + memcpy(memory, GetTensor(), GetTensorInfo().GetNumBytes()); +} + +void ScopedCpuTensorHandle::CopyInFrom(const void* memory) +{ + memcpy(GetTensor(), memory, GetTensorInfo().GetNumBytes()); +} + void ScopedCpuTensorHandle::CopyFrom(const ScopedCpuTensorHandle& other) { CopyFrom(other.GetTensor(), other.GetTensorInfo().GetNumBytes()); diff --git a/src/backends/backendsCommon/CpuTensorHandle.hpp b/src/backends/backendsCommon/CpuTensorHandle.hpp index 4138812822..ae13d6c439 100644 --- a/src/backends/backendsCommon/CpuTensorHandle.hpp +++ b/src/backends/backendsCommon/CpuTensorHandle.hpp @@ -31,11 +31,6 @@ public: return m_TensorInfo; } - virtual ITensorHandle::Type GetType() const override - { - return ITensorHandle::Cpu; - } - virtual void Manage() override {} virtual ITensorHandle* GetParent() const override { return nullptr; } @@ -66,6 +61,10 @@ protected: void SetConstMemory(const void* mem) { m_Memory = mem; } private: + // Only used for testing + void CopyOutTo(void *) const override {} + void CopyInFrom(const void*) override {} + ConstCpuTensorHandle(const ConstCpuTensorHandle& other) = delete; ConstCpuTensorHandle& operator=(const ConstCpuTensorHandle& other) = delete; @@ -119,6 +118,10 @@ public: virtual void Allocate() override; private: + // Only used for testing + void CopyOutTo(void* memory) const override; + void CopyInFrom(const void* memory) override; + void CopyFrom(const ScopedCpuTensorHandle& other); void CopyFrom(const void* srcMemory, unsigned int numBytes); }; diff --git a/src/backends/backendsCommon/ITensorHandle.hpp b/src/backends/backendsCommon/ITensorHandle.hpp index 02f4ed6e5a..176b021d76 100644 --- a/src/backends/backendsCommon/ITensorHandle.hpp +++ b/src/backends/backendsCommon/ITensorHandle.hpp @@ -12,13 +12,6 @@ class TensorShape; class ITensorHandle { public: - enum Type - { - Cpu, - CL, - Neon - }; - virtual ~ITensorHandle(){} /// Indicate to the memory manager that this resource is active. @@ -29,10 +22,6 @@ public: /// This is used to compute overlapping lifetimes of resources. virtual void Allocate() = 0; - /// Get the type backend associated with the tensor handle. - /// \return Type enum - virtual ITensorHandle::Type GetType() const = 0; - /// Get the parent tensor if this is a subtensor. /// \return a pointer to the parent tensor. Otherwise nullptr if not a subtensor. virtual ITensorHandle* GetParent() const = 0; @@ -64,10 +53,14 @@ public: /// \return a TensorShape filled with the strides for each dimension virtual TensorShape GetStrides() const = 0; - /// Get the number of elements for each dimension orderd from slowest iterating dimension + /// Get the number of elements for each dimension ordered from slowest iterating dimension /// to fastest iterating dimension. /// \return a TensorShape filled with the number of elements for each dimension. virtual TensorShape GetShape() const = 0; + + // Testing support to be able to verify and set tensor data content + virtual void CopyOutTo(void* memory) const = 0; + virtual void CopyInFrom(const void* memory) = 0; }; } diff --git a/src/backends/backendsCommon/test/TensorCopyUtils.cpp b/src/backends/backendsCommon/test/TensorCopyUtils.cpp index acc28c9c03..ba7208cc40 100644 --- a/src/backends/backendsCommon/test/TensorCopyUtils.cpp +++ b/src/backends/backendsCommon/test/TensorCopyUtils.cpp @@ -4,158 +4,20 @@ // #include "TensorCopyUtils.hpp" - #include -#ifdef ARMCOMPUTECL_ENABLED -#include -#endif - -#if ARMCOMPUTENEON_ENABLED -#include -#endif - -#if ARMCOMPUTECLENABLED || ARMCOMPUTENEON_ENABLED -#include -#endif - -#include - -#include - -#include -#include - -void CopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem) +void CopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* memory) { - switch (tensorHandle->GetType()) - { - case armnn::ITensorHandle::Cpu: - { - auto handle = boost::polymorphic_downcast(tensorHandle); - memcpy(handle->GetTensor(), mem, handle->GetTensorInfo().GetNumBytes()); - break; - } -#ifdef ARMCOMPUTECL_ENABLED - case armnn::ITensorHandle::CL: - { - using armnn::armcomputetensorutils::CopyArmComputeITensorData; - auto handle = boost::polymorphic_downcast(tensorHandle); - handle->Map(true); - switch(handle->GetDataType()) - { - case arm_compute::DataType::F32: - CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); - break; - case arm_compute::DataType::QASYMM8: - CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); - break; - case arm_compute::DataType::F16: - CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); - break; - default: - { - throw armnn::UnimplementedException(); - } - } - handle->Unmap(); - break; - } -#endif -#if ARMCOMPUTENEON_ENABLED - case armnn::ITensorHandle::Neon: - { - using armnn::armcomputetensorutils::CopyArmComputeITensorData; - auto handle = boost::polymorphic_downcast(tensorHandle); - switch (handle->GetDataType()) - { - case arm_compute::DataType::F32: - CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); - break; - case arm_compute::DataType::QASYMM8: - CopyArmComputeITensorData(static_cast(mem), handle->GetTensor()); - break; - default: - { - throw armnn::UnimplementedException(); - } - } - break; - } -#endif - default: - { - throw armnn::UnimplementedException(); - } - } + tensorHandle->CopyInFrom(memory); } -void CopyDataFromITensorHandle(void* mem, const armnn::ITensorHandle* tensorHandle) +void CopyDataFromITensorHandle(void* memory, const armnn::ITensorHandle* tensorHandle) { - switch (tensorHandle->GetType()) - { - case armnn::ITensorHandle::Cpu: - { - auto handle = boost::polymorphic_downcast(tensorHandle); - memcpy(mem, handle->GetTensor(), handle->GetTensorInfo().GetNumBytes()); - break; - } -#ifdef ARMCOMPUTECL_ENABLED - case armnn::ITensorHandle::CL: - { - using armnn::armcomputetensorutils::CopyArmComputeITensorData; - auto handle = boost::polymorphic_downcast(tensorHandle); - const_cast(handle)->Map(true); - switch(handle->GetDataType()) - { - case arm_compute::DataType::F32: - CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); - break; - case arm_compute::DataType::QASYMM8: - CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); - break; - case arm_compute::DataType::F16: - CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); - break; - default: - { - throw armnn::UnimplementedException(); - } - } - const_cast(handle)->Unmap(); - break; - } -#endif -#if ARMCOMPUTENEON_ENABLED - case armnn::ITensorHandle::Neon: - { - using armnn::armcomputetensorutils::CopyArmComputeITensorData; - auto handle = boost::polymorphic_downcast(tensorHandle); - switch (handle->GetDataType()) - { - case arm_compute::DataType::F32: - CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); - break; - case arm_compute::DataType::QASYMM8: - CopyArmComputeITensorData(handle->GetTensor(), static_cast(mem)); - break; - default: - { - throw armnn::UnimplementedException(); - } - } - break; - } -#endif - default: - { - throw armnn::UnimplementedException(); - } - } + tensorHandle->CopyOutTo(memory); } -void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem) +void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* memory) { tensorHandle->Allocate(); - CopyDataToITensorHandle(tensorHandle, mem); + CopyDataToITensorHandle(tensorHandle, memory); } diff --git a/src/backends/backendsCommon/test/TensorCopyUtils.hpp b/src/backends/backendsCommon/test/TensorCopyUtils.hpp index 2187523edb..36f6369c0f 100644 --- a/src/backends/backendsCommon/test/TensorCopyUtils.hpp +++ b/src/backends/backendsCommon/test/TensorCopyUtils.hpp @@ -8,8 +8,8 @@ #include -void CopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem); +void CopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* memory); void CopyDataFromITensorHandle(void* mem, const armnn::ITensorHandle* tensorHandle); -void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* mem); \ No newline at end of file +void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle* tensorHandle, const void* memory); \ No newline at end of file diff --git a/src/backends/cl/ClTensorHandle.hpp b/src/backends/cl/ClTensorHandle.hpp index 0f1f583bbe..f791ee8fc9 100644 --- a/src/backends/cl/ClTensorHandle.hpp +++ b/src/backends/cl/ClTensorHandle.hpp @@ -7,6 +7,8 @@ #include #include +#include + #include #include #include @@ -59,8 +61,6 @@ public: } virtual void Unmap() const override { const_cast(&m_Tensor)->unmap(); } - virtual ITensorHandle::Type GetType() const override { return ITensorHandle::CL; } - virtual ITensorHandle* GetParent() const override { return nullptr; } virtual arm_compute::DataType GetDataType() const override @@ -82,7 +82,60 @@ public: { return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape()); } + private: + // Only used for testing + void CopyOutTo(void* memory) const override + { + const_cast(this)->Map(true); + switch(this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::F16: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + const_cast(this)->Unmap(); + } + + // Only used for testing + void CopyInFrom(const void* memory) override + { + this->Map(true); + switch(this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::F16: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + this->Unmap(); + } + arm_compute::CLTensor m_Tensor; std::shared_ptr m_MemoryGroup; }; @@ -111,8 +164,6 @@ public: } virtual void Unmap() const override { const_cast(&m_Tensor)->unmap(); } - virtual ITensorHandle::Type GetType() const override { return ITensorHandle::CL; } - virtual ITensorHandle* GetParent() const override { return parentHandle; } virtual arm_compute::DataType GetDataType() const override @@ -133,9 +184,60 @@ public: } private: + // Only used for testing + void CopyOutTo(void* memory) const override + { + const_cast(this)->Map(true); + switch(this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::F16: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + const_cast(this)->Unmap(); + } + + // Only used for testing + void CopyInFrom(const void* memory) override + { + this->Map(true); + switch(this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::F16: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + this->Unmap(); + } + mutable arm_compute::CLSubTensor m_Tensor; ITensorHandle* parentHandle = nullptr; - }; -} +} // namespace armnn \ No newline at end of file diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index e205cf1746..43c147fb38 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -110,8 +110,6 @@ std::unique_ptr ClWorkloadFactory::CreateSubTensorHandle(ITensorH TensorShape const& subTensorShape, unsigned int const* subTensorOrigin) const { - BOOST_ASSERT(parent.GetType() == ITensorHandle::CL); - arm_compute::Coordinates coords; arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape); diff --git a/src/backends/neon/NeonTensorHandle.hpp b/src/backends/neon/NeonTensorHandle.hpp index 63e2a781d6..7206b6fc5a 100644 --- a/src/backends/neon/NeonTensorHandle.hpp +++ b/src/backends/neon/NeonTensorHandle.hpp @@ -55,8 +55,6 @@ public: 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 @@ -87,6 +85,46 @@ public: } private: + // Only used for testing + void CopyOutTo(void* memory) const override + { + switch (this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + } + + // Only used for testing + void CopyInFrom(const void* memory) override + { + switch (this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + } + arm_compute::Tensor m_Tensor; std::shared_ptr m_MemoryGroup; }; @@ -108,8 +146,6 @@ public: 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 @@ -134,9 +170,50 @@ public: { return armcomputetensorutils::GetShape(m_Tensor.info()->tensor_shape()); } + private: + // Only used for testing + void CopyOutTo(void* memory) const override + { + switch (this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + } + + // Only used for testing + void CopyInFrom(const void* memory) override + { + switch (this->GetDataType()) + { + case arm_compute::DataType::F32: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + case arm_compute::DataType::QASYMM8: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; + default: + { + throw armnn::UnimplementedException(); + } + } + } + arm_compute::SubTensor m_Tensor; ITensorHandle* parentHandle = nullptr; }; -} +} // namespace armnn \ No newline at end of file diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index fc3890684d..604686771e 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -54,8 +54,6 @@ std::unique_ptr NeonWorkloadFactory::CreateSubTensorHandle(ITenso TensorShape const& subTensorShape, unsigned int const* subTensorOrigin) const { - BOOST_ASSERT(parent.GetType() == ITensorHandle::Neon); - const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape); arm_compute::Coordinates coords; -- cgit v1.2.1