diff options
author | Sadik Armagan <sadik.armagan@arm.com> | 2021-04-21 10:50:34 +0100 |
---|---|---|
committer | Sadik Armagan <sadik.armagan@arm.com> | 2021-04-22 14:55:17 +0000 |
commit | 48f011e1d5337ff580ae2c315f670bfc15413598 (patch) | |
tree | c526e755664689fe6771fe27392b9bea143e9258 | |
parent | f40d6d41b58a086273513d1b386725a7ae9c5503 (diff) | |
download | armnn-48f011e1d5337ff580ae2c315f670bfc15413598.tar.gz |
IVGCVSW-5419 'Add ACL Support for CAST Operator'
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I481343af311cf3cbc81eee80e80d8b5581fdfd7b
-rw-r--r-- | src/backends/neon/NeonLayerSupport.cpp | 11 | ||||
-rw-r--r-- | src/backends/neon/NeonLayerSupport.hpp | 4 | ||||
-rw-r--r-- | src/backends/neon/NeonTensorHandle.hpp | 4 | ||||
-rw-r--r-- | src/backends/neon/NeonWorkloadFactory.cpp | 6 | ||||
-rw-r--r-- | src/backends/neon/NeonWorkloadFactory.hpp | 3 | ||||
-rw-r--r-- | src/backends/neon/backend.mk | 1 | ||||
-rw-r--r-- | src/backends/neon/test/NeonLayerTests.cpp | 8 | ||||
-rw-r--r-- | src/backends/neon/workloads/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonCastWorkload.cpp | 44 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonCastWorkload.hpp | 28 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonWorkloads.hpp | 1 |
11 files changed, 112 insertions, 0 deletions
diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 66999c1a30..a1519cd46f 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -27,6 +27,7 @@ #include "workloads/NeonArgMinMaxWorkload.hpp" #include "workloads/NeonBatchNormalizationWorkload.hpp" #include "workloads/NeonBatchToSpaceNdWorkload.hpp" +#include "workloads/NeonCastWorkload.hpp" #include "workloads/NeonExpWorkload.hpp" #include "workloads/NeonComparisonWorkload.hpp" #include "workloads/NeonConstantWorkload.hpp" @@ -220,6 +221,16 @@ bool NeonLayerSupport::IsBatchToSpaceNdSupported(const TensorInfo& input, descriptor); } +bool NeonLayerSupport::IsCastSupported(const TensorInfo& input, + const TensorInfo& output, + Optional<std::string&> reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(NeonCastValidate, + reasonIfUnsupported, + input, + output); +} + bool NeonLayerSupport::IsComparisonSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/neon/NeonLayerSupport.hpp b/src/backends/neon/NeonLayerSupport.hpp index 2ae1b0d489..c2c81f480c 100644 --- a/src/backends/neon/NeonLayerSupport.hpp +++ b/src/backends/neon/NeonLayerSupport.hpp @@ -53,6 +53,10 @@ public: const BatchToSpaceNdDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsCastSupported(const TensorInfo& input, + const TensorInfo& output, + Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsComparisonSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/neon/NeonTensorHandle.hpp b/src/backends/neon/NeonTensorHandle.hpp index be5bd45956..ae8aa5d8c7 100644 --- a/src/backends/neon/NeonTensorHandle.hpp +++ b/src/backends/neon/NeonTensorHandle.hpp @@ -186,6 +186,7 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast<uint8_t*>(memory)); break; + case arm_compute::DataType::QSYMM8: case arm_compute::DataType::QASYMM8_SIGNED: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast<int8_t*>(memory)); @@ -228,6 +229,7 @@ private: armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory), this->GetTensor()); break; + case arm_compute::DataType::QSYMM8: case arm_compute::DataType::QASYMM8_SIGNED: armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory), this->GetTensor()); @@ -320,6 +322,7 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast<uint8_t*>(memory)); break; + case arm_compute::DataType::QSYMM8: case arm_compute::DataType::QASYMM8_SIGNED: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast<int8_t*>(memory)); @@ -354,6 +357,7 @@ private: armcomputetensorutils::CopyArmComputeITensorData(static_cast<const uint8_t*>(memory), this->GetTensor()); break; + case arm_compute::DataType::QSYMM8: case arm_compute::DataType::QASYMM8_SIGNED: armcomputetensorutils::CopyArmComputeITensorData(static_cast<const int8_t*>(memory), this->GetTensor()); diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index 28352011dc..9967fb8604 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -172,6 +172,12 @@ std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateBatchToSpaceNd(const Batch return std::make_unique<NeonBatchToSpaceNdWorkload>(descriptor, info); } +std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateCast(const CastQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return std::make_unique<NeonCastWorkload>(descriptor, info); +} + std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/neon/NeonWorkloadFactory.hpp b/src/backends/neon/NeonWorkloadFactory.hpp index ee11002033..e791bbcfd5 100644 --- a/src/backends/neon/NeonWorkloadFactory.hpp +++ b/src/backends/neon/NeonWorkloadFactory.hpp @@ -71,6 +71,9 @@ public: std::unique_ptr<IWorkload> CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor, const WorkloadInfo& Info) const override; + std::unique_ptr<IWorkload> CreateCast(const CastQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + std::unique_ptr<IWorkload> CreateComparison(const ComparisonQueueDescriptor& descriptor, const WorkloadInfo& Info) const override; diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index 6feeeb5f2c..21a1770cb5 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -28,6 +28,7 @@ BACKEND_SOURCES := \ workloads/NeonArgMinMaxWorkload.cpp \ workloads/NeonBatchNormalizationWorkload.cpp \ workloads/NeonBatchToSpaceNdWorkload.cpp \ + workloads/NeonCastWorkload.cpp \ workloads/NeonComparisonWorkload.cpp \ workloads/NeonConcatWorkload.cpp \ workloads/NeonConstantWorkload.cpp \ diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index f484eadd81..6cd26dfdd2 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -1391,6 +1391,14 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceMax2Float32, ReduceMaxSimpleTest2<DataType:: ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceMinFloat32, ReduceMinSimpleTest<DataType::Float32>) ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceMinNegativeAxisFloat32, ReduceMinNegativeAxisTest<DataType::Float32>) +// Cast +ARMNN_AUTO_TEST_CASE_WITH_THF(CastInt32ToFloat, CastInt32ToFloat2dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(CastInt8AsymmToFloat, CastInt8AsymmToFloat2dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(CastUIntToFloat, CastUInt8ToFloat2dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(CastFloatToIn8, CastFloat32ToInt82dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(CastFloatToUInt8, CastFloat32ToUInt82dTest) + + #if defined(ARMNNREF_ENABLED) // The ARMNN_COMPARE_REF_AUTO_TEST_CASE and the ARMNN_COMPARE_REF_FIXTURE_TEST_CASE test units are not available diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 7c2b185ec3..f8fc18fdda 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -16,6 +16,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonBatchNormalizationWorkload.hpp NeonBatchToSpaceNdWorkload.cpp NeonBatchToSpaceNdWorkload.hpp + NeonCastWorkload.cpp + NeonCastWorkload.hpp NeonComparisonWorkload.cpp NeonComparisonWorkload.hpp NeonConcatWorkload.cpp diff --git a/src/backends/neon/workloads/NeonCastWorkload.cpp b/src/backends/neon/workloads/NeonCastWorkload.cpp new file mode 100644 index 0000000000..4727fe127e --- /dev/null +++ b/src/backends/neon/workloads/NeonCastWorkload.cpp @@ -0,0 +1,44 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonCastWorkload.hpp" +#include "NeonWorkloadUtils.hpp" + +#include <aclCommon/ArmComputeTensorHandle.hpp> +#include <aclCommon/ArmComputeTensorUtils.hpp> + +#include <armnn/utility/PolymorphicDowncast.hpp> + +namespace armnn +{ + +static constexpr arm_compute::ConvertPolicy g_AclConvertPolicy = arm_compute::ConvertPolicy::SATURATE; + +arm_compute::Status NeonCastValidate(const TensorInfo& input, const TensorInfo& output) +{ + arm_compute::TensorInfo aclInput = armcomputetensorutils::BuildArmComputeTensorInfo(input); + arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + return arm_compute::NECast::validate(&aclInput, &aclOutput, g_AclConvertPolicy); +} + +NeonCastWorkload::NeonCastWorkload(const CastQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload<CastQueueDescriptor>(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonCastWorkload", 1, 1); + + arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor(); + + m_CastLayer.configure(&input, &output, g_AclConvertPolicy); +} + +void NeonCastWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonCastWorkload_Execute"); + m_CastLayer.run(); +} + +} // namespace armnn diff --git a/src/backends/neon/workloads/NeonCastWorkload.hpp b/src/backends/neon/workloads/NeonCastWorkload.hpp new file mode 100644 index 0000000000..4247c2e712 --- /dev/null +++ b/src/backends/neon/workloads/NeonCastWorkload.hpp @@ -0,0 +1,28 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <backendsCommon/Workload.hpp> + +#include <arm_compute/core/Error.h> +#include <arm_compute/runtime/NEON/functions/NECast.h> + +namespace armnn +{ + +arm_compute::Status NeonCastValidate(const TensorInfo& input, const TensorInfo& output); + +class NeonCastWorkload : public BaseWorkload<CastQueueDescriptor> +{ +public: + NeonCastWorkload(const CastQueueDescriptor& descriptor, const WorkloadInfo& info); + virtual void Execute() const override; + +private: + mutable arm_compute::NECast m_CastLayer; +}; + +} // namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index 4eb526a04d..16035e02cd 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -10,6 +10,7 @@ #include "NeonArgMinMaxWorkload.hpp" #include "NeonBatchNormalizationWorkload.hpp" #include "NeonBatchToSpaceNdWorkload.hpp" +#include "NeonCastWorkload.hpp" #include "NeonComparisonWorkload.hpp" #include "NeonConcatWorkload.hpp" #include "NeonConstantWorkload.hpp" |