From cfdcadf9feebaa112545923343875e790a18cc1c Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Thu, 6 Dec 2018 11:54:33 +0000 Subject: IVGCVSW-2316 Add reference implementation and unit tests for Debug Change-Id: Ib2e5de2a057da57ef77a9f5c4367d699d4773294 --- src/backends/backendsCommon/test/CMakeLists.txt | 1 + src/backends/backendsCommon/test/DebugTestImpl.hpp | 272 +++++++++++++++++++++ src/backends/backendsCommon/test/LayerTests.cpp | 59 ++++- src/backends/backendsCommon/test/LayerTests.hpp | 34 ++- 4 files changed, 364 insertions(+), 2 deletions(-) create mode 100644 src/backends/backendsCommon/test/DebugTestImpl.hpp (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index f1a4289d4c..8107176210 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources Conv2dTestImpl.hpp ConvertFp16ToFp32TestImpl.hpp ConvertFp32ToFp16TestImpl.hpp + DebugTestImpl.hpp EndToEndTestImpl.hpp FullyConnectedTestImpl.hpp IsLayerSupportedTestImpl.hpp diff --git a/src/backends/backendsCommon/test/DebugTestImpl.hpp b/src/backends/backendsCommon/test/DebugTestImpl.hpp new file mode 100644 index 0000000000..e0f8a35d0a --- /dev/null +++ b/src/backends/backendsCommon/test/DebugTestImpl.hpp @@ -0,0 +1,272 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "WorkloadTestUtils.hpp" + +#include +#include +#include + +#include +#include +#include + +#include + +namespace +{ + +template +LayerTestResult DebugTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::TensorInfo& inputTensorInfo, + armnn::TensorInfo& outputTensorInfo, + std::vector& inputData, + std::vector& outputExpectedData, + armnn::DebugQueueDescriptor descriptor, + const std::string expectedStringOutput, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + if(armnn::IsQuantizedType()) + { + inputTensorInfo.SetQuantizationScale(qScale); + inputTensorInfo.SetQuantizationOffset(qOffset); + + outputTensorInfo.SetQuantizationScale(qScale); + outputTensorInfo.SetQuantizationOffset(qOffset); + } + + boost::multi_array input = + MakeTensor(inputTensorInfo, QuantizedVector(qScale, qOffset, inputData)); + + LayerTestResult ret(outputTensorInfo); + ret.outputExpected = + MakeTensor(outputTensorInfo, QuantizedVector(qScale, qOffset, outputExpectedData)); + + std::unique_ptr inputHandle = + workloadFactory.CreateTensorHandle(inputTensorInfo); + + std::unique_ptr outputHandle = + workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::WorkloadInfo info; + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateDebug(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), input.data()); + + std::ostringstream oss; + std::streambuf* coutStreambuf = std::cout.rdbuf(); + std::cout.rdbuf(oss.rdbuf()); + + ExecuteWorkload(*workload, memoryManager); + + std::cout.rdbuf(coutStreambuf); + + BOOST_TEST(oss.str() == expectedStringOutput); + + CopyDataFromITensorHandle(ret.output.data(), outputHandle.get()); + + return ret; +} + +template +LayerTestResult Debug4DTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo inputTensorInfo; + armnn::TensorInfo outputTensorInfo; + + unsigned int inputShape[] = {1, 2, 2, 3}; + unsigned int outputShape[] = {1, 2, 2, 3}; + + armnn::DebugQueueDescriptor desc; + desc.m_Parameters.m_LayerName = "TestOutput"; + desc.m_Parameters.m_SlotIndex = 1; + + inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType()); + outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType()); + + std::vector input = std::vector( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + 10.0f, 11.0f, 12.0f, + }); + + std::vector outputExpected = std::vector( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + 10.0f, 11.0f, 12.0f, + }); + + const std::string expectedStringOutput = + "{ \"layer\": \"TestOutput\"," + " \"outputSlot\": 1," + " \"shape\": [1, 2, 2, 3]," + " \"min\": 1, \"max\": 12," + " \"data\": [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]] }\n"; + + return DebugTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template +LayerTestResult Debug3DTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo inputTensorInfo; + armnn::TensorInfo outputTensorInfo; + + unsigned int inputShape[] = {3, 3, 1}; + unsigned int outputShape[] = {3, 3, 1}; + + armnn::DebugQueueDescriptor desc; + desc.m_Parameters.m_LayerName = "TestOutput"; + + inputTensorInfo = armnn::TensorInfo(3, inputShape, armnn::GetDataType()); + outputTensorInfo = armnn::TensorInfo(3, outputShape, armnn::GetDataType()); + + std::vector input = std::vector( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + }); + + std::vector outputExpected = std::vector( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + }); + + const std::string expectedStringOutput = + "{ \"layer\": \"TestOutput\"," + " \"outputSlot\": 0," + " \"shape\": [3, 3, 1]," + " \"min\": 1, \"max\": 9," + " \"data\": [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]] }\n"; + + return DebugTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template +LayerTestResult Debug2DTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo inputTensorInfo; + armnn::TensorInfo outputTensorInfo; + + unsigned int inputShape[] = {2, 2}; + unsigned int outputShape[] = {2, 2}; + + armnn::DebugQueueDescriptor desc; + desc.m_Parameters.m_LayerName = "TestOutput"; + + inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::GetDataType()); + outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::GetDataType()); + + std::vector input = std::vector( + { + 1.0f, 2.0f, + 3.0f, 4.0f, + }); + + std::vector outputExpected = std::vector( + { + 1.0f, 2.0f, + 3.0f, 4.0f, + }); + + const std::string expectedStringOutput = + "{ \"layer\": \"TestOutput\"," + " \"outputSlot\": 0," + " \"shape\": [2, 2]," + " \"min\": 1, \"max\": 4," + " \"data\": [[1, 2], [3, 4]] }\n"; + + return DebugTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template +LayerTestResult Debug1DTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::TensorInfo inputTensorInfo; + armnn::TensorInfo outputTensorInfo; + + unsigned int inputShape[] = {4}; + unsigned int outputShape[] = {4}; + + armnn::DebugQueueDescriptor desc; + desc.m_Parameters.m_LayerName = "TestOutput"; + + inputTensorInfo = armnn::TensorInfo(1, inputShape, armnn::GetDataType()); + outputTensorInfo = armnn::TensorInfo(1, outputShape, armnn::GetDataType()); + + std::vector input = std::vector( + { + 1.0f, 2.0f, 3.0f, 4.0f, + }); + + std::vector outputExpected = std::vector( + { + 1.0f, 2.0f, 3.0f, 4.0f, + }); + + const std::string expectedStringOutput = + "{ \"layer\": \"TestOutput\"," + " \"outputSlot\": 0," + " \"shape\": [4]," + " \"min\": 1, \"max\": 4," + " \"data\": [1, 2, 3, 4] }\n"; + + return DebugTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +} // anonymous namespace diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 131b84c859..b44c835cb2 100755 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -40,6 +40,7 @@ #include "LstmTestImpl.hpp" #include "ConvertFp16ToFp32TestImpl.hpp" #include "ConvertFp32ToFp16TestImpl.hpp" +#include "DebugTestImpl.hpp" // 3-channel 16x8 image used as common input data for a number of Conv2d tests. static std::vector ConvInput3x8x16({ @@ -7930,4 +7931,60 @@ LayerTestResult BatchToSpaceNdNchwUintTest3( return BatchToSpaceNdHelper(workloadFactory, memoryManager, armnn::DataLayout::NCHW, inputShape, input, blockShape, crops, outputShape, expectedOutput); -} \ No newline at end of file +} + +LayerTestResult Debug4DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug4DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug3DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug3DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug2DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug2DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug1DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug1DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug4DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug4DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug3DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug3DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug2DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug2DTest(workloadFactory, memoryManager); +} + +LayerTestResult Debug1DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug1DTest(workloadFactory, memoryManager); +} diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 1797f9fa5e..1f38675b37 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -1139,7 +1139,7 @@ LayerTestResult BatchToSpaceNdNchwUintTest3( LayerTestResult StridedSlice4DFloat32Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); - + LayerTestResult StridedSlice4DReverseFloat32Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); @@ -1207,3 +1207,35 @@ LayerTestResult StridedSlice2DUint8Test( LayerTestResult StridedSlice2DReverseUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug4DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug3DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug2DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug1DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug4DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug3DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug2DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult Debug1DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -- cgit v1.2.1