diff options
author | Narumol Prangnawarat <narumol.prangnawarat@arm.com> | 2019-08-14 12:25:50 +0100 |
---|---|---|
committer | Narumol Prangnawarat <narumol.prangnawarat@arm.com> | 2019-08-14 14:38:24 +0000 |
commit | 4e3e818e1ea73544f3aec4e2ac2621a1c3380b54 (patch) | |
tree | 7a4cbdc3d95a1a2743194b7fdc61b81989f3ce2c /src/backends/neon/NeonTensorHandleFactory.cpp | |
parent | 4992c344c888774da0e5cffd4b607828bf46b74f (diff) | |
download | armnn-4e3e818e1ea73544f3aec4e2ac2621a1c3380b54.tar.gz |
IVGCVSW-3622 Add Neon TensorHandleFactory
Signed-off-by: James Conroy <james.conroy@arm.com>
Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: I9f24f7d97c1e7d37ee7d58ff85c6c3f8496e52ec
Diffstat (limited to 'src/backends/neon/NeonTensorHandleFactory.cpp')
-rw-r--r-- | src/backends/neon/NeonTensorHandleFactory.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/backends/neon/NeonTensorHandleFactory.cpp b/src/backends/neon/NeonTensorHandleFactory.cpp new file mode 100644 index 0000000000..ef342347d3 --- /dev/null +++ b/src/backends/neon/NeonTensorHandleFactory.cpp @@ -0,0 +1,79 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonTensorHandleFactory.hpp" +#include "NeonTensorHandle.hpp" + +#include <boost/core/ignore_unused.hpp> + +namespace armnn +{ + +using FactoryId = std::string; + +std::unique_ptr<ITensorHandle> NeonTensorHandleFactory::CreateSubTensorHandle(ITensorHandle& parent, + TensorShape const& subTensorShape, + unsigned int const* subTensorOrigin) + const +{ + const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape); + + arm_compute::Coordinates coords; + coords.set_num_dimensions(subTensorShape.GetNumDimensions()); + for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++) + { + // Arm compute indexes tensor coords in reverse order. + unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1; + coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex])); + } + + const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(parent.GetShape()); + if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape)) + { + return nullptr; + } + + return std::make_unique<NeonSubTensorHandle>( + boost::polymorphic_downcast<IAclTensorHandle*>(&parent), shape, coords); +} + +std::unique_ptr<ITensorHandle> NeonTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const +{ + auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo); + tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup()); + + return tensorHandle; +} + +std::unique_ptr<ITensorHandle> NeonTensorHandleFactory::CreateTensorHandle(const TensorInfo& tensorInfo, + DataLayout dataLayout) const +{ + auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo, dataLayout); + tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup()); + + return tensorHandle; +} + +const FactoryId NeonTensorHandleFactory::GetId() const +{ + return m_Id; +} + +bool NeonTensorHandleFactory::SupportsSubTensors() const +{ + return true; +} + +MemorySourceFlags NeonTensorHandleFactory::GetExportFlags() const +{ + return m_ExportFlags; +} + +MemorySourceFlags NeonTensorHandleFactory::GetImportFlags() const +{ + return m_ImportFlags; +} + +} // namespace armnn
\ No newline at end of file |