From d672f5d4386dc0545d2e484ce85b76d53edb6bc9 Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Mon, 18 Jan 2021 18:07:57 +0000 Subject: IVGCVSW-5616 Don't fuse activation if quantization parameters are different Signed-off-by: Teresa Charlin Change-Id: I6504e922113aa9e397f53e570ebcf47e1f133945 --- src/backends/aclCommon/ArmComputeSubgraphUtils.hpp | 27 ++++++++++++++++++++++ src/backends/cl/ClBackend.cpp | 3 ++- src/backends/neon/NeonBackend.cpp | 3 ++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp b/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp index 860d88df80..a0fca46330 100644 --- a/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp +++ b/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp @@ -45,6 +45,33 @@ SubgraphView::OutputSlots CreateOutputsFrom(const std::vector& layers) return result; } +bool checkDataTypeInputandOutput(const Layer& layer) +{ + auto inputInfo = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + auto outputInfo = layer.GetOutputSlot(0).GetTensorInfo(); + bool sameDataType = (inputInfo.GetDataType() == outputInfo.GetDataType()); + + // Check is same quantization info (same scale and offset) + if (sameDataType) + { + if (IsQuantizedType(inputInfo.GetDataType())) + { + bool sameScale = (inputInfo.GetQuantizationScale() == outputInfo.GetQuantizationScale()); + bool sameOffset = (inputInfo.GetQuantizationOffset() == outputInfo.GetQuantizationOffset()); + + return (sameScale && sameOffset); + } + else + { + return true; + } + } + else + { + return false; + } +} + } // namespace inline void ReportUntouchedLayers(OptimizationViews& optimizationViews, std::map untouched) diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp index 80c7969e91..928760ef5f 100644 --- a/src/backends/cl/ClBackend.cpp +++ b/src/backends/cl/ClBackend.cpp @@ -187,7 +187,8 @@ OptimizationViews ClBackend::OptimizeSubgraphView(const SubgraphView& subgraph, { for (auto&& childInput : output->GetConnections()) { - if (childInput->GetOwningLayer().GetType() == LayerType::Activation) + if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) && + (checkDataTypeInputandOutput(childInput->GetOwningLayer()))) { Layer& child = childInput->GetOwningLayer(); diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp index 240456f44b..d48b32bb45 100644 --- a/src/backends/neon/NeonBackend.cpp +++ b/src/backends/neon/NeonBackend.cpp @@ -163,7 +163,8 @@ OptimizationViews NeonBackend::OptimizeSubgraphView(const SubgraphView& subgraph { for (auto&& childInput : output->GetConnections()) { - if (childInput->GetOwningLayer().GetType() == LayerType::Activation) + if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) && + (checkDataTypeInputandOutput(childInput->GetOwningLayer()))) { Layer& child = childInput->GetOwningLayer(); -- cgit v1.2.1