diff options
author | Ryan OShea <Ryan.OShea2@arm.com> | 2020-06-10 11:33:37 +0100 |
---|---|---|
committer | Keith Davis <keith.davis@arm.com> | 2020-06-15 12:07:38 +0100 |
commit | f4bfa6ae12d0f6385b2017c1d98ba9c2ec0d59f4 (patch) | |
tree | 5b7ab1106180deafaf88900b22231f6da60ae50e /src/backends/reference | |
parent | d0aa456dae928d54fb68eeac2ae75198b9f8e2d6 (diff) | |
download | armnn-f4bfa6ae12d0f6385b2017c1d98ba9c2ec0d59f4.tar.gz |
IVGCVSW-4620 Add Fill Reference Implementation
* Add Fill Reference Implementation
* Refactor FP converter to use static_cast
Signed-off-by: Ryan OShea <Ryan.OShea2@arm.com>
Signed-off-by: Keith Davis <keith.davis@arm.com>
Change-Id: I532e2f982981d047690755fac43a0e9cf8b17dcd
Diffstat (limited to 'src/backends/reference')
-rw-r--r-- | src/backends/reference/RefLayerSupport.cpp | 22 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.hpp | 5 | ||||
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.cpp | 12 | ||||
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.hpp | 3 | ||||
-rw-r--r-- | src/backends/reference/backend.mk | 2 | ||||
-rw-r--r-- | src/backends/reference/test/RefLayerTests.cpp | 4 | ||||
-rw-r--r-- | src/backends/reference/workloads/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/backends/reference/workloads/Fill.cpp | 24 | ||||
-rw-r--r-- | src/backends/reference/workloads/Fill.hpp | 22 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefFillWorkload.cpp | 29 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefFillWorkload.hpp | 21 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefWorkloads.hpp | 1 |
12 files changed, 146 insertions, 3 deletions
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 2e404f9c61..52a763247e 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -857,6 +857,28 @@ bool RefLayerSupport::IsFakeQuantizationSupported(const TensorInfo& input, return supported; } +bool RefLayerSupport::IsFillSupported(const TensorInfo& input, + const TensorInfo& output, + const FillDescriptor& descriptor, + Optional<std::string&> reasonIfUnsupported) const +{ + IgnoreUnused(descriptor); + IgnoreUnused(output); + + bool supported = true; + + std::array<DataType,2> supportedTypes = + { + DataType::Float32, + DataType::Float16 + }; + + supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, + "Reference Fill: input type not supported."); + + return supported; +} + bool RefLayerSupport::IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional<std::string&> reasonIfUnsupported) const diff --git a/src/backends/reference/RefLayerSupport.hpp b/src/backends/reference/RefLayerSupport.hpp index eb89946bcd..96bff56a42 100644 --- a/src/backends/reference/RefLayerSupport.hpp +++ b/src/backends/reference/RefLayerSupport.hpp @@ -141,6 +141,11 @@ public: const FakeQuantizationDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + 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/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index ba84de49da..643684c5b0 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -7,6 +7,7 @@ #include <backendsCommon/MemCopyWorkload.hpp> #include <backendsCommon/MemImportWorkload.hpp> #include <backendsCommon/MakeWorkloadHelper.hpp> +#include <reference/workloads/RefFillWorkload.hpp> #include "RefWorkloadFactory.hpp" #include "RefBackendId.hpp" #include "workloads/RefWorkloads.hpp" @@ -297,13 +298,18 @@ std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescr return CreateComparison(comparisonDescriptor, info); } -std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFakeQuantization( - const FakeQuantizationQueueDescriptor& descriptor, - const WorkloadInfo& info) const +std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, + const WorkloadInfo& info) const { return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info); } +std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFill(const FillQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return std::make_unique<RefFillWorkload>(descriptor, info); +} + std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/reference/RefWorkloadFactory.hpp b/src/backends/reference/RefWorkloadFactory.hpp index 4bfb9e268c..0b419303cc 100644 --- a/src/backends/reference/RefWorkloadFactory.hpp +++ b/src/backends/reference/RefWorkloadFactory.hpp @@ -129,6 +129,9 @@ public: std::unique_ptr<IWorkload> CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr<IWorkload> CreateFill(const FillQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + std::unique_ptr<IWorkload> CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const override; diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 8d7f63dbc3..bf5f340afc 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -32,6 +32,7 @@ BACKEND_SOURCES := \ workloads/DetectionPostProcess.cpp \ workloads/Dequantize.cpp \ workloads/ElementwiseFunction.cpp \ + workloads/Fill.cpp \ workloads/FullyConnected.cpp \ workloads/Gather.cpp \ workloads/InstanceNorm.cpp \ @@ -62,6 +63,7 @@ BACKEND_SOURCES := \ workloads/RefElementwiseWorkload.cpp \ workloads/RefElementwiseUnaryWorkload.cpp \ workloads/RefFakeQuantizationFloat32Workload.cpp \ + workloads/RefFillWorkload.cpp \ workloads/RefFloorWorkload.cpp \ workloads/RefFullyConnectedWorkload.cpp \ workloads/RefGatherWorkload.cpp \ diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 09096b4646..93bfb90244 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -1202,6 +1202,10 @@ ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim1Uint8, Concat4dDiffShapeDim1Uint8Test) ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim2Uint8, Concat4dDiffShapeDim2Uint8Test) ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim3Uint8, Concat4dDiffShapeDim3Uint8Test, true) +// Fill +ARMNN_AUTO_TEST_CASE(SimpleFill, SimpleFillTest<DataType::Float32>) +ARMNN_AUTO_TEST_CASE(SimpleFillF16, SimpleFillTest<DataType::Float16>) + // Floor ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest<DataType::Float32>) ARMNN_AUTO_TEST_CASE(SimpleFloorFloat16, SimpleFloorTest<DataType::Float16>) diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index 94c8513b12..d51db365cc 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -33,6 +33,8 @@ list(APPEND armnnRefBackendWorkloads_sources ElementwiseFunction.hpp Encoders.hpp Exp.hpp + Fill.cpp + Fill.hpp FullyConnected.cpp FullyConnected.hpp Gather.cpp @@ -95,6 +97,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefElementwiseUnaryWorkload.hpp RefFakeQuantizationFloat32Workload.cpp RefFakeQuantizationFloat32Workload.hpp + RefFillWorkload.cpp + RefFillWorkload.hpp RefFloorWorkload.cpp RefFloorWorkload.hpp RefFullyConnectedWorkload.cpp diff --git a/src/backends/reference/workloads/Fill.cpp b/src/backends/reference/workloads/Fill.cpp new file mode 100644 index 0000000000..a166a61ea4 --- /dev/null +++ b/src/backends/reference/workloads/Fill.cpp @@ -0,0 +1,24 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "Fill.hpp" + +#include "RefWorkloadUtils.hpp" + +namespace armnn +{ + +void Fill(Encoder<float>& output, + const TensorShape& desiredOutputShape, + const float value) +{ + for(unsigned int i = 0; i < desiredOutputShape.GetNumElements(); ++i) + { + output[i]; + output.Set(value); + } +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/Fill.hpp b/src/backends/reference/workloads/Fill.hpp new file mode 100644 index 0000000000..379eb04458 --- /dev/null +++ b/src/backends/reference/workloads/Fill.hpp @@ -0,0 +1,22 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" +#include <armnn/Tensor.hpp> +#include <backendsCommon/WorkloadData.hpp> + +namespace armnn +{ + +/// Creates a tensor and fills it with a scalar value. +void Fill(Encoder<float>& output, + const TensorShape& desiredOutputShape, + const float value); + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefFillWorkload.cpp b/src/backends/reference/workloads/RefFillWorkload.cpp new file mode 100644 index 0000000000..991ab45396 --- /dev/null +++ b/src/backends/reference/workloads/RefFillWorkload.cpp @@ -0,0 +1,29 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefFillWorkload.hpp" +#include "Fill.hpp" + +#include "Decoders.hpp" +#include "Encoders.hpp" +#include "RefWorkloadUtils.hpp" +#include "Profiling.hpp" + +namespace armnn +{ + +void RefFillWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefFillWorkload_Execute"); + + const TensorInfo &outputTensorInfo = GetTensorInfo(m_Data.m_Outputs[0]); + + std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputTensorInfo, m_Data.m_Outputs[0]->Map()); + Encoder<float> &encoder = *encoderPtr; + + Fill(encoder, outputTensorInfo.GetShape(), m_Data.m_Parameters.m_Value); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefFillWorkload.hpp b/src/backends/reference/workloads/RefFillWorkload.hpp new file mode 100644 index 0000000000..9be773c50b --- /dev/null +++ b/src/backends/reference/workloads/RefFillWorkload.hpp @@ -0,0 +1,21 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <backendsCommon/Workload.hpp> +#include <backendsCommon/WorkloadData.hpp> + +namespace armnn +{ + +class RefFillWorkload : public BaseWorkload<FillQueueDescriptor> +{ +public: + using BaseWorkload<FillQueueDescriptor>::BaseWorkload; + virtual void Execute() const override; +}; + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index e396a6ba3c..951e3a1e29 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -34,6 +34,7 @@ #include "RefDequantizeWorkload.hpp" #include "RefElementwiseWorkload.hpp" #include "RefElementwiseUnaryWorkload.hpp" +#include "RefFillWorkload.hpp" #include "RefFullyConnectedWorkload.hpp" #include "RefFloorWorkload.hpp" #include "RefFakeQuantizationFloat32Workload.hpp" |