diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2023-07-27 14:11:54 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2023-07-28 16:59:37 +0000 |
commit | a0cc6ff8065083b833dda9c3c5992938834bdf29 (patch) | |
tree | a5bacca27431c429ac982c44b0a698e6b20bfe03 | |
parent | 65f9504e7381a28cda5f02c0e1bca65a1e2b90b2 (diff) | |
download | armnn-a0cc6ff8065083b833dda9c3c5992938834bdf29.tar.gz |
IVGCVSW-7924 Add TILE to Support Library (SL)
* Add serialize parameters so that the multiples appear in the dot file
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: Id02ed709c97b866dabefed655b06bdb1b20c9026
-rw-r--r-- | shim/sl/canonical/Converter.cpp | 70 | ||||
-rw-r--r-- | shim/sl/canonical/Converter.hpp | 2 | ||||
-rw-r--r-- | src/armnn/SerializeLayerParameters.cpp | 17 | ||||
-rw-r--r-- | src/armnn/SerializeLayerParameters.hpp | 7 |
4 files changed, 95 insertions, 1 deletions
diff --git a/shim/sl/canonical/Converter.cpp b/shim/sl/canonical/Converter.cpp index 5b8c450733..8200050391 100644 --- a/shim/sl/canonical/Converter.cpp +++ b/shim/sl/canonical/Converter.cpp @@ -170,6 +170,8 @@ bool Converter::ConvertOperation(const Operation& operation, const Model& model, return ConvertStridedSlice(operation, model, data); case OperationType::SUB: return ConvertElementwiseBinary(operation, model, data, BinaryOperation::Sub); + case OperationType::TILE: + return ConvertTile(operation, model, data); case OperationType::TRANSPOSE: return ConvertTranspose(operation, model, data); case OperationType::TRANSPOSE_CONV_2D: @@ -5135,6 +5137,74 @@ bool Converter::ConvertTanH(const Operation& operation, const Model& model, Conv return ConvertToActivation(operation, __func__, desc, model, data); } +bool Converter::ConvertTile(const Operation& operation, const Model& model, ConversionData& data) +{ + VLOG(DRIVER) << "Converter::ConvertTile()"; + + LayerInputHandle input = ConvertToLayerInputHandle(operation, 0, model, data); + if (!input.IsValid()) + { + return Fail("%s: Operation has invalid inputs", __func__); + } + const armnn::TensorInfo& inputInfo = input.GetTensorInfo(); + + const Operand* outputOperand = GetOutputOperand(operation, 0, model); + if (!outputOperand) + { + return Fail("%s: Operation has no outputs", __func__); + } + const TensorInfo& outputInfo = GetTensorInfoForOperand(*outputOperand); + + const Operand* multiplesOperand = GetInputOperand(operation, 1, model); + if (!multiplesOperand) + { + return Fail("%s: Could not read input 1", __func__); + } + std::vector<int32_t> multiples; + if (!GetTensorInt32Values(*multiplesOperand, multiples, model, data)) + { + return Fail("%s: Input 1 has invalid values", __func__); + } + + TileDescriptor descriptor; + descriptor.m_Multiples.assign(multiples.begin(), multiples.end()); + + bool isSupported = false; + armnn::BackendId setBackend; + auto validateFunc = [&](const armnn::TensorInfo& outputInfo, bool& isSupported) + { + FORWARD_LAYER_SUPPORT_FUNC(__func__, + IsTileSupported, + data.m_Backends, + isSupported, + setBackend, + inputInfo, + outputInfo, + descriptor); + }; + + if(IsDynamicTensor(outputInfo)) + { + isSupported = AreDynamicTensorsSupported(); + } + else + { + validateFunc(outputInfo, isSupported); + } + + if (!isSupported) + { + return false; + } + + IConnectableLayer* const layer = data.m_Network->AddTileLayer(descriptor); + layer->SetBackendId(setBackend); + assert(layer != nullptr); + input.Connect(layer->GetInputSlot(0)); + + return SetupAndTrackLayerOutputSlot(operation, 0, *layer, model, data, nullptr, validateFunc); +} + bool Converter::ConvertTransposeConv2d(const Operation& operation, const Model& model, ConversionData& data) { VLOG(DRIVER) << "Converter::ConvertTransposeConv2d()"; diff --git a/shim/sl/canonical/Converter.hpp b/shim/sl/canonical/Converter.hpp index d19498d2d4..143dd022e0 100644 --- a/shim/sl/canonical/Converter.hpp +++ b/shim/sl/canonical/Converter.hpp @@ -153,6 +153,8 @@ private: static bool ConvertTanH(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertTile(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertTranspose(const Operation& operation, const Model& model, ConversionData& data); static bool ConvertTransposeConv2d(const Operation& operation, const Model& model, ConversionData& data); diff --git a/src/armnn/SerializeLayerParameters.cpp b/src/armnn/SerializeLayerParameters.cpp index 67520a72d6..1445c70a70 100644 --- a/src/armnn/SerializeLayerParameters.cpp +++ b/src/armnn/SerializeLayerParameters.cpp @@ -558,6 +558,23 @@ void StringifyLayerParameters<StridedSliceDescriptor>::Serialize(ParameterString fn("DataLayout", GetDataLayoutName(desc.m_DataLayout)); } +void StringifyLayerParameters<TileDescriptor>::Serialize(ParameterStringifyFunction& fn, + const TileDescriptor& desc) +{ + std::stringstream ss; + int count = 0; + for (auto&& var : desc.m_Multiples) + { + if (count > 0) + { + ss << ","; + } + ss << var; + ++count; + } + fn("Multiples", ss.str()); +} + void StringifyLayerParameters<TransposeConvolution2dDescriptor>::Serialize( ParameterStringifyFunction& fn, const TransposeConvolution2dDescriptor& desc) diff --git a/src/armnn/SerializeLayerParameters.hpp b/src/armnn/SerializeLayerParameters.hpp index b90f9d85e8..5b0378eab7 100644 --- a/src/armnn/SerializeLayerParameters.hpp +++ b/src/armnn/SerializeLayerParameters.hpp @@ -1,5 +1,5 @@ // -// Copyright © 2017,2022 Arm Ltd. All rights reserved. +// Copyright © 2017,2022-2023 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once @@ -189,6 +189,11 @@ template <> struct StringifyLayerParameters<SoftmaxDescriptor> static void Serialize(ParameterStringifyFunction& fn, const SoftmaxDescriptor& desc); }; +template <> struct StringifyLayerParameters<TileDescriptor> +{ + static void Serialize(ParameterStringifyFunction& fn, const TileDescriptor& desc); +}; + template <> struct StringifyLayerParameters<TransposeConvolution2dDescriptor> { static void Serialize(ParameterStringifyFunction& fn, const TransposeConvolution2dDescriptor& desc); |