diff options
author | Ruomei Yan <ruomei.yan@arm.com> | 2019-05-28 16:48:20 +0100 |
---|---|---|
committer | Ruomei Yan <ruomei.yan@arm.com> | 2019-05-30 15:45:40 +0100 |
commit | 25339c31a829111fce691311cb84100e8591f5da (patch) | |
tree | 9d79436f67f4570e4e4d1c52516de7f3df6eb7e0 /src/backends/reference | |
parent | edb8b2ec42624ec27c37bc1b3d345ef0c97c024c (diff) | |
download | armnn-25339c31a829111fce691311cb84100e8591f5da.tar.gz |
IVGCVSW-3159 Support QSymm16 for Splitter workloads
Change-Id: I9af5d2d8ade97b9ecd2e6fbf13db9fa3bb622ed8
Signed-off-by: Ruomei Yan <ruomei.yan@arm.com>
Diffstat (limited to 'src/backends/reference')
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.cpp | 6 | ||||
-rw-r--r-- | src/backends/reference/backend.mk | 6 | ||||
-rw-r--r-- | src/backends/reference/test/RefCreateWorkloadTests.cpp | 12 | ||||
-rw-r--r-- | src/backends/reference/test/RefLayerTests.cpp | 2 | ||||
-rw-r--r-- | src/backends/reference/workloads/CMakeLists.txt | 7 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefSplitterFloat32Workload.cpp | 21 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefSplitterUint8Workload.cpp | 21 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefSplitterUint8Workload.hpp | 21 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefSplitterWorkload.cpp | 20 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefSplitterWorkload.hpp (renamed from src/backends/reference/workloads/RefSplitterFloat32Workload.hpp) | 6 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefWorkloads.hpp | 3 | ||||
-rw-r--r-- | src/backends/reference/workloads/Splitter.cpp | 94 | ||||
-rw-r--r-- | src/backends/reference/workloads/Splitter.hpp | 3 |
13 files changed, 139 insertions, 83 deletions
diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 50e3c0006c..71b1cb034d 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -133,7 +133,11 @@ std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueD std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload<RefSplitterFloat32Workload, RefSplitterUint8Workload>(descriptor, info); + if (IsFloat16(info)) + { + return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info); + } + return std::make_unique<RefSplitterWorkload>(descriptor, info); } std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor, diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 57204a05ac..46aac056bf 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -61,14 +61,14 @@ BACKEND_SOURCES := \ workloads/RefSoftmaxWorkload.cpp \ workloads/RefSpaceToBatchNdWorkload.cpp \ workloads/RefStridedSliceWorkload.cpp \ - workloads/RefSplitterFloat32Workload.cpp \ - workloads/RefSplitterUint8Workload.cpp \ + workloads/RefSplitterWorkload.cpp \ workloads/ResizeBilinear.cpp \ workloads/Rsqrt.cpp \ workloads/SpaceToBatchNd.cpp \ workloads/StridedSlice.cpp \ workloads/StringMapping.cpp \ - workloads/Softmax.cpp + workloads/Softmax.cpp \ + workloads/Splitter.cpp # BACKEND_TEST_SOURCES contains the list of files to be included # in the Android unit test build (armnn-tests) and it is picked diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 78083fa07b..0311276f10 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -470,12 +470,12 @@ static void RefCreateSplitterWorkloadTest() BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload) { - RefCreateSplitterWorkloadTest<RefSplitterFloat32Workload, armnn::DataType::Float32>(); + RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>(); } BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload) { - RefCreateSplitterWorkloadTest<RefSplitterUint8Workload, armnn::DataType::QuantisedAsymm8>(); + RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QuantisedAsymm8>(); } template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType> @@ -513,12 +513,12 @@ static void RefCreateSplitterConcatWorkloadTest() BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32) { - RefCreateSplitterConcatWorkloadTest<RefSplitterFloat32Workload, RefConcatWorkload, DataType::Float32>(); + RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>(); } BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8) { - RefCreateSplitterConcatWorkloadTest<RefSplitterUint8Workload, RefConcatWorkload, DataType::QuantisedAsymm8>(); + RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QuantisedAsymm8>(); } template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType> @@ -561,13 +561,13 @@ static void RefCreateSingleOutputMultipleInputsTest() BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32) { - RefCreateSingleOutputMultipleInputsTest<RefSplitterFloat32Workload, RefActivationWorkload, + RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload, armnn::DataType::Float32>(); } BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8) { - RefCreateSingleOutputMultipleInputsTest<RefSplitterUint8Workload, RefActivationWorkload, + RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload, armnn::DataType::QuantisedAsymm8>(); } diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 522d673f07..690a78c21c 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -253,9 +253,11 @@ ARMNN_AUTO_TEST_CASE(FullyConnectedLargeTransposed, FullyConnectedLargeTest, tru // Splitter ARMNN_AUTO_TEST_CASE(SimpleSplitter, SplitterTest) ARMNN_AUTO_TEST_CASE(SimpleSplitterUint8, SplitterUint8Test) +ARMNN_AUTO_TEST_CASE(SimpleSplitterInt16, SplitterInt16Test) ARMNN_AUTO_TEST_CASE(CopyViaSplitter, CopyViaSplitterTest) ARMNN_AUTO_TEST_CASE(CopyViaSplitterUint8, CopyViaSplitterUint8Test) +ARMNN_AUTO_TEST_CASE(CopyViaSplitterInt16, CopyViaSplitterInt16Test) // Concat ARMNN_AUTO_TEST_CASE(SimpleConcat, ConcatTest) diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index e2f93d72a9..e57a40a9ba 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -103,10 +103,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefSoftmaxWorkload.hpp RefSpaceToBatchNdWorkload.cpp RefSpaceToBatchNdWorkload.hpp - RefSplitterFloat32Workload.cpp - RefSplitterFloat32Workload.hpp - RefSplitterUint8Workload.cpp - RefSplitterUint8Workload.hpp + RefSplitterWorkload.cpp + RefSplitterWorkload.hpp RefStridedSliceWorkload.cpp RefStridedSliceWorkload.hpp RefWorkloads.hpp @@ -120,6 +118,7 @@ list(APPEND armnnRefBackendWorkloads_sources SpaceToBatchNd.hpp SpaceToBatchNd.cpp Splitter.hpp + Splitter.cpp StridedSlice.hpp StridedSlice.cpp StringMapping.cpp diff --git a/src/backends/reference/workloads/RefSplitterFloat32Workload.cpp b/src/backends/reference/workloads/RefSplitterFloat32Workload.cpp deleted file mode 100644 index 75611dacf3..0000000000 --- a/src/backends/reference/workloads/RefSplitterFloat32Workload.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefSplitterFloat32Workload.hpp" - -#include "Splitter.hpp" - -#include "Profiling.hpp" - -namespace armnn -{ - -void RefSplitterFloat32Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSplitterFloat32Workload_Execute"); - Splitter<float>(m_Data); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefSplitterUint8Workload.cpp b/src/backends/reference/workloads/RefSplitterUint8Workload.cpp deleted file mode 100644 index ca9f5db850..0000000000 --- a/src/backends/reference/workloads/RefSplitterUint8Workload.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefSplitterUint8Workload.hpp" - -#include "Splitter.hpp" - -#include "Profiling.hpp" - -namespace armnn -{ - -void RefSplitterUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSplitterUint8Workload_Execute"); - Splitter<uint8_t>(m_Data); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefSplitterUint8Workload.hpp b/src/backends/reference/workloads/RefSplitterUint8Workload.hpp deleted file mode 100644 index d9b6aaf639..0000000000 --- a/src/backends/reference/workloads/RefSplitterUint8Workload.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include <backendsCommon/Workload.hpp> -#include <backendsCommon/WorkloadData.hpp> - -namespace armnn -{ - -class RefSplitterUint8Workload : public Uint8Workload<SplitterQueueDescriptor> -{ -public: - using Uint8Workload<SplitterQueueDescriptor>::Uint8Workload; - virtual void Execute() const override; -}; - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefSplitterWorkload.cpp b/src/backends/reference/workloads/RefSplitterWorkload.cpp new file mode 100644 index 0000000000..ffe4eb880b --- /dev/null +++ b/src/backends/reference/workloads/RefSplitterWorkload.cpp @@ -0,0 +1,20 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefSplitterWorkload.hpp" +#include "Splitter.hpp" +#include "RefWorkloadUtils.hpp" +#include "Profiling.hpp" + +namespace armnn +{ + +void RefSplitterWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSplitterWorkload_Execute"); + Split(m_Data); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefSplitterFloat32Workload.hpp b/src/backends/reference/workloads/RefSplitterWorkload.hpp index 502eb3555f..95cc4a5db7 100644 --- a/src/backends/reference/workloads/RefSplitterFloat32Workload.hpp +++ b/src/backends/reference/workloads/RefSplitterWorkload.hpp @@ -7,14 +7,16 @@ #include <backendsCommon/Workload.hpp> #include <backendsCommon/WorkloadData.hpp> +#include "Decoders.hpp" +#include "Encoders.hpp" namespace armnn { -class RefSplitterFloat32Workload : public Float32Workload<SplitterQueueDescriptor> +class RefSplitterWorkload : public BaseWorkload<SplitterQueueDescriptor> { public: - using Float32Workload<SplitterQueueDescriptor>::Float32Workload; + using BaseWorkload<SplitterQueueDescriptor>::BaseWorkload; virtual void Execute() const override; }; diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index ab3da88437..c20e2f6191 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -10,7 +10,7 @@ #include "ConvImpl.hpp" #include "RefConstantWorkload.hpp" #include "RefConvolution2dWorkload.hpp" -#include "RefSplitterUint8Workload.hpp" +#include "RefSplitterWorkload.hpp" #include "RefResizeBilinearUint8Workload.hpp" #include "RefL2NormalizationFloat32Workload.hpp" #include "RefActivationWorkload.hpp" @@ -39,7 +39,6 @@ #include "Activation.hpp" #include "Concatenate.hpp" #include "RefSpaceToBatchNdWorkload.hpp" -#include "RefSplitterFloat32Workload.hpp" #include "RefStridedSliceWorkload.hpp" #include "Pooling2d.hpp" #include "RefFakeQuantizationFloat32Workload.hpp" diff --git a/src/backends/reference/workloads/Splitter.cpp b/src/backends/reference/workloads/Splitter.cpp new file mode 100644 index 0000000000..3bddfb0cab --- /dev/null +++ b/src/backends/reference/workloads/Splitter.cpp @@ -0,0 +1,94 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefWorkloadUtils.hpp" +#include <backendsCommon/WorkloadData.hpp> +#include <armnn/Tensor.hpp> + +#include <boost/assert.hpp> +#include "Splitter.hpp" + +#include <cmath> +#include <limits> + +#include "Decoders.hpp" +#include "Encoders.hpp" + +namespace armnn +{ + +void Split(const SplitterQueueDescriptor& data) +{ + const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]); + + std::unique_ptr<Decoder<float>> decoderPtr = + MakeDecoder<float>(inputInfo, data.m_Inputs[0]->Map()); + Decoder<float>& decoder = *decoderPtr; + + for (unsigned int index = 0; index < inputInfo.GetNumElements(); ++index) + { + unsigned int indices[MaxNumOfTensorDimensions] = { 0 }; + + unsigned int indexRemainder = index; + unsigned int dimensionStride = inputInfo.GetNumElements(); + + for (unsigned int i = 0; i<inputInfo.GetNumDimensions(); i++) + { + dimensionStride /= inputInfo.GetShape()[i]; + indices[i] = indexRemainder / dimensionStride; // Use integer division to round down. + indexRemainder -= indices[i] * dimensionStride; + } + + for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx) + { + SplitterQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx]; + + //Split view extents are defined by the size of (the corresponding) input tensor. + const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[viewIdx]); + BOOST_ASSERT(outputInfo.GetNumDimensions() == inputInfo.GetNumDimensions()); + + // Check all dimensions to see if this element is inside the given input view. + bool insideView = true; + for (unsigned int i = 0; i<outputInfo.GetNumDimensions(); i++) + { + if (indices[i] < view.m_Origin[i]) + { + insideView = false; + } + if (indices[i] >= view.m_Origin[i] + outputInfo.GetShape()[i]) + { + insideView = false; + } + } + + if (insideView) + { + std::unique_ptr<Encoder<float>> encoderPtr = + MakeEncoder<float>(outputInfo, data.m_Outputs[viewIdx]->Map()); + Encoder<float>& encoder = *encoderPtr; + + unsigned int outIndex = 0; + unsigned int dimensionStride = 1; + float inputValue = 0.f; + + for (unsigned int i = outputInfo.GetNumDimensions(); i-- > 0;) + { + outIndex += dimensionStride * (indices[i] - view.m_Origin[i]); + dimensionStride *= outputInfo.GetShape()[i]; + } + + decoder += index; + inputValue = decoder.Get(); + decoder -= index; + + encoder += outIndex; + encoder.Set(inputValue); + break; + } + } + } +} + +}
\ No newline at end of file diff --git a/src/backends/reference/workloads/Splitter.hpp b/src/backends/reference/workloads/Splitter.hpp index 0e522d5ad5..271c6fdeb8 100644 --- a/src/backends/reference/workloads/Splitter.hpp +++ b/src/backends/reference/workloads/Splitter.hpp @@ -6,10 +6,8 @@ #pragma once #include "RefWorkloadUtils.hpp" - #include <backendsCommon/WorkloadData.hpp> #include <armnn/Tensor.hpp> - #include <boost/assert.hpp> namespace armnn @@ -80,4 +78,5 @@ void Splitter(const SplitterQueueDescriptor& data) } } +void Split(const SplitterQueueDescriptor& data); } //namespace armnn |