From 7740045352a0d4e90011bcf472c069bd537cba72 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Thu, 13 Jan 2022 17:43:41 +0000 Subject: IVGCVSW-6678 Register CopyAndImportFactoryPairs to NeonBackend and unit tests Signed-off-by: Narumol Prangnawarat Change-Id: If5392020dfd0caa3f09ea2edbaf0f83ec36ab99b --- src/backends/neon/NeonBackend.cpp | 22 +++++++++++-- src/backends/neon/backend.mk | 1 + src/backends/neon/test/CMakeLists.txt | 1 + src/backends/neon/test/NeonBackendTests.cpp | 51 +++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/backends/neon/test/NeonBackendTests.cpp diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp index 54af14e30b..66547ad4df 100644 --- a/src/backends/neon/NeonBackend.cpp +++ b/src/backends/neon/NeonBackend.cpp @@ -74,7 +74,13 @@ IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory( BaseMemoryManager::MemoryAffinity::Offset); tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager); - tensorHandleFactoryRegistry.RegisterFactory(std::make_unique(memoryManager)); + + auto factory = std::make_unique(memoryManager); + // Register copy and import factory pair + tensorHandleFactoryRegistry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId()); + // Register the factory + tensorHandleFactoryRegistry.RegisterFactory(std::move(factory)); + return std::make_unique( PolymorphicPointerDowncast(memoryManager)); @@ -87,7 +93,12 @@ IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory( BaseMemoryManager::MemoryAffinity::Offset); tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager); - tensorHandleFactoryRegistry.RegisterFactory(std::make_unique(memoryManager)); + + auto factory = std::make_unique(memoryManager); + // Register copy and import factory pair + tensorHandleFactoryRegistry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId()); + // Register the factory + tensorHandleFactoryRegistry.RegisterFactory(std::move(factory)); return std::make_unique( PolymorphicPointerDowncast(memoryManager), CreateBackendSpecificModelContext(modelOptions)); @@ -424,7 +435,12 @@ void NeonBackend::RegisterTensorHandleFactories(class TensorHandleFactoryRegistr BaseMemoryManager::MemoryAffinity::Offset); registry.RegisterMemoryManager(memoryManager); - registry.RegisterFactory(std::make_unique(memoryManager)); + + auto factory = std::make_unique(memoryManager); + // Register copy and import factory pair + registry.RegisterCopyAndImportFactoryPair(factory->GetId(), factory->GetId()); + // Register the factory + registry.RegisterFactory(std::move(factory)); } std::unique_ptr NeonBackend::GetDefaultAllocator() const diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index daf2e5eb09..8ae50ac7e0 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -106,6 +106,7 @@ ifeq ($(ARMNN_COMPUTE_NEON_ENABLED),1) # Include the source files for the NEON backend tests BACKEND_TEST_SOURCES := \ + test/NeonBackendTests.cpp \ test/NeonCreateWorkloadTests.cpp \ test/NeonEndToEndTests.cpp \ test/NeonJsonPrinterTests.cpp \ diff --git a/src/backends/neon/test/CMakeLists.txt b/src/backends/neon/test/CMakeLists.txt index e4c5b34532..f7438ea6c9 100644 --- a/src/backends/neon/test/CMakeLists.txt +++ b/src/backends/neon/test/CMakeLists.txt @@ -4,6 +4,7 @@ # list(APPEND armnnNeonBackendUnitTests_sources + NeonBackendTests.cpp NeonCreateWorkloadTests.cpp NeonEndToEndTests.cpp NeonJsonPrinterTests.cpp diff --git a/src/backends/neon/test/NeonBackendTests.cpp b/src/backends/neon/test/NeonBackendTests.cpp new file mode 100644 index 0000000000..23f58a76fc --- /dev/null +++ b/src/backends/neon/test/NeonBackendTests.cpp @@ -0,0 +1,51 @@ +// +// Copyright © 2022 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include + +#include + +using namespace armnn; + +TEST_SUITE("NeonBackendTests") +{ +TEST_CASE("NeonRegisterTensorHandleFactoriesMatchingImportFactoryId") +{ + auto neonBackend = std::make_unique(); + TensorHandleFactoryRegistry registry; + neonBackend->RegisterTensorHandleFactories(registry); + + // When calling RegisterTensorHandleFactories, CopyAndImportFactoryPair is registered + // Get matching import factory id correctly + CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) == + NeonTensorHandleFactory::GetIdStatic())); +} + +TEST_CASE("NeonCreateWorkloadFactoryMatchingImportFactoryId") +{ + auto neonBackend = std::make_unique(); + TensorHandleFactoryRegistry registry; + neonBackend->CreateWorkloadFactory(registry); + + // When calling CreateWorkloadFactory, CopyAndImportFactoryPair is registered + // Get matching import factory id correctly + CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) == + NeonTensorHandleFactory::GetIdStatic())); +} + +TEST_CASE("NeonCreateWorkloadFactoryWithOptionsMatchingImportFactoryId") +{ + auto neonBackend = std::make_unique(); + TensorHandleFactoryRegistry registry; + ModelOptions modelOptions; + neonBackend->CreateWorkloadFactory(registry, modelOptions); + + // When calling CreateWorkloadFactory with ModelOptions, CopyAndImportFactoryPair is registered + // Get matching import factory id correctly + CHECK((registry.GetMatchingImportFactoryId(NeonTensorHandleFactory::GetIdStatic()) == + NeonTensorHandleFactory::GetIdStatic())); +} +} -- cgit v1.2.1