From 9199e58813ef262fefdf70ec992b5192b5a05559 Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Thu, 5 Sep 2019 17:35:31 +0100 Subject: IVGCVSW-3740 Add Reference Workload support for ABS * Implemented RefAbsWorkload and unit tests Signed-off-by: Sadik Armagan Change-Id: Ibfcdb2b37fd8d240c181f96856e2c997a4b88914 --- src/backends/backendsCommon/common.mk | 1 + src/backends/backendsCommon/test/CMakeLists.txt | 2 + src/backends/backendsCommon/test/LayerTests.hpp | 1 + .../backendsCommon/test/layerTests/AbsTestImpl.cpp | 241 +++++++++++++++++++++ .../backendsCommon/test/layerTests/AbsTestImpl.hpp | 28 +++ 5 files changed, 273 insertions(+) create mode 100644 src/backends/backendsCommon/test/layerTests/AbsTestImpl.cpp create mode 100644 src/backends/backendsCommon/test/layerTests/AbsTestImpl.hpp (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk index 88eae35730..f75870adb7 100644 --- a/src/backends/backendsCommon/common.mk +++ b/src/backends/backendsCommon/common.mk @@ -33,6 +33,7 @@ COMMON_TEST_SOURCES := \ test/CommonTestUtils.cpp \ test/JsonPrinterTestImpl.cpp \ test/TensorCopyUtils.cpp \ + test/layerTests/AbsTestImpl.cpp \ test/layerTests/ActivationTestImpl.cpp \ test/layerTests/AdditionTestImpl.cpp \ test/layerTests/BatchNormalizationTestImpl.cpp \ diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index c0760cbef7..6b715226a2 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -38,6 +38,8 @@ list(APPEND armnnBackendsCommonUnitTests_sources TensorCopyUtils.hpp WorkloadFactoryHelper.hpp WorkloadTestUtils.hpp + layerTests/AbsTestImpl.cpp + layerTests/AbsTestImpl.hpp layerTests/ActivationTestImpl.cpp layerTests/ActivationTestImpl.hpp layerTests/AdditionTestImpl.cpp diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index a4c09a63dc..bf2ef6abb6 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -5,6 +5,7 @@ #pragma once +#include #include #include #include diff --git a/src/backends/backendsCommon/test/layerTests/AbsTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/AbsTestImpl.cpp new file mode 100644 index 0000000000..60ac54b701 --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/AbsTestImpl.cpp @@ -0,0 +1,241 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "AbsTestImpl.hpp" + +#include + +#include +#include +#include + +#include + +namespace +{ + +template> +LayerTestResult Abs2dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::TensorInfo inputTensorInfo, + const armnn::TensorInfo outputTensorInfo, + const std::vector& inputValues, + const std::vector& expectedOutputValues) +{ + auto inputTensor = MakeTensor(inputTensorInfo, ConvertToDataType(inputValues,inputTensorInfo)); + + LayerTestResult result(outputTensorInfo); + + result.outputExpected = MakeTensor(outputTensorInfo, + ConvertToDataType(expectedOutputValues,outputTensorInfo)); + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::AbsQueueDescriptor descriptor; + + armnn::WorkloadInfo info; + + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateAbs(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]); + + workload->PostAllocationConfigure(); + workload->Execute(); + + CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get()); + + return result; +} + +} // anonymous namespace + +template +LayerTestResult Abs2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + const armnn::TensorShape inputShape{ 2, 2 }; + const armnn::TensorShape outputShape{ 2, 2 }; + + float qScale = 0.0625f; + int32_t qOffset = 64; + + if (ArmnnType == armnn::DataType::QuantisedSymm16) + { + qScale = 0.1f; + qOffset = 0; + } + + armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType); + inputTensorInfo.SetQuantizationScale(qScale); + inputTensorInfo.SetQuantizationOffset(qOffset); + + armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType); + outputTensorInfo.SetQuantizationScale(qScale); + outputTensorInfo.SetQuantizationOffset(qOffset); + + std::vector inputValues + { + -0.1f, 0.2f, + 0.3f, -0.4f + }; + + // Calculate output values for input. + auto f = [](float value) + { + return std::abs(value); + }; + std::vector expectedOutputValues(inputValues.size()); + std::transform(inputValues.begin(), inputValues.end(), expectedOutputValues.begin(), f); + + return Abs2dTestCommon(workloadFactory, memoryManager, + inputTensorInfo, outputTensorInfo, + inputValues, expectedOutputValues); +} + +template +LayerTestResult Abs3dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + const armnn::TensorShape inputShape{ 3, 1, 2 }; + const armnn::TensorShape outputShape{ 3, 1, 2 }; + + float qScale = 0.0625f; + int32_t qOffset = 64; + + if (ArmnnType == armnn::DataType::QuantisedSymm16) + { + qScale = 0.1f; + qOffset = 0; + } + + armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType); + inputTensorInfo.SetQuantizationScale(qScale); + inputTensorInfo.SetQuantizationOffset(qOffset); + + armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType); + outputTensorInfo.SetQuantizationScale(qScale); + outputTensorInfo.SetQuantizationOffset(qOffset); + + std::vector inputValues + { + -0.1f, -0.2f, -0.3f, + 0.1f, 0.2f, 0.3f + }; + + auto f = [](float value) + { + return std::abs(value); + }; + std::vectorexpectedOutputValues(inputValues.size()); + std::transform(inputValues.begin(), inputValues.end(), expectedOutputValues.begin(), f); + + auto inputTensor = MakeTensor(inputTensorInfo, ConvertToDataType(inputValues,inputTensorInfo)); + + LayerTestResult result(outputTensorInfo); + result.outputExpected = MakeTensor(outputTensorInfo, + ConvertToDataType(expectedOutputValues,outputTensorInfo)); + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::AbsQueueDescriptor descriptor; + + armnn::WorkloadInfo info; + + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateAbs(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]); + + workload->PostAllocationConfigure(); + workload->Execute(); + + CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get()); + + return result; +} + +template +LayerTestResult AbsZeroTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + const armnn::TensorShape inputShape{ 1, 2 }; + const armnn::TensorShape outputShape{ 1, 2 }; + + armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType); + inputTensorInfo.SetQuantizationScale(0.1f); + + armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType); + outputTensorInfo.SetQuantizationScale(0.1f); + + std::vector inputValues + { + 0.f, -0.f + }; + + std::vector expectedOutputValues + { + 0.f, 0.f + }; + + return Abs2dTestCommon(workloadFactory, memoryManager, + inputTensorInfo, outputTensorInfo, + inputValues, expectedOutputValues); +} + +// +// Explicit template specializations +// + +template LayerTestResult, 2> +Abs2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 2> +Abs2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 2> +Abs2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 3> +Abs3dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 3> +Abs3dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 3> +Abs3dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 2> +AbsZeroTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); \ No newline at end of file diff --git a/src/backends/backendsCommon/test/layerTests/AbsTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/AbsTestImpl.hpp new file mode 100644 index 0000000000..88bf1ea8a5 --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/AbsTestImpl.hpp @@ -0,0 +1,28 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "LayerTestResult.hpp" + +#include + +#include +#include + +template> +LayerTestResult Abs2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template> +LayerTestResult Abs3dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template> +LayerTestResult AbsZeroTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -- cgit v1.2.1