aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon
diff options
context:
space:
mode:
authorSadik Armagan <sadik.armagan@arm.com>2021-10-04 15:13:11 +0100
committerTeresaARM <teresa.charlinreyes@arm.com>2021-10-06 13:27:57 +0000
commitb8a26d8f497f92643288a4c519af4d230ede1d7e (patch)
tree89b1ad2303b8a18d4491eb47ab16f37e53e33c37 /src/backends/backendsCommon
parentbc3bb62c2d5b881ca7f0b3973a533134196fc802 (diff)
downloadarmnn-b8a26d8f497f92643288a4c519af4d230ede1d7e.tar.gz
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 <sadik.armagan@arm.com> Change-Id: I037f8ac8efa79c0f71bd63e379101e3ad92d80c9
Diffstat (limited to 'src/backends/backendsCommon')
-rw-r--r--src/backends/backendsCommon/CMakeLists.txt3
-rw-r--r--src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp28
-rw-r--r--src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp68
-rw-r--r--src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp21
-rw-r--r--src/backends/backendsCommon/common.mk2
-rw-r--r--src/backends/backendsCommon/test/BackendRegistryTests.cpp21
-rw-r--r--src/backends/backendsCommon/test/CMakeLists.txt1
-rw-r--r--src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp125
8 files changed, 269 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/CMakeLists.txt b/src/backends/backendsCommon/CMakeLists.txt
index c894f986c9..a18ee330d4 100644
--- a/src/backends/backendsCommon/CMakeLists.txt
+++ b/src/backends/backendsCommon/CMakeLists.txt
@@ -26,6 +26,9 @@ list(APPEND armnnBackendsCommon_sources
MemCopyWorkload.hpp
MemImportWorkload.cpp
MemImportWorkload.hpp
+ MemoryOptimizerStrategyFactory.hpp
+ MemoryOptimizerStrategyLibrary.cpp
+ MemoryOptimizerStrategyLibrary.hpp
MemSyncWorkload.cpp
MemSyncWorkload.hpp
OptimizationViews.cpp
diff --git a/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp b/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp
new file mode 100644
index 0000000000..62a2182a6e
--- /dev/null
+++ b/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp
@@ -0,0 +1,28 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
+
+#include <algorithm>
+
+namespace armnn
+{
+
+class MemoryOptimizerStrategyFactory
+{
+public:
+ MemoryOptimizerStrategyFactory() {}
+
+ template <typename T>
+ std::shared_ptr<IMemoryOptimizerStrategy> CreateMemoryOptimizerStrategy()
+ {
+ return std::make_shared<T>();
+ }
+
+};
+
+} // namespace armnn \ No newline at end of file
diff --git a/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp b/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp
new file mode 100644
index 0000000000..0b48cbd176
--- /dev/null
+++ b/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "MemoryOptimizerStrategyLibrary.hpp"
+#include "MemoryOptimizerStrategyFactory.hpp"
+
+#include <armnn/BackendHelper.hpp>
+#include <armnn/Logging.hpp>
+#include <armnn/TypesUtils.hpp>
+
+#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
+
+#include <backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp>
+
+#include <algorithm>
+
+namespace
+{
+// Default Memory Optimizer Strategies
+static const std::vector<std::string> memoryOptimizationStrategies({
+ "ConstLayerMemoryOptimizerStrategy",
+ });
+
+#define CREATE_MEMORY_OPTIMIZER_STRATEGY(strategyName, memoryOptimizerStrategy) \
+{ \
+ MemoryOptimizerStrategyFactory memoryOptimizerStrategyFactory; \
+ memoryOptimizerStrategy = memoryOptimizerStrategyFactory.CreateMemoryOptimizerStrategy<strategyName>(); \
+} \
+
+} // anonymous namespace
+
+namespace armnn
+{
+
+bool MemoryOptimizerStrategyLibrary::SetMemoryOptimizerStrategy(const BackendId& id, const std::string& strategyName)
+{
+ auto isStrategyExist = std::find(memoryOptimizationStrategies.begin(),
+ memoryOptimizationStrategies.end(),
+ strategyName) != memoryOptimizationStrategies.end();
+ if (isStrategyExist)
+ {
+ std::shared_ptr<IMemoryOptimizerStrategy> memoryOptimizerStrategy = nullptr;
+ CREATE_MEMORY_OPTIMIZER_STRATEGY(armnn::ConstLayerMemoryOptimizerStrategy,
+ memoryOptimizerStrategy);
+ if (memoryOptimizerStrategy)
+ {
+ using BackendCapability = BackendOptions::BackendOption;
+ auto strategyType = GetMemBlockStrategyTypeName(memoryOptimizerStrategy->GetMemBlockStrategyType());
+ BackendCapability memOptimizeStrategyCapability {strategyType, true};
+ if (HasCapability(memOptimizeStrategyCapability, id))
+ {
+ BackendRegistryInstance().RegisterMemoryOptimizerStrategy(id, memoryOptimizerStrategy);
+ return true;
+ }
+ // reset shared_ptr memoryOptimizerStrategy
+ memoryOptimizerStrategy.reset();
+ }
+ }
+ ARMNN_LOG(warning) << "Backend "
+ << id
+ << " is not registered as does not support memory optimizer strategy "
+ << strategyName << " \n";
+ return false;
+}
+
+} // namespace armnn \ No newline at end of file
diff --git a/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp b/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp
new file mode 100644
index 0000000000..795fc640b9
--- /dev/null
+++ b/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp
@@ -0,0 +1,21 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <armnn/BackendRegistry.hpp>
+
+namespace armnn
+{
+
+class MemoryOptimizerStrategyLibrary
+{
+public:
+ MemoryOptimizerStrategyLibrary() = default;
+
+ bool SetMemoryOptimizerStrategy(const BackendId& id, const std::string& strategyName);
+
+};
+
+} // namespace armnn \ No newline at end of file
diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk
index 8c1037ad19..2795c9cc2f 100644
--- a/src/backends/backendsCommon/common.mk
+++ b/src/backends/backendsCommon/common.mk
@@ -17,6 +17,7 @@ COMMON_SOURCES := \
MapWorkload.cpp \
MemCopyWorkload.cpp \
MemImportWorkload.cpp \
+ MemoryOptimizerStrategyLibrary.cpp \
MemSyncWorkload.cpp \
OptimizationViews.cpp \
TensorHandleFactoryRegistry.cpp \
@@ -32,6 +33,7 @@ COMMON_SOURCES := \
COMMON_TEST_SOURCES := \
test/CommonTestUtils.cpp \
+ test/CustomMemoryOptimizerStrategyTests.cpp \
test/InstanceNormalizationEndToEndTestImpl.cpp \
test/JsonPrinterTestImpl.cpp \
test/LogSoftmaxEndToEndTestImpl.cpp \
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 <armnn/BackendRegistry.hpp>
#include <armnn/backends/IBackendInternal.hpp>
+#include <backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp>
#include <reference/RefBackend.hpp>
#include <doctest/doctest.h>
@@ -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<IMemoryOptimizerStrategy> memoryOptimizerStrategy =
+ std::make_shared<ConstLayerMemoryOptimizerStrategy>();
+ 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 <armnn/IRuntime.hpp>
+#include <armnn/Utils.hpp>
+#include <armnn/BackendRegistry.hpp>
+
+#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
+
+#if defined(ARMNNREF_ENABLED)
+#include <reference/RefBackend.hpp>
+#endif
+
+#if defined(ARMCOMPUTENEON_ENABLED)
+#include <neon/NeonBackend.hpp>
+#endif
+
+#include <doctest/doctest.h>
+
+
+// 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<armnn::MemBin> Optimize(std::vector<armnn::MemBlock>& memBlocks)
+ {
+ std::vector<armnn::MemBin> 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<SampleMemoryOptimizerStrategy>();
+ 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