blob: 11eae04775b873b1581fc7471a16c52825e1d7ef [file] [log] [blame]
Sadik Armaganb8a26d82021-10-04 15:13:11 +01001//
2// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <armnn/IRuntime.hpp>
7#include <armnn/Utils.hpp>
8#include <armnn/BackendRegistry.hpp>
9
10#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
11
12#if defined(ARMNNREF_ENABLED)
13#include <reference/RefBackend.hpp>
14#endif
15
16#if defined(ARMCOMPUTENEON_ENABLED)
17#include <neon/NeonBackend.hpp>
18#endif
19
20#include <doctest/doctest.h>
21
22
23// Sample implementation of IMemoryOptimizerStrategy..
24class SampleMemoryOptimizerStrategy : public armnn::IMemoryOptimizerStrategy
25{
26public:
27 SampleMemoryOptimizerStrategy() = default;
28
29 std::string GetName() const
30 {
31 return std::string("SampleMemoryOptimizerStrategy");
32 }
33
34 armnn::MemBlockStrategyType GetMemBlockStrategyType() const
35 {
36 return armnn::MemBlockStrategyType::SingleAxisPacking;
37 }
38
39 std::vector<armnn::MemBin> Optimize(std::vector<armnn::MemBlock>& memBlocks)
40 {
41 std::vector<armnn::MemBin> memBins;
42 memBins.reserve(memBlocks.size());
43 return memBins;
44 }
45};
46
47TEST_SUITE("CustomMemoryOptimizerStrategyTests")
48{
49
50// Only run this test if CpuRef is enabled
51#if defined(ARMNNREF_ENABLED)
52TEST_CASE("RefCustomMemoryOptimizerStrategyTest")
53{
54 using namespace armnn;
55
56 // Create ArmNN runtime
57 IRuntime::CreationOptions options; // default options
58 auto customMemoryOptimizerStrategy = std::make_shared<SampleMemoryOptimizerStrategy>();
59 options.m_MemoryOptimizerStrategyMap = {{"CpuRef", std::move(customMemoryOptimizerStrategy)}};
60 IRuntimePtr run = IRuntime::Create(options);
61
62 CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty());
63 CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1);
64 CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic()));
65 auto optimizerStrategy = BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic());
66 CHECK(optimizerStrategy->GetName() == std::string("SampleMemoryOptimizerStrategy"));
67
68 // De-register the memory optimizer
69 BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(RefBackend::GetIdStatic());
70 CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().empty());
71
72}
73
74TEST_CASE("CpuRefSetMemoryOptimizerStrategyTest")
75{
76 using namespace armnn;
77
78 // Create ArmNN runtime
79 IRuntime::CreationOptions options; // default options
80 options.m_BackendOptions.emplace_back(
81 BackendOptions{"CpuRef",
82 {
Jim Flynne1fdd282021-10-26 21:26:10 +010083 {"MemoryOptimizerStrategy", "ConstantMemoryStrategy"}
Sadik Armaganb8a26d82021-10-04 15:13:11 +010084 }
85 });
86
87 IRuntimePtr run = IRuntime::Create(options);
88
Jim Flynne1fdd282021-10-26 21:26:10 +010089 // ConstantMemoryStrategy should be registered for CpuRef
Sadik Armaganb8a26d82021-10-04 15:13:11 +010090 CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty());
91 CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1);
92 CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic()));
93 auto optimizerStrategy = BackendRegistryInstance().GetMemoryOptimizerStrategies().at(RefBackend::GetIdStatic());
Jim Flynne1fdd282021-10-26 21:26:10 +010094 CHECK(optimizerStrategy->GetName() == std::string("ConstantMemoryStrategy"));
Sadik Armaganb8a26d82021-10-04 15:13:11 +010095 armnn::BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(RefBackend::GetIdStatic());
96}
97
98#endif
99
100// Only run this test if CpuAcc is enabled
101#if defined(ARMCOMPUTENEON_ENABLED)
102
103TEST_CASE("CpuAccSetMemoryOptimizerStrategyTest")
104{
105 using namespace armnn;
106
107 // Create ArmNN runtime
108 IRuntime::CreationOptions options; // default options
109 options.m_BackendOptions.emplace_back(
110 BackendOptions{"CpuAcc",
111 {
112 {"MemoryOptimizerStrategy", "NotExistMemoryOptimizerStrategy"}
113 }
114 });
115
116 IRuntimePtr run = IRuntime::Create(options);
117
118 // No MemoryOptimizerStrategy should be registered..
119 CHECK(armnn::BackendRegistryInstance().GetMemoryOptimizerStrategies().empty());
120 armnn::BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(NeonBackend::GetIdStatic());
121}
122
123#endif
124
125} // test suite CustomMemoryOptimizerStrategyTests