From 19e79420fa9f136352cce56b5650b47aa2e96de3 Mon Sep 17 00:00:00 2001 From: Ryan OShea Date: Wed, 4 May 2022 00:38:03 +0100 Subject: IVGCVSW-6175 Add Pooling3d to Neon * Add IsSupported for Pooling3d * Add CreateWorkload case for Pooling3d * Create new NeonPooling3dWorkload header and source files * Add Pooling3d workload to NeonWorkloads.hpp * Add float32 tests for Pooling3d workload * Add Uint8 tests for Cl and NE pooling3d Signed-off-by: Ryan OShea Change-Id: Ic992e1233d1eb8db52df2c8446183df1c907bc4d --- src/backends/cl/test/ClLayerTests.cpp | 61 ++++++++++- src/backends/neon/NeonLayerSupport.cpp | 16 ++- src/backends/neon/NeonLayerSupport.hpp | 5 +- src/backends/neon/NeonWorkloadFactory.cpp | 5 + src/backends/neon/backend.mk | 1 + src/backends/neon/test/NeonLayerTests.cpp | 114 ++++++++++++++++++++- src/backends/neon/workloads/CMakeLists.txt | 2 + .../neon/workloads/NeonPooling3dWorkload.cpp | 64 ++++++++++++ .../neon/workloads/NeonPooling3dWorkload.hpp | 33 ++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 1 + 10 files changed, 295 insertions(+), 7 deletions(-) create mode 100644 src/backends/neon/workloads/NeonPooling3dWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonPooling3dWorkload.hpp diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 68635ac6fc..855697c9be 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -517,6 +517,7 @@ ARMNN_AUTO_TEST_FIXTURE_WITH_THF(IgnorePaddingSimpleL2Pooling2d, ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_IgnorePaddingSimpleL2Pooling2dUint8, ClContextControlFixture, IgnorePaddingSimpleL2Pooling2dUint8Test) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(IgnorePaddingL2Pooling2dSize3, ClContextControlFixture, IgnorePaddingL2Pooling2dSize3Test) @@ -617,26 +618,51 @@ ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleMaxPooling3dSize2x2x2Stride1x1x1, SimpleMaxPooling3dSize2x2x2Stride1x1x1Test, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleMaxPooling3dSize2x2x2Stride1x1x1Uint8, + ClContextControlFixture, + SimpleMaxPooling3dSize2x2x2Stride1x1x1Uint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleMaxPooling3d, ClContextControlFixture, SimpleMaxPooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleMaxPooling3dUint8, + ClContextControlFixture, + SimpleMaxPooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(IgnorePaddingSimpleMaxPooling3d, ClContextControlFixture, IgnorePaddingSimpleMaxPooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(IgnorePaddingSimpleMaxPooling3dUint8, + ClContextControlFixture, + IgnorePaddingSimpleMaxPooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleAveragePooling3d, ClContextControlFixture, SimpleAveragePooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleAveragePooling3dUint8, + ClContextControlFixture, + SimpleAveragePooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(LargeTensorsAveragePooling3d, ClContextControlFixture, LargeTensorsAveragePooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(LargeTensorsAveragePooling3dUint8, + ClContextControlFixture, + LargeTensorsAveragePooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(IgnorePaddingSimpleAveragePooling3d, ClContextControlFixture, IgnorePaddingSimpleAveragePooling3dTest, @@ -657,11 +683,21 @@ ARMNN_AUTO_TEST_FIXTURE_WITH_THF(AsymmetricNonSquareMaxPooling3d, AsymmetricNonSquareMaxPooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(AsymmetricNonSquareMaxPooling3dUint8, + ClContextControlFixture, + AsymmetricNonSquareMaxPooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(AsymmetricNonSquareAveragePooling3d, ClContextControlFixture, AsymmetricNonSquareAveragePooling3dTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(AsymmetricNonSquareAveragePooling3dUint8, + ClContextControlFixture, + AsymmetricNonSquareAveragePooling3dUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(AsymmetricNonSquareL2Pooling3d, ClContextControlFixture, AsymmetricNonSquareL2Pooling3dTest, @@ -672,9 +708,19 @@ ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareMaxPooling3dWith AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTest, DataLayout::NDHWC) -ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPool, +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolUint8, ClContextControlFixture, - AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTest, + AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8, + ClContextControlFixture, + AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8, + ClContextControlFixture, + AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8Test, DataLayout::NDHWC) ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTEDAsymmetricNonSquareL2Pooling3dWithPaddingOnlyPool, @@ -682,13 +728,20 @@ ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTEDAsymmetricNonSquareL2Pooling3dWithPa AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTest, DataLayout::NDHWC) +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(UNSUPPORTEDAsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolUint8, + ClContextControlFixture, + AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleAveragePooling3d, ClContextControlFixture, SimpleAveragePooling3dTest, DataLayout::NDHWC) - - +ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleAveragePooling3dUint8, + ClContextControlFixture, + SimpleAveragePooling3dUint8Test, + DataLayout::NDHWC) // Add ARMNN_AUTO_TEST_FIXTURE_WITH_THF(SimpleAdd, ClContextControlFixture, AdditionTest) diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index d50b25377d..cf541f491b 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -58,6 +58,7 @@ #include "workloads/NeonPadWorkload.hpp" #include "workloads/NeonPermuteWorkload.hpp" #include "workloads/NeonPooling2dWorkload.hpp" +#include "workloads/NeonPooling3dWorkload.hpp" #include "workloads/NeonPreluWorkload.hpp" #include "workloads/NeonQLstmWorkload.hpp" #include "workloads/NeonQuantizeWorkload.hpp" @@ -435,6 +436,11 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, infos[1], *(PolymorphicDowncast(&descriptor)), reasonIfUnsupported); + case LayerType::Pooling3d: + return IsPooling3dSupported(infos[0], + infos[1], + *(PolymorphicDowncast(&descriptor)), + reasonIfUnsupported); case LayerType::Prelu: return IsPreluSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); case LayerType::QLstm: @@ -578,7 +584,7 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, default: // layers not supported in neon by default: // debug, fakequantization, precompiled, - // standin, switch, pooling3d + // standin, switch return false; } } @@ -1213,6 +1219,14 @@ bool NeonLayerSupport::IsPooling2dSupported(const TensorInfo& input, FORWARD_WORKLOAD_VALIDATE_FUNC(NeonPooling2dWorkloadValidate, reasonIfUnsupported, input, output, descriptor); } +bool NeonLayerSupport::IsPooling3dSupported(const TensorInfo& input, + const TensorInfo& output, + const Pooling3dDescriptor& descriptor, + Optional reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(NeonPooling3dWorkloadValidate, reasonIfUnsupported, input, output, descriptor); +} + bool NeonLayerSupport::IsPreluSupported(const armnn::TensorInfo &input, const armnn::TensorInfo &alpha, const armnn::TensorInfo &output, diff --git a/src/backends/neon/NeonLayerSupport.hpp b/src/backends/neon/NeonLayerSupport.hpp index b82351872b..783e6a0c46 100644 --- a/src/backends/neon/NeonLayerSupport.hpp +++ b/src/backends/neon/NeonLayerSupport.hpp @@ -246,7 +246,10 @@ public: const TensorInfo& output, const Pooling2dDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()) const override; - + bool IsPooling3dSupported(const TensorInfo& input, + const TensorInfo& output, + const Pooling3dDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()) const override; bool IsPreluSupported(const TensorInfo& input, const TensorInfo& alpha, const TensorInfo& output, diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index f087c6262a..ff9ef268ec 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -461,6 +461,11 @@ std::unique_ptr NeonWorkloadFactory::CreateWorkload(LayerType type, auto pooling2dQueueDescriptor = PolymorphicDowncast(&descriptor); return std::make_unique(*pooling2dQueueDescriptor, info); } + case LayerType::Pooling3d : + { + auto pooling3dQueueDescriptor = PolymorphicDowncast(&descriptor); + return std::make_unique(*pooling3dQueueDescriptor, info); + } case LayerType::PreCompiled : { auto preCompiledQueueDescriptor = PolymorphicDowncast(&descriptor); diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index d940c92ba1..7c0974c13f 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -67,6 +67,7 @@ BACKEND_SOURCES := \ workloads/NeonPadWorkload.cpp \ workloads/NeonPermuteWorkload.cpp \ workloads/NeonPooling2dWorkload.cpp \ + workloads/NeonPooling3dWorkload.cpp \ workloads/NeonPreluWorkload.cpp \ workloads/NeonQLstmWorkload.cpp \ workloads/NeonQuantizedLstmWorkload.cpp \ diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index b813c33763..91fb4d77a8 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -458,7 +458,7 @@ ARMNN_AUTO_TEST_CASE(DequantizeSimpleUint8, DequantizeSimpleUint8Test) ARMNN_AUTO_TEST_CASE(DequantizeOffsetUint8, DequantizeOffsetUint8Test) ARMNN_AUTO_TEST_CASE(DequantizeSimpleInt16, DequantizeSimpleInt16Test) -// Pooling +// Pooling2d ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling2dSize3x3Stride2x4, SimpleMaxPooling2dSize3x3Stride2x4Test, true) ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling2dSize3x3Stride2x4Uint8, @@ -522,6 +522,111 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(IgnorePaddingL2Pooling2dSize3, IgnorePaddingL2Pool ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_IgnorePaddingL2Pooling2dSize3Uint8, IgnorePaddingL2Pooling2dSize3Uint8Test) +//Pooling 3d +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling3dSize2x2x2Stride1x1x1, + SimpleMaxPooling3dSize2x2x2Stride1x1x1Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling3dSize2x2x2Stride1x1x1Uint8, + SimpleMaxPooling3dSize2x2x2Stride1x1x1Uint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling3d, + SimpleMaxPooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleMaxPooling3dUint8, + SimpleMaxPooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(IgnorePaddingSimpleMaxPooling3d, + IgnorePaddingSimpleMaxPooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(IgnorePaddingSimpleMaxPooling3dUint8, + IgnorePaddingSimpleMaxPooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleAveragePooling3d, + SimpleAveragePooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleAveragePooling3dUint8, + SimpleAveragePooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(LargeTensorsAveragePooling3d, + LargeTensorsAveragePooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(LargeTensorsAveragePooling3dUint8, + LargeTensorsAveragePooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(IgnorePaddingSimpleAveragePooling3d, + IgnorePaddingSimpleAveragePooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleL2Pooling3d, + SimpleL2Pooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(IgnorePaddingSimpleL2Pooling3d, + IgnorePaddingSimpleL2Pooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(AsymmetricNonSquareMaxPooling3d, + AsymmetricNonSquareMaxPooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(AsymmetricNonSquareMaxPooling3dUint8, + AsymmetricNonSquareMaxPooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(AsymmetricNonSquareAveragePooling3d, + AsymmetricNonSquareAveragePooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(AsymmetricNonSquareAveragePooling3dUint8, + AsymmetricNonSquareAveragePooling3dUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(AsymmetricNonSquareL2Pooling3d, + AsymmetricNonSquareL2Pooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPool, + AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolUint8, + AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPool, + AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8, + AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTEDAsymmetricNonSquareL2Pooling3dWithPaddingOnlyPool, + AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(UNSUPPORTEDAsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolUint8, + AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolUint8Test, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleAveragePooling3d, + SimpleAveragePooling3dTest, + DataLayout::NDHWC) + +ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleAveragePooling3dUint8, + SimpleAveragePooling3dUint8Test, + DataLayout::NDHWC) + // Activation ARMNN_AUTO_TEST_CASE_WITH_THF(ConstantLinearActivation, ConstantLinearActivationTest) @@ -1572,6 +1677,13 @@ ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareL2Pooling2dWithReference, Compa ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(UNSUPPORTED_CompareL2Pooling2dWithReferenceUint8, ComparePooling2dUint8Test, PoolingAlgorithm::L2) +ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareMaxPooling3dWithRef, ComparePooling3dTest, PoolingAlgorithm::Max, + DataLayout::NDHWC) +ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareAveragePooling3dWithRef, ComparePooling3dTest, + PoolingAlgorithm::Average, DataLayout::NDHWC) +ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareL2Pooling3dWithRef, ComparePooling3dTest, PoolingAlgorithm::L2, + DataLayout::NDHWC) + // Moved to NeonLayerTests_NDK_Bug.cpp //ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareSoftmaxBeta1WithReference, CompareSoftmaxTest, 1.0f) //ARMNN_COMPARE_REF_AUTO_TEST_CASE_WITH_THF(CompareSoftmaxBeta2WithReference, CompareSoftmaxTest, 2.0f) diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 16fae69029..2209bf47e2 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -94,6 +94,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonPermuteWorkload.hpp NeonPooling2dWorkload.cpp NeonPooling2dWorkload.hpp + NeonPooling3dWorkload.hpp + NeonPooling3dWorkload.cpp NeonPreluWorkload.cpp NeonPreluWorkload.hpp NeonQLstmWorkload.cpp diff --git a/src/backends/neon/workloads/NeonPooling3dWorkload.cpp b/src/backends/neon/workloads/NeonPooling3dWorkload.cpp new file mode 100644 index 0000000000..4bc4f986c3 --- /dev/null +++ b/src/backends/neon/workloads/NeonPooling3dWorkload.cpp @@ -0,0 +1,64 @@ +// +// Copyright © 2022 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#include "NeonPooling3dWorkload.hpp" +#include "NeonWorkloadUtils.hpp" +#include +#include +#include +#include + +namespace armnn +{ + using namespace armcomputetensorutils; + arm_compute::Status NeonPooling3dWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const Pooling3dDescriptor& descriptor) + { + const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); + arm_compute::Pooling3dLayerInfo layerInfo = BuildArmComputePooling3dLayerInfo(descriptor); + return arm_compute::NEPooling3dLayer::validate(&aclInputInfo, &aclOutputInfo, layerInfo); + } + + NeonPooling3dWorkload::NeonPooling3dWorkload( const Pooling3dQueueDescriptor& descriptor, + const WorkloadInfo& info) + : NeonBaseWorkload(descriptor, info) + { + // Report Profiling Details + ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonPooling3dWorkload_Construct", + descriptor.m_Parameters, + info, + this->GetGuid()); + + m_Data.ValidateInputsOutputs("NeonPooling3dWorkload", 1, 1); + + arm_compute::ITensor& input = static_cast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); + + arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout); + input.info()->set_data_layout(aclDataLayout); + output.info()->set_data_layout(aclDataLayout); + + // flag to use wider accumulators (32 bit instead of 16 for FP16) to improve accuracy + // enable fp_mixed_precision for the the FP16 cases that + // accumulation reaches a limit beyond which there is no more increment of the value + bool fpMixedPrecision = false; + + arm_compute::Pooling3dLayerInfo layerInfo = BuildArmComputePooling3dLayerInfo(m_Data.m_Parameters, + fpMixedPrecision); + { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "NeonPooling3dWorkload_configure"); + + auto layer = std::make_unique(); + layer->configure(&input, &output, layerInfo); + m_PoolingLayer.reset(layer.release()); + } + } + void NeonPooling3dWorkload::Execute() const + { + ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonPooling3dWorkload_Execute", this->GetGuid()); + m_PoolingLayer->run(); + } +} diff --git a/src/backends/neon/workloads/NeonPooling3dWorkload.hpp b/src/backends/neon/workloads/NeonPooling3dWorkload.hpp new file mode 100644 index 0000000000..03453f1eee --- /dev/null +++ b/src/backends/neon/workloads/NeonPooling3dWorkload.hpp @@ -0,0 +1,33 @@ +// +// Copyright © 2022 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "NeonBaseWorkload.hpp" + +#include + +namespace armnn +{ + + arm_compute::Status NeonPooling3dWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const Pooling3dDescriptor& descriptor); + + class NeonPooling3dWorkload : public NeonBaseWorkload + { + public: + using BaseWorkload::m_Data; + + NeonPooling3dWorkload(const Pooling3dQueueDescriptor& descriptor, + const WorkloadInfo& info); + + void Execute() const override; + + private: + std::unique_ptr m_PoolingLayer; + }; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index d486a1d988..8f83674950 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -49,6 +49,7 @@ #include "NeonPadWorkload.hpp" #include "NeonPermuteWorkload.hpp" #include "NeonPooling2dWorkload.hpp" +#include "NeonPooling3dWorkload.hpp" #include "NeonPreluWorkload.hpp" #include "NeonQLstmWorkload.hpp" #include "NeonQuantizedLstmWorkload.hpp" -- cgit v1.2.1