diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2023-07-24 23:42:10 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2023-07-25 15:53:40 +0000 |
commit | 7f0ff16bf698e34f208622cf2c043c1f34be6be8 (patch) | |
tree | 0299df226be91211befd417a6ba67843276fd681 | |
parent | 5862bc4beca7cc14636c3fbf46e0ada1778beab0 (diff) | |
download | android-nn-driver-7f0ff16bf698e34f208622cf2c043c1f34be6be8.tar.gz |
IVGCVSW-7888 Add Tile convert function
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: Ic9479be6b3e6cf0e529c685c9b28c642e9dd00d5
-rw-r--r-- | 1.2/HalPolicy.cpp | 8 | ||||
-rw-r--r-- | 1.2/HalPolicy.hpp | 2 | ||||
-rw-r--r-- | 1.3/HalPolicy.cpp | 8 | ||||
-rw-r--r-- | 1.3/HalPolicy.hpp | 2 | ||||
-rw-r--r-- | ConversionUtils_1_2.hpp | 78 |
5 files changed, 98 insertions, 0 deletions
diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index 4e53c744..39616c55 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -185,6 +185,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertTransposeConv2d(operation, model, data); case V1_2::OperationType::TANH: return ConvertTanH(operation, model, data); + case V1_2::OperationType::TILE: + return ConvertTile(operation, model, data); case V1_2::OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM: return ConvertUnidirectionalSequenceLstm(operation, model, data); default: @@ -498,6 +500,12 @@ bool HalPolicy::ConvertTransposeConv2d(const Operation& operation, const Model& return ::ConvertTransposeConv2d<hal_1_2::HalPolicy>(operation, model, data); } +bool HalPolicy::ConvertTile(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertTile()"); + return ::ConvertTile<hal_1_2::HalPolicy>(operation, model, data); +} + bool HalPolicy::ConvertUnidirectionalSequenceLstm(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertUnidirectionalSequenceLstm()"); diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp index 4121ec9c..796f4de8 100644 --- a/1.2/HalPolicy.hpp +++ b/1.2/HalPolicy.hpp @@ -153,6 +153,8 @@ private: static bool ConvertTransposeConv2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertTile(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertUnidirectionalSequenceLstm(const Operation& operation, const Model& model, ConversionData& data); diff --git a/1.3/HalPolicy.cpp b/1.3/HalPolicy.cpp index aaf0813c..2c8ef065 100644 --- a/1.3/HalPolicy.cpp +++ b/1.3/HalPolicy.cpp @@ -173,6 +173,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertTransposeConv2d(operation, model, data); case V1_3::OperationType::TANH: return ConvertTanH(operation, model, data); + case V1_3::OperationType::TILE: + return ConvertTile(operation, model, data); case V1_3::OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM: return ConvertUnidirectionalSequenceLstm(operation, model, data); default: @@ -501,6 +503,12 @@ bool HalPolicy::ConvertTransposeConv2d(const Operation& operation, const Model& return ::ConvertTransposeConv2d<hal_1_3::HalPolicy>(operation, model, data); } +bool HalPolicy::ConvertTile(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_3::HalPolicy::ConvertTile()"); + return ::ConvertTile<hal_1_3::HalPolicy>(operation, model, data); +} + bool HalPolicy::ConvertSqrt(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_3::HalPolicy::ConvertSqrt()"); diff --git a/1.3/HalPolicy.hpp b/1.3/HalPolicy.hpp index 63e5ee7c..b0bc09b4 100644 --- a/1.3/HalPolicy.hpp +++ b/1.3/HalPolicy.hpp @@ -165,6 +165,8 @@ private: static bool ConvertTransposeConv2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertTile(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertUnidirectionalSequenceLstm(const Operation& operation, const Model& model, ConversionData& data); diff --git a/ConversionUtils_1_2.hpp b/ConversionUtils_1_2.hpp index 2ad14c2f..5b38b075 100644 --- a/ConversionUtils_1_2.hpp +++ b/ConversionUtils_1_2.hpp @@ -2888,6 +2888,84 @@ bool ConvertLstm(const HalOperation& operation, const HalModel& model, Conversio template<typename HalPolicy, typename HalOperation = typename HalPolicy::Operation, typename HalModel = typename HalPolicy::Model> +bool ConvertTile(const HalOperation& operation, const HalModel& model, ConversionData& data) +{ + using HalOperand = typename HalPolicy::Operand; + + LayerInputHandle input = ConvertToLayerInputHandle<HalPolicy>(operation, 0, model, data); + + if (!input.IsValid()) + { + return Fail("%s: Operation has invalid inputs", __func__); + } + + const HalOperand* output = GetOutputOperand<HalPolicy>(operation, 0, model); + + if (!output) + { + return Fail("%s: Could not read output", __func__); + } + + const HalOperand* multiplesOperand = GetInputOperand<HalPolicy>(operation, 1, model); + if (!multiplesOperand) + { + return Fail("%s: Could not read input 1", __func__); + } + std::vector<int32_t> multiples; + if (!GetTensorInt32Values<HalPolicy>(*multiplesOperand, multiples, model, data)) + { + return Fail("%s: Input 1 has invalid values", __func__); + } + // Convert the multiples from int to unsigned int, + // as values are always going to be positive despite the data type being integer. + TileDescriptor descriptor; + descriptor.m_Multiples.assign(multiples.begin(), multiples.end()); + + const TensorInfo& inputInfo = input.GetTensorInfo(); + const TensorInfo& outputInfo = GetTensorInfoForOperand(*output); + + 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* tileLayer = data.m_Network->AddTileLayer(descriptor); + if (!tileLayer) + { + return Fail("%s: AddTileLayer failed", __func__); + } + tileLayer->SetBackendId(setBackend); + + input.Connect(tileLayer->GetInputSlot(0)); + + return SetupAndTrackLayerOutputSlot<HalPolicy>(operation, 0, *tileLayer, model, data, nullptr, validateFunc); +} + +template<typename HalPolicy, + typename HalOperation = typename HalPolicy::Operation, + typename HalModel = typename HalPolicy::Model> bool ConvertTransposeConv2d(const HalOperation& operation, const HalModel& model, ConversionData& data) { using HalOperand = typename HalPolicy::Operand; |