aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Charlin <teresa.charlinreyes@arm.com>2021-01-18 18:07:57 +0000
committerTeresaARM <teresa.charlinreyes@arm.com>2021-01-21 17:36:32 +0000
commitd672f5d4386dc0545d2e484ce85b76d53edb6bc9 (patch)
tree3c836d43cd8396aeb6d8ffee7dfe4ad4b21ed4fb
parent19a1c0347709506c5ad5c1b7f647a5af4a30fba0 (diff)
downloadarmnn-d672f5d4386dc0545d2e484ce85b76d53edb6bc9.tar.gz
IVGCVSW-5616 Don't fuse activation if quantization parameters are different
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com> Change-Id: I6504e922113aa9e397f53e570ebcf47e1f133945
-rw-r--r--src/backends/aclCommon/ArmComputeSubgraphUtils.hpp27
-rw-r--r--src/backends/cl/ClBackend.cpp3
-rw-r--r--src/backends/neon/NeonBackend.cpp3
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<Layer*>& 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<LayerGuid, Layer*> 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();