From 2099595bac339c953bf4291be12703c8845e916e Mon Sep 17 00:00:00 2001 From: FrancisMurtagh Date: Mon, 17 Dec 2018 12:11:36 +0000 Subject: IVGCVSW-2398 Add no-op factory implementations for all backends for the Equal operation * Add QueueDescriptor in WorkloadData.hpp * Add CreateEqual function in WorkloadFactory.hpp * Added stub implementation of the CreateEqual function in RefWorkloadFactory, NeonWorkloadFactory and ClWorkloadFactory Change-Id: Iec6dc2f989c67fa6f0c32cfb93508995c8580783 --- src/armnn/InternalTypes.cpp | 1 + src/armnn/InternalTypes.hpp | 1 + src/armnn/LayerSupport.cpp | 10 +++++++ src/armnn/LayersFwd.hpp | 2 ++ src/armnn/Network.cpp | 5 ++++ src/armnn/Network.hpp | 2 ++ src/armnn/layers/EqualLayer.cpp | 34 ++++++++++++++++++++++ src/armnn/layers/EqualLayer.hpp | 26 +++++++++++++++++ src/backends/backendsCommon/ILayerSupport.cpp | 8 +++++ src/backends/backendsCommon/WorkloadData.hpp | 6 ++++ src/backends/backendsCommon/WorkloadFactory.cpp | 11 +++++++ src/backends/backendsCommon/WorkloadFactory.hpp | 3 ++ .../test/IsLayerSupportedTestImpl.hpp | 2 ++ src/backends/cl/ClWorkloadFactory.cpp | 6 ++++ src/backends/cl/ClWorkloadFactory.hpp | 3 ++ src/backends/neon/NeonWorkloadFactory.cpp | 6 ++++ src/backends/neon/NeonWorkloadFactory.hpp | 3 ++ src/backends/reference/RefWorkloadFactory.cpp | 6 ++++ src/backends/reference/RefWorkloadFactory.hpp | 3 ++ 19 files changed, 138 insertions(+) create mode 100644 src/armnn/layers/EqualLayer.cpp create mode 100644 src/armnn/layers/EqualLayer.hpp (limited to 'src') diff --git a/src/armnn/InternalTypes.cpp b/src/armnn/InternalTypes.cpp index 845ba9ec0c..fe806f1ccb 100644 --- a/src/armnn/InternalTypes.cpp +++ b/src/armnn/InternalTypes.cpp @@ -25,6 +25,7 @@ char const* GetLayerTypeAsCString(LayerType type) case LayerType::Debug: return "Debug"; case LayerType::DepthwiseConvolution2d: return "DepthwiseConvolution2d"; case LayerType::Division: return "Division"; + case LayerType::Equal: return "Equal"; case LayerType::FakeQuantization: return "FakeQuantization"; case LayerType::Floor: return "Floor"; case LayerType::FullyConnected: return "FullyConnected"; diff --git a/src/armnn/InternalTypes.hpp b/src/armnn/InternalTypes.hpp index 27a1359f68..c6b5c04665 100644 --- a/src/armnn/InternalTypes.hpp +++ b/src/armnn/InternalTypes.hpp @@ -25,6 +25,7 @@ enum class LayerType Debug, DepthwiseConvolution2d, Division, + Equal, FakeQuantization, Floor, FullyConnected, diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp index d1161b63b1..3c864c5ae7 100644 --- a/src/armnn/LayerSupport.cpp +++ b/src/armnn/LayerSupport.cpp @@ -455,4 +455,14 @@ bool IsGreaterSupported(const BackendId& backend, FORWARD_LAYER_SUPPORT_FUNC(backend, IsGreaterSupported, input0, input1, output); } +bool IsEqualSupported(const BackendId& backend, + const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output, + char* reasonIfUnsupported, + size_t reasonIfUnsupportedMaxLength) +{ + FORWARD_LAYER_SUPPORT_FUNC(backend, IsEqualSupported, input0, input1, output); +} + } diff --git a/src/armnn/LayersFwd.hpp b/src/armnn/LayersFwd.hpp index 39b0b20b21..c9a12a6643 100644 --- a/src/armnn/LayersFwd.hpp +++ b/src/armnn/LayersFwd.hpp @@ -17,6 +17,7 @@ #include "layers/DebugLayer.hpp" #include "layers/DepthwiseConvolution2dLayer.hpp" #include "layers/DivisionLayer.hpp" +#include "layers/EqualLayer.hpp" #include "layers/FakeQuantizationLayer.hpp" #include "layers/FloorLayer.hpp" #include "layers/FullyConnectedLayer.hpp" @@ -81,6 +82,7 @@ DECLARE_LAYER(Convolution2d) DECLARE_LAYER(Debug) DECLARE_LAYER(DepthwiseConvolution2d) DECLARE_LAYER(Division) +DECLARE_LAYER(Equal) DECLARE_LAYER(FakeQuantization) DECLARE_LAYER(Floor) DECLARE_LAYER(FullyConnected) diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp index 7a7e1800f2..d798c84a62 100644 --- a/src/armnn/Network.cpp +++ b/src/armnn/Network.cpp @@ -722,6 +722,11 @@ IConnectableLayer* Network::AddGreaterLayer(const char* name) return m_Graph->AddLayer(name); } +IConnectableLayer* Network::AddEqualLayer(const char* name) +{ + return m_Graph->AddLayer(name); +} + OptimizedNetwork::OptimizedNetwork(std::unique_ptr graph) : m_Graph(std::move(graph)) { diff --git a/src/armnn/Network.hpp b/src/armnn/Network.hpp index 31e86ac0b9..f36ca4fa74 100644 --- a/src/armnn/Network.hpp +++ b/src/armnn/Network.hpp @@ -137,6 +137,8 @@ public: IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override; + IConnectableLayer* AddEqualLayer(const char* name = nullptr) override; + private: IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor, const ConstTensor& weights, diff --git a/src/armnn/layers/EqualLayer.cpp b/src/armnn/layers/EqualLayer.cpp new file mode 100644 index 0000000000..e0d2e65309 --- /dev/null +++ b/src/armnn/layers/EqualLayer.cpp @@ -0,0 +1,34 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "EqualLayer.hpp" + +#include "LayerCloneBase.hpp" + +#include +#include +#include + +namespace armnn +{ + +EqualLayer::EqualLayer(const char* name) + : ElementwiseBaseLayer(2, 1, LayerType::Equal, name) +{ +} + +std::unique_ptr EqualLayer::CreateWorkload(const Graph& graph, + const IWorkloadFactory& factory) const +{ + EqualQueueDescriptor descriptor; + return factory.CreateEqual(descriptor, PrepInfoAndDesc(descriptor, graph)); +} + +EqualLayer* EqualLayer::Clone(Graph& graph) const +{ + return CloneBase(graph, GetName()); +} + +} // namespace armnn diff --git a/src/armnn/layers/EqualLayer.hpp b/src/armnn/layers/EqualLayer.hpp new file mode 100644 index 0000000000..956ae3c1ab --- /dev/null +++ b/src/armnn/layers/EqualLayer.hpp @@ -0,0 +1,26 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "ElementwiseBaseLayer.hpp" + +namespace armnn +{ + +class EqualLayer : public ElementwiseBaseLayer +{ +public: + virtual std::unique_ptr CreateWorkload(const Graph& graph, + const IWorkloadFactory& factory) const override; + + EqualLayer* Clone(Graph& graph) const override; + +protected: + EqualLayer(const char* name); + ~EqualLayer() = default; +}; + +} //namespace armnn diff --git a/src/backends/backendsCommon/ILayerSupport.cpp b/src/backends/backendsCommon/ILayerSupport.cpp index 3718df1347..1f058af2bd 100644 --- a/src/backends/backendsCommon/ILayerSupport.cpp +++ b/src/backends/backendsCommon/ILayerSupport.cpp @@ -123,6 +123,14 @@ bool ILayerSupport::IsDivisionSupported(const TensorInfo& input0, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool ILayerSupport::IsEqualSupported(const armnn::TensorInfo& input0, + const armnn::TensorInfo& input1, + const armnn::TensorInfo& output, + armnn::Optional reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool ILayerSupport::IsFakeQuantizationSupported(const TensorInfo& input, const FakeQuantizationDescriptor& descriptor, Optional reasonIfUnsupported) const diff --git a/src/backends/backendsCommon/WorkloadData.hpp b/src/backends/backendsCommon/WorkloadData.hpp index 88b0d5e5c5..9142d87bfd 100644 --- a/src/backends/backendsCommon/WorkloadData.hpp +++ b/src/backends/backendsCommon/WorkloadData.hpp @@ -217,6 +217,12 @@ struct PadQueueDescriptor : QueueDescriptorWithParameters void Validate(const WorkloadInfo& workloadInfo) const; }; +// Equal layer workload data +struct EqualQueueDescriptor : QueueDescriptor +{ + void Validate(const WorkloadInfo& workloadInfo) const; +}; + // Batch norm layer workload data. struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters { diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index d7704ffad4..3b8a7d8f7f 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -240,6 +240,17 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, reason); break; } + case LayerType::Equal: + { + const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + result = layerSupportObject->IsEqualSupported(OverrideDataType(input0, dataType), + OverrideDataType(input1, dataType), + OverrideDataType(output, dataType), + reason); + break; + } case LayerType::FakeQuantization: { auto cLayer = boost::polymorphic_downcast(&layer); diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp index 57f61968c1..e72987fdcb 100644 --- a/src/backends/backendsCommon/WorkloadFactory.hpp +++ b/src/backends/backendsCommon/WorkloadFactory.hpp @@ -145,6 +145,9 @@ public: virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& Info) const = 0; + virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& Info) const = 0; + virtual std::unique_ptr CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, const WorkloadInfo& Info) const = 0; diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index dc4f05eec4..d4c5fe43c6 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -336,6 +336,8 @@ DECLARE_LAYER_POLICY_2_PARAM(Debug) DECLARE_LAYER_POLICY_2_PARAM(DepthwiseConvolution2d) +DECLARE_LAYER_POLICY_1_PARAM(Equal) + DECLARE_LAYER_POLICY_2_PARAM(FakeQuantization) DECLARE_LAYER_POLICY_1_PARAM(Floor) diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index ebd957b903..16ca2e6e41 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -314,6 +314,12 @@ std::unique_ptr ClWorkloadFactory::CreatePad(const PadQueueDescriptor return MakeWorkload(descriptor, info); } +std::unique_ptr ClWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return MakeWorkload(descriptor, info); +} + std::unique_ptr ClWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/cl/ClWorkloadFactory.hpp b/src/backends/cl/ClWorkloadFactory.hpp index 70052c41e0..28447216db 100644 --- a/src/backends/cl/ClWorkloadFactory.hpp +++ b/src/backends/cl/ClWorkloadFactory.hpp @@ -129,6 +129,9 @@ public: virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& info) const override; diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index d7de17a83d..f7b2133196 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -282,6 +282,12 @@ std::unique_ptr NeonWorkloadFactory::CreatePad(const PadQueueDescript return MakeWorkloadHelper(descriptor, info); } +std::unique_ptr NeonWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return MakeWorkloadHelper(descriptor, info); +} + std::unique_ptr NeonWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/neon/NeonWorkloadFactory.hpp b/src/backends/neon/NeonWorkloadFactory.hpp index 115dfb0458..2f7a2db315 100644 --- a/src/backends/neon/NeonWorkloadFactory.hpp +++ b/src/backends/neon/NeonWorkloadFactory.hpp @@ -130,6 +130,9 @@ public: virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& Info) const override; diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index b34de8649b..110a947491 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -282,6 +282,12 @@ std::unique_ptr RefWorkloadFactory::CreatePad(const PadQueueDescripto return MakeWorkload(descriptor, info); } +std::unique_ptr RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return MakeWorkload(descriptor, info); +} + std::unique_ptr RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/reference/RefWorkloadFactory.hpp b/src/backends/reference/RefWorkloadFactory.hpp index 03b349db97..f4401ccb6e 100644 --- a/src/backends/reference/RefWorkloadFactory.hpp +++ b/src/backends/reference/RefWorkloadFactory.hpp @@ -147,6 +147,9 @@ public: virtual std::unique_ptr CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + virtual std::unique_ptr CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& info) const override; -- cgit v1.2.1