1 // 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.. 24 class SampleMemoryOptimizerStrategy : public armnn::IMemoryOptimizerStrategy 25 { 26 public: 27 SampleMemoryOptimizerStrategy() = default; 28 GetName() const29 std::string GetName() const 30 { 31 return std::string("SampleMemoryOptimizerStrategy"); 32 } 33 GetMemBlockStrategyType() const34 armnn::MemBlockStrategyType GetMemBlockStrategyType() const 35 { 36 return armnn::MemBlockStrategyType::SingleAxisPacking; 37 } 38 Optimize(std::vector<armnn::MemBlock> & memBlocks)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 47 TEST_SUITE("CustomMemoryOptimizerStrategyTests") 48 { 49 50 // Only run this test if CpuRef is enabled 51 #if defined(ARMNNREF_ENABLED) 52 TEST_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 74 TEST_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 { 83 {"MemoryOptimizerStrategy", "ConstantMemoryStrategy"} 84 } 85 }); 86 87 IRuntimePtr run = IRuntime::Create(options); 88 89 // ConstantMemoryStrategy should be registered for CpuRef 90 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()); 94 CHECK(optimizerStrategy->GetName() == std::string("ConstantMemoryStrategy")); 95 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 103 TEST_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