From a0cc6ff8065083b833dda9c3c5992938834bdf29 Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Thu, 27 Jul 2023 14:11:54 +0100 Subject: 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 Change-Id: Id02ed709c97b866dabefed655b06bdb1b20c9026 --- shim/sl/canonical/Converter.cpp | 70 ++++++++++++++++++++++++++++++++++ shim/sl/canonical/Converter.hpp | 2 + src/armnn/SerializeLayerParameters.cpp | 17 +++++++++ src/armnn/SerializeLayerParameters.hpp | 7 +++- 4 files changed, 95 insertions(+), 1 deletion(-) 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 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::Serialize(ParameterString fn("DataLayout", GetDataLayoutName(desc.m_DataLayout)); } +void StringifyLayerParameters::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::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 static void Serialize(ParameterStringifyFunction& fn, const SoftmaxDescriptor& desc); }; +template <> struct StringifyLayerParameters +{ + static void Serialize(ParameterStringifyFunction& fn, const TileDescriptor& desc); +}; + template <> struct StringifyLayerParameters { static void Serialize(ParameterStringifyFunction& fn, const TransposeConvolution2dDescriptor& desc); -- cgit v1.2.1