aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Charlin <teresa.charlinreyes@arm.com>2023-07-27 14:11:54 +0100
committerTeresaARM <teresa.charlinreyes@arm.com>2023-07-28 16:59:37 +0000
commita0cc6ff8065083b833dda9c3c5992938834bdf29 (patch)
treea5bacca27431c429ac982c44b0a698e6b20bfe03
parent65f9504e7381a28cda5f02c0e1bca65a1e2b90b2 (diff)
downloadarmnn-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.cpp70
-rw-r--r--shim/sl/canonical/Converter.hpp2
-rw-r--r--src/armnn/SerializeLayerParameters.cpp17
-rw-r--r--src/armnn/SerializeLayerParameters.hpp7
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);