diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2023-07-13 17:16:45 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2023-07-25 09:54:47 +0000 |
commit | 79a06a59bafadf736ca53c4240e87f9bbb657260 (patch) | |
tree | b94b2063766b40b79bed8cb81f571ea05cfa9efb /src/armnn/layers | |
parent | a638f101bcb51008932f922fe0a5cef28633bc66 (diff) | |
download | armnn-79a06a59bafadf736ca53c4240e87f9bbb657260.tar.gz |
IVGCVSW-7883 Front end and reference implementation for TILE
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Signed-off-by: Cian McGriskin <cian.mcgriskin@arm.com>
Change-Id: I0afb2403fee11c5c1e58ea65e2525e99594d8f2d
Diffstat (limited to 'src/armnn/layers')
-rw-r--r-- | src/armnn/layers/TileLayer.cpp | 71 | ||||
-rw-r--r-- | src/armnn/layers/TileLayer.hpp | 45 |
2 files changed, 116 insertions, 0 deletions
diff --git a/src/armnn/layers/TileLayer.cpp b/src/armnn/layers/TileLayer.cpp new file mode 100644 index 0000000000..3c313905fe --- /dev/null +++ b/src/armnn/layers/TileLayer.cpp @@ -0,0 +1,71 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "TileLayer.hpp" + +#include <armnn/backends/WorkloadFactory.hpp> +#include "layers/LayerCloneBase.hpp" + +namespace armnn +{ +TileLayer::TileLayer(const TileDescriptor ¶m, const char *name) + : LayerWithParameters(1, 1, LayerType::Tile, param, name) +{} + +std::unique_ptr<IWorkload> TileLayer::CreateWorkload(const IWorkloadFactory &factory) const +{ + TileQueueDescriptor descriptor; + SetAdditionalInfo(descriptor); + + return factory.CreateWorkload(LayerType::Tile, descriptor, PrepInfoAndDesc(descriptor)); +} + +TileLayer* TileLayer::Clone(armnn::Graph &graph) const +{ + auto layer = CloneBase<TileLayer>(graph, m_Param, GetName()); + + return std::move(layer); +} + +std::vector<TensorShape> TileLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const +{ + ARMNN_ASSERT(inputShapes.size() == 1); + const TensorShape& inputShape = inputShapes[0]; + const std::vector<uint32_t> multipleShape = m_Param.m_Multiples; + + std::vector<unsigned int> dimSizes; + + // Check input shape and multiples have same length and multiply them together to get output shape + if(inputShape.GetNumDimensions() == multipleShape.size()) + { + for(uint32_t i = 0; i < inputShape.GetNumDimensions(); ++i) + { + dimSizes.insert(dimSizes.begin(), inputShape[i] * multipleShape[i]); + } + } + else + { + throw LayerValidationException("TileLayer: input rank and length of multiples are different."); + } + + return std::vector<TensorShape>({TensorShape({inputShape.GetNumElements(), dimSizes.data()})}); +} + +void TileLayer::ValidateTensorShapesFromInputs() +{ + VerifyLayerConnections(1, CHECK_LOCATION()); + + const TensorShape& outputShape = GetOutputSlot(0).GetTensorInfo().GetShape(); + + VerifyShapeInferenceType(outputShape, m_ShapeInferenceMethod); + + auto inferredShapes = InferOutputShapes({ GetInputSlot(0).GetTensorInfo().GetShape() }); + + ARMNN_ASSERT(inferredShapes.size() == 1); + + ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "TileLayer"); +} + +}
\ No newline at end of file diff --git a/src/armnn/layers/TileLayer.hpp b/src/armnn/layers/TileLayer.hpp new file mode 100644 index 0000000000..632cdb426b --- /dev/null +++ b/src/armnn/layers/TileLayer.hpp @@ -0,0 +1,45 @@ +// +// Copyright © 2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "LayerWithParameters.hpp" + +namespace armnn +{ + +class TileLayer : public LayerWithParameters<TileDescriptor> +{ +public: + /// Makes a workload for the Tile type. + /// @param [in] graph The graph where this layer can be found. + /// @param [in] factory The workload factory which will create the workload. + /// @return A pointer to the created workload, or nullptr if not created. + virtual std::unique_ptr<IWorkload> CreateWorkload(const IWorkloadFactory& factory) const override; + + /// Creates a dynamically-allocated copy of this layer. + /// @param [in] graph The graph into which this layer is being cloned. + TileLayer* Clone(Graph& graph) const override; + + /// Infers the output shapes from given input shapes and layer properties. + /// @param [in] inputShapes The input shapes layer has. + /// @return A vector to the inferred output shape. + std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override; + + /// Check if the input tensor tile(s) + /// will lead to a valid configuration of @ref TileLayer. + /// @param [in] shapeInferenceMethod Indicates if output tile shall be overwritten or just validated. + void ValidateTensorShapesFromInputs() override; + +protected: + /// Constructor to create a TileLayer. + /// @param [in] name Optional name for the layer. + TileLayer(const TileDescriptor& param, const char* name); + + /// Default destructor. + ~TileLayer() = default; +}; + +} // namespace armnn |