From 92b5fd1b1f16fafa59d1757fe2c464e60181a55e Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Mon, 26 Apr 2021 09:52:06 +0100 Subject: IVGCVSW-5416 'Add android-nn-driver support for CAST' !armnn:5494 Signed-off-by: Sadik Armagan Change-Id: Ie99d58f7421c2634c23d2a68d1acaaac651963a4 --- 1.2/HalPolicy.cpp | 8 +++++++ 1.2/HalPolicy.hpp | 2 ++ 1.3/HalPolicy.cpp | 8 +++++++ 1.3/HalPolicy.hpp | 2 ++ ConversionUtils_1_2.hpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ NnapiSupport.txt | 1 + 6 files changed, 81 insertions(+) diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index e96c4cb0..77511311 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -33,6 +33,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertAveragePool2d(operation, model, data); case V1_2::OperationType::BATCH_TO_SPACE_ND: return ConvertBatchToSpaceNd(operation, model, data); + case V1_2::OperationType::CAST: + return ConvertCast(operation, model, data); case V1_2::OperationType::CONCATENATION: return ConvertConcatenation(operation, model, data); case V1_2::OperationType::CONV_2D: @@ -178,6 +180,12 @@ bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& m return ::ConvertBatchToSpaceNd(operation, model, data); } +bool HalPolicy::ConvertCast(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertCast()"); + return ::ConvertCast(operation, model, data); +} + bool HalPolicy::ConvertComparison(const Operation& operation, const Model& model, ConversionData& data, diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp index abd60e72..a348abe0 100644 --- a/1.2/HalPolicy.hpp +++ b/1.2/HalPolicy.hpp @@ -46,6 +46,8 @@ private: static bool ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertCast(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertComparison(const Operation& operation, const Model& model, ConversionData& data, diff --git a/1.3/HalPolicy.cpp b/1.3/HalPolicy.cpp index d58ac6c6..bf80c81e 100644 --- a/1.3/HalPolicy.cpp +++ b/1.3/HalPolicy.cpp @@ -33,6 +33,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertAveragePool2d(operation, model, data); case V1_3::OperationType::BATCH_TO_SPACE_ND: return ConvertBatchToSpaceNd(operation, model, data); + case V1_3::OperationType::CAST: + return ConvertCast(operation, model, data); case V1_3::OperationType::CONCATENATION: return ConvertConcatenation(operation, model, data); case V1_3::OperationType::CONV_2D: @@ -194,6 +196,12 @@ bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& m return ::ConvertBatchToSpaceNd(operation, model, data); } +bool HalPolicy::ConvertCast(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_3::HalPolicy::ConvertCast()"); + return ::ConvertCast(operation, model, data); +} + bool HalPolicy::ConvertComparison(const Operation& operation, const Model& model, ConversionData& data, diff --git a/1.3/HalPolicy.hpp b/1.3/HalPolicy.hpp index 6dfb8856..cf1d3665 100644 --- a/1.3/HalPolicy.hpp +++ b/1.3/HalPolicy.hpp @@ -47,6 +47,8 @@ private: static bool ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertCast(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertComparison(const Operation& operation, const Model& model, ConversionData& data, diff --git a/ConversionUtils_1_2.hpp b/ConversionUtils_1_2.hpp index cddb13d7..eec87bf5 100644 --- a/ConversionUtils_1_2.hpp +++ b/ConversionUtils_1_2.hpp @@ -109,6 +109,66 @@ bool SetupAndTrackLayerOutputSlotAndOverrideTensorInfo(const HalOperation& opera return true; } +template +bool ConvertCast(const HalOperation& operation, + const HalModel& model, + ConversionData& data) +{ + using HalOperand = typename HalPolicy::Operand; + + ALOGV("HalPolicy::ConvertCast()"); + + LayerInputHandle input = ConvertToLayerInputHandle(operation, 0, model, data); + + if (!input.IsValid()) + { + return Fail("%s: Operation has invalid inputs", __func__); + } + + const HalOperand* output = GetOutputOperand(operation, 0, model); + if (!output) + { + return Fail("%s: Could not read output 0", __func__); + } + + const TensorInfo& inputInfo = input.GetTensorInfo(); + const TensorInfo& outputInfo = GetTensorInfoForOperand(*output); + + bool isSupported = false; + + auto validateFunc = [&](const armnn::TensorInfo& outputInfo, bool& isSupported) + { + FORWARD_LAYER_SUPPORT_FUNC(__func__, + IsCastSupported, + data.m_Backends, + isSupported, + inputInfo, + outputInfo); + }; + + if(!IsDynamicTensor(outputInfo)) + { + validateFunc(outputInfo, isSupported); + } + else + { + isSupported = AreDynamicTensorsSupported(); + } + + if (!isSupported) + { + return false; + } + + IConnectableLayer* layer = data.m_Network->AddCastLayer(); + assert(layer != nullptr); + input.Connect(layer->GetInputSlot(0)); + + return SetupAndTrackLayerOutputSlot(operation, 0, *layer, model, data, nullptr, validateFunc); +} + template diff --git a/NnapiSupport.txt b/NnapiSupport.txt index e0400e1f..9fdb6171 100644 --- a/NnapiSupport.txt +++ b/NnapiSupport.txt @@ -20,6 +20,7 @@ ARGMAX (FLOAT32, INT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) ARGMIN (FLOAT32, INT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) AVERAGE_POOL_2D (FLOAT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) BATCH_TO_SPACE_ND (FLOAT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) +CAST (FLOAT32, FLOAT16, INT32, QUANT8_ASYMM) CONCATENATION (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) CONV_2D (FLOAT32, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) DEPTH_TO_SPACE (FLOAT32, FLOAT16, QUANT8_ASYMM, QUANT8_ASYMM_SIGNED) -- cgit v1.2.1