diff options
Diffstat (limited to 'src/backends/backendsCommon/test')
-rw-r--r-- | src/backends/backendsCommon/test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/DebugTestImpl.hpp | 272 | ||||
-rwxr-xr-x | src/backends/backendsCommon/test/LayerTests.cpp | 59 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/LayerTests.hpp | 34 |
4 files changed, 364 insertions, 2 deletions
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 <armnn/ArmNN.hpp> +#include <armnn/Tensor.hpp> +#include <armnn/TypesUtils.hpp> + +#include <backendsCommon/CpuTensorHandle.hpp> +#include <backendsCommon/IBackendInternal.hpp> +#include <backendsCommon/WorkloadFactory.hpp> + +#include <test/TensorHelpers.hpp> + +namespace +{ + +template<typename T, std::size_t Dim> +LayerTestResult<T, Dim> DebugTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::TensorInfo& inputTensorInfo, + armnn::TensorInfo& outputTensorInfo, + std::vector<float>& inputData, + std::vector<float>& outputExpectedData, + armnn::DebugQueueDescriptor descriptor, + const std::string expectedStringOutput, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + if(armnn::IsQuantizedType<T>()) + { + inputTensorInfo.SetQuantizationScale(qScale); + inputTensorInfo.SetQuantizationOffset(qOffset); + + outputTensorInfo.SetQuantizationScale(qScale); + outputTensorInfo.SetQuantizationOffset(qOffset); + } + + boost::multi_array<T, Dim> input = + MakeTensor<T, Dim>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData)); + + LayerTestResult<T, Dim> ret(outputTensorInfo); + ret.outputExpected = + MakeTensor<T, Dim>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, outputExpectedData)); + + std::unique_ptr<armnn::ITensorHandle> inputHandle = + workloadFactory.CreateTensorHandle(inputTensorInfo); + + std::unique_ptr<armnn::ITensorHandle> outputHandle = + workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::WorkloadInfo info; + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr<armnn::IWorkload> 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 <typename T> +LayerTestResult<T, 4> 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<T>()); + outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>()); + + std::vector<float> input = std::vector<float>( + { + 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<float> outputExpected = std::vector<float>( + { + 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<T, 4>(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template <typename T> +LayerTestResult<T, 3> 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<T>()); + outputTensorInfo = armnn::TensorInfo(3, outputShape, armnn::GetDataType<T>()); + + std::vector<float> input = std::vector<float>( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + }); + + std::vector<float> outputExpected = std::vector<float>( + { + 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<T, 3>(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template <typename T> +LayerTestResult<T, 2> 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<T>()); + outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::GetDataType<T>()); + + std::vector<float> input = std::vector<float>( + { + 1.0f, 2.0f, + 3.0f, 4.0f, + }); + + std::vector<float> outputExpected = std::vector<float>( + { + 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<T, 2>(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + input, + outputExpected, + desc, + expectedStringOutput); +} + +template <typename T> +LayerTestResult<T, 1> 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<T>()); + outputTensorInfo = armnn::TensorInfo(1, outputShape, armnn::GetDataType<T>()); + + std::vector<float> input = std::vector<float>( + { + 1.0f, 2.0f, 3.0f, 4.0f, + }); + + std::vector<float> outputExpected = std::vector<float>( + { + 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<T, 1>(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<float> ConvInput3x8x16({ @@ -7930,4 +7931,60 @@ LayerTestResult<uint8_t, 4> BatchToSpaceNdNchwUintTest3( return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager, armnn::DataLayout::NCHW, inputShape, input, blockShape, crops, outputShape, expectedOutput); -}
\ No newline at end of file +} + +LayerTestResult<float, 4> Debug4DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug4DTest<float>(workloadFactory, memoryManager); +} + +LayerTestResult<float, 3> Debug3DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug3DTest<float>(workloadFactory, memoryManager); +} + +LayerTestResult<float, 2> Debug2DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug2DTest<float>(workloadFactory, memoryManager); +} + +LayerTestResult<float, 1> Debug1DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug1DTest<float>(workloadFactory, memoryManager); +} + +LayerTestResult<uint8_t, 4> Debug4DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug4DTest<uint8_t>(workloadFactory, memoryManager); +} + +LayerTestResult<uint8_t, 3> Debug3DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug3DTest<uint8_t>(workloadFactory, memoryManager); +} + +LayerTestResult<uint8_t, 2> Debug2DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug2DTest<uint8_t>(workloadFactory, memoryManager); +} + +LayerTestResult<uint8_t, 1> Debug1DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Debug1DTest<uint8_t>(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<uint8_t, 4> BatchToSpaceNdNchwUintTest3( LayerTestResult<float, 4> StridedSlice4DFloat32Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); - + LayerTestResult<float, 4> StridedSlice4DReverseFloat32Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); @@ -1207,3 +1207,35 @@ LayerTestResult<uint8_t, 2> StridedSlice2DUint8Test( LayerTestResult<uint8_t, 2> StridedSlice2DReverseUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<float, 4> Debug4DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<float, 3> Debug3DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<float, 2> Debug2DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<float, 1> Debug1DFloat32Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<uint8_t, 4> Debug4DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<uint8_t, 3> Debug3DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<uint8_t, 2> Debug2DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<uint8_t, 1> Debug1DUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); |