diff options
author | Ryan OShea <Ryan.OShea2@arm.com> | 2020-06-05 17:17:06 +0100 |
---|---|---|
committer | KeithARM <keith.davis@arm.com> | 2020-06-11 12:17:49 +0000 |
commit | ec6c68093eaef8a2b8e1fd64fcc765237973512e (patch) | |
tree | e4dd87466d5be44d1310f9e1c9c6e1355df43fbf /src/backends/backendsCommon | |
parent | 6350d27286114dfdae5f65ae1823ba1150087efb (diff) | |
download | armnn-ec6c68093eaef8a2b8e1fd64fcc765237973512e.tar.gz |
IVGCVSW-4906 Add front-end support for FILL operator
* Added new fill layer
* Added visitor tests
Signed-off-by: Ryan OShea <Ryan.OShea2@arm.com>
Change-Id: Iea677014866b4f2d514004623f59ee83f3c0eef8
Signed-off-by: Keith Davis <keith.davis@arm.com>
Diffstat (limited to 'src/backends/backendsCommon')
-rw-r--r-- | src/backends/backendsCommon/LayerSupportBase.cpp | 8 | ||||
-rw-r--r-- | src/backends/backendsCommon/LayerSupportBase.hpp | 5 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 23 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.hpp | 13 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadFactory.cpp | 20 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadFactory.hpp | 3 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp | 2 |
7 files changed, 74 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/LayerSupportBase.cpp b/src/backends/backendsCommon/LayerSupportBase.cpp index c55f51d315..e509a7b929 100644 --- a/src/backends/backendsCommon/LayerSupportBase.cpp +++ b/src/backends/backendsCommon/LayerSupportBase.cpp @@ -248,6 +248,14 @@ bool LayerSupportBase::IsFakeQuantizationSupported(const TensorInfo& /*input*/, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool LayerSupportBase::IsFillSupported(const TensorInfo& /*input*/, + const TensorInfo& /*output*/, + const FillDescriptor& /*descriptor*/, + Optional<std::string&> reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsFloorSupported(const TensorInfo& /*input*/, const TensorInfo& /*output*/, Optional<std::string&> reasonIfUnsupported) const diff --git a/src/backends/backendsCommon/LayerSupportBase.hpp b/src/backends/backendsCommon/LayerSupportBase.hpp index fcc3326601..aff4529417 100644 --- a/src/backends/backendsCommon/LayerSupportBase.hpp +++ b/src/backends/backendsCommon/LayerSupportBase.hpp @@ -143,6 +143,11 @@ public: const FakeQuantizationDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + virtual bool IsFillSupported(const TensorInfo& input, + const TensorInfo& output, + const FillDescriptor& descriptor, + Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 2060093015..3949fa945d 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -966,6 +966,29 @@ void StackQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const "output"); } +void FillQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const +{ + const std::string descriptorName{"FillQueueDescriptor"}; + + ValidateNumInputs(workloadInfo, descriptorName, 1); + ValidateNumOutputs(workloadInfo, descriptorName, 1); + + const TensorInfo& inputTensorInfo = workloadInfo.m_InputTensorInfos[0]; + const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0]; + + ValidateTensorNumDimensions(inputTensorInfo, descriptorName, 1, "input"); + + std::vector<DataType> supportedTypes = + { + DataType::BFloat16, + DataType::Float32, + DataType::Float16, + DataType::Signed32 + }; + + ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName); +} + void FullyConnectedQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const { const std::string descriptorName{"FullyConnectedQueueDescriptor"}; diff --git a/src/backends/backendsCommon/WorkloadData.hpp b/src/backends/backendsCommon/WorkloadData.hpp index adce5570d3..ba9b0f394b 100644 --- a/src/backends/backendsCommon/WorkloadData.hpp +++ b/src/backends/backendsCommon/WorkloadData.hpp @@ -137,6 +137,19 @@ struct ArgMinMaxQueueDescriptor : QueueDescriptorWithParameters<ArgMinMaxDescrip void Validate(const WorkloadInfo& workloadInfo) const; }; +// Fill layer workload data. +struct FillQueueDescriptor : QueueDescriptorWithParameters<FillDescriptor> +{ + FillQueueDescriptor() + : m_Value(nullptr) + { + } + + const ConstCpuTensorHandle* m_Value; + + void Validate(const WorkloadInfo& workloadInfo) const; +}; + // Fully connected layer workload data. struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor> { diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 0a13c99ab8..d2565cf21d 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -312,6 +312,20 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, reason); break; } + case LayerType::Fill: + { + auto cLayer = PolymorphicDowncast<const FillLayer*>(&layer); + const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + const FillDescriptor& descriptor = cLayer->GetParameters(); + + result = layerSupportObject->IsFillSupported( + OverrideDataType(input, dataType), + OverrideDataType(output, dataType), + descriptor, + reason); + break; + } case LayerType::FakeQuantization: { auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer); @@ -1336,6 +1350,12 @@ std::unique_ptr<IWorkload> IWorkloadFactory::CreateFakeQuantization(const FakeQu return std::unique_ptr<IWorkload>(); } +std::unique_ptr<IWorkload> IWorkloadFactory::CreateFill(const FillQueueDescriptor& /*descriptor*/, + const WorkloadInfo& /*info*/) const +{ + return std::unique_ptr<IWorkload>(); +} + std::unique_ptr<IWorkload> IWorkloadFactory::CreateFloor(const FloorQueueDescriptor& /*descriptor*/, const WorkloadInfo& /*info*/) const { diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp index 89c073c170..e373a4f218 100644 --- a/src/backends/backendsCommon/WorkloadFactory.hpp +++ b/src/backends/backendsCommon/WorkloadFactory.hpp @@ -122,6 +122,9 @@ public: virtual std::unique_ptr<IWorkload> CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const; + virtual std::unique_ptr<IWorkload> CreateFill(const FillQueueDescriptor& descriptor, + const WorkloadInfo& info) const; + virtual std::unique_ptr<IWorkload> CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const; diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index 0780f4bd27..dcd073d279 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -545,6 +545,8 @@ DECLARE_LAYER_POLICY_2_PARAM(ElementwiseUnary) DECLARE_LAYER_POLICY_2_PARAM(FakeQuantization) +DECLARE_LAYER_POLICY_2_PARAM(Fill) + DECLARE_LAYER_POLICY_1_PARAM(Floor) DECLARE_LAYER_POLICY_2_PARAM(FullyConnected) |