From b8a26d8f497f92643288a4c519af4d230ede1d7e Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Mon, 4 Oct 2021 15:13:11 +0100 Subject: IVGCVSW-6300 'IMemoryOptimizerStrategy Add strategy library and add support in BackendRegistry' * Updated IRuntime interface for providing custom memory optimizer strategy. * Enabled selecting existing memory optimizer strategy by using BackendOptions * Added MemoryOptimizerStrategyLibrary that sets one of the existing memory optimizer strategies selected by user Signed-off-by: Sadik Armagan Change-Id: I037f8ac8efa79c0f71bd63e379101e3ad92d80c9 --- .../backendsCommon/test/BackendRegistryTests.cpp | 21 ++++ src/backends/backendsCommon/test/CMakeLists.txt | 1 + .../test/CustomMemoryOptimizerStrategyTests.cpp | 125 +++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp (limited to 'src/backends/backendsCommon/test') diff --git a/src/backends/backendsCommon/test/BackendRegistryTests.cpp b/src/backends/backendsCommon/test/BackendRegistryTests.cpp index ba21b332e1..5acc61fe2c 100644 --- a/src/backends/backendsCommon/test/BackendRegistryTests.cpp +++ b/src/backends/backendsCommon/test/BackendRegistryTests.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -145,4 +146,24 @@ TEST_CASE("ThrowBackendUnavailableException") BackendRegistryInstance().Deregister(mockBackendId); } +#if defined(ARMNNREF_ENABLED) +TEST_CASE("RegisterMemoryOptimizerStrategy") +{ + using namespace armnn; + + const BackendId cpuRefBackendId(armnn::Compute::CpuRef); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + + // Register the memory optimizer + std::shared_ptr memoryOptimizerStrategy = + std::make_shared(); + BackendRegistryInstance().RegisterMemoryOptimizerStrategy(cpuRefBackendId, memoryOptimizerStrategy); + CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1); + // De-register the memory optimizer + BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(cpuRefBackendId); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); +} +#endif + } diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index ea33513097..e3221c5ae4 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources ChannelShuffleEndToEndTestImpl.hpp ComparisonEndToEndTestImpl.hpp CompatibilityTests.cpp + CustomMemoryOptimizerStrategyTests.cpp DefaultAsyncExecuteTest.cpp DepthToSpaceEndToEndTestImpl.hpp DequantizeEndToEndTestImpl.hpp diff --git a/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp b/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp new file mode 100644 index 0000000000..a5bf17c8b1 --- /dev/null +++ b/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp @@ -0,0 +1,125 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include +#include + +#include + +#if defined(ARMNNREF_ENABLED) +#include +#endif + +#if defined(ARMCOMPUTENEON_ENABLED) +#include +#endif + +#include + + +// Sample implementation of IMemoryOptimizerStrategy.. +class SampleMemoryOptimizerStrategy : public armnn::IMemoryOptimizerStrategy +{ +public: + SampleMemoryOptimizerStrategy() = default; + + std::string GetName() const + { + return std::string("SampleMemoryOptimizerStrategy"); + } + + armnn::MemBlockStrategyType GetMemBlockStrategyType() const + { + return armnn::MemBlockStrategyType::SingleAxisPacking; + } + + std::vector Optimize(std::vector& memBlocks) + { + std::vector memBins; + memBins.reserve(memBlocks.size()); + return memBins; + } +}; + +TEST_SUITE("CustomMemoryOptimizerStrategyTests") +{ + +// Only run this test if CpuRef is enabled +#if defined(ARMNNREF_ENABLED) +TEST_CASE("RefCustomMemoryOptimizerStrategyTest") +{ + using namespace armnn; + + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + auto customMemoryOptimizerStrategy = std::make_shared(); + options.m_MemoryOptimizerStrategyMap = {{"CpuRef", std::move(customMemoryOptimizerStrategy)}}; + IRuntimePtr run = IRuntime::Create(options); + + CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic())); + auto optimizerStrategy = BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic()); + CHECK(optimizerStrategy->GetName() == std::string("SampleMemoryOptimizerStrategy")); + + // De-register the memory optimizer + BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(RefBackend::GetIdStatic()); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + +} + +TEST_CASE("CpuRefSetMemoryOptimizerStrategyTest") +{ + using namespace armnn; + + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + options.m_BackendOptions.emplace_back( + BackendOptions{"CpuRef", + { + {"MemoryOptimizerStrategy", "ConstLayerMemoryOptimizerStrategy"} + } + }); + + IRuntimePtr run = IRuntime::Create(options); + + // ConstLayerMemoryOptimizerStrategy should be registered for CpuRef + CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1); + CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic())); + auto optimizerStrategy = BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic()); + CHECK(optimizerStrategy->GetName() == std::string("ConstLayerMemoryOptimizerStrategy")); + armnn::BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(RefBackend::GetIdStatic()); +} + +#endif + +// Only run this test if CpuAcc is enabled +#if defined(ARMCOMPUTENEON_ENABLED) + +TEST_CASE("CpuAccSetMemoryOptimizerStrategyTest") +{ + using namespace armnn; + + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + options.m_BackendOptions.emplace_back( + BackendOptions{"CpuAcc", + { + {"MemoryOptimizerStrategy", "NotExistMemoryOptimizerStrategy"} + } + }); + + IRuntimePtr run = IRuntime::Create(options); + + // No MemoryOptimizerStrategy should be registered.. + CHECK(armnn::BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); + armnn::BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(NeonBackend::GetIdStatic()); +} + +#endif + +} // test suite CustomMemoryOptimizerStrategyTests \ No newline at end of file -- cgit v1.2.1