From a160b245a5c876d3630651e938a7c45ee30645be Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Thu, 18 Oct 2018 10:33:23 +0100 Subject: IVGCVSW-2033 Add unit tests for the newly implemented NHWC support in ref Normalization * Added create workload unit tests for the NHWC data layout Change-Id: Id4813105c027a26e277de64fecea1845fea39fd9 --- src/armnn/test/CreateWorkload.hpp | 11 ++++++-- src/backends/cl/test/ClCreateWorkloadTests.cpp | 13 +++++---- src/backends/neon/test/NeonCreateWorkloadTests.cpp | 8 ++++-- .../reference/test/RefCreateWorkloadTests.cpp | 31 +++++++++++++++++----- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/armnn/test/CreateWorkload.hpp b/src/armnn/test/CreateWorkload.hpp index f3cf544fa3..51820a425f 100644 --- a/src/armnn/test/CreateWorkload.hpp +++ b/src/armnn/test/CreateWorkload.hpp @@ -517,9 +517,16 @@ std::unique_ptr CreateNormalizationWorkloadTest(armnn::IW Layer* const input = graph.AddLayer(0, "input"); Layer* const output = graph.AddLayer(0, "output"); + TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? + TensorShape{ 3, 5, 5, 1 } : TensorShape{ 3, 1, 5, 5 }; + TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? + TensorShape{ 3, 5, 5, 1 } : TensorShape{ 3, 1, 5, 5 }; + // Connects up. - Connect(input, layer, TensorInfo({3, 5, 5, 1}, DataType)); - Connect(layer, output, TensorInfo({3, 5, 5, 1}, DataType)); + armnn::TensorInfo inputTensorInfo(inputShape, DataType); + armnn::TensorInfo outputTensorInfo(outputShape, DataType); + Connect(input, layer, inputTensorInfo); + Connect(layer, output, outputTensorInfo); CreateTensorHandles(graph, factory); // Makes the workload and checks it. diff --git a/src/backends/cl/test/ClCreateWorkloadTests.cpp b/src/backends/cl/test/ClCreateWorkloadTests.cpp index 526dc68fc5..756b4a603b 100644 --- a/src/backends/cl/test/ClCreateWorkloadTests.cpp +++ b/src/backends/cl/test/ClCreateWorkloadTests.cpp @@ -337,17 +337,20 @@ static void ClNormalizationWorkloadTest(DataLayout dataLayout) { Graph graph; ClWorkloadFactory factory; - - auto workload = CreateNormalizationWorkloadTest - (factory, graph, dataLayout); + auto workload = CreateNormalizationWorkloadTest(factory, graph, dataLayout); // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest). NormalizationQueueDescriptor queueDescriptor = workload->GetData(); auto inputHandle = boost::polymorphic_downcast(queueDescriptor.m_Inputs[0]); auto outputHandle = boost::polymorphic_downcast(queueDescriptor.m_Outputs[0]); - BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 5, 5, 1})); - BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 5, 5, 1})); + std::initializer_list inputShape = (dataLayout == DataLayout::NCHW) ? + std::initializer_list({3, 5, 5, 1}) : std::initializer_list({3, 1, 5, 5}); + std::initializer_list outputShape = (dataLayout == DataLayout::NCHW) ? + std::initializer_list({3, 5, 5, 1}) : std::initializer_list({3, 1, 5, 5}); + + BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape)); + BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape)); } BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload) diff --git a/src/backends/neon/test/NeonCreateWorkloadTests.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp index 4b6ab51924..a588a3ecc8 100644 --- a/src/backends/neon/test/NeonCreateWorkloadTests.cpp +++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp @@ -296,8 +296,12 @@ static void NeonCreateNormalizationWorkloadTest(DataLayout dataLayout) NormalizationQueueDescriptor queueDescriptor = workload->GetData(); auto inputHandle = boost::polymorphic_downcast(queueDescriptor.m_Inputs[0]); auto outputHandle = boost::polymorphic_downcast(queueDescriptor.m_Outputs[0]); - BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({3, 5, 5, 1}, DataType))); - BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({3, 5, 5, 1}, DataType))); + + TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5}; + TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5}; + + BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType))); + BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType))); } #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 236267c177..1ec7749168 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -231,21 +231,40 @@ BOOST_AUTO_TEST_CASE(CreateFullyConnectedUint8Workload) } template -static void RefCreateNormalizationWorkloadTest() +static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout) { Graph graph; RefWorkloadFactory factory; - auto workload = CreateNormalizationWorkloadTest(factory, graph); + auto workload = CreateNormalizationWorkloadTest(factory, graph, dataLayout); + + TensorShape inputShape; + TensorShape outputShape; + + switch (dataLayout) + { + case DataLayout::NHWC: + inputShape = { 3, 1, 5, 5 }; + outputShape = { 3, 1, 5, 5 }; + break; + case DataLayout::NCHW: + default: + inputShape = { 3, 5, 5, 1 }; + outputShape = { 3, 5, 5, 1 }; + break; + } // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest). - CheckInputOutput(std::move(workload), - TensorInfo({3, 5, 5, 1}, DataType), - TensorInfo({3, 5, 5, 1}, DataType)); + CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType)); } BOOST_AUTO_TEST_CASE(CreateRefNormalizationNchwWorkload) { - RefCreateNormalizationWorkloadTest(); + RefCreateNormalizationWorkloadTest(DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(CreateRefNormalizationNhwcWorkload) +{ + RefCreateNormalizationWorkloadTest(DataLayout::NHWC); } template -- cgit v1.2.1