From 2f2778f36e59537bbd47fb8b21e73c6c5a949584 Mon Sep 17 00:00:00 2001 From: Nina Drozd Date: Mon, 27 May 2019 10:37:05 +0100 Subject: IVGCVSW-3145 Refactor Reference Reshape workloads * Removed reference reshape workloads for float32 and uint8 * Added RefReshapeWorkload * Added check for supported datatypes for reshape in WorkloadData * Added check for supported datatypes for reshape in RefLayerSupport * Updated CMakeLists.txt * Updated references to reshape workloads Signed-off-by: Nina Drozd Change-Id: I9941659067b022f8f7686ab0ff14776944dca3e5 --- src/backends/backendsCommon/WorkloadData.cpp | 25 ++++++++++++++------ .../backendsCommon/test/WorkloadDataValidation.cpp | 2 +- src/backends/reference/RefLayerSupport.cpp | 13 +++++++---- src/backends/reference/RefWorkloadFactory.cpp | 2 +- src/backends/reference/backend.mk | 3 +-- .../reference/test/RefCreateWorkloadTests.cpp | 4 ++-- src/backends/reference/workloads/CMakeLists.txt | 6 ++--- .../workloads/RefReshapeFloat32Workload.cpp | 27 ---------------------- .../workloads/RefReshapeFloat32Workload.hpp | 21 ----------------- .../workloads/RefReshapeUint8Workload.cpp | 27 ---------------------- .../workloads/RefReshapeUint8Workload.hpp | 21 ----------------- .../reference/workloads/RefReshapeWorkload.cpp | 25 ++++++++++++++++++++ .../reference/workloads/RefReshapeWorkload.hpp | 21 +++++++++++++++++ src/backends/reference/workloads/RefWorkloads.hpp | 3 +-- 14 files changed, 81 insertions(+), 119 deletions(-) delete mode 100644 src/backends/reference/workloads/RefReshapeFloat32Workload.cpp delete mode 100644 src/backends/reference/workloads/RefReshapeFloat32Workload.hpp delete mode 100644 src/backends/reference/workloads/RefReshapeUint8Workload.cpp delete mode 100644 src/backends/reference/workloads/RefReshapeUint8Workload.hpp create mode 100644 src/backends/reference/workloads/RefReshapeWorkload.cpp create mode 100644 src/backends/reference/workloads/RefReshapeWorkload.hpp diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index d9779e4e37..ea84c0b9f2 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -850,13 +850,13 @@ void ConstantQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const // Check the supported data types std::vector supportedTypes = - { - DataType::Float32, - DataType::Float16, - DataType::Signed32, - DataType::QuantisedAsymm8, - DataType::QuantisedSymm16 - }; + { + DataType::Float32, + DataType::Float16, + DataType::Signed32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; ValidateDataTypes(workloadInfo.m_OutputTensorInfos[0], supportedTypes, "ConstantQueueDescriptor"); } @@ -872,6 +872,17 @@ void ReshapeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const to_string(workloadInfo.m_InputTensorInfos[0].GetNumElements()) + " but output tensor has " + to_string(workloadInfo.m_OutputTensorInfos[0].GetNumElements()) + " elements."); } + + // Check the supported data types + std::vector supportedTypes = + { + DataType::Float32, + DataType::Float16, + DataType::QuantisedAsymm8 + }; + + ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], supportedTypes, "ReshapeQueueDescriptor"); + ValidateDataTypes(workloadInfo.m_OutputTensorInfos[0], supportedTypes, "ReshapeQueueDescriptor"); } void SpaceToBatchNdQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const diff --git a/src/backends/backendsCommon/test/WorkloadDataValidation.cpp b/src/backends/backendsCommon/test/WorkloadDataValidation.cpp index 119eb7df90..067cca8319 100644 --- a/src/backends/backendsCommon/test/WorkloadDataValidation.cpp +++ b/src/backends/backendsCommon/test/WorkloadDataValidation.cpp @@ -447,7 +447,7 @@ BOOST_AUTO_TEST_CASE(ReshapeQueueDescriptor_Validate_MismatchingNumElements) AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr); // InvalidArgumentException is expected, because the number of elements don't match. - BOOST_CHECK_THROW(RefReshapeFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException); + BOOST_CHECK_THROW(RefReshapeWorkload(invalidData, invalidInfo), armnn::InvalidArgumentException); } diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 9be1ed6d74..2adcb1099d 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -1021,10 +1021,15 @@ bool RefLayerSupport::IsReshapeSupported(const TensorInfo& input, Optional reasonIfUnsupported) const { ignore_unused(descriptor); - return IsSupportedForDataTypeRef(reasonIfUnsupported, - input.GetDataType(), - &TrueFunc<>, - &TrueFunc<>); + // Define supported output types. + std::array supportedOutputTypes = + { + DataType::Float32, + DataType::Float16, + DataType::QuantisedAsymm8 + }; + return CheckSupportRule(TypeAnyOf(input, supportedOutputTypes), reasonIfUnsupported, + "Reference reshape: input type not supported."); } bool RefLayerSupport::IsResizeBilinearSupported(const TensorInfo& input, diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 6abcf9cd08..1243328852 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -264,7 +264,7 @@ std::unique_ptr RefWorkloadFactory::CreateConstant(const ConstantQueu std::unique_ptr RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor, diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 50cfbf68cc..1c7f8dc22c 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -54,8 +54,7 @@ BACKEND_SOURCES := \ workloads/RefPooling2dFloat32Workload.cpp \ workloads/RefPooling2dUint8Workload.cpp \ workloads/RefQuantizeWorkload.cpp \ - workloads/RefReshapeFloat32Workload.cpp \ - workloads/RefReshapeUint8Workload.cpp \ + workloads/RefReshapeWorkload.cpp \ workloads/RefResizeBilinearFloat32Workload.cpp \ workloads/RefResizeBilinearUint8Workload.cpp \ workloads/RefRsqrtFloat32Workload.cpp \ diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 95da7abad1..3f4cc75fea 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -663,12 +663,12 @@ static void RefCreateReshapeWorkloadTest() BOOST_AUTO_TEST_CASE(CreateReshapeFloat32Workload) { - RefCreateReshapeWorkloadTest(); + RefCreateReshapeWorkloadTest(); } BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload) { - RefCreateReshapeWorkloadTest(); + RefCreateReshapeWorkloadTest(); } template diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index 7f26d78c7e..508dfdc293 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -91,10 +91,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefPooling2dUint8Workload.hpp RefQuantizeWorkload.cpp RefQuantizeWorkload.hpp - RefReshapeFloat32Workload.cpp - RefReshapeFloat32Workload.hpp - RefReshapeUint8Workload.cpp - RefReshapeUint8Workload.hpp + RefReshapeWorkload.cpp + RefReshapeWorkload.hpp RefResizeBilinearFloat32Workload.cpp RefResizeBilinearFloat32Workload.hpp RefResizeBilinearUint8Workload.cpp diff --git a/src/backends/reference/workloads/RefReshapeFloat32Workload.cpp b/src/backends/reference/workloads/RefReshapeFloat32Workload.cpp deleted file mode 100644 index 99c94a49a1..0000000000 --- a/src/backends/reference/workloads/RefReshapeFloat32Workload.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefReshapeFloat32Workload.hpp" - -#include "RefWorkloadUtils.hpp" - -#include "Profiling.hpp" - -#include - -namespace armnn -{ - -void RefReshapeFloat32Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefReshapeFloat32Workload_Execute"); - - void* output = GetOutputTensorData(0, m_Data); - const void* input = GetInputTensorData(0, m_Data); - unsigned int numBytes = GetTensorInfo(m_Data.m_Inputs[0]).GetNumBytes(); - memcpy(output, input, numBytes); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefReshapeFloat32Workload.hpp b/src/backends/reference/workloads/RefReshapeFloat32Workload.hpp deleted file mode 100644 index 75024b3db6..0000000000 --- a/src/backends/reference/workloads/RefReshapeFloat32Workload.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn -{ - -class RefReshapeFloat32Workload : public Float32Workload -{ -public: - using Float32Workload::Float32Workload; - virtual void Execute() const override; -}; - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefReshapeUint8Workload.cpp b/src/backends/reference/workloads/RefReshapeUint8Workload.cpp deleted file mode 100644 index 8f475f3db3..0000000000 --- a/src/backends/reference/workloads/RefReshapeUint8Workload.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefReshapeUint8Workload.hpp" - -#include "RefWorkloadUtils.hpp" - -#include "Profiling.hpp" - -#include - -namespace armnn -{ - -void RefReshapeUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefReshapeUint8Workload_Execute"); - - void* output = GetOutputTensorData(0, m_Data); - const void* input = GetInputTensorData(0, m_Data); - unsigned int numBytes = GetTensorInfo(m_Data.m_Inputs[0]).GetNumBytes(); - memcpy(output, input, numBytes); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefReshapeUint8Workload.hpp b/src/backends/reference/workloads/RefReshapeUint8Workload.hpp deleted file mode 100644 index c3d31f8a73..0000000000 --- a/src/backends/reference/workloads/RefReshapeUint8Workload.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn -{ - -class RefReshapeUint8Workload : public Uint8Workload -{ -public: - using Uint8Workload::Uint8Workload; - virtual void Execute() const override; -}; - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefReshapeWorkload.cpp b/src/backends/reference/workloads/RefReshapeWorkload.cpp new file mode 100644 index 0000000000..6d29781937 --- /dev/null +++ b/src/backends/reference/workloads/RefReshapeWorkload.cpp @@ -0,0 +1,25 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefReshapeWorkload.hpp" +#include "RefWorkloadUtils.hpp" +#include "Profiling.hpp" + +#include + +namespace armnn +{ + +void RefReshapeWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefReshapeWorkload_Execute"); + + void* output = GetOutputTensorData(0, m_Data); + const void* input = GetInputTensorData(0, m_Data); + unsigned int numBytes = GetTensorInfo(m_Data.m_Inputs[0]).GetNumBytes(); + memcpy(output, input, numBytes); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefReshapeWorkload.hpp b/src/backends/reference/workloads/RefReshapeWorkload.hpp new file mode 100644 index 0000000000..7359ff9cde --- /dev/null +++ b/src/backends/reference/workloads/RefReshapeWorkload.hpp @@ -0,0 +1,21 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +namespace armnn +{ + +class RefReshapeWorkload : public BaseWorkload +{ +public: + using BaseWorkload::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 54bc5c7f01..20649d93ce 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -23,14 +23,12 @@ #include "TensorBufferArrayView.hpp" #include "RefBatchNormalizationFloat32Workload.hpp" #include "Splitter.hpp" -#include "RefReshapeFloat32Workload.hpp" #include "RefDepthwiseConvolution2dWorkload.hpp" #include "FullyConnected.hpp" #include "Gather.hpp" #include "RefFloorFloat32Workload.hpp" #include "RefSoftmaxFloat32Workload.hpp" #include "RefSoftmaxUint8Workload.hpp" -#include "RefReshapeUint8Workload.hpp" #include "RefResizeBilinearFloat32Workload.hpp" #include "RefBatchNormalizationUint8Workload.hpp" #include "ResizeBilinear.hpp" @@ -59,3 +57,4 @@ #include "RefRsqrtFloat32Workload.hpp" #include "RefDequantizeWorkload.hpp" #include "RefQuantizeWorkload.hpp" +#include "RefReshapeWorkload.hpp" -- cgit v1.2.1