From 7c1603a4e310c5b7b0d3bdddc0c80a63a7661107 Mon Sep 17 00:00:00 2001 From: Matthew Bentham Date: Fri, 21 Jun 2019 17:22:23 +0100 Subject: IVGCVSW-3307 Add RefMemoryManager Simple pool memory manager for use in the reference backend, in order to make the backend usable for testing large networks. Change-Id: I5694da29052c60f95b57da595c64cc114d75b8ba Signed-off-by: Matthew Bentham --- src/backends/reference/test/CMakeLists.txt | 2 + .../reference/test/RefCreateWorkloadTests.cpp | 48 +++++++++++--------- .../reference/test/RefMemoryManagerTests.cpp | 51 ++++++++++++++++++++++ .../reference/test/RefTensorHandleTests.cpp | 48 ++++++++++++++++++++ 4 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 src/backends/reference/test/RefMemoryManagerTests.cpp create mode 100644 src/backends/reference/test/RefTensorHandleTests.cpp (limited to 'src/backends/reference/test') diff --git a/src/backends/reference/test/CMakeLists.txt b/src/backends/reference/test/CMakeLists.txt index 9e5711e608..b56b35354e 100644 --- a/src/backends/reference/test/CMakeLists.txt +++ b/src/backends/reference/test/CMakeLists.txt @@ -10,8 +10,10 @@ list(APPEND armnnRefBackendUnitTests_sources RefJsonPrinterTests.cpp RefLayerSupportTests.cpp RefLayerTests.cpp + RefMemoryManagerTests.cpp RefOptimizedNetworkTests.cpp RefRuntimeTests.cpp + RefTensorHandleTests.cpp RefWorkloadFactoryHelper.hpp ) diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 945a87430c..8fe18f5d78 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -36,6 +36,14 @@ void CheckInputsOutput(std::unique_ptr workload, BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1)); BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo)); } + +armnn::RefWorkloadFactory GetFactory() +{ + std::shared_ptr memoryManager = std::make_shared(); + return RefWorkloadFactory(memoryManager); +} + + } BOOST_AUTO_TEST_SUITE(CreateWorkloadRef) @@ -44,7 +52,7 @@ template static void RefCreateActivationWorkloadTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateActivationWorkloadTest(factory, graph); // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest). @@ -70,7 +78,7 @@ template ( factory, graph); @@ -180,7 +188,7 @@ template static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateBatchNormalizationWorkloadTest(factory, graph, dataLayout); @@ -244,7 +252,7 @@ BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc) BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateConvertFp16ToFp32WorkloadTest(factory, graph); // Checks that outputs and inputs are as we expect them @@ -255,7 +263,7 @@ BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload) BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateConvertFp32ToFp16WorkloadTest(factory, graph); // Checks that outputs and inputs are as we expect them @@ -266,7 +274,7 @@ BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload) static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateConvolution2dWorkloadTest (factory, graph, dataLayout); @@ -294,7 +302,7 @@ BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload) static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateDepthwiseConvolution2dWorkloadTest (factory, graph, dataLayout); @@ -318,7 +326,7 @@ template static void RefCreateFullyConnectedWorkloadTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateFullyConnectedWorkloadTest(factory, graph); // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest). @@ -348,7 +356,7 @@ template static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateNormalizationWorkloadTest(factory, graph, dataLayout); TensorShape inputShape; @@ -405,7 +413,7 @@ template static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreatePooling2dWorkloadTest(factory, graph, dataLayout); TensorShape inputShape; @@ -463,7 +471,7 @@ template static void RefCreateSoftmaxWorkloadTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateSoftmaxWorkloadTest(factory, graph); // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest). @@ -492,7 +500,7 @@ template static void RefCreateSplitterWorkloadTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateSplitterWorkloadTest(factory, graph); // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest). @@ -530,7 +538,7 @@ static void RefCreateSplitterConcatWorkloadTest() // of the concat. Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workloads = CreateSplitterConcatWorkloadTest (factory, graph); @@ -570,7 +578,7 @@ static void RefCreateSingleOutputMultipleInputsTest() // We created a splitter with two outputs. That each of those outputs is used by two different activation layers. Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); std::unique_ptr wlSplitter; std::unique_ptr wlActiv0_0; std::unique_ptr wlActiv0_1; @@ -617,7 +625,7 @@ template static void RefCreateResizeBilinearTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateResizeBilinearWorkloadTest(factory, graph, dataLayout); TensorShape inputShape; @@ -665,7 +673,7 @@ template static void RefCreateRsqrtTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateRsqrtWorkloadTest(factory, graph); @@ -723,7 +731,7 @@ template static void RefCreateL2NormalizationTest(DataLayout dataLayout) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateL2NormalizationWorkloadTest(factory, graph, dataLayout); @@ -781,7 +789,7 @@ template static void RefCreateReshapeWorkloadTest() { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateReshapeWorkloadTest(factory, graph); // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest). @@ -811,7 +819,7 @@ static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape, unsigned int concatAxis) { Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateConcatWorkloadTest(factory, graph, outputShape, concatAxis); CheckInputsOutput(std::move(workload), @@ -869,7 +877,7 @@ template static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape) { armnn::Graph graph; - RefWorkloadFactory factory; + RefWorkloadFactory factory = GetFactory(); auto workload = CreateConstantWorkloadTest(factory, graph, outputShape); // Check output is as expected diff --git a/src/backends/reference/test/RefMemoryManagerTests.cpp b/src/backends/reference/test/RefMemoryManagerTests.cpp new file mode 100644 index 0000000000..15b7c2af4f --- /dev/null +++ b/src/backends/reference/test/RefMemoryManagerTests.cpp @@ -0,0 +1,51 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include + +#include + +BOOST_AUTO_TEST_SUITE(RefMemoryManagerTests) +using namespace armnn; +using Pool = RefMemoryManager::Pool; + +BOOST_AUTO_TEST_CASE(ManageOneThing) +{ + RefMemoryManager memoryManager; + + Pool* pool = memoryManager.Manage(10); + + BOOST_CHECK(pool); + + memoryManager.Acquire(); + + BOOST_CHECK(memoryManager.GetPointer(pool) != nullptr); // Yields a valid pointer + + memoryManager.Release(); +} + +BOOST_AUTO_TEST_CASE(ManageTwoThings) +{ + RefMemoryManager memoryManager; + + Pool* pool1 = memoryManager.Manage(10); + Pool* pool2 = memoryManager.Manage(5); + + BOOST_CHECK(pool1); + BOOST_CHECK(pool2); + + memoryManager.Acquire(); + + void *p1 = memoryManager.GetPointer(pool1); + void *p2 = memoryManager.GetPointer(pool2); + + BOOST_CHECK(p1); + BOOST_CHECK(p2); + BOOST_CHECK(p1 != p2); + + memoryManager.Release(); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/reference/test/RefTensorHandleTests.cpp b/src/backends/reference/test/RefTensorHandleTests.cpp new file mode 100644 index 0000000000..accf900975 --- /dev/null +++ b/src/backends/reference/test/RefTensorHandleTests.cpp @@ -0,0 +1,48 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#include + +#include + +BOOST_AUTO_TEST_SUITE(RefTensorHandleTests) +using namespace armnn; + +BOOST_AUTO_TEST_CASE(AcquireAndRelease) +{ + std::shared_ptr memoryManager = std::make_shared(); + + TensorInfo info({1,1,1,1}, DataType::Float32); + RefTensorHandle handle(info, memoryManager); + + handle.Manage(); + handle.Allocate(); + + memoryManager->Acquire(); + { + float *buffer = reinterpret_cast(handle.Map()); + + BOOST_CHECK(buffer != nullptr); // Yields a valid pointer + + buffer[0] = 2.5f; + + BOOST_CHECK(buffer[0] == 2.5f); // Memory is writable and readable + + } + memoryManager->Release(); + + memoryManager->Acquire(); + { + float *buffer = reinterpret_cast(handle.Map()); + + BOOST_CHECK(buffer != nullptr); // Yields a valid pointer + + buffer[0] = 3.5f; + + BOOST_CHECK(buffer[0] == 3.5f); // Memory is writable and readable + } + memoryManager->Release(); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file -- cgit v1.2.1