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 /shim | |
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
Diffstat (limited to 'shim')
-rw-r--r-- | shim/sl/canonical/Converter.cpp | 70 | ||||
-rw-r--r-- | shim/sl/canonical/Converter.hpp | 2 |
2 files changed, 72 insertions, 0 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); |