From e1fdd2866b0f403b5e80994890d62c2c038c16c9 Mon Sep 17 00:00:00 2001 From: Jim Flynn Date: Tue, 26 Oct 2021 21:26:10 +0100 Subject: IVGCVSW-6470 Create MemoryStrategyBenchmark * Refactor the strategy library to be more generic * Shorten the names of the current strategies * Change validatorStrat to throw exceptions Change-Id: I0d9c9ef609b2d8675e5788610d1accac6767c660 Signed-off-by: Finn Williams Signed-off-by: Jim Flynn --- cmake/GlobalConfig.cmake | 1 + include/armnn/Exceptions.hpp | 6 + include/armnn/IRuntime.hpp | 2 +- src/armnn/Runtime.cpp | 32 +- src/backends/backendsCommon/CMakeLists.txt | 7 +- .../MemoryOptimizerStrategyFactory.hpp | 28 - .../MemoryOptimizerStrategyLibrary.cpp | 68 - .../MemoryOptimizerStrategyLibrary.hpp | 21 - src/backends/backendsCommon/common.mk | 10 +- .../memoryOptimizationStrategies/CMakeLists.txt | 23 - .../ConstLayerMemoryOptimizerStrategy.cpp | 43 - .../ConstLayerMemoryOptimizerStrategy.hpp | 31 - .../MemoryOptimizerStrategyValidator.cpp | 121 -- .../MemoryOptimizerStrategyValidator.hpp | 27 - .../test/CMakeLists.txt | 17 - .../ConstLayerMemoryOptimizerStrategyTests.cpp | 77 - .../test/MemoryOptimizerStrategyValidatorTests.cpp | 273 ---- .../memoryOptimizerStrategyLibrary/CMakeLists.txt | 19 + .../MemoryOptimizerStrategyFactory.hpp | 28 + .../MemoryOptimizerStrategyLibrary.hpp | 52 + .../strategies/ConstantMemoryStrategy.cpp | 43 + .../strategies/ConstantMemoryStrategy.hpp | 31 + .../strategies/StrategyValidator.cpp | 132 ++ .../strategies/StrategyValidator.hpp | 41 + .../test/CMakeLists.txt | 12 + .../test/ConstMemoryStrategyTests.cpp | 77 + .../test/ValidatorStrategyTests.cpp | 283 ++++ .../backendsCommon/test/BackendRegistryTests.cpp | 4 +- .../test/CustomMemoryOptimizerStrategyTests.cpp | 6 +- tests/CMakeLists.txt | 4 + tests/MemoryStrategyBenchmark/CMakeLists.txt | 16 + .../MemoryStrategyBenchmark.cpp | 206 +++ tests/MemoryStrategyBenchmark/TestBlocks.hpp | 1575 ++++++++++++++++++++ tests/MemoryStrategyBenchmark/TestStrategy.cpp | 43 + tests/MemoryStrategyBenchmark/TestStrategy.hpp | 31 + 35 files changed, 2640 insertions(+), 750 deletions(-) delete mode 100644 src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp delete mode 100644 src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp delete mode 100644 src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/CMakeLists.txt delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/test/CMakeLists.txt delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp delete mode 100644 src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/CMakeLists.txt create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyFactory.hpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyLibrary.hpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.cpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.hpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.cpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.hpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/CMakeLists.txt create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ConstMemoryStrategyTests.cpp create mode 100644 src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ValidatorStrategyTests.cpp create mode 100644 tests/MemoryStrategyBenchmark/CMakeLists.txt create mode 100644 tests/MemoryStrategyBenchmark/MemoryStrategyBenchmark.cpp create mode 100644 tests/MemoryStrategyBenchmark/TestBlocks.hpp create mode 100644 tests/MemoryStrategyBenchmark/TestStrategy.cpp create mode 100644 tests/MemoryStrategyBenchmark/TestStrategy.hpp diff --git a/cmake/GlobalConfig.cmake b/cmake/GlobalConfig.cmake index ef18ed0030..1dc2d67f49 100644 --- a/cmake/GlobalConfig.cmake +++ b/cmake/GlobalConfig.cmake @@ -32,6 +32,7 @@ option(BUILD_PYTHON_SRC "Build Python source package" OFF) option(BUILD_STATIC_PIPE_LIBS "Build Static PIPE libraries" OFF) option(BUILD_PIPE_ONLY "Build the PIPE libraries only" OFF) option(BUILD_ARMNN_TFLITE_DELEGATE "Build the Arm NN TfLite delegate" OFF) +option(BUILD_MEMORY_STRATEGY_BENCHMARK "Build the MemoryBenchmark" OFF) include(SelectLibraryConfigurations) diff --git a/include/armnn/Exceptions.hpp b/include/armnn/Exceptions.hpp index 1a123bfbce..980b57449d 100644 --- a/include/armnn/Exceptions.hpp +++ b/include/armnn/Exceptions.hpp @@ -161,6 +161,12 @@ public: using Exception::Exception; }; +class MemoryValidationException : public Exception +{ +public: + using Exception::Exception; +}; + template void ConditionalThrow(bool condition, const std::string& message) { diff --git a/include/armnn/IRuntime.hpp b/include/armnn/IRuntime.hpp index 014481357d..b89cfd72cd 100644 --- a/include/armnn/IRuntime.hpp +++ b/include/armnn/IRuntime.hpp @@ -198,7 +198,7 @@ public: /// The following backend options are available: /// AllBackends: /// "MemoryOptimizerStrategy" : string [stategynameString] - /// (Existing Memory Optimizer Strategies: ConstLayerMemoryOptimizerStrategy) + /// (Existing Memory Optimizer Strategies: ConstantMemoryStrategy) /// GpuAcc: /// "TuningLevel" : int [0..3] (0=UseOnly(default) | 1=RapidTuning | 2=NormalTuning | 3=ExhaustiveTuning) /// "TuningFile" : string [filenameString] diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp index ca28199aae..9e212306c4 100644 --- a/src/armnn/Runtime.cpp +++ b/src/armnn/Runtime.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include @@ -425,11 +425,33 @@ RuntimeImpl::RuntimeImpl(const IRuntime::CreationOptions& options) }); if (memoryOptimizerStrategyName != "") { - MemoryOptimizerStrategyLibrary memoryOptimizerStrategyLibrary; - if (memoryOptimizerStrategyLibrary.SetMemoryOptimizerStrategy(id, memoryOptimizerStrategyName)) + std::shared_ptr strategy = + GetMemoryOptimizerStrategy(memoryOptimizerStrategyName); + + if (!strategy) { - ARMNN_LOG(info) << "MemoryOptimizerStrategy " - << memoryOptimizerStrategyName << " set for the backend " << id << "."; + ARMNN_LOG(warning) << "MemoryOptimizerStrategy: " << memoryOptimizerStrategyName + << " was not found \n"; + } + else + { + using BackendCapability = BackendOptions::BackendOption; + auto strategyType = GetMemBlockStrategyTypeName(strategy->GetMemBlockStrategyType()); + BackendCapability memOptimizeStrategyCapability {strategyType, true}; + if (HasCapability(memOptimizeStrategyCapability, id)) + { + BackendRegistryInstance().RegisterMemoryOptimizerStrategy(id, strategy); + + ARMNN_LOG(info) << "MemoryOptimizerStrategy: " + << memoryOptimizerStrategyName << " set for the backend " << id << "."; + } + else + { + ARMNN_LOG(warning) << "Backend " + << id + << " does not have multi-axis packing capability and cannot support" + << "MemoryOptimizerStrategy: " << memoryOptimizerStrategyName << "\n"; + } } } } diff --git a/src/backends/backendsCommon/CMakeLists.txt b/src/backends/backendsCommon/CMakeLists.txt index 90fb376dae..dfd35018d9 100644 --- a/src/backends/backendsCommon/CMakeLists.txt +++ b/src/backends/backendsCommon/CMakeLists.txt @@ -24,9 +24,6 @@ list(APPEND armnnBackendsCommon_sources MemCopyWorkload.hpp MemImportWorkload.cpp MemImportWorkload.hpp - MemoryOptimizerStrategyFactory.hpp - MemoryOptimizerStrategyLibrary.cpp - MemoryOptimizerStrategyLibrary.hpp MemoryManager.cpp MemoryManager.hpp MemSyncWorkload.cpp @@ -51,7 +48,7 @@ list(APPEND armnnBackendsCommon_sources WorkloadUtils.hpp ) -add_subdirectory(memoryOptimizationStrategies) +add_subdirectory(memoryOptimizerStrategyLibrary) if(BUILD_UNIT_TESTS) add_subdirectory(test) @@ -63,4 +60,4 @@ target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/src target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/backends) target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling) -target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include) \ No newline at end of file +target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include) diff --git a/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp b/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp deleted file mode 100644 index 62a2182a6e..0000000000 --- a/src/backends/backendsCommon/MemoryOptimizerStrategyFactory.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -#include - -namespace armnn -{ - -class MemoryOptimizerStrategyFactory -{ -public: - MemoryOptimizerStrategyFactory() {} - - template - std::shared_ptr CreateMemoryOptimizerStrategy() - { - return std::make_shared(); - } - -}; - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp b/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp deleted file mode 100644 index 0b48cbd176..0000000000 --- a/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "MemoryOptimizerStrategyLibrary.hpp" -#include "MemoryOptimizerStrategyFactory.hpp" - -#include -#include -#include - -#include - -#include - -#include - -namespace -{ -// Default Memory Optimizer Strategies -static const std::vector memoryOptimizationStrategies({ - "ConstLayerMemoryOptimizerStrategy", - }); - -#define CREATE_MEMORY_OPTIMIZER_STRATEGY(strategyName, memoryOptimizerStrategy) \ -{ \ - MemoryOptimizerStrategyFactory memoryOptimizerStrategyFactory; \ - memoryOptimizerStrategy = memoryOptimizerStrategyFactory.CreateMemoryOptimizerStrategy(); \ -} \ - -} // 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 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 deleted file mode 100644 index 795fc640b9..0000000000 --- a/src/backends/backendsCommon/MemoryOptimizerStrategyLibrary.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// -#pragma once - -#include - -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 910f9a4210..f90a7c855e 100644 --- a/src/backends/backendsCommon/common.mk +++ b/src/backends/backendsCommon/common.mk @@ -17,7 +17,6 @@ COMMON_SOURCES := \ MapWorkload.cpp \ MemCopyWorkload.cpp \ MemImportWorkload.cpp \ - MemoryOptimizerStrategyLibrary.cpp \ MemSyncWorkload.cpp \ OptimizationViews.cpp \ TensorHandleFactoryRegistry.cpp \ @@ -25,8 +24,9 @@ COMMON_SOURCES := \ WorkloadData.cpp \ WorkloadFactory.cpp \ WorkloadUtils.cpp \ - memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp \ - memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp + memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.cpp \ + memoryOptimizerStrategyLibrary/strategies/StrategyValidator.cpp \ + # COMMON_TEST_SOURCES contains the list of files to be included # in the Android unit test build (armnn-tests) and it is picked @@ -102,8 +102,8 @@ COMMON_TEST_SOURCES := \ test/layerTests/SubtractionTestImpl.cpp \ test/layerTests/TransposeConvolution2dTestImpl.cpp \ test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp \ - memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp \ - memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp + memoryOptimizerStrategyLibrary/test/ConstMemoryStrategyTests.cpp \ + memoryOptimizerStrategyLibrary/test/ValidatorStrategyTests.cpp ifeq ($(ARMNN_REF_ENABLED),1) COMMON_TEST_SOURCES += \ diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/CMakeLists.txt b/src/backends/backendsCommon/memoryOptimizationStrategies/CMakeLists.txt deleted file mode 100644 index de83505f7c..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -# SPDX-License-Identifier: MIT -# - -list(APPEND armnnMemoryOptimizationStrategies_sources - ConstLayerMemoryOptimizerStrategy.hpp - ConstLayerMemoryOptimizerStrategy.cpp - MemoryOptimizerStrategyValidator.hpp - MemoryOptimizerStrategyValidator.cpp -) - -if(BUILD_UNIT_TESTS) - add_subdirectory(test) -endif() - -add_library(armnnMemoryOptimizationStrategies OBJECT ${armnnMemoryOptimizationStrategies_sources}) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/include/armnn) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/src/backends) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling) -target_include_directories(armnnMemoryOptimizationStrategies PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include) \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp b/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp deleted file mode 100644 index 023c6361d0..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "ConstLayerMemoryOptimizerStrategy.hpp" - -namespace armnn -{ - -std::string ConstLayerMemoryOptimizerStrategy::GetName() const -{ - return m_Name; -} - -MemBlockStrategyType ConstLayerMemoryOptimizerStrategy::GetMemBlockStrategyType() const -{ - return m_MemBlockStrategyType; -} - -// A IMemoryOptimizerStrategy must ensure that -// 1: All MemBlocks have been assigned to a MemBin -// 2: No MemBlock is assigned to multiple MemBins -// 3: No two Memblocks in a MemBin overlap in both the X and Y axis -std::vector ConstLayerMemoryOptimizerStrategy::Optimize(std::vector& memBlocks) -{ - std::vector memBins; - memBins.reserve(memBlocks.size()); - - for (auto& memBlock : memBlocks) - { - MemBin memBin; - memBin.m_MemSize = memBlock.m_MemSize; - memBin.m_MemBlocks.reserve(1); - memBlock.m_Offset = 0; - memBin.m_MemBlocks.push_back(memBlock); - memBins.push_back(memBin); - } - - return memBins; -} - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp b/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp deleted file mode 100644 index 3f803abe87..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// -#pragma once - -#include -#include - -namespace armnn -{ -// ConstLayerMemoryOptimizer: Create a unique MemBin for each MemBlock and assign it an offset of 0 -class ConstLayerMemoryOptimizerStrategy : public IMemoryOptimizerStrategy -{ -public: - ConstLayerMemoryOptimizerStrategy() - : m_Name(std::string("ConstLayerMemoryOptimizerStrategy")) - , m_MemBlockStrategyType(MemBlockStrategyType::SingleAxisPacking) {} - - std::string GetName() const override; - - MemBlockStrategyType GetMemBlockStrategyType() const override; - - std::vector Optimize(std::vector& memBlocks) override; - -private: - std::string m_Name; - MemBlockStrategyType m_MemBlockStrategyType; -}; - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp b/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp deleted file mode 100644 index 876ad90cd4..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include - -namespace armnn -{ - -bool MemoryOptimizerValidator::Validate(std::vector& memBlocks) -{ - // Condition #1: All Memblocks have been assigned to a MemBin - - // Condition #2: No Memblock is assigned to multiple MemBins - - // Condition #3: No two Memblocks in a MemBin overlap in both the X and Y axis - // Memblocks in a MemBin can overlap on the X axis for SingleAxisPacking - // Memblocks in a MemBin can overlap on the Y axis or the X for MultiAxisPacking but not both - - auto memBinVect = m_Strategy->Optimize(memBlocks); - - // Compare each of the input memblocks against every assignedBlock in each bin - // if we get through all bins without finding a block return - // if at any stage the block is found twice return - - for (auto memBlock : memBlocks) - { - auto found = false; - - for (auto bin : memBinVect) - { - for (auto assignedBlock : bin.m_MemBlocks) - { - if (memBlock.m_Index == assignedBlock.m_Index) - { - if (found) - { - // Condition #2: Memblock is assigned to multiple MemBins - return false; - } - - found = true; - } - } - } - // Condition #1: Block not found in any bin so return false as strategy is invalid - if (!found) - { - return false; - } - } - - // Check for overlaps once we know blocks are all assigned and no duplicates - for (auto bin : memBinVect) - { - for (unsigned int i = 0; i < bin.m_MemBlocks.size(); ++i) - { - auto assignedBlock = bin.m_MemBlocks[i]; - auto xStart = assignedBlock.m_Offset; - auto xEnd = assignedBlock.m_Offset + assignedBlock.m_MemSize; - - auto yStart = assignedBlock.m_StartOfLife; - auto yEnd = assignedBlock.m_EndOfLife; - auto assignedIndex = assignedBlock.m_Index; - - // Only compare with blocks after the current one as previous have already been checked - for (unsigned int j = i + 1; j < bin.m_MemBlocks.size(); ++j) - { - auto otherAssignedBlock = bin.m_MemBlocks[j]; - auto xStartAssigned = otherAssignedBlock.m_Offset; - auto xEndAssigned = otherAssignedBlock.m_Offset + otherAssignedBlock.m_MemSize; - - auto yStartAssigned = otherAssignedBlock.m_StartOfLife; - auto yEndAssigned = otherAssignedBlock.m_EndOfLife; - auto otherIndex = otherAssignedBlock.m_Index; - - // If overlapping on both X and Y then invalid - // Inside left of rectangle & Inside right of rectangle - if ((((xStart >= xStartAssigned) && (xEnd <= xEndAssigned)) && - // Inside bottom of rectangle & Inside top of rectangle - ((yStart >= yStartAssigned) && (yEnd <= yEndAssigned))) && - // Cant overlap with itself - (assignedIndex != otherIndex)) - { - // Condition #3: two Memblocks overlap on both the X and Y axis - return false; - } - - switch (m_Strategy->GetMemBlockStrategyType()) - { - case (MemBlockStrategyType::SingleAxisPacking): - { - // Inside bottom of rectangle & Inside top of rectangle - if (((yStart >= yStartAssigned) && (yEnd <= yEndAssigned)) && - // Cant overlap with itself - (assignedIndex != otherIndex)) - { - // Condition #3: invalid as two Memblocks overlap on the Y axis for SingleAxisPacking - return false; - } - break; - } - case (MemBlockStrategyType::MultiAxisPacking): - { - break; - } - default: - // Unknown MemBlockStrategyType - return false; - } - } - - } - } - - // None of the conditions broken so return true - return true; -} - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp b/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp deleted file mode 100644 index 13e90593d8..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// -#pragma once - -#include -#include - -namespace armnn -{ - -class MemoryOptimizerValidator -{ -public: - explicit MemoryOptimizerValidator(std::shared_ptr strategy) - : m_Strategy(strategy) - { - }; - - bool Validate(std::vector& memBlocks); - -private: - std::shared_ptr m_Strategy; -}; - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/test/CMakeLists.txt b/src/backends/backendsCommon/memoryOptimizationStrategies/test/CMakeLists.txt deleted file mode 100644 index 1e16f09411..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/test/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -# SPDX-License-Identifier: MIT -# - -list(APPEND armnnMemoryOptimizationStrategiesUnitTests_sources - ConstLayerMemoryOptimizerStrategyTests.cpp - MemoryOptimizerStrategyValidatorTests.cpp -) - -add_library(armnnMemoryOptimizationStrategiesUnitTests OBJECT ${armnnMemoryOptimizationStrategiesUnitTests_sources}) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/backends) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include) -target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/third-party) diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp b/src/backends/backendsCommon/memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp deleted file mode 100644 index cfa2d40e7d..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include -#include - -#include -#include - -using namespace armnn; - -TEST_SUITE("ConstLayerMemoryOptimizerStrategyTestSuite") -{ - -TEST_CASE("ConstLayerMemoryOptimizerStrategyTest") -{ - // create a few memory blocks - MemBlock memBlock0(0, 2, 20, 0, 0); - MemBlock memBlock1(2, 3, 10, 20, 1); - MemBlock memBlock2(3, 5, 15, 30, 2); - MemBlock memBlock3(5, 6, 20, 50, 3); - MemBlock memBlock4(7, 8, 5, 70, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with ConstLayerMemoryOptimizerStrategy - ConstLayerMemoryOptimizerStrategy constLayerMemoryOptimizerStrategy; - CHECK_EQ(constLayerMemoryOptimizerStrategy.GetName(), std::string("ConstLayerMemoryOptimizerStrategy")); - CHECK_EQ(constLayerMemoryOptimizerStrategy.GetMemBlockStrategyType(), MemBlockStrategyType::SingleAxisPacking); - auto memBins = constLayerMemoryOptimizerStrategy.Optimize(memBlocks); - CHECK(memBins.size() == 5); - - CHECK(memBins[1].m_MemBlocks.size() == 1); - CHECK(memBins[1].m_MemBlocks[0].m_Offset == 0); - CHECK(memBins[1].m_MemBlocks[0].m_MemSize == 10); - CHECK(memBins[1].m_MemBlocks[0].m_Index == 1); - - CHECK(memBins[4].m_MemBlocks.size() == 1); - CHECK(memBins[4].m_MemBlocks[0].m_Offset == 0); - CHECK(memBins[4].m_MemBlocks[0].m_MemSize == 5); - CHECK(memBins[4].m_MemBlocks[0].m_Index == 4); -} - -TEST_CASE("ConstLayerMemoryOptimizerStrategyValidatorTest") -{ - // create a few memory blocks - MemBlock memBlock0(0, 2, 20, 0, 0); - MemBlock memBlock1(2, 3, 10, 20, 1); - MemBlock memBlock2(3, 5, 15, 30, 2); - MemBlock memBlock3(5, 6, 20, 50, 3); - MemBlock memBlock4(7, 8, 5, 70, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with ConstLayerMemoryOptimizerStrategy - ConstLayerMemoryOptimizerStrategy constLayerMemoryOptimizerStrategy; - auto ptr = std::make_shared(constLayerMemoryOptimizerStrategy); - MemoryOptimizerValidator validator(std::move(ptr)); - // Ensure ConstLayerMemoryOptimizerStrategy is valid - CHECK(validator.Validate(memBlocks)); -} - -} diff --git a/src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp b/src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp deleted file mode 100644 index af09e4ed56..0000000000 --- a/src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp +++ /dev/null @@ -1,273 +0,0 @@ -// -// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include - -#include -#include - -using namespace armnn; - -TEST_SUITE("MemoryOptimizerStrategyValidatorTestSuite") -{ - -// TestMemoryOptimizerStrategy: Create a MemBin and put all blocks in it so the can overlap. -class TestMemoryOptimizerStrategy : public IMemoryOptimizerStrategy -{ -public: - TestMemoryOptimizerStrategy(MemBlockStrategyType type) - : m_Name(std::string("testMemoryOptimizerStrategy")) - , m_MemBlockStrategyType(type) {} - - std::string GetName() const override - { - return m_Name; - } - - MemBlockStrategyType GetMemBlockStrategyType() const override - { - return m_MemBlockStrategyType; - } - - std::vector Optimize(std::vector& memBlocks) override - { - std::vector memBins; - memBins.reserve(memBlocks.size()); - - MemBin memBin; - memBin.m_MemBlocks.reserve(memBlocks.size()); - memBin.m_MemSize = 0; - for (auto& memBlock : memBlocks) - { - - memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; - memBin.m_MemBlocks.push_back(memBlock); - } - memBins.push_back(memBin); - - return memBins; - } - -private: - std::string m_Name; - MemBlockStrategyType m_MemBlockStrategyType; -}; - -TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapX") -{ - // create a few memory blocks - MemBlock memBlock0(0, 5, 20, 0, 0); - MemBlock memBlock1(5, 10, 10, 0, 1); - MemBlock memBlock2(10, 15, 15, 0, 2); - MemBlock memBlock3(15, 20, 20, 0, 3); - MemBlock memBlock4(20, 25, 5, 0, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with TestMemoryOptimizerStrategySingle - TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); - auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); - MemoryOptimizerValidator validator(std::move(ptr)); - // SingleAxisPacking can overlap on X axis. - CHECK(validator.Validate(memBlocks)); - - // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti - TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); - auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); - MemoryOptimizerValidator validatorMulti(std::move(ptrMulti)); - // MultiAxisPacking can overlap on X axis. - CHECK(validatorMulti.Validate(memBlocks)); -} - -TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapXAndY") -{ - // create a few memory blocks - MemBlock memBlock0(0, 5, 20, 0, 0); - MemBlock memBlock1(0, 10, 10, 0, 1); - MemBlock memBlock2(0, 15, 15, 0, 2); - MemBlock memBlock3(0, 20, 20, 0, 3); - MemBlock memBlock4(0, 25, 5, 0, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with TestMemoryOptimizerStrategySingle - TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); - auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); - MemoryOptimizerValidator validator(std::move(ptr)); - // SingleAxisPacking cannot overlap on both X and Y axis. - CHECK(!validator.Validate(memBlocks)); - - // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti - TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); - auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); - MemoryOptimizerValidator validatorMulti(std::move(ptrMulti)); - // MultiAxisPacking cannot overlap on both X and Y axis. - CHECK(!validatorMulti.Validate(memBlocks)); -} - -TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapY") -{ - // create a few memory blocks - MemBlock memBlock0(0, 2, 20, 0, 0); - MemBlock memBlock1(0, 3, 10, 20, 1); - MemBlock memBlock2(0, 5, 15, 30, 2); - MemBlock memBlock3(0, 6, 20, 50, 3); - MemBlock memBlock4(0, 8, 5, 70, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with TestMemoryOptimizerStrategySingle - TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); - auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); - MemoryOptimizerValidator validator(std::move(ptr)); - // SingleAxisPacking cannot overlap on Y axis - CHECK(!validator.Validate(memBlocks)); - - // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti - TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); - auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); - MemoryOptimizerValidator validatorMulti(std::move(ptrMulti)); - // MultiAxisPacking can overlap on Y axis - CHECK(validatorMulti.Validate(memBlocks)); -} - -// TestMemoryOptimizerStrategyDuplicate: Create a MemBin and put all blocks in it duplicating each so validator -// can check -class TestMemoryOptimizerStrategyDuplicate : public TestMemoryOptimizerStrategy -{ -public: - TestMemoryOptimizerStrategyDuplicate(MemBlockStrategyType type) - : TestMemoryOptimizerStrategy(type) - {} - - std::vector Optimize(std::vector& memBlocks) override - { - std::vector memBins; - memBins.reserve(memBlocks.size()); - - MemBin memBin; - memBin.m_MemBlocks.reserve(memBlocks.size()); - for (auto& memBlock : memBlocks) - { - memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; - memBin.m_MemBlocks.push_back(memBlock); - // Put block in twice so it gets found twice - memBin.m_MemBlocks.push_back(memBlock); - } - memBins.push_back(memBin); - - return memBins; - } -}; - -TEST_CASE("MemoryOptimizerStrategyValidatorTestDuplicateBlocks") -{ - // create a few memory blocks - MemBlock memBlock0(0, 2, 20, 0, 0); - MemBlock memBlock1(2, 3, 10, 20, 1); - MemBlock memBlock2(3, 5, 15, 30, 2); - MemBlock memBlock3(5, 6, 20, 50, 3); - MemBlock memBlock4(7, 8, 5, 70, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with TestMemoryOptimizerStrategySingle - // Duplicate strategy is invalid as same block is found twice - TestMemoryOptimizerStrategyDuplicate testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); - auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); - MemoryOptimizerValidator validator(std::move(ptr)); - CHECK(!validator.Validate(memBlocks)); - - // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti - TestMemoryOptimizerStrategyDuplicate testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); - auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); - MemoryOptimizerValidator validatorMulti(std::move(ptrMulti)); - CHECK(!validatorMulti.Validate(memBlocks)); -} - -// TestMemoryOptimizerStrategySkip: Create a MemBin and put all blocks in it skipping every other block so validator -// can check -class TestMemoryOptimizerStrategySkip : public TestMemoryOptimizerStrategy -{ -public: - TestMemoryOptimizerStrategySkip(MemBlockStrategyType type) - : TestMemoryOptimizerStrategy(type) - {} - - std::vector Optimize(std::vector& memBlocks) override - { - std::vector memBins; - memBins.reserve(memBlocks.size()); - - MemBin memBin; - memBin.m_MemBlocks.reserve(memBlocks.size()); - for (unsigned int i = 0; i < memBlocks.size()-1; i+=2) - { - auto memBlock = memBlocks[i]; - memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; - memBin.m_MemBlocks.push_back(memBlock); - } - memBins.push_back(memBin); - - return memBins; - } -}; - -TEST_CASE("MemoryOptimizerStrategyValidatorTestSkipBlocks") -{ - // create a few memory blocks - MemBlock memBlock0(0, 2, 20, 0, 0); - MemBlock memBlock1(2, 3, 10, 20, 1); - MemBlock memBlock2(3, 5, 15, 30, 2); - MemBlock memBlock3(5, 6, 20, 50, 3); - MemBlock memBlock4(7, 8, 5, 70, 4); - - std::vector memBlocks; - memBlocks.reserve(5); - memBlocks.push_back(memBlock0); - memBlocks.push_back(memBlock1); - memBlocks.push_back(memBlock2); - memBlocks.push_back(memBlock3); - memBlocks.push_back(memBlock4); - - // Optimize the memory blocks with TestMemoryOptimizerStrategySingle - // Skip strategy is invalid as every second block is not found - TestMemoryOptimizerStrategySkip testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); - auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); - MemoryOptimizerValidator validator(std::move(ptr)); - CHECK(!validator.Validate(memBlocks)); - - // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti - TestMemoryOptimizerStrategySkip testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); - auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); - MemoryOptimizerValidator validatorMulti(std::move(ptrMulti)); - CHECK(!validatorMulti.Validate(memBlocks)); -} - -} diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/CMakeLists.txt b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/CMakeLists.txt new file mode 100644 index 0000000000..43ec9db670 --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/CMakeLists.txt @@ -0,0 +1,19 @@ +# +# Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT +# + +list(APPEND armnnMemoryOptimizationStrategies_sources + MemoryOptimizerStrategyLibrary.hpp + MemoryOptimizerStrategyFactory.hpp + strategies/ConstantMemoryStrategy.hpp + strategies/ConstantMemoryStrategy.cpp + strategies/StrategyValidator.hpp + strategies/StrategyValidator.cpp +) + +if(BUILD_UNIT_TESTS) + add_subdirectory(test) +endif() + +add_library(armnnMemoryOptimizationStrategies OBJECT ${armnnMemoryOptimizationStrategies_sources}) \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyFactory.hpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyFactory.hpp new file mode 100644 index 0000000000..aff0995266 --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyFactory.hpp @@ -0,0 +1,28 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include + +namespace armnn +{ + +class MemoryOptimizerStrategyFactory +{ +public: + MemoryOptimizerStrategyFactory() {} + + template + std::unique_ptr CreateMemoryOptimizerStrategy() + { + return std::make_unique(); + } + +}; + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyLibrary.hpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyLibrary.hpp new file mode 100644 index 0000000000..5e20a9f218 --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/MemoryOptimizerStrategyLibrary.hpp @@ -0,0 +1,52 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include "MemoryOptimizerStrategyFactory.hpp" +#include + +#include "strategies/ConstantMemoryStrategy.hpp" +#include "strategies/StrategyValidator.hpp" + +namespace +{ +// Default Memory Optimizer Strategies +static const std::vector memoryOptimizationStrategies( +{ + "ConstantMemoryStrategy", + "StrategyValidator" +}); + +#define CREATE_MEMORY_OPTIMIZER_STRATEGY(strategyName, memoryOptimizerStrategy) \ +{ \ + MemoryOptimizerStrategyFactory memoryOptimizerStrategyFactory; \ + memoryOptimizerStrategy = memoryOptimizerStrategyFactory.CreateMemoryOptimizerStrategy(); \ +} \ + +} // anonymous namespace +namespace armnn +{ + std::unique_ptr GetMemoryOptimizerStrategy(const std::string& strategyName) + { + auto doesStrategyExist = std::find(memoryOptimizationStrategies.begin(), + memoryOptimizationStrategies.end(), + strategyName) != memoryOptimizationStrategies.end(); + if (doesStrategyExist) + { + std::unique_ptr memoryOptimizerStrategy = nullptr; + CREATE_MEMORY_OPTIMIZER_STRATEGY(armnn::ConstantMemoryStrategy, + memoryOptimizerStrategy); + return memoryOptimizerStrategy; + } + return nullptr; + } + + + const std::vector& GetMemoryOptimizerStrategyNames() + { + return memoryOptimizationStrategies; + } +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.cpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.cpp new file mode 100644 index 0000000000..55f7f89f4b --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.cpp @@ -0,0 +1,43 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ConstantMemoryStrategy.hpp" + +namespace armnn +{ + +std::string ConstantMemoryStrategy::GetName() const +{ + return m_Name; +} + +MemBlockStrategyType ConstantMemoryStrategy::GetMemBlockStrategyType() const +{ + return m_MemBlockStrategyType; +} + +// A IMemoryOptimizerStrategy must ensure that +// 1: All MemBlocks have been assigned to a MemBin +// 2: No MemBlock is assigned to multiple MemBins +// 3: No two Memblocks in a MemBin overlap in both the X and Y axis +std::vector ConstantMemoryStrategy::Optimize(std::vector& memBlocks) +{ + std::vector memBins; + memBins.reserve(memBlocks.size()); + + for (auto& memBlock : memBlocks) + { + MemBin memBin; + memBin.m_MemSize = memBlock.m_MemSize; + memBin.m_MemBlocks.reserve(1); + memBlock.m_Offset = 0; + memBin.m_MemBlocks.push_back(memBlock); + memBins.push_back(memBin); + } + + return memBins; +} + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.hpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.hpp new file mode 100644 index 0000000000..249c133a0f --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/ConstantMemoryStrategy.hpp @@ -0,0 +1,31 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include + +namespace armnn +{ +// ConstLayerMemoryOptimizer: Create a unique MemBin for each MemBlock and assign it an offset of 0 +class ConstantMemoryStrategy : public IMemoryOptimizerStrategy +{ +public: + ConstantMemoryStrategy() + : m_Name(std::string("ConstantMemoryStrategy")) + , m_MemBlockStrategyType(MemBlockStrategyType::SingleAxisPacking) {} + + std::string GetName() const override; + + MemBlockStrategyType GetMemBlockStrategyType() const override; + + std::vector Optimize(std::vector& memBlocks) override; + +private: + std::string m_Name; + MemBlockStrategyType m_MemBlockStrategyType; +}; + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.cpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.cpp new file mode 100644 index 0000000000..48cdfb040c --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.cpp @@ -0,0 +1,132 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include +#include "StrategyValidator.hpp" + +namespace armnn +{ + +std::vector StrategyValidator::Optimize(std::vector& memBlocks) +{ + // Condition #1: All Memblocks have been assigned to a MemBin + + // Condition #2: No Memblock is assigned to multiple MemBins + + // Condition #3: No two Memblocks in a MemBin overlap in both the X and Y axis + // Memblocks in a MemBin can overlap on the X axis for SingleAxisPacking + // Memblocks in a MemBin can overlap on the Y axis or the X for MultiAxisPacking but not both + + std::unordered_map validationMap; + + for (auto memBlock : memBlocks) + { + validationMap[memBlock.m_Index] = false; + } + + auto memBinVect = m_Strategy->Optimize(memBlocks); + + // Compare each of the input memblocks against every assignedBlock in each bin + // if we get through all bins without finding a block return + // if at any stage the block is found twice return + + for (auto memBin : memBinVect) + { + for (auto block : memBin.m_MemBlocks) + { + try + { + if (!validationMap.at(block.m_Index)) + { + validationMap.at(block.m_Index) = true; + } + else + { + throw MemoryValidationException("Condition #2: Memblock is assigned to multiple MemBins"); + } + } + catch (const std::out_of_range&) + { + throw MemoryValidationException("Unknown index "); + } + } + } + + for (auto memBlock : memBlocks) + { + if (!validationMap.at(memBlock.m_Index)) + { + throw MemoryValidationException("Condition #1: Block not found in any bin"); + } + } + + // Check for overlaps once we know blocks are all assigned and no duplicates + for (auto bin : memBinVect) + { + for (unsigned int i = 0; i < bin.m_MemBlocks.size(); ++i) + { + auto assignedBlock = bin.m_MemBlocks[i]; + auto xStart = assignedBlock.m_Offset; + auto xEnd = assignedBlock.m_Offset + assignedBlock.m_MemSize; + + auto yStart = assignedBlock.m_StartOfLife; + auto yEnd = assignedBlock.m_EndOfLife; + auto assignedIndex = assignedBlock.m_Index; + + // Only compare with blocks after the current one as previous have already been checked + for (unsigned int j = i + 1; j < bin.m_MemBlocks.size(); ++j) + { + auto otherAssignedBlock = bin.m_MemBlocks[j]; + auto xStartAssigned = otherAssignedBlock.m_Offset; + auto xEndAssigned = otherAssignedBlock.m_Offset + otherAssignedBlock.m_MemSize; + + auto yStartAssigned = otherAssignedBlock.m_StartOfLife; + auto yEndAssigned = otherAssignedBlock.m_EndOfLife; + auto otherIndex = otherAssignedBlock.m_Index; + + // If overlapping on both X and Y then invalid + // Inside left of rectangle & Inside right of rectangle + if ((((xStart >= xStartAssigned) && (xEnd <= xEndAssigned)) && + // Inside bottom of rectangle & Inside top of rectangle + ((yStart >= yStartAssigned) && (yEnd <= yEndAssigned))) && + // Cant overlap with itself + (assignedIndex != otherIndex)) + { + // Condition #3: two Memblocks overlap on both the X and Y axis + throw MemoryValidationException("Condition #3: two Memblocks overlap on both the X and Y axis"); + } + + switch (m_Strategy->GetMemBlockStrategyType()) + { + case (MemBlockStrategyType::SingleAxisPacking): + { + // Inside bottom of rectangle & Inside top of rectangle + if (((yStart >= yStartAssigned) && (yEnd <= yEndAssigned)) && + // Cant overlap with itself + (assignedIndex != otherIndex)) + { + throw MemoryValidationException("Condition #3: " + "invalid as two Memblocks overlap on the Y axis for SingleAxisPacking"); + + } + break; + } + case (MemBlockStrategyType::MultiAxisPacking): + { + break; + } + default: + throw MemoryValidationException("Unknown MemBlockStrategyType"); + } + } + } + } + + // None of the conditions broken so return true + return memBinVect; +} + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.hpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.hpp new file mode 100644 index 0000000000..e1f9111cd3 --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/strategies/StrategyValidator.hpp @@ -0,0 +1,41 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include +#include + +namespace armnn +{ + +class StrategyValidator : public IMemoryOptimizerStrategy +{ +public: + + void SetStrategy(std::shared_ptr strategy) + { + m_Strategy = strategy; + m_MemBlockStrategyType = strategy->GetMemBlockStrategyType(); + } + + std::string GetName() const override + { + return "StrategyValidator"; + } + + MemBlockStrategyType GetMemBlockStrategyType() const override + { + return m_MemBlockStrategyType; + } + + std::vector Optimize(std::vector& memBlocks) override; + +private: + std::shared_ptr m_Strategy; + MemBlockStrategyType m_MemBlockStrategyType; +}; + +} // namespace armnn \ No newline at end of file diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/CMakeLists.txt b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/CMakeLists.txt new file mode 100644 index 0000000000..b96782a84d --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT +# + +list(APPEND armnnMemoryOptimizationStrategiesUnitTests_sources + ConstMemoryStrategyTests.cpp + ValidatorStrategyTests.cpp +) + +add_library(armnnMemoryOptimizationStrategiesUnitTests OBJECT ${armnnMemoryOptimizationStrategiesUnitTests_sources}) +target_include_directories(armnnMemoryOptimizationStrategiesUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/backends) diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ConstMemoryStrategyTests.cpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ConstMemoryStrategyTests.cpp new file mode 100644 index 0000000000..64312f362f --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ConstMemoryStrategyTests.cpp @@ -0,0 +1,77 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include + +#include +#include + +using namespace armnn; + +TEST_SUITE("ConstMemoryStrategyTestSuite") +{ + +TEST_CASE("ConstMemoryStrategyTest") +{ + // create a few memory blocks + MemBlock memBlock0(0, 2, 20, 0, 0); + MemBlock memBlock1(2, 3, 10, 20, 1); + MemBlock memBlock2(3, 5, 15, 30, 2); + MemBlock memBlock3(5, 6, 20, 50, 3); + MemBlock memBlock4(7, 8, 5, 70, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with ConstantMemoryStrategy + ConstantMemoryStrategy constLayerMemoryOptimizerStrategy; + CHECK_EQ(constLayerMemoryOptimizerStrategy.GetName(), std::string("ConstantMemoryStrategy")); + CHECK_EQ(constLayerMemoryOptimizerStrategy.GetMemBlockStrategyType(), MemBlockStrategyType::SingleAxisPacking); + auto memBins = constLayerMemoryOptimizerStrategy.Optimize(memBlocks); + CHECK(memBins.size() == 5); + + CHECK(memBins[1].m_MemBlocks.size() == 1); + CHECK(memBins[1].m_MemBlocks[0].m_Offset == 0); + CHECK(memBins[1].m_MemBlocks[0].m_MemSize == 10); + CHECK(memBins[1].m_MemBlocks[0].m_Index == 1); + + CHECK(memBins[4].m_MemBlocks.size() == 1); + CHECK(memBins[4].m_MemBlocks[0].m_Offset == 0); + CHECK(memBins[4].m_MemBlocks[0].m_MemSize == 5); + CHECK(memBins[4].m_MemBlocks[0].m_Index == 4); +} + +TEST_CASE("ConstLayerMemoryOptimizerStrategyValidatorTest") +{ + // create a few memory blocks + MemBlock memBlock0(0, 2, 20, 0, 0); + MemBlock memBlock1(2, 3, 10, 20, 1); + MemBlock memBlock2(3, 5, 15, 30, 2); + MemBlock memBlock3(5, 6, 20, 50, 3); + MemBlock memBlock4(7, 8, 5, 70, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with ConstLayerMemoryOptimizerStrategy + auto ptr = std::make_shared(); + StrategyValidator validator; + validator.SetStrategy(ptr); + // Ensure ConstLayerMemoryOptimizerStrategy is valid + CHECK_NOTHROW(validator.Optimize(memBlocks)); +} + +} diff --git a/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ValidatorStrategyTests.cpp b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ValidatorStrategyTests.cpp new file mode 100644 index 0000000000..bc04105f4b --- /dev/null +++ b/src/backends/backendsCommon/memoryOptimizerStrategyLibrary/test/ValidatorStrategyTests.cpp @@ -0,0 +1,283 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include + +#include +#include + +using namespace armnn; + +TEST_SUITE("MemoryOptimizerStrategyValidatorTestSuite") +{ + +// TestMemoryOptimizerStrategy: Create a MemBin and put all blocks in it so the can overlap. +class TestMemoryOptimizerStrategy : public IMemoryOptimizerStrategy +{ +public: + TestMemoryOptimizerStrategy(MemBlockStrategyType type) + : m_Name(std::string("testMemoryOptimizerStrategy")) + , m_MemBlockStrategyType(type) {} + + std::string GetName() const override + { + return m_Name; + } + + MemBlockStrategyType GetMemBlockStrategyType() const override + { + return m_MemBlockStrategyType; + } + + std::vector Optimize(std::vector& memBlocks) override + { + std::vector memBins; + memBins.reserve(memBlocks.size()); + + MemBin memBin; + memBin.m_MemBlocks.reserve(memBlocks.size()); + memBin.m_MemSize = 0; + for (auto& memBlock : memBlocks) + { + + memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; + memBin.m_MemBlocks.push_back(memBlock); + } + memBins.push_back(memBin); + + return memBins; + } + +private: + std::string m_Name; + MemBlockStrategyType m_MemBlockStrategyType; +}; + +TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapX") +{ + // create a few memory blocks + MemBlock memBlock0(0, 5, 20, 0, 0); + MemBlock memBlock1(5, 10, 10, 0, 1); + MemBlock memBlock2(10, 15, 15, 0, 2); + MemBlock memBlock3(15, 20, 20, 0, 3); + MemBlock memBlock4(20, 25, 5, 0, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with TestMemoryOptimizerStrategySingle + TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); + auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); + StrategyValidator validator; + validator.SetStrategy(ptr); + // SingleAxisPacking can overlap on X axis. + CHECK_NOTHROW(validator.Optimize(memBlocks)); + + // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti + TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); + auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); + StrategyValidator validatorMulti; + validatorMulti.SetStrategy(ptrMulti); + // MultiAxisPacking can overlap on X axis. + CHECK_NOTHROW(validatorMulti.Optimize(memBlocks)); +} + +TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapXAndY") +{ + // create a few memory blocks + MemBlock memBlock0(0, 5, 20, 0, 0); + MemBlock memBlock1(0, 10, 10, 0, 1); + MemBlock memBlock2(0, 15, 15, 0, 2); + MemBlock memBlock3(0, 20, 20, 0, 3); + MemBlock memBlock4(0, 25, 5, 0, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with TestMemoryOptimizerStrategySingle + TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); + auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); + StrategyValidator validator; + validator.SetStrategy(ptr); + // SingleAxisPacking cannot overlap on both X and Y axis. + CHECK_THROWS(validator.Optimize(memBlocks)); + + // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti + TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); + auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); + StrategyValidator validatorMulti; + validatorMulti.SetStrategy(ptrMulti); + // MultiAxisPacking cannot overlap on both X and Y axis. + CHECK_THROWS(validatorMulti.Optimize(memBlocks)); +} + +TEST_CASE("MemoryOptimizerStrategyValidatorTestOverlapY") +{ + // create a few memory blocks + MemBlock memBlock0(0, 2, 20, 0, 0); + MemBlock memBlock1(0, 3, 10, 20, 1); + MemBlock memBlock2(0, 5, 15, 30, 2); + MemBlock memBlock3(0, 6, 20, 50, 3); + MemBlock memBlock4(0, 8, 5, 70, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with TestMemoryOptimizerStrategySingle + TestMemoryOptimizerStrategy testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); + auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); + StrategyValidator validator; + validator.SetStrategy(ptr); + // SingleAxisPacking cannot overlap on Y axis + CHECK_THROWS(validator.Optimize(memBlocks)); + + // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti + TestMemoryOptimizerStrategy testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); + auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); + StrategyValidator validatorMulti; + validatorMulti.SetStrategy(ptrMulti); + // MultiAxisPacking can overlap on Y axis + CHECK_NOTHROW(validatorMulti.Optimize(memBlocks)); +} + +// TestMemoryOptimizerStrategyDuplicate: Create a MemBin and put all blocks in it duplicating each so validator +// can check +class TestMemoryOptimizerStrategyDuplicate : public TestMemoryOptimizerStrategy +{ +public: + TestMemoryOptimizerStrategyDuplicate(MemBlockStrategyType type) + : TestMemoryOptimizerStrategy(type) + {} + + std::vector Optimize(std::vector& memBlocks) override + { + std::vector memBins; + memBins.reserve(memBlocks.size()); + + MemBin memBin; + memBin.m_MemBlocks.reserve(memBlocks.size()); + for (auto& memBlock : memBlocks) + { + memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; + memBin.m_MemBlocks.push_back(memBlock); + // Put block in twice so it gets found twice + memBin.m_MemBlocks.push_back(memBlock); + } + memBins.push_back(memBin); + + return memBins; + } +}; + +TEST_CASE("MemoryOptimizerStrategyValidatorTestDuplicateBlocks") +{ + // create a few memory blocks + MemBlock memBlock0(0, 2, 20, 0, 0); + MemBlock memBlock1(2, 3, 10, 20, 1); + MemBlock memBlock2(3, 5, 15, 30, 2); + MemBlock memBlock3(5, 6, 20, 50, 3); + MemBlock memBlock4(7, 8, 5, 70, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with TestMemoryOptimizerStrategySingle + // Duplicate strategy is invalid as same block is found twice + TestMemoryOptimizerStrategyDuplicate testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); + auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); + StrategyValidator validator; + validator.SetStrategy(ptr); + CHECK_THROWS(validator.Optimize(memBlocks)); + + // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti + TestMemoryOptimizerStrategyDuplicate testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); + auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); + StrategyValidator validatorMulti; + validatorMulti.SetStrategy(ptrMulti); + CHECK_THROWS(validatorMulti.Optimize(memBlocks)); +} + +// TestMemoryOptimizerStrategySkip: Create a MemBin and put all blocks in it skipping every other block so validator +// can check +class TestMemoryOptimizerStrategySkip : public TestMemoryOptimizerStrategy +{ +public: + TestMemoryOptimizerStrategySkip(MemBlockStrategyType type) + : TestMemoryOptimizerStrategy(type) + {} + + std::vector Optimize(std::vector& memBlocks) override + { + std::vector memBins; + memBins.reserve(memBlocks.size()); + + MemBin memBin; + memBin.m_MemBlocks.reserve(memBlocks.size()); + for (unsigned int i = 0; i < memBlocks.size()-1; i+=2) + { + auto memBlock = memBlocks[i]; + memBin.m_MemSize = memBin.m_MemSize + memBlock.m_MemSize; + memBin.m_MemBlocks.push_back(memBlock); + } + memBins.push_back(memBin); + + return memBins; + } +}; + +TEST_CASE("MemoryOptimizerStrategyValidatorTestSkipBlocks") +{ + // create a few memory blocks + MemBlock memBlock0(0, 2, 20, 0, 0); + MemBlock memBlock1(2, 3, 10, 20, 1); + MemBlock memBlock2(3, 5, 15, 30, 2); + MemBlock memBlock3(5, 6, 20, 50, 3); + MemBlock memBlock4(7, 8, 5, 70, 4); + + std::vector memBlocks; + memBlocks.reserve(5); + memBlocks.push_back(memBlock0); + memBlocks.push_back(memBlock1); + memBlocks.push_back(memBlock2); + memBlocks.push_back(memBlock3); + memBlocks.push_back(memBlock4); + + // Optimize the memory blocks with TestMemoryOptimizerStrategySingle + // Skip strategy is invalid as every second block is not found + TestMemoryOptimizerStrategySkip testMemoryOptimizerStrategySingle(MemBlockStrategyType::SingleAxisPacking); + auto ptr = std::make_shared(testMemoryOptimizerStrategySingle); + StrategyValidator validator; + validator.SetStrategy(ptr); + CHECK_THROWS(validator.Optimize(memBlocks)); + + // Optimize the memory blocks with TestMemoryOptimizerStrategyMulti + TestMemoryOptimizerStrategySkip testMemoryOptimizerStrategyMulti(MemBlockStrategyType::MultiAxisPacking); + auto ptrMulti = std::make_shared(testMemoryOptimizerStrategyMulti); + StrategyValidator validatorMulti; + validatorMulti.SetStrategy(ptrMulti); + CHECK_THROWS(validatorMulti.Optimize(memBlocks)); +} + +} diff --git a/src/backends/backendsCommon/test/BackendRegistryTests.cpp b/src/backends/backendsCommon/test/BackendRegistryTests.cpp index 5acc61fe2c..18b3745a2e 100644 --- a/src/backends/backendsCommon/test/BackendRegistryTests.cpp +++ b/src/backends/backendsCommon/test/BackendRegistryTests.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include @@ -156,7 +156,7 @@ TEST_CASE("RegisterMemoryOptimizerStrategy") // Register the memory optimizer std::shared_ptr memoryOptimizerStrategy = - std::make_shared(); + std::make_shared(); BackendRegistryInstance().RegisterMemoryOptimizerStrategy(cpuRefBackendId, memoryOptimizerStrategy); CHECK(!BackendRegistryInstance().GetMemoryOptimizerStrategies().empty()); CHECK(BackendRegistryInstance().GetMemoryOptimizerStrategies().size() == 1); diff --git a/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp b/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp index a5bf17c8b1..11eae04775 100644 --- a/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp +++ b/src/backends/backendsCommon/test/CustomMemoryOptimizerStrategyTests.cpp @@ -80,18 +80,18 @@ TEST_CASE("CpuRefSetMemoryOptimizerStrategyTest") options.m_BackendOptions.emplace_back( BackendOptions{"CpuRef", { - {"MemoryOptimizerStrategy", "ConstLayerMemoryOptimizerStrategy"} + {"MemoryOptimizerStrategy", "ConstantMemoryStrategy"} } }); IRuntimePtr run = IRuntime::Create(options); - // ConstLayerMemoryOptimizerStrategy should be registered for CpuRef + // ConstantMemoryStrategy 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")); + CHECK(optimizerStrategy->GetName() == std::string("ConstantMemoryStrategy")); armnn::BackendRegistryInstance().DeregisterMemoryOptimizerStrategy(RefBackend::GetIdStatic()); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1531fd5f24..cea55c5b8e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -221,3 +221,7 @@ if(BUILD_ACCURACY_TOOL) target_include_directories(ImageCSVFileGenerator PRIVATE ../src/armnnUtils) ImageTensorExecutor(ImageCSVFileGenerator) endif() + +if(BUILD_MEMORY_STRATEGY_BENCHMARK) + add_subdirectory(MemoryStrategyBenchmark) +endif() diff --git a/tests/MemoryStrategyBenchmark/CMakeLists.txt b/tests/MemoryStrategyBenchmark/CMakeLists.txt new file mode 100644 index 0000000000..9ed79bae5f --- /dev/null +++ b/tests/MemoryStrategyBenchmark/CMakeLists.txt @@ -0,0 +1,16 @@ +add_executable(MemoryStrategyBenchmark + MemoryStrategyBenchmark.cpp + TestBlocks.hpp + TestStrategy.hpp + TestStrategy.cpp + ../../include/armnn/Exceptions.hpp + ../../src/armnn/Exceptions.cpp) + +target_link_libraries(MemoryStrategyBenchmark armnnMemoryOptimizationStrategies) +target_include_directories(MemoryStrategyBenchmark PRIVATE + ../../include/armnn/backends + ../../src/backends/backendsCommon/memoryOptimizerStrategyLibrary + ../../third-party/cxxopts) + + +set_target_properties(MemoryStrategyBenchmark PROPERTIES LINKER_LANGUAGE CXX) \ No newline at end of file diff --git a/tests/MemoryStrategyBenchmark/MemoryStrategyBenchmark.cpp b/tests/MemoryStrategyBenchmark/MemoryStrategyBenchmark.cpp new file mode 100644 index 0000000000..5924757f21 --- /dev/null +++ b/tests/MemoryStrategyBenchmark/MemoryStrategyBenchmark.cpp @@ -0,0 +1,206 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#include "TestBlocks.hpp" +#include "TestStrategy.hpp" + +#include +#include +#include + + +#include + +#include +#include +#include + +std::vector testBlocks +{ + {"inceptionv4", inceptionv4}, + {"deeplabv3", deeplabv3}, + {"deepspeechv1", deepspeechv1}, + {"ssd_mobilenetv2", ssd_mobilenetv2}, + {"resnetv2", resnetv2}, + {"yolov3",yolov3} +}; + +void PrintModels() +{ + std::cout << "Available models:\n"; + for (const auto& model : testBlocks) + { + std::cout << model.m_Name << "\n"; + } + std::cout << "\n"; +} + +size_t GetMinPossibleMemorySize(const std::vector blocks) +{ + std::vector lifetimes(1000); + for (const auto& block : blocks) + { + for (auto lifetime = block.m_StartOfLife; lifetime <= block.m_EndOfLife; ++lifetime) + { + lifetimes[lifetime] += block.m_MemSize; + } + } + return *std::max_element(lifetimes.begin(), lifetimes.end()); +} + +void RunBenchmark(armnn::IMemoryOptimizerStrategy* strategy, std::vector* models) +{ + using Clock = std::chrono::high_resolution_clock; + float avgEfficiency = 0; + std::chrono::duration avgDuration{}; + std::cout << "\nMemory Strategy: " << strategy->GetName()<< "\n"; + std::cout << "===============================================\n"; + for (auto& model : *models) + { + auto now = Clock::now(); + const std::vector result = strategy->Optimize(model.m_Blocks); + auto duration = std::chrono::duration(Clock::now() - now); + + avgDuration += duration; + size_t memoryUsage = 0; + for (auto bin : result) + { + memoryUsage += bin.m_MemSize; + } + size_t minSize = GetMinPossibleMemorySize(model.m_Blocks); + + float efficiency = static_cast(minSize) / static_cast(memoryUsage); + efficiency*=100; + avgEfficiency += efficiency; + std::cout << "\nModel: " << model.m_Name << "\n"; + + std::cout << "Strategy execution time: " << std::setprecision(4) << duration.count() << " milliseconds\n"; + + std::cout << "Memory usage: " << memoryUsage/1024 << " kb\n"; + + std::cout << "Minimum possible usage: " << minSize/1024 << " kb\n"; + + std::cout << "Memory efficiency: " << std::setprecision(3) << efficiency << "%\n"; + } + + avgDuration/= static_cast(models->size()); + avgEfficiency/= static_cast(models->size()); + + std::cout << "\n===============================================\n"; + std::cout << "Average memory duration: " << std::setprecision(4) << avgDuration.count() << " milliseconds\n"; + std::cout << "Average memory efficiency: " << std::setprecision(3) << avgEfficiency << "%\n"; +} + +struct BenchmarkOptions +{ + std::string m_StrategyName; + std::string m_ModelName; + bool m_UseDefaultStrategy = false; + bool m_Validate = false; +}; + +BenchmarkOptions ParseOptions(int argc, char* argv[]) +{ + cxxopts::Options options("Memory Benchmark", "Tests memory optimization strategies on different models"); + + options.add_options() + ("s, strategy", "Strategy name, do not specify to use default strategy", cxxopts::value()) + ("m, model", "Model name", cxxopts::value()) + ("v, validate", "Validate strategy", cxxopts::value()->default_value("false")->implicit_value("true")) + ("h,help", "Display usage information"); + + auto result = options.parse(argc, argv); + if (result.count("help")) + { + std::cout << options.help() << std::endl; + PrintModels(); + + std::cout << "\nAvailable strategies:\n"; + + for (const auto& s :armnn::GetMemoryOptimizerStrategyNames()) + { + std::cout << s << "\n"; + } + exit(EXIT_SUCCESS); + } + + BenchmarkOptions benchmarkOptions; + + if(result.count("strategy")) + { + benchmarkOptions.m_StrategyName = result["strategy"].as(); + } + else + { + std::cout << "No Strategy given, using default strategy"; + + benchmarkOptions.m_UseDefaultStrategy = true; + } + + if(result.count("model")) + { + benchmarkOptions.m_ModelName = result["model"].as(); + } + + benchmarkOptions.m_Validate = result["validate"].as(); + + return benchmarkOptions; +} + +int main(int argc, char* argv[]) +{ + BenchmarkOptions benchmarkOptions = ParseOptions(argc, argv); + + std::shared_ptr strategy; + + if (benchmarkOptions.m_UseDefaultStrategy) + { + strategy = std::make_shared(); + } + else + { + strategy = armnn::GetMemoryOptimizerStrategy(benchmarkOptions.m_StrategyName); + + if (!strategy) + { + std::cout << "Strategy name not found\n"; + return 0; + } + } + + std::vector model; + std::vector* modelsToTest = &testBlocks; + if (benchmarkOptions.m_ModelName.size() != 0) + { + auto it = std::find_if(testBlocks.cbegin(), testBlocks.cend(), [&](const TestBlock testBlock) + { + return testBlock.m_Name == benchmarkOptions.m_ModelName; + }); + + if (it == testBlocks.end()) + { + std::cout << "Model name not found\n"; + return 0; + } + else + { + model.push_back(*it); + modelsToTest = &model; + } + } + + if (benchmarkOptions.m_Validate) + { + armnn::StrategyValidator strategyValidator; + + strategyValidator.SetStrategy(strategy); + + RunBenchmark(&strategyValidator, modelsToTest); + } + else + { + RunBenchmark(strategy.get(), modelsToTest); + } + +} \ No newline at end of file diff --git a/tests/MemoryStrategyBenchmark/TestBlocks.hpp b/tests/MemoryStrategyBenchmark/TestBlocks.hpp new file mode 100644 index 0000000000..280307c2bf --- /dev/null +++ b/tests/MemoryStrategyBenchmark/TestBlocks.hpp @@ -0,0 +1,1575 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include + +struct TestBlock +{ + std::string m_Name; + std::vector& m_Blocks; +}; + +// Generated from inception_v4_299_quant.tflite +std::vector inceptionv4 +{ + { 0, 1, 268203, 0, 0 }, + { 1, 5, 710432, 0, 1 }, + { 4, 9, 691488, 0, 4 }, + { 5, 12, 1382976, 0, 5 }, + { 6, 14, 341056, 0, 6 }, + { 7, 15, 511584, 0, 7 }, + { 8, 18, 852640, 0, 8 }, + { 9, 20, 341056, 0, 9 }, + { 10, 22, 341056, 0, 10 }, + { 12, 25, 341056, 0, 12 }, + { 13, 27, 341056, 0, 13 }, + { 11, 26, 483936, 0, 11 }, + { 14, 29, 483936, 0, 14 }, + { 15, 32, 967872, 0, 15 }, + { 17, 35, 235200, 0, 17 }, + { 16, 34, 235200, 0, 16 }, + { 18, 40, 470400, 0, 18 }, + { 21, 44, 78400, 0, 21 }, + { 22, 46, 78400, 0, 22 }, + { 19, 44, 470400, 0, 19 }, + { 24, 50, 117600, 0, 24 }, + { 20, 47, 117600, 0, 20 }, + { 23, 50, 117600, 0, 23 }, + { 26, 53, 117600, 0, 26 }, + { 25, 52, 117600, 0, 25 }, + { 27, 58, 470400, 0, 27 }, + { 30, 62, 78400, 0, 30 }, + { 31, 64, 78400, 0, 31 }, + { 28, 62, 470400, 0, 28 }, + { 33, 68, 117600, 0, 33 }, + { 29, 65, 117600, 0, 29 }, + { 32, 68, 117600, 0, 32 }, + { 35, 71, 117600, 0, 35 }, + { 34, 70, 117600, 0, 34 }, + { 36, 76, 470400, 0, 36 }, + { 39, 80, 78400, 0, 39 }, + { 40, 82, 78400, 0, 40 }, + { 37, 80, 470400, 0, 37 }, + { 42, 86, 117600, 0, 42 }, + { 38, 83, 117600, 0, 38 }, + { 41, 86, 117600, 0, 41 }, + { 44, 89, 117600, 0, 44 }, + { 43, 88, 117600, 0, 43 }, + { 45, 94, 470400, 0, 45 }, + { 48, 98, 78400, 0, 48 }, + { 49, 100, 78400, 0, 49 }, + { 46, 98, 470400, 0, 46 }, + { 51, 104, 117600, 0, 51 }, + { 47, 101, 117600, 0, 47 }, + { 50, 104, 117600, 0, 50 }, + { 53, 107, 117600, 0, 53 }, + { 52, 106, 117600, 0, 52 }, + { 54, 111, 470400, 0, 54 }, + { 57, 115, 235200, 0, 57 }, + { 58, 117, 274400, 0, 58 }, + { 56, 116, 110976, 0, 56 }, + { 59, 119, 73984, 0, 59 }, + { 55, 115, 110976, 0, 55 }, + { 60, 124, 295936, 0, 60 }, + { 63, 128, 55488, 0, 63 }, + { 64, 130, 55488, 0, 64 }, + { 61, 128, 295936, 0, 61 }, + { 65, 133, 64736, 0, 65 }, + { 66, 135, 55488, 0, 66 }, + { 69, 139, 64736, 0, 69 }, + { 70, 141, 64736, 0, 70 }, + { 62, 134, 110976, 0, 62 }, + { 68, 140, 73984, 0, 68 }, + { 71, 143, 73984, 0, 71 }, + { 67, 139, 36992, 0, 67 }, + { 72, 148, 295936, 0, 72 }, + { 75, 152, 55488, 0, 75 }, + { 76, 154, 55488, 0, 76 }, + { 73, 152, 295936, 0, 73 }, + { 77, 157, 64736, 0, 77 }, + { 78, 159, 55488, 0, 78 }, + { 81, 163, 64736, 0, 81 }, + { 82, 165, 64736, 0, 82 }, + { 74, 158, 110976, 0, 74 }, + { 80, 164, 73984, 0, 80 }, + { 83, 167, 73984, 0, 83 }, + { 79, 163, 36992, 0, 79 }, + { 84, 172, 295936, 0, 84 }, + { 87, 176, 55488, 0, 87 }, + { 88, 178, 55488, 0, 88 }, + { 85, 176, 295936, 0, 85 }, + { 89, 181, 64736, 0, 89 }, + { 90, 183, 55488, 0, 90 }, + { 93, 187, 64736, 0, 93 }, + { 94, 189, 64736, 0, 94 }, + { 86, 182, 110976, 0, 86 }, + { 92, 188, 73984, 0, 92 }, + { 95, 191, 73984, 0, 95 }, + { 91, 187, 36992, 0, 91 }, + { 96, 196, 295936, 0, 96 }, + { 99, 200, 55488, 0, 99 }, + { 100, 202, 55488, 0, 100 }, + { 97, 200, 295936, 0, 97 }, + { 101, 205, 64736, 0, 101 }, + { 102, 207, 55488, 0, 102 }, + { 105, 211, 64736, 0, 105 }, + { 106, 213, 64736, 0, 106 }, + { 98, 206, 110976, 0, 98 }, + { 104, 212, 73984, 0, 104 }, + { 107, 215, 73984, 0, 107 }, + { 103, 211, 36992, 0, 103 }, + { 108, 220, 295936, 0, 108 }, + { 111, 224, 55488, 0, 111 }, + { 112, 226, 55488, 0, 112 }, + { 109, 224, 295936, 0, 109 }, + { 113, 229, 64736, 0, 113 }, + { 114, 231, 55488, 0, 114 }, + { 117, 235, 64736, 0, 117 }, + { 118, 237, 64736, 0, 118 }, + { 110, 230, 110976, 0, 110 }, + { 116, 236, 73984, 0, 116 }, + { 119, 239, 73984, 0, 119 }, + { 115, 235, 36992, 0, 115 }, + { 120, 244, 295936, 0, 120 }, + { 123, 248, 55488, 0, 123 }, + { 124, 250, 55488, 0, 124 }, + { 121, 248, 295936, 0, 121 }, + { 125, 253, 64736, 0, 125 }, + { 126, 255, 55488, 0, 126 }, + { 129, 259, 64736, 0, 129 }, + { 130, 261, 64736, 0, 130 }, + { 122, 254, 110976, 0, 122 }, + { 128, 260, 73984, 0, 128 }, + { 131, 263, 73984, 0, 131 }, + { 127, 259, 36992, 0, 127 }, + { 132, 268, 295936, 0, 132 }, + { 135, 272, 55488, 0, 135 }, + { 136, 274, 55488, 0, 136 }, + { 133, 272, 295936, 0, 133 }, + { 137, 277, 64736, 0, 137 }, + { 138, 279, 55488, 0, 138 }, + { 141, 283, 64736, 0, 141 }, + { 142, 285, 64736, 0, 142 }, + { 134, 278, 110976, 0, 134 }, + { 140, 284, 73984, 0, 140 }, + { 143, 287, 73984, 0, 143 }, + { 139, 283, 36992, 0, 139 }, + { 144, 291, 295936, 0, 144 }, + { 146, 294, 55488, 0, 146 }, + { 147, 296, 73984, 0, 147 }, + { 149, 299, 73984, 0, 149 }, + { 150, 301, 92480, 0, 150 }, + { 148, 300, 12288, 0, 148 }, + { 151, 303, 20480, 0, 151 }, + { 145, 297, 65536, 0, 145 }, + { 152, 308, 98304, 0, 152 }, + { 155, 313, 24576, 0, 155 }, + { 156, 315, 24576, 0, 156 }, + { 153, 313, 98304, 0, 153 }, + { 157, 318, 16384, 0, 157 }, + { 158, 319, 16384, 0, 158 }, + { 159, 321, 28672, 0, 159 }, + { 162, 326, 32768, 0, 162 }, + { 163, 328, 16384, 0, 163 }, + { 164, 329, 16384, 0, 164 }, + { 154, 320, 16384, 0, 154 }, + { 161, 327, 32768, 0, 161 }, + { 165, 331, 32768, 0, 165 }, + { 160, 326, 16384, 0, 160 }, + { 166, 336, 98304, 0, 166 }, + { 169, 341, 24576, 0, 169 }, + { 170, 343, 24576, 0, 170 }, + { 167, 341, 98304, 0, 167 }, + { 171, 346, 16384, 0, 171 }, + { 172, 347, 16384, 0, 172 }, + { 173, 349, 28672, 0, 173 }, + { 176, 354, 32768, 0, 176 }, + { 177, 356, 16384, 0, 177 }, + { 178, 357, 16384, 0, 178 }, + { 168, 348, 16384, 0, 168 }, + { 175, 355, 32768, 0, 175 }, + { 179, 359, 32768, 0, 179 }, + { 174, 354, 16384, 0, 174 }, + { 180, 364, 98304, 0, 180 }, + { 183, 369, 24576, 0, 183 }, + { 184, 371, 24576, 0, 184 }, + { 181, 369, 98304, 0, 181 }, + { 185, 374, 16384, 0, 185 }, + { 186, 375, 16384, 0, 186 }, + { 187, 377, 28672, 0, 187 }, + { 190, 382, 32768, 0, 190 }, + { 191, 384, 16384, 0, 191 }, + { 192, 385, 16384, 0, 192 }, + { 182, 376, 16384, 0, 182 }, + { 189, 383, 32768, 0, 189 }, + { 193, 387, 32768, 0, 193 }, + { 188, 382, 16384, 0, 188 }, + { 194, 389, 98304, 0, 194 }, + { 195, 391, 1536, 0, 195 }, + { 196, 393, 1536, 0, 196 }, + { 197, 395, 1001, 0, 197 }, + { 198, 397, 1001, 0, 198 } +}; + +// Generated from deepspeechv1_float32.tflite +std::vector deepspeechv1 +{ + { 0, 3, 31616, 0, 0 }, + { 3, 39, 31616, 0, 3 }, + { 36, 73, 131072, 0, 36 }, + { 37, 75, 131072, 0, 37 }, + { 38, 77, 131072, 0, 38 }, + { 39, 79, 131072, 0, 39 }, + { 40, 81, 131072, 0, 40 }, + { 41, 83, 131072, 0, 41 }, + { 42, 85, 131072, 0, 42 }, + { 43, 87, 131072, 0, 43 }, + { 44, 89, 131072, 0, 44 }, + { 45, 91, 131072, 0, 45 }, + { 46, 93, 8192, 0, 46 }, + { 46, 94, 8192, 0, 47 }, + { 46, 95, 8192, 0, 48 }, + { 46, 96, 8192, 0, 49 }, + { 46, 97, 8192, 0, 50 }, + { 46, 98, 8192, 0, 51 }, + { 46, 99, 8192, 0, 52 }, + { 46, 100, 8192, 0, 53 }, + { 46, 101, 8192, 0, 54 }, + { 46, 102, 8192, 0, 55 }, + { 46, 103, 8192, 0, 56 }, + { 46, 104, 8192, 0, 57 }, + { 46, 105, 8192, 0, 58 }, + { 46, 106, 8192, 0, 59 }, + { 46, 107, 8192, 0, 60 }, + { 46, 108, 8192, 0, 61 }, + { 47, 110, 8192, 0, 62 }, + { 1, 64, 8192, 0, 1 }, + { 63, 127, 16384, 0, 78 }, + { 64, 129, 32768, 0, 79 }, + { 65, 131, 8192, 0, 82 }, + { 65, 132, 8192, 0, 80 }, + { 65, 133, 8192, 0, 81 }, + { 65, 134, 8192, 0, 83 }, + { 66, 136, 8192, 0, 84 }, + { 67, 138, 8192, 0, 85 }, + { 68, 139, 8192, 0, 86 }, + { 70, 142, 8192, 0, 88 }, + { 2, 74, 8192, 0, 2 }, + { 72, 145, 8192, 0, 90 }, + { 71, 144, 8192, 0, 89 }, + { 69, 144, 8192, 0, 87 }, + { 74, 149, 8192, 0, 92 }, + { 48, 124, 8192, 0, 63 }, + { 76, 153, 16384, 0, 94 }, + { 77, 155, 32768, 0, 95 }, + { 78, 157, 8192, 0, 98 }, + { 78, 158, 8192, 0, 96 }, + { 78, 159, 8192, 0, 97 }, + { 78, 160, 8192, 0, 99 }, + { 79, 162, 8192, 0, 100 }, + { 80, 164, 8192, 0, 101 }, + { 81, 165, 8192, 0, 102 }, + { 83, 168, 8192, 0, 104 }, + { 73, 158, 8192, 0, 91 }, + { 85, 171, 8192, 0, 106 }, + { 84, 170, 8192, 0, 105 }, + { 82, 170, 8192, 0, 103 }, + { 87, 175, 8192, 0, 108 }, + { 49, 138, 8192, 0, 64 }, + { 89, 179, 16384, 0, 110 }, + { 90, 181, 32768, 0, 111 }, + { 91, 183, 8192, 0, 114 }, + { 91, 184, 8192, 0, 112 }, + { 91, 185, 8192, 0, 113 }, + { 91, 186, 8192, 0, 115 }, + { 92, 188, 8192, 0, 116 }, + { 93, 190, 8192, 0, 117 }, + { 94, 191, 8192, 0, 118 }, + { 96, 194, 8192, 0, 120 }, + { 86, 184, 8192, 0, 107 }, + { 98, 197, 8192, 0, 122 }, + { 97, 196, 8192, 0, 121 }, + { 95, 196, 8192, 0, 119 }, + { 100, 201, 8192, 0, 124 }, + { 50, 152, 8192, 0, 65 }, + { 102, 205, 16384, 0, 126 }, + { 103, 207, 32768, 0, 127 }, + { 104, 209, 8192, 0, 130 }, + { 104, 210, 8192, 0, 128 }, + { 104, 211, 8192, 0, 129 }, + { 104, 212, 8192, 0, 131 }, + { 105, 214, 8192, 0, 132 }, + { 106, 216, 8192, 0, 133 }, + { 107, 217, 8192, 0, 134 }, + { 109, 220, 8192, 0, 136 }, + { 99, 210, 8192, 0, 123 }, + { 111, 223, 8192, 0, 138 }, + { 110, 222, 8192, 0, 137 }, + { 108, 222, 8192, 0, 135 }, + { 113, 227, 8192, 0, 140 }, + { 51, 166, 8192, 0, 66 }, + { 115, 231, 16384, 0, 142 }, + { 116, 233, 32768, 0, 143 }, + { 117, 235, 8192, 0, 146 }, + { 117, 236, 8192, 0, 144 }, + { 117, 237, 8192, 0, 145 }, + { 117, 238, 8192, 0, 147 }, + { 118, 240, 8192, 0, 148 }, + { 119, 242, 8192, 0, 149 }, + { 120, 243, 8192, 0, 150 }, + { 122, 246, 8192, 0, 152 }, + { 112, 236, 8192, 0, 139 }, + { 124, 249, 8192, 0, 154 }, + { 123, 248, 8192, 0, 153 }, + { 121, 248, 8192, 0, 151 }, + { 126, 253, 8192, 0, 156 }, + { 52, 180, 8192, 0, 67 }, + { 128, 257, 16384, 0, 158 }, + { 129, 259, 32768, 0, 159 }, + { 130, 261, 8192, 0, 162 }, + { 130, 262, 8192, 0, 160 }, + { 130, 263, 8192, 0, 161 }, + { 130, 264, 8192, 0, 163 }, + { 131, 266, 8192, 0, 164 }, + { 132, 268, 8192, 0, 165 }, + { 133, 269, 8192, 0, 166 }, + { 135, 272, 8192, 0, 168 }, + { 125, 262, 8192, 0, 155 }, + { 137, 275, 8192, 0, 170 }, + { 136, 274, 8192, 0, 169 }, + { 134, 274, 8192, 0, 167 }, + { 139, 279, 8192, 0, 172 }, + { 53, 194, 8192, 0, 68 }, + { 141, 283, 16384, 0, 174 }, + { 142, 285, 32768, 0, 175 }, + { 143, 287, 8192, 0, 178 }, + { 143, 288, 8192, 0, 176 }, + { 143, 289, 8192, 0, 177 }, + { 143, 290, 8192, 0, 179 }, + { 144, 292, 8192, 0, 180 }, + { 145, 294, 8192, 0, 181 }, + { 146, 295, 8192, 0, 182 }, + { 148, 298, 8192, 0, 184 }, + { 138, 288, 8192, 0, 171 }, + { 150, 301, 8192, 0, 186 }, + { 149, 300, 8192, 0, 185 }, + { 147, 300, 8192, 0, 183 }, + { 152, 305, 8192, 0, 188 }, + { 54, 208, 8192, 0, 69 }, + { 154, 309, 16384, 0, 190 }, + { 155, 311, 32768, 0, 191 }, + { 156, 313, 8192, 0, 194 }, + { 156, 314, 8192, 0, 192 }, + { 156, 315, 8192, 0, 193 }, + { 156, 316, 8192, 0, 195 }, + { 157, 318, 8192, 0, 196 }, + { 158, 320, 8192, 0, 197 }, + { 159, 321, 8192, 0, 198 }, + { 161, 324, 8192, 0, 200 }, + { 151, 314, 8192, 0, 187 }, + { 163, 327, 8192, 0, 202 }, + { 162, 326, 8192, 0, 201 }, + { 160, 326, 8192, 0, 199 }, + { 165, 331, 8192, 0, 204 }, + { 55, 222, 8192, 0, 70 }, + { 167, 335, 16384, 0, 206 }, + { 168, 337, 32768, 0, 207 }, + { 169, 339, 8192, 0, 210 }, + { 169, 340, 8192, 0, 208 }, + { 169, 341, 8192, 0, 209 }, + { 169, 342, 8192, 0, 211 }, + { 170, 344, 8192, 0, 212 }, + { 171, 346, 8192, 0, 213 }, + { 172, 347, 8192, 0, 214 }, + { 174, 350, 8192, 0, 216 }, + { 164, 340, 8192, 0, 203 }, + { 176, 353, 8192, 0, 218 }, + { 175, 352, 8192, 0, 217 }, + { 173, 352, 8192, 0, 215 }, + { 178, 357, 8192, 0, 220 }, + { 56, 236, 8192, 0, 71 }, + { 180, 361, 16384, 0, 222 }, + { 181, 363, 32768, 0, 223 }, + { 182, 365, 8192, 0, 226 }, + { 182, 366, 8192, 0, 224 }, + { 182, 367, 8192, 0, 225 }, + { 182, 368, 8192, 0, 227 }, + { 183, 370, 8192, 0, 228 }, + { 184, 372, 8192, 0, 229 }, + { 185, 373, 8192, 0, 230 }, + { 187, 376, 8192, 0, 232 }, + { 177, 366, 8192, 0, 219 }, + { 189, 379, 8192, 0, 234 }, + { 188, 378, 8192, 0, 233 }, + { 186, 378, 8192, 0, 231 }, + { 191, 383, 8192, 0, 236 }, + { 57, 250, 8192, 0, 72 }, + { 193, 387, 16384, 0, 238 }, + { 194, 389, 32768, 0, 239 }, + { 195, 391, 8192, 0, 242 }, + { 195, 392, 8192, 0, 240 }, + { 195, 393, 8192, 0, 241 }, + { 195, 394, 8192, 0, 243 }, + { 196, 396, 8192, 0, 244 }, + { 197, 398, 8192, 0, 245 }, + { 198, 399, 8192, 0, 246 }, + { 200, 402, 8192, 0, 248 }, + { 190, 392, 8192, 0, 235 }, + { 202, 405, 8192, 0, 250 }, + { 201, 404, 8192, 0, 249 }, + { 199, 404, 8192, 0, 247 }, + { 204, 409, 8192, 0, 252 }, + { 58, 264, 8192, 0, 73 }, + { 206, 413, 16384, 0, 254 }, + { 207, 415, 32768, 0, 255 }, + { 208, 417, 8192, 0, 258 }, + { 208, 418, 8192, 0, 256 }, + { 208, 419, 8192, 0, 257 }, + { 208, 420, 8192, 0, 259 }, + { 209, 422, 8192, 0, 260 }, + { 210, 424, 8192, 0, 261 }, + { 211, 425, 8192, 0, 262 }, + { 213, 428, 8192, 0, 264 }, + { 203, 418, 8192, 0, 251 }, + { 215, 431, 8192, 0, 266 }, + { 214, 430, 8192, 0, 265 }, + { 212, 430, 8192, 0, 263 }, + { 217, 435, 8192, 0, 268 }, + { 59, 278, 8192, 0, 74 }, + { 219, 439, 16384, 0, 270 }, + { 220, 441, 32768, 0, 271 }, + { 221, 443, 8192, 0, 274 }, + { 221, 444, 8192, 0, 272 }, + { 221, 445, 8192, 0, 273 }, + { 221, 446, 8192, 0, 275 }, + { 222, 448, 8192, 0, 276 }, + { 223, 450, 8192, 0, 277 }, + { 224, 451, 8192, 0, 278 }, + { 226, 454, 8192, 0, 280 }, + { 216, 444, 8192, 0, 267 }, + { 228, 457, 8192, 0, 282 }, + { 227, 456, 8192, 0, 281 }, + { 225, 456, 8192, 0, 279 }, + { 230, 461, 8192, 0, 284 }, + { 60, 292, 8192, 0, 75 }, + { 232, 465, 16384, 0, 286 }, + { 233, 467, 32768, 0, 287 }, + { 234, 469, 8192, 0, 290 }, + { 234, 470, 8192, 0, 288 }, + { 234, 471, 8192, 0, 289 }, + { 234, 472, 8192, 0, 291 }, + { 235, 474, 8192, 0, 292 }, + { 236, 476, 8192, 0, 293 }, + { 237, 477, 8192, 0, 294 }, + { 239, 480, 8192, 0, 296 }, + { 229, 470, 8192, 0, 283 }, + { 241, 483, 8192, 0, 298 }, + { 240, 482, 8192, 0, 297 }, + { 238, 482, 8192, 0, 295 }, + { 243, 487, 8192, 0, 300 }, + { 61, 306, 8192, 0, 76 }, + { 245, 491, 16384, 0, 302 }, + { 246, 493, 32768, 0, 303 }, + { 247, 495, 8192, 0, 306 }, + { 247, 496, 8192, 0, 304 }, + { 247, 497, 8192, 0, 305 }, + { 247, 498, 8192, 0, 307 }, + { 248, 500, 8192, 0, 308 }, + { 249, 502, 8192, 0, 309 }, + { 250, 503, 8192, 0, 310 }, + { 252, 506, 8192, 0, 312 }, + { 242, 496, 8192, 0, 299 }, + { 254, 509, 8192, 0, 314 }, + { 253, 508, 8192, 0, 313 }, + { 251, 508, 8192, 0, 311 }, + { 256, 513, 8192, 0, 316 }, + { 62, 320, 8192, 0, 77 }, + { 258, 517, 16384, 0, 318 }, + { 259, 519, 32768, 0, 319 }, + { 260, 521, 8192, 0, 322 }, + { 260, 522, 8192, 0, 320 }, + { 260, 523, 8192, 0, 321 }, + { 260, 524, 8192, 0, 323 }, + { 261, 526, 8192, 0, 324 }, + { 262, 528, 8192, 0, 325 }, + { 263, 529, 8192, 0, 326 }, + { 265, 532, 8192, 0, 328 }, + { 255, 522, 8192, 0, 315 }, + { 267, 535, 8192, 0, 330 }, + { 266, 534, 8192, 0, 329 }, + { 264, 534, 8192, 0, 327 }, + { 269, 539, 8192, 0, 332 }, + { 75, 346, 8192, 0, 93 }, + { 88, 359, 8192, 0, 109 }, + { 101, 372, 8192, 0, 125 }, + { 114, 385, 8192, 0, 141 }, + { 127, 398, 8192, 0, 157 }, + { 140, 411, 8192, 0, 173 }, + { 153, 424, 8192, 0, 189 }, + { 166, 437, 8192, 0, 205 }, + { 179, 450, 8192, 0, 221 }, + { 192, 463, 8192, 0, 237 }, + { 205, 476, 8192, 0, 253 }, + { 218, 489, 8192, 0, 269 }, + { 231, 502, 8192, 0, 285 }, + { 244, 515, 8192, 0, 301 }, + { 257, 528, 8192, 0, 317 }, + { 271, 543, 131072, 0, 334 }, + { 272, 545, 131072, 0, 335 }, + { 273, 547, 131072, 0, 336 }, + { 274, 549, 131072, 0, 337 }, + { 275, 551, 1856, 0, 338 }, + { 276, 553, 1856, 0, 339 }, + { 270, 548, 8192, 0, 333 }, + { 268, 547, 8192, 0, 331 } +}; + +// Generated from resnet_v2_50_default_minmax.tflite +std::vector resnetv2 +{ + { 0, 1, 150528, 0, 0 }, + { 1, 37, 802816, 0, 1 }, + { 36, 73, 200704, 0, 36 }, + { 37, 75, 200704, 0, 37 }, + { 38, 77, 200704, 0, 38 }, + { 39, 80, 200704, 0, 39 }, + { 41, 83, 200704, 0, 41 }, + { 42, 85, 200704, 0, 42 }, + { 43, 87, 200704, 0, 43 }, + { 44, 89, 200704, 0, 44 }, + { 40, 86, 802816, 0, 40 }, + { 45, 91, 802816, 0, 45 }, + { 47, 95, 802816, 0, 47 }, + { 48, 97, 802816, 0, 48 }, + { 49, 99, 802816, 0, 49 }, + { 50, 101, 200704, 0, 50 }, + { 51, 103, 200704, 0, 51 }, + { 52, 105, 200704, 0, 52 }, + { 53, 107, 200704, 0, 53 }, + { 46, 101, 802816, 0, 46 }, + { 54, 109, 802816, 0, 54 }, + { 55, 112, 802816, 0, 55 }, + { 56, 114, 802816, 0, 56 }, + { 58, 117, 802816, 0, 58 }, + { 59, 119, 802816, 0, 59 }, + { 60, 121, 200704, 0, 60 }, + { 61, 123, 200704, 0, 61 }, + { 62, 125, 50176, 0, 62 }, + { 63, 127, 50176, 0, 63 }, + { 57, 122, 200704, 0, 57 }, + { 64, 129, 200704, 0, 64 }, + { 65, 131, 200704, 0, 65 }, + { 66, 133, 200704, 0, 66 }, + { 67, 135, 200704, 0, 67 }, + { 68, 138, 200704, 0, 68 }, + { 70, 141, 100352, 0, 70 }, + { 71, 143, 100352, 0, 71 }, + { 72, 145, 100352, 0, 72 }, + { 73, 147, 100352, 0, 73 }, + { 69, 144, 401408, 0, 69 }, + { 74, 149, 401408, 0, 74 }, + { 76, 153, 401408, 0, 76 }, + { 77, 155, 401408, 0, 77 }, + { 78, 157, 401408, 0, 78 }, + { 79, 159, 100352, 0, 79 }, + { 80, 161, 100352, 0, 80 }, + { 81, 163, 100352, 0, 81 }, + { 82, 165, 100352, 0, 82 }, + { 75, 159, 401408, 0, 75 }, + { 83, 167, 401408, 0, 83 }, + { 85, 171, 401408, 0, 85 }, + { 86, 173, 401408, 0, 86 }, + { 87, 175, 401408, 0, 87 }, + { 88, 177, 100352, 0, 88 }, + { 89, 179, 100352, 0, 89 }, + { 90, 181, 100352, 0, 90 }, + { 91, 183, 100352, 0, 91 }, + { 84, 177, 401408, 0, 84 }, + { 92, 185, 401408, 0, 92 }, + { 93, 188, 401408, 0, 93 }, + { 94, 190, 401408, 0, 94 }, + { 96, 193, 401408, 0, 96 }, + { 97, 195, 401408, 0, 97 }, + { 98, 197, 100352, 0, 98 }, + { 99, 199, 100352, 0, 99 }, + { 100, 201, 25088, 0, 100 }, + { 101, 203, 25088, 0, 101 }, + { 95, 198, 100352, 0, 95 }, + { 102, 205, 100352, 0, 102 }, + { 103, 207, 100352, 0, 103 }, + { 104, 209, 100352, 0, 104 }, + { 105, 211, 100352, 0, 105 }, + { 106, 214, 100352, 0, 106 }, + { 108, 217, 50176, 0, 108 }, + { 109, 219, 50176, 0, 109 }, + { 110, 221, 50176, 0, 110 }, + { 111, 223, 50176, 0, 111 }, + { 107, 220, 200704, 0, 107 }, + { 112, 225, 200704, 0, 112 }, + { 114, 229, 200704, 0, 114 }, + { 115, 231, 200704, 0, 115 }, + { 116, 233, 200704, 0, 116 }, + { 117, 235, 50176, 0, 117 }, + { 118, 237, 50176, 0, 118 }, + { 119, 239, 50176, 0, 119 }, + { 120, 241, 50176, 0, 120 }, + { 113, 235, 200704, 0, 113 }, + { 121, 243, 200704, 0, 121 }, + { 123, 247, 200704, 0, 123 }, + { 124, 249, 200704, 0, 124 }, + { 125, 251, 200704, 0, 125 }, + { 126, 253, 50176, 0, 126 }, + { 127, 255, 50176, 0, 127 }, + { 128, 257, 50176, 0, 128 }, + { 129, 259, 50176, 0, 129 }, + { 122, 253, 200704, 0, 122 }, + { 130, 261, 200704, 0, 130 }, + { 132, 265, 200704, 0, 132 }, + { 133, 267, 200704, 0, 133 }, + { 134, 269, 200704, 0, 134 }, + { 135, 271, 50176, 0, 135 }, + { 136, 273, 50176, 0, 136 }, + { 137, 275, 50176, 0, 137 }, + { 138, 277, 50176, 0, 138 }, + { 131, 271, 200704, 0, 131 }, + { 139, 279, 200704, 0, 139 }, + { 141, 283, 200704, 0, 141 }, + { 142, 285, 200704, 0, 142 }, + { 143, 287, 200704, 0, 143 }, + { 144, 289, 50176, 0, 144 }, + { 145, 291, 50176, 0, 145 }, + { 146, 293, 50176, 0, 146 }, + { 147, 295, 50176, 0, 147 }, + { 140, 289, 200704, 0, 140 }, + { 148, 297, 200704, 0, 148 }, + { 149, 300, 200704, 0, 149 }, + { 150, 302, 200704, 0, 150 }, + { 152, 305, 200704, 0, 152 }, + { 153, 307, 200704, 0, 153 }, + { 154, 309, 50176, 0, 154 }, + { 155, 311, 50176, 0, 155 }, + { 156, 313, 12544, 0, 156 }, + { 157, 315, 12544, 0, 157 }, + { 151, 310, 50176, 0, 151 }, + { 158, 317, 50176, 0, 158 }, + { 159, 319, 50176, 0, 159 }, + { 160, 321, 50176, 0, 160 }, + { 161, 323, 50176, 0, 161 }, + { 162, 326, 50176, 0, 162 }, + { 164, 329, 25088, 0, 164 }, + { 165, 331, 25088, 0, 165 }, + { 166, 333, 25088, 0, 166 }, + { 167, 335, 25088, 0, 167 }, + { 163, 332, 100352, 0, 163 }, + { 168, 337, 100352, 0, 168 }, + { 170, 341, 100352, 0, 170 }, + { 171, 343, 100352, 0, 171 }, + { 172, 345, 100352, 0, 172 }, + { 173, 347, 25088, 0, 173 }, + { 174, 349, 25088, 0, 174 }, + { 175, 351, 25088, 0, 175 }, + { 176, 353, 25088, 0, 176 }, + { 169, 347, 100352, 0, 169 }, + { 177, 355, 100352, 0, 177 }, + { 179, 359, 100352, 0, 179 }, + { 180, 361, 100352, 0, 180 }, + { 181, 363, 100352, 0, 181 }, + { 182, 365, 25088, 0, 182 }, + { 183, 367, 25088, 0, 183 }, + { 184, 369, 25088, 0, 184 }, + { 185, 371, 25088, 0, 185 }, + { 178, 365, 100352, 0, 178 }, + { 186, 373, 100352, 0, 186 }, + { 187, 375, 100352, 0, 187 }, + { 188, 377, 100352, 0, 188 }, + { 189, 379, 100352, 0, 189 }, + { 190, 381, 100352, 0, 190 }, + { 191, 383, 2048, 0, 191 }, + { 192, 385, 1001, 0, 192 }, + { 193, 387, 1001, 0, 193 }, + { 194, 389, 1001, 0, 194 } + +}; + +// Generated from yolov3_1080_1920_backbone_int8.tflite +std::vector yolov3 +{ + { 0, 1, 24883200, 0, 0 }, + { 1, 75, 6220800, 0, 1 }, + { 74, 150, 66355200, 0, 74 }, + { 75, 152, 66355200, 0, 75 }, + { 76, 154, 66355200, 0, 76 }, + { 77, 155, 66355200, 0, 77 }, + { 78, 157, 66355200, 0, 78 }, + { 79, 160, 33177600, 0, 79 }, + { 80, 162, 33177600, 0, 80 }, + { 81, 164, 33177600, 0, 81 }, + { 82, 165, 33177600, 0, 82 }, + { 84, 170, 16588800, 0, 84 }, + { 85, 172, 16588800, 0, 85 }, + { 86, 174, 16588800, 0, 86 }, + { 87, 175, 16588800, 0, 87 }, + { 88, 177, 16588800, 0, 88 }, + { 89, 180, 33177600, 0, 89 }, + { 90, 182, 33177600, 0, 90 }, + { 91, 184, 33177600, 0, 91 }, + { 92, 185, 33177600, 0, 92 }, + { 93, 187, 33177600, 0, 93 }, + { 83, 177, 33177600, 0, 83 }, + { 94, 189, 33177600, 0, 94 }, + { 95, 192, 16588800, 0, 95 }, + { 96, 194, 16588800, 0, 96 }, + { 97, 196, 16588800, 0, 97 }, + { 98, 197, 16588800, 0, 98 }, + { 100, 202, 8294400, 0, 100 }, + { 101, 204, 8294400, 0, 101 }, + { 102, 206, 8294400, 0, 102 }, + { 103, 207, 8294400, 0, 103 }, + { 104, 209, 8294400, 0, 104 }, + { 105, 212, 16588800, 0, 105 }, + { 106, 214, 16588800, 0, 106 }, + { 107, 216, 16588800, 0, 107 }, + { 108, 217, 16588800, 0, 108 }, + { 109, 219, 16588800, 0, 109 }, + { 99, 209, 16588800, 0, 99 }, + { 111, 224, 8294400, 0, 111 }, + { 112, 226, 8294400, 0, 112 }, + { 113, 228, 8294400, 0, 113 }, + { 114, 229, 8294400, 0, 114 }, + { 115, 231, 8294400, 0, 115 }, + { 116, 234, 16588800, 0, 116 }, + { 117, 236, 16588800, 0, 117 }, + { 118, 238, 16588800, 0, 118 }, + { 119, 239, 16588800, 0, 119 }, + { 120, 241, 16588800, 0, 120 }, + { 110, 231, 16588800, 0, 110 }, + { 121, 243, 16588800, 0, 121 }, + { 122, 246, 8294400, 0, 122 }, + { 123, 248, 8294400, 0, 123 }, + { 124, 250, 8294400, 0, 124 }, + { 125, 251, 8294400, 0, 125 }, + { 127, 256, 4147200, 0, 127 }, + { 128, 258, 4147200, 0, 128 }, + { 129, 260, 4147200, 0, 129 }, + { 130, 261, 4147200, 0, 130 }, + { 131, 263, 4147200, 0, 131 }, + { 132, 266, 8294400, 0, 132 }, + { 133, 268, 8294400, 0, 133 }, + { 134, 270, 8294400, 0, 134 }, + { 135, 271, 8294400, 0, 135 }, + { 136, 273, 8294400, 0, 136 }, + { 126, 263, 8294400, 0, 126 }, + { 138, 278, 4147200, 0, 138 }, + { 139, 280, 4147200, 0, 139 }, + { 140, 282, 4147200, 0, 140 }, + { 141, 283, 4147200, 0, 141 }, + { 142, 285, 4147200, 0, 142 }, + { 143, 288, 8294400, 0, 143 }, + { 144, 290, 8294400, 0, 144 }, + { 145, 292, 8294400, 0, 145 }, + { 146, 293, 8294400, 0, 146 }, + { 147, 295, 8294400, 0, 147 }, + { 137, 285, 8294400, 0, 137 }, + { 149, 300, 4147200, 0, 149 }, + { 150, 302, 4147200, 0, 150 }, + { 151, 304, 4147200, 0, 151 }, + { 152, 305, 4147200, 0, 152 }, + { 153, 307, 4147200, 0, 153 }, + { 154, 310, 8294400, 0, 154 }, + { 155, 312, 8294400, 0, 155 }, + { 156, 314, 8294400, 0, 156 }, + { 157, 315, 8294400, 0, 157 }, + { 158, 317, 8294400, 0, 158 }, + { 148, 307, 8294400, 0, 148 }, + { 160, 322, 4147200, 0, 160 }, + { 161, 324, 4147200, 0, 161 }, + { 162, 326, 4147200, 0, 162 }, + { 163, 327, 4147200, 0, 163 }, + { 164, 329, 4147200, 0, 164 }, + { 165, 332, 8294400, 0, 165 }, + { 166, 334, 8294400, 0, 166 }, + { 167, 336, 8294400, 0, 167 }, + { 168, 337, 8294400, 0, 168 }, + { 169, 339, 8294400, 0, 169 }, + { 159, 329, 8294400, 0, 159 }, + { 171, 344, 4147200, 0, 171 }, + { 172, 346, 4147200, 0, 172 }, + { 173, 348, 4147200, 0, 173 }, + { 174, 349, 4147200, 0, 174 }, + { 175, 351, 4147200, 0, 175 }, + { 176, 354, 8294400, 0, 176 }, + { 177, 356, 8294400, 0, 177 }, + { 178, 358, 8294400, 0, 178 }, + { 179, 359, 8294400, 0, 179 }, + { 180, 361, 8294400, 0, 180 }, + { 170, 351, 8294400, 0, 170 }, + { 182, 366, 4147200, 0, 182 }, + { 183, 368, 4147200, 0, 183 }, + { 184, 370, 4147200, 0, 184 }, + { 185, 371, 4147200, 0, 185 }, + { 186, 373, 4147200, 0, 186 }, + { 187, 376, 8294400, 0, 187 }, + { 188, 378, 8294400, 0, 188 }, + { 189, 380, 8294400, 0, 189 }, + { 190, 381, 8294400, 0, 190 }, + { 191, 383, 8294400, 0, 191 }, + { 181, 373, 8294400, 0, 181 }, + { 193, 388, 4147200, 0, 193 }, + { 194, 390, 4147200, 0, 194 }, + { 195, 392, 4147200, 0, 195 }, + { 196, 393, 4147200, 0, 196 }, + { 197, 395, 4147200, 0, 197 }, + { 198, 398, 8294400, 0, 198 }, + { 199, 400, 8294400, 0, 199 }, + { 200, 402, 8294400, 0, 200 }, + { 201, 403, 8294400, 0, 201 }, + { 202, 405, 8294400, 0, 202 }, + { 192, 395, 8294400, 0, 192 }, + { 204, 410, 4147200, 0, 204 }, + { 205, 412, 4147200, 0, 205 }, + { 206, 414, 4147200, 0, 206 }, + { 207, 415, 4147200, 0, 207 }, + { 208, 417, 4147200, 0, 208 }, + { 209, 420, 8294400, 0, 209 }, + { 210, 422, 8294400, 0, 210 }, + { 211, 424, 8294400, 0, 211 }, + { 212, 425, 8294400, 0, 212 }, + { 213, 427, 8294400, 0, 213 }, + { 203, 417, 8294400, 0, 203 }, + { 214, 430, 8294400, 0, 214 }, + { 215, 433, 4177920, 0, 215 }, + { 217, 436, 4177920, 0, 217 }, + { 218, 438, 4177920, 0, 218 }, + { 219, 439, 4177920, 0, 219 }, + { 221, 444, 2088960, 0, 221 }, + { 222, 446, 2088960, 0, 222 }, + { 223, 448, 2088960, 0, 223 }, + { 224, 449, 2088960, 0, 224 }, + { 225, 451, 2088960, 0, 225 }, + { 226, 454, 4177920, 0, 226 }, + { 227, 456, 4177920, 0, 227 }, + { 228, 458, 4177920, 0, 228 }, + { 229, 459, 4177920, 0, 229 }, + { 230, 461, 4177920, 0, 230 }, + { 220, 451, 4177920, 0, 220 }, + { 232, 466, 2088960, 0, 232 }, + { 233, 468, 2088960, 0, 233 }, + { 234, 470, 2088960, 0, 234 }, + { 235, 471, 2088960, 0, 235 }, + { 236, 473, 2088960, 0, 236 }, + { 237, 476, 4177920, 0, 237 }, + { 238, 478, 4177920, 0, 238 }, + { 239, 480, 4177920, 0, 239 }, + { 240, 481, 4177920, 0, 240 }, + { 241, 483, 4177920, 0, 241 }, + { 231, 473, 4177920, 0, 231 }, + { 243, 488, 2088960, 0, 243 }, + { 244, 490, 2088960, 0, 244 }, + { 245, 492, 2088960, 0, 245 }, + { 246, 493, 2088960, 0, 246 }, + { 247, 495, 2088960, 0, 247 }, + { 248, 498, 4177920, 0, 248 }, + { 249, 500, 4177920, 0, 249 }, + { 250, 502, 4177920, 0, 250 }, + { 251, 503, 4177920, 0, 251 }, + { 252, 505, 4177920, 0, 252 }, + { 242, 495, 4177920, 0, 242 }, + { 254, 510, 2088960, 0, 254 }, + { 255, 512, 2088960, 0, 255 }, + { 256, 514, 2088960, 0, 256 }, + { 257, 515, 2088960, 0, 257 }, + { 258, 517, 2088960, 0, 258 }, + { 259, 520, 4177920, 0, 259 }, + { 260, 522, 4177920, 0, 260 }, + { 261, 524, 4177920, 0, 261 }, + { 262, 525, 4177920, 0, 262 }, + { 263, 527, 4177920, 0, 263 }, + { 253, 517, 4177920, 0, 253 }, + { 265, 532, 2088960, 0, 265 }, + { 266, 534, 2088960, 0, 266 }, + { 267, 536, 2088960, 0, 267 }, + { 268, 537, 2088960, 0, 268 }, + { 269, 539, 2088960, 0, 269 }, + { 270, 542, 4177920, 0, 270 }, + { 271, 544, 4177920, 0, 271 }, + { 272, 546, 4177920, 0, 272 }, + { 273, 547, 4177920, 0, 273 }, + { 274, 549, 4177920, 0, 274 }, + { 264, 539, 4177920, 0, 264 }, + { 276, 554, 2088960, 0, 276 }, + { 277, 556, 2088960, 0, 277 }, + { 278, 558, 2088960, 0, 278 }, + { 279, 559, 2088960, 0, 279 }, + { 280, 561, 2088960, 0, 280 }, + { 281, 564, 4177920, 0, 281 }, + { 282, 566, 4177920, 0, 282 }, + { 283, 568, 4177920, 0, 283 }, + { 284, 569, 4177920, 0, 284 }, + { 285, 571, 4177920, 0, 285 }, + { 275, 561, 4177920, 0, 275 }, + { 287, 576, 2088960, 0, 287 }, + { 288, 578, 2088960, 0, 288 }, + { 289, 580, 2088960, 0, 289 }, + { 290, 581, 2088960, 0, 290 }, + { 291, 583, 2088960, 0, 291 }, + { 292, 586, 4177920, 0, 292 }, + { 293, 588, 4177920, 0, 293 }, + { 294, 590, 4177920, 0, 294 }, + { 295, 591, 4177920, 0, 295 }, + { 296, 593, 4177920, 0, 296 }, + { 286, 583, 4177920, 0, 286 }, + { 298, 598, 2088960, 0, 298 }, + { 299, 600, 2088960, 0, 299 }, + { 300, 602, 2088960, 0, 300 }, + { 301, 603, 2088960, 0, 301 }, + { 302, 605, 2088960, 0, 302 }, + { 303, 608, 4177920, 0, 303 }, + { 304, 610, 4177920, 0, 304 }, + { 305, 612, 4177920, 0, 305 }, + { 306, 613, 4177920, 0, 306 }, + { 307, 615, 4177920, 0, 307 }, + { 297, 605, 4177920, 0, 297 }, + { 309, 620, 2088960, 0, 309 }, + { 310, 622, 2088960, 0, 310 }, + { 311, 624, 2088960, 0, 311 }, + { 312, 625, 2088960, 0, 312 }, + { 314, 630, 1044480, 0, 314 }, + { 315, 632, 1044480, 0, 315 }, + { 316, 634, 1044480, 0, 316 }, + { 317, 635, 1044480, 0, 317 }, + { 318, 637, 1044480, 0, 318 }, + { 319, 640, 2088960, 0, 319 }, + { 320, 642, 2088960, 0, 320 }, + { 321, 644, 2088960, 0, 321 }, + { 322, 645, 2088960, 0, 322 }, + { 323, 647, 2088960, 0, 323 }, + { 313, 637, 2088960, 0, 313 }, + { 325, 652, 1044480, 0, 325 }, + { 326, 654, 1044480, 0, 326 }, + { 327, 656, 1044480, 0, 327 }, + { 328, 657, 1044480, 0, 328 }, + { 329, 659, 1044480, 0, 329 }, + { 330, 662, 2088960, 0, 330 }, + { 331, 664, 2088960, 0, 331 }, + { 332, 666, 2088960, 0, 332 }, + { 333, 667, 2088960, 0, 333 }, + { 334, 669, 2088960, 0, 334 }, + { 324, 659, 2088960, 0, 324 }, + { 336, 674, 1044480, 0, 336 }, + { 337, 676, 1044480, 0, 337 }, + { 338, 678, 1044480, 0, 338 }, + { 339, 679, 1044480, 0, 339 }, + { 340, 681, 1044480, 0, 340 }, + { 341, 684, 2088960, 0, 341 }, + { 342, 686, 2088960, 0, 342 }, + { 343, 688, 2088960, 0, 343 }, + { 344, 689, 2088960, 0, 344 }, + { 345, 691, 2088960, 0, 345 }, + { 335, 681, 2088960, 0, 335 }, + { 347, 696, 1044480, 0, 347 }, + { 348, 698, 1044480, 0, 348 }, + { 349, 700, 1044480, 0, 349 }, + { 350, 701, 1044480, 0, 350 }, + { 351, 703, 1044480, 0, 351 }, + { 352, 706, 2088960, 0, 352 }, + { 353, 708, 2088960, 0, 353 }, + { 354, 710, 2088960, 0, 354 }, + { 355, 711, 2088960, 0, 355 }, + { 356, 713, 2088960, 0, 356 }, + { 346, 703, 2088960, 0, 346 }, + { 357, 715, 2088960, 0, 357 }, + { 358, 718, 1044480, 0, 358 }, + { 359, 720, 1044480, 0, 359 }, + { 360, 722, 1044480, 0, 360 }, + { 361, 723, 1044480, 0, 361 }, + { 362, 725, 1044480, 0, 362 }, + { 363, 728, 2088960, 0, 363 }, + { 364, 730, 2088960, 0, 364 }, + { 365, 732, 2088960, 0, 365 }, + { 366, 733, 2088960, 0, 366 }, + { 367, 735, 2088960, 0, 367 }, + { 368, 738, 1044480, 0, 368 }, + { 369, 740, 1044480, 0, 369 }, + { 370, 742, 1044480, 0, 370 }, + { 371, 743, 1044480, 0, 371 }, + { 372, 745, 1044480, 0, 372 }, + { 373, 748, 2088960, 0, 373 }, + { 374, 750, 2088960, 0, 374 }, + { 375, 752, 2088960, 0, 375 }, + { 376, 753, 2088960, 0, 376 }, + { 377, 755, 2088960, 0, 377 }, + { 378, 758, 1044480, 0, 378 }, + { 379, 760, 1044480, 0, 379 }, + { 380, 762, 1044480, 0, 380 }, + { 381, 763, 1044480, 0, 381 }, + { 382, 766, 1044480, 0, 382 }, + { 383, 770, 2088960, 0, 383 }, + { 384, 772, 522240, 0, 384 }, + { 385, 774, 2088960, 0, 385 }, + { 386, 776, 522240, 0, 386 }, + { 387, 778, 2088960, 0, 387 }, + { 389, 780, 2088960, 0, 389 }, + { 388, 780, 522240, 0, 388 }, + { 390, 782, 522240, 0, 390 }, + { 391, 784, 2088960, 0, 391 }, + { 392, 786, 522240, 0, 392 }, + { 394, 789, 2088960, 0, 394 }, + { 393, 789, 520200, 0, 393 }, + { 395, 792, 2088960, 0, 395 }, + { 308, 705, 4177920, 0, 308 }, + { 397, 795, 6266880, 0, 397 }, + { 398, 798, 2088960, 0, 398 }, + { 399, 800, 2088960, 0, 399 }, + { 400, 802, 2088960, 0, 400 }, + { 401, 803, 2088960, 0, 401 }, + { 402, 805, 2088960, 0, 402 }, + { 403, 808, 4177920, 0, 403 }, + { 404, 810, 4177920, 0, 404 }, + { 405, 812, 4177920, 0, 405 }, + { 406, 813, 4177920, 0, 406 }, + { 407, 815, 4177920, 0, 407 }, + { 408, 818, 2088960, 0, 408 }, + { 409, 820, 2088960, 0, 409 }, + { 410, 822, 2088960, 0, 410 }, + { 411, 823, 2088960, 0, 411 }, + { 412, 825, 2088960, 0, 412 }, + { 413, 828, 4177920, 0, 413 }, + { 414, 830, 4177920, 0, 414 }, + { 415, 832, 4177920, 0, 415 }, + { 416, 833, 4177920, 0, 416 }, + { 417, 835, 4177920, 0, 417 }, + { 418, 838, 2088960, 0, 418 }, + { 419, 840, 2088960, 0, 419 }, + { 420, 842, 2088960, 0, 420 }, + { 421, 843, 2088960, 0, 421 }, + { 422, 846, 2088960, 0, 422 }, + { 423, 850, 4177920, 0, 423 }, + { 424, 852, 1044480, 0, 424 }, + { 425, 854, 4177920, 0, 425 }, + { 426, 856, 1044480, 0, 426 }, + { 427, 858, 4177920, 0, 427 }, + { 429, 860, 4177920, 0, 429 }, + { 428, 860, 1044480, 0, 428 }, + { 430, 862, 1044480, 0, 430 }, + { 431, 864, 4177920, 0, 431 }, + { 432, 866, 1044480, 0, 432 }, + { 434, 869, 4147200, 0, 434 }, + { 433, 869, 2080800, 0, 433 }, + { 435, 872, 4147200, 0, 435 }, + { 216, 653, 8294400, 0, 216 }, + { 437, 875, 12441600, 0, 437 }, + { 438, 878, 4147200, 0, 438 }, + { 439, 880, 4147200, 0, 439 }, + { 440, 882, 4147200, 0, 440 }, + { 441, 883, 4147200, 0, 441 }, + { 442, 885, 4147200, 0, 442 }, + { 443, 888, 8294400, 0, 443 }, + { 444, 890, 8294400, 0, 444 }, + { 445, 892, 8294400, 0, 445 }, + { 446, 893, 8294400, 0, 446 }, + { 447, 895, 8294400, 0, 447 }, + { 448, 898, 4147200, 0, 448 }, + { 449, 900, 4147200, 0, 449 }, + { 450, 902, 4147200, 0, 450 }, + { 451, 903, 4147200, 0, 451 }, + { 452, 905, 4147200, 0, 452 }, + { 453, 908, 8294400, 0, 453 }, + { 454, 910, 8294400, 0, 454 }, + { 455, 912, 8294400, 0, 455 }, + { 456, 913, 8294400, 0, 456 }, + { 457, 915, 8294400, 0, 457 }, + { 458, 918, 4147200, 0, 458 }, + { 459, 920, 4147200, 0, 459 }, + { 460, 922, 4147200, 0, 460 }, + { 461, 923, 4147200, 0, 461 }, + { 462, 925, 4147200, 0, 462 }, + { 463, 928, 8294400, 0, 463 }, + { 464, 930, 8294400, 0, 464 }, + { 465, 932, 8294400, 0, 465 }, + { 466, 933, 8294400, 0, 466 }, + { 467, 935, 8294400, 0, 467 }, + { 468, 937, 8262000, 0, 468 }, + { 396, 866, 2080800, 0, 396 }, + { 436, 907, 8323200, 0, 436 }, + { 469, 941, 33048000, 0, 469 } +}; + +// Generated from deeplabv3_257_mv_gpu.tflite +std::vector deeplabv3 +{ + { 0, 3, 31616, 0, 0 }, + { 3, 39, 31616, 0, 3 }, + { 36, 73, 131072, 0, 36 }, + { 37, 75, 131072, 0, 37 }, + { 38, 77, 131072, 0, 38 }, + { 39, 79, 131072, 0, 39 }, + { 40, 81, 131072, 0, 40 }, + { 41, 83, 131072, 0, 41 }, + { 42, 85, 131072, 0, 42 }, + { 43, 87, 131072, 0, 43 }, + { 44, 89, 131072, 0, 44 }, + { 45, 91, 131072, 0, 45 }, + { 46, 93, 8192, 0, 46 }, + { 46, 94, 8192, 0, 47 }, + { 46, 95, 8192, 0, 48 }, + { 46, 96, 8192, 0, 49 }, + { 46, 97, 8192, 0, 50 }, + { 46, 98, 8192, 0, 51 }, + { 46, 99, 8192, 0, 52 }, + { 46, 100, 8192, 0, 53 }, + { 46, 101, 8192, 0, 54 }, + { 46, 102, 8192, 0, 55 }, + { 46, 103, 8192, 0, 56 }, + { 46, 104, 8192, 0, 57 }, + { 46, 105, 8192, 0, 58 }, + { 46, 106, 8192, 0, 59 }, + { 46, 107, 8192, 0, 60 }, + { 46, 108, 8192, 0, 61 }, + { 47, 110, 8192, 0, 62 }, + { 1, 64, 8192, 0, 1 }, + { 63, 127, 16384, 0, 78 }, + { 64, 129, 32768, 0, 79 }, + { 65, 131, 8192, 0, 82 }, + { 65, 132, 8192, 0, 80 }, + { 65, 133, 8192, 0, 81 }, + { 65, 134, 8192, 0, 83 }, + { 66, 136, 8192, 0, 84 }, + { 67, 138, 8192, 0, 85 }, + { 68, 139, 8192, 0, 86 }, + { 70, 142, 8192, 0, 88 }, + { 2, 74, 8192, 0, 2 }, + { 72, 145, 8192, 0, 90 }, + { 71, 144, 8192, 0, 89 }, + { 69, 144, 8192, 0, 87 }, + { 74, 149, 8192, 0, 92 }, + { 48, 124, 8192, 0, 63 }, + { 76, 153, 16384, 0, 94 }, + { 77, 155, 32768, 0, 95 }, + { 78, 157, 8192, 0, 98 }, + { 78, 158, 8192, 0, 96 }, + { 78, 159, 8192, 0, 97 }, + { 78, 160, 8192, 0, 99 }, + { 79, 162, 8192, 0, 100 }, + { 80, 164, 8192, 0, 101 }, + { 81, 165, 8192, 0, 102 }, + { 83, 168, 8192, 0, 104 }, + { 73, 158, 8192, 0, 91 }, + { 85, 171, 8192, 0, 106 }, + { 84, 170, 8192, 0, 105 }, + { 82, 170, 8192, 0, 103 }, + { 87, 175, 8192, 0, 108 }, + { 49, 138, 8192, 0, 64 }, + { 89, 179, 16384, 0, 110 }, + { 90, 181, 32768, 0, 111 }, + { 91, 183, 8192, 0, 114 }, + { 91, 184, 8192, 0, 112 }, + { 91, 185, 8192, 0, 113 }, + { 91, 186, 8192, 0, 115 }, + { 92, 188, 8192, 0, 116 }, + { 93, 190, 8192, 0, 117 }, + { 94, 191, 8192, 0, 118 }, + { 96, 194, 8192, 0, 120 }, + { 86, 184, 8192, 0, 107 }, + { 98, 197, 8192, 0, 122 }, + { 97, 196, 8192, 0, 121 }, + { 95, 196, 8192, 0, 119 }, + { 100, 201, 8192, 0, 124 }, + { 50, 152, 8192, 0, 65 }, + { 102, 205, 16384, 0, 126 }, + { 103, 207, 32768, 0, 127 }, + { 104, 209, 8192, 0, 130 }, + { 104, 210, 8192, 0, 128 }, + { 104, 211, 8192, 0, 129 }, + { 104, 212, 8192, 0, 131 }, + { 105, 214, 8192, 0, 132 }, + { 106, 216, 8192, 0, 133 }, + { 107, 217, 8192, 0, 134 }, + { 109, 220, 8192, 0, 136 }, + { 99, 210, 8192, 0, 123 }, + { 111, 223, 8192, 0, 138 }, + { 110, 222, 8192, 0, 137 }, + { 108, 222, 8192, 0, 135 }, + { 113, 227, 8192, 0, 140 }, + { 51, 166, 8192, 0, 66 }, + { 115, 231, 16384, 0, 142 }, + { 116, 233, 32768, 0, 143 }, + { 117, 235, 8192, 0, 146 }, + { 117, 236, 8192, 0, 144 }, + { 117, 237, 8192, 0, 145 }, + { 117, 238, 8192, 0, 147 }, + { 118, 240, 8192, 0, 148 }, + { 119, 242, 8192, 0, 149 }, + { 120, 243, 8192, 0, 150 }, + { 122, 246, 8192, 0, 152 }, + { 112, 236, 8192, 0, 139 }, + { 124, 249, 8192, 0, 154 }, + { 123, 248, 8192, 0, 153 }, + { 121, 248, 8192, 0, 151 }, + { 126, 253, 8192, 0, 156 }, + { 52, 180, 8192, 0, 67 }, + { 128, 257, 16384, 0, 158 }, + { 129, 259, 32768, 0, 159 }, + { 130, 261, 8192, 0, 162 }, + { 130, 262, 8192, 0, 160 }, + { 130, 263, 8192, 0, 161 }, + { 130, 264, 8192, 0, 163 }, + { 131, 266, 8192, 0, 164 }, + { 132, 268, 8192, 0, 165 }, + { 133, 269, 8192, 0, 166 }, + { 135, 272, 8192, 0, 168 }, + { 125, 262, 8192, 0, 155 }, + { 137, 275, 8192, 0, 170 }, + { 136, 274, 8192, 0, 169 }, + { 134, 274, 8192, 0, 167 }, + { 139, 279, 8192, 0, 172 }, + { 53, 194, 8192, 0, 68 }, + { 141, 283, 16384, 0, 174 }, + { 142, 285, 32768, 0, 175 }, + { 143, 287, 8192, 0, 178 }, + { 143, 288, 8192, 0, 176 }, + { 143, 289, 8192, 0, 177 }, + { 143, 290, 8192, 0, 179 }, + { 144, 292, 8192, 0, 180 }, + { 145, 294, 8192, 0, 181 }, + { 146, 295, 8192, 0, 182 }, + { 148, 298, 8192, 0, 184 }, + { 138, 288, 8192, 0, 171 }, + { 150, 301, 8192, 0, 186 }, + { 149, 300, 8192, 0, 185 }, + { 147, 300, 8192, 0, 183 }, + { 152, 305, 8192, 0, 188 }, + { 54, 208, 8192, 0, 69 }, + { 154, 309, 16384, 0, 190 }, + { 155, 311, 32768, 0, 191 }, + { 156, 313, 8192, 0, 194 }, + { 156, 314, 8192, 0, 192 }, + { 156, 315, 8192, 0, 193 }, + { 156, 316, 8192, 0, 195 }, + { 157, 318, 8192, 0, 196 }, + { 158, 320, 8192, 0, 197 }, + { 159, 321, 8192, 0, 198 }, + { 161, 324, 8192, 0, 200 }, + { 151, 314, 8192, 0, 187 }, + { 163, 327, 8192, 0, 202 }, + { 162, 326, 8192, 0, 201 }, + { 160, 326, 8192, 0, 199 }, + { 165, 331, 8192, 0, 204 }, + { 55, 222, 8192, 0, 70 }, + { 167, 335, 16384, 0, 206 }, + { 168, 337, 32768, 0, 207 }, + { 169, 339, 8192, 0, 210 }, + { 169, 340, 8192, 0, 208 }, + { 169, 341, 8192, 0, 209 }, + { 169, 342, 8192, 0, 211 }, + { 170, 344, 8192, 0, 212 }, + { 171, 346, 8192, 0, 213 }, + { 172, 347, 8192, 0, 214 }, + { 174, 350, 8192, 0, 216 }, + { 164, 340, 8192, 0, 203 }, + { 176, 353, 8192, 0, 218 }, + { 175, 352, 8192, 0, 217 }, + { 173, 352, 8192, 0, 215 }, + { 178, 357, 8192, 0, 220 }, + { 56, 236, 8192, 0, 71 }, + { 180, 361, 16384, 0, 222 }, + { 181, 363, 32768, 0, 223 }, + { 182, 365, 8192, 0, 226 }, + { 182, 366, 8192, 0, 224 }, + { 182, 367, 8192, 0, 225 }, + { 182, 368, 8192, 0, 227 }, + { 183, 370, 8192, 0, 228 }, + { 184, 372, 8192, 0, 229 }, + { 185, 373, 8192, 0, 230 }, + { 187, 376, 8192, 0, 232 }, + { 177, 366, 8192, 0, 219 }, + { 189, 379, 8192, 0, 234 }, + { 188, 378, 8192, 0, 233 }, + { 186, 378, 8192, 0, 231 }, + { 191, 383, 8192, 0, 236 }, + { 57, 250, 8192, 0, 72 }, + { 193, 387, 16384, 0, 238 }, + { 194, 389, 32768, 0, 239 }, + { 195, 391, 8192, 0, 242 }, + { 195, 392, 8192, 0, 240 }, + { 195, 393, 8192, 0, 241 }, + { 195, 394, 8192, 0, 243 }, + { 196, 396, 8192, 0, 244 }, + { 197, 398, 8192, 0, 245 }, + { 198, 399, 8192, 0, 246 }, + { 200, 402, 8192, 0, 248 }, + { 190, 392, 8192, 0, 235 }, + { 202, 405, 8192, 0, 250 }, + { 201, 404, 8192, 0, 249 }, + { 199, 404, 8192, 0, 247 }, + { 204, 409, 8192, 0, 252 }, + { 58, 264, 8192, 0, 73 }, + { 206, 413, 16384, 0, 254 }, + { 207, 415, 32768, 0, 255 }, + { 208, 417, 8192, 0, 258 }, + { 208, 418, 8192, 0, 256 }, + { 208, 419, 8192, 0, 257 }, + { 208, 420, 8192, 0, 259 }, + { 209, 422, 8192, 0, 260 }, + { 210, 424, 8192, 0, 261 }, + { 211, 425, 8192, 0, 262 }, + { 213, 428, 8192, 0, 264 }, + { 203, 418, 8192, 0, 251 }, + { 215, 431, 8192, 0, 266 }, + { 214, 430, 8192, 0, 265 }, + { 212, 430, 8192, 0, 263 }, + { 217, 435, 8192, 0, 268 }, + { 59, 278, 8192, 0, 74 }, + { 219, 439, 16384, 0, 270 }, + { 220, 441, 32768, 0, 271 }, + { 221, 443, 8192, 0, 274 }, + { 221, 444, 8192, 0, 272 }, + { 221, 445, 8192, 0, 273 }, + { 221, 446, 8192, 0, 275 }, + { 222, 448, 8192, 0, 276 }, + { 223, 450, 8192, 0, 277 }, + { 224, 451, 8192, 0, 278 }, + { 226, 454, 8192, 0, 280 }, + { 216, 444, 8192, 0, 267 }, + { 228, 457, 8192, 0, 282 }, + { 227, 456, 8192, 0, 281 }, + { 225, 456, 8192, 0, 279 }, + { 230, 461, 8192, 0, 284 }, + { 60, 292, 8192, 0, 75 }, + { 232, 465, 16384, 0, 286 }, + { 233, 467, 32768, 0, 287 }, + { 234, 469, 8192, 0, 290 }, + { 234, 470, 8192, 0, 288 }, + { 234, 471, 8192, 0, 289 }, + { 234, 472, 8192, 0, 291 }, + { 235, 474, 8192, 0, 292 }, + { 236, 476, 8192, 0, 293 }, + { 237, 477, 8192, 0, 294 }, + { 239, 480, 8192, 0, 296 }, + { 229, 470, 8192, 0, 283 }, + { 241, 483, 8192, 0, 298 }, + { 240, 482, 8192, 0, 297 }, + { 238, 482, 8192, 0, 295 }, + { 243, 487, 8192, 0, 300 }, + { 61, 306, 8192, 0, 76 }, + { 245, 491, 16384, 0, 302 }, + { 246, 493, 32768, 0, 303 }, + { 247, 495, 8192, 0, 306 }, + { 247, 496, 8192, 0, 304 }, + { 247, 497, 8192, 0, 305 }, + { 247, 498, 8192, 0, 307 }, + { 248, 500, 8192, 0, 308 }, + { 249, 502, 8192, 0, 309 }, + { 250, 503, 8192, 0, 310 }, + { 252, 506, 8192, 0, 312 }, + { 242, 496, 8192, 0, 299 }, + { 254, 509, 8192, 0, 314 }, + { 253, 508, 8192, 0, 313 }, + { 251, 508, 8192, 0, 311 }, + { 256, 513, 8192, 0, 316 }, + { 62, 320, 8192, 0, 77 }, + { 258, 517, 16384, 0, 318 }, + { 259, 519, 32768, 0, 319 }, + { 260, 521, 8192, 0, 322 }, + { 260, 522, 8192, 0, 320 }, + { 260, 523, 8192, 0, 321 }, + { 260, 524, 8192, 0, 323 }, + { 261, 526, 8192, 0, 324 }, + { 262, 528, 8192, 0, 325 }, + { 263, 529, 8192, 0, 326 }, + { 265, 532, 8192, 0, 328 }, + { 255, 522, 8192, 0, 315 }, + { 267, 535, 8192, 0, 330 }, + { 266, 534, 8192, 0, 329 }, + { 264, 534, 8192, 0, 327 }, + { 269, 539, 8192, 0, 332 }, + { 75, 346, 8192, 0, 93 }, + { 88, 359, 8192, 0, 109 }, + { 101, 372, 8192, 0, 125 }, + { 114, 385, 8192, 0, 141 }, + { 127, 398, 8192, 0, 157 }, + { 140, 411, 8192, 0, 173 }, + { 153, 424, 8192, 0, 189 }, + { 166, 437, 8192, 0, 205 }, + { 179, 450, 8192, 0, 221 }, + { 192, 463, 8192, 0, 237 }, + { 205, 476, 8192, 0, 253 }, + { 218, 489, 8192, 0, 269 }, + { 231, 502, 8192, 0, 285 }, + { 244, 515, 8192, 0, 301 }, + { 257, 528, 8192, 0, 317 }, + { 271, 543, 131072, 0, 334 }, + { 272, 545, 131072, 0, 335 }, + { 273, 547, 131072, 0, 336 }, + { 274, 549, 131072, 0, 337 }, + { 275, 551, 1856, 0, 338 }, + { 276, 553, 1856, 0, 339 }, + { 270, 548, 8192, 0, 333 }, + { 268, 547, 8192, 0, 331 } +}; + +// Generated from ssd_mobilenet_v2_int8.tflite +std::vector ssd_mobilenetv2 +{ + { 0, 1, 1080000, 0, 0 }, + { 1, 3, 270000, 0, 1 }, + { 2, 5, 720000, 0, 2 }, + { 3, 7, 720000, 0, 3 }, + { 4, 9, 720000, 0, 4 }, + { 5, 11, 720000, 0, 5 }, + { 6, 13, 360000, 0, 6 }, + { 7, 15, 2160000, 0, 7 }, + { 8, 17, 2160000, 0, 8 }, + { 9, 19, 540000, 0, 9 }, + { 10, 21, 540000, 0, 10 }, + { 12, 25, 810000, 0, 12 }, + { 13, 27, 810000, 0, 13 }, + { 14, 29, 810000, 0, 14 }, + { 15, 31, 810000, 0, 15 }, + { 11, 28, 135000, 0, 11 }, + { 16, 33, 135000, 0, 16 }, + { 17, 35, 135000, 0, 17 }, + { 18, 37, 810000, 0, 18 }, + { 19, 39, 810000, 0, 19 }, + { 20, 41, 207936, 0, 20 }, + { 21, 43, 207936, 0, 21 }, + { 23, 47, 277248, 0, 23 }, + { 24, 49, 277248, 0, 24 }, + { 25, 51, 277248, 0, 25 }, + { 26, 53, 277248, 0, 26 }, + { 22, 50, 46208, 0, 22 }, + { 27, 55, 46208, 0, 27 }, + { 29, 59, 277248, 0, 29 }, + { 30, 61, 277248, 0, 30 }, + { 31, 63, 277248, 0, 31 }, + { 32, 65, 277248, 0, 32 }, + { 28, 62, 46208, 0, 28 }, + { 33, 67, 46208, 0, 33 }, + { 34, 69, 46208, 0, 34 }, + { 35, 71, 277248, 0, 35 }, + { 36, 73, 277248, 0, 36 }, + { 37, 75, 69312, 0, 37 }, + { 38, 77, 69312, 0, 38 }, + { 40, 81, 138624, 0, 40 }, + { 41, 83, 138624, 0, 41 }, + { 42, 85, 138624, 0, 42 }, + { 43, 87, 138624, 0, 43 }, + { 39, 84, 23104, 0, 39 }, + { 44, 89, 23104, 0, 44 }, + { 46, 93, 138624, 0, 46 }, + { 47, 95, 138624, 0, 47 }, + { 48, 97, 138624, 0, 48 }, + { 49, 99, 138624, 0, 49 }, + { 45, 96, 23104, 0, 45 }, + { 50, 101, 23104, 0, 50 }, + { 52, 105, 138624, 0, 52 }, + { 53, 107, 138624, 0, 53 }, + { 54, 109, 138624, 0, 54 }, + { 55, 111, 138624, 0, 55 }, + { 51, 108, 23104, 0, 51 }, + { 56, 113, 23104, 0, 56 }, + { 57, 115, 23104, 0, 57 }, + { 58, 117, 138624, 0, 58 }, + { 59, 119, 138624, 0, 59 }, + { 60, 121, 138624, 0, 60 }, + { 61, 123, 138624, 0, 61 }, + { 63, 127, 207936, 0, 63 }, + { 64, 129, 207936, 0, 64 }, + { 65, 131, 207936, 0, 65 }, + { 66, 133, 207936, 0, 66 }, + { 62, 130, 34656, 0, 62 }, + { 67, 135, 34656, 0, 67 }, + { 69, 139, 207936, 0, 69 }, + { 70, 141, 207936, 0, 70 }, + { 71, 143, 207936, 0, 71 }, + { 72, 145, 207936, 0, 72 }, + { 68, 142, 34656, 0, 68 }, + { 73, 147, 34656, 0, 73 }, + { 74, 149, 34656, 0, 74 }, + { 75, 151, 207936, 0, 75 }, + { 76, 155, 207936, 0, 76 }, + { 77, 157, 4332, 0, 77 }, + { 78, 159, 98553, 0, 78 }, + { 79, 161, 57600, 0, 79 }, + { 82, 165, 57600, 0, 82 }, + { 84, 169, 96000, 0, 84 }, + { 85, 171, 96000, 0, 85 }, + { 86, 173, 96000, 0, 86 }, + { 87, 175, 96000, 0, 87 }, + { 83, 172, 16000, 0, 83 }, + { 88, 177, 16000, 0, 88 }, + { 90, 181, 96000, 0, 90 }, + { 91, 183, 96000, 0, 91 }, + { 92, 185, 96000, 0, 92 }, + { 93, 187, 96000, 0, 93 }, + { 89, 184, 16000, 0, 89 }, + { 94, 189, 16000, 0, 94 }, + { 95, 191, 16000, 0, 95 }, + { 96, 193, 96000, 0, 96 }, + { 97, 195, 96000, 0, 97 }, + { 98, 197, 96000, 0, 98 }, + { 99, 199, 96000, 0, 99 }, + { 100, 201, 32000, 0, 100 }, + { 101, 203, 128000, 0, 101 }, + { 102, 207, 128000, 0, 102 }, + { 103, 209, 2400, 0, 103 }, + { 104, 211, 54600, 0, 104 }, + { 105, 213, 25600, 0, 105 }, + { 108, 217, 25600, 0, 108 }, + { 106, 216, 2400, 0, 106 }, + { 107, 218, 54600, 0, 107 }, + { 109, 221, 12800, 0, 109 }, + { 112, 227, 12800, 0, 112 }, + { 113, 229, 600, 0, 113 }, + { 114, 231, 13650, 0, 114 }, + { 115, 233, 3200, 0, 115 }, + { 118, 237, 3200, 0, 118 }, + { 116, 236, 600, 0, 116 }, + { 117, 238, 13650, 0, 117 }, + { 119, 241, 2304, 0, 119 }, + { 122, 247, 2304, 0, 122 }, + { 123, 249, 216, 0, 123 }, + { 124, 251, 4914, 0, 124 }, + { 125, 253, 1152, 0, 125 }, + { 128, 257, 1152, 0, 128 }, + { 126, 256, 216, 0, 126 }, + { 127, 258, 4914, 0, 127 }, + { 129, 261, 1024, 0, 129 }, + { 132, 267, 1024, 0, 132 }, + { 133, 269, 96, 0, 133 }, + { 134, 271, 2184, 0, 134 }, + { 135, 273, 256, 0, 135 }, + { 138, 277, 256, 0, 138 }, + { 136, 276, 96, 0, 136 }, + { 137, 278, 2184, 0, 137 }, + { 139, 281, 128, 0, 139 }, + { 142, 286, 128, 0, 142 }, + { 143, 288, 24, 0, 143 }, + { 144, 290, 546, 0, 144 }, + { 145, 292, 24, 0, 145 }, + { 146, 294, 546, 0, 146 }, + { 80, 229, 4332, 0, 80 }, + { 110, 259, 2400, 0, 110 }, + { 120, 269, 600, 0, 120 }, + { 130, 279, 216, 0, 130 }, + { 140, 289, 96, 0, 140 }, + { 147, 296, 24, 0, 147 }, + { 81, 231, 98553, 0, 81 }, + { 111, 261, 54600, 0, 111 }, + { 121, 271, 13650, 0, 121 }, + { 131, 281, 4914, 0, 131 }, + { 141, 291, 2184, 0, 141 }, + { 148, 298, 546, 0, 148 }, + { 149, 300, 7668, 0, 149 }, + { 150, 302, 174447, 0, 150 }, + { 151, 304, 7668, 0, 151 }, + { 152, 306, 174447, 0, 152 }, + { 153, 308, 30672, 0, 153 }, + { 154, 309, 697788, 0, 154 }, + { 155, 311, 160, 0, 155 }, + { 155, 312, 40, 0, 156 }, + { 155, 313, 40, 0, 157 }, + { 155, 314, 4, 0, 158 } +}; \ No newline at end of file diff --git a/tests/MemoryStrategyBenchmark/TestStrategy.cpp b/tests/MemoryStrategyBenchmark/TestStrategy.cpp new file mode 100644 index 0000000000..9e9194972a --- /dev/null +++ b/tests/MemoryStrategyBenchmark/TestStrategy.cpp @@ -0,0 +1,43 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "TestStrategy.hpp" + +namespace armnn +{ + + std::string TestStrategy::GetName() const + { + return m_Name; + } + + MemBlockStrategyType TestStrategy::GetMemBlockStrategyType() const + { + return m_MemBlockStrategyType; + } + + // A IMemoryOptimizerStrategy must ensure that + // 1: All MemBlocks have been assigned to a MemBin + // 2: No MemBlock is assigned to multiple MemBins + // 3: No two Memblocks in a MemBin overlap in both the X and Y axis + std::vector TestStrategy::Optimize(std::vector& memBlocks) + { + std::vector memBins; + memBins.reserve(memBlocks.size()); + + for (auto& memBlock : memBlocks) + { + MemBin memBin; + memBin.m_MemSize = memBlock.m_MemSize; + memBin.m_MemBlocks.reserve(1); + memBlock.m_Offset = 0; + memBin.m_MemBlocks.push_back(memBlock); + memBins.push_back(memBin); + } + + return memBins; + } + +} // namespace armnn \ No newline at end of file diff --git a/tests/MemoryStrategyBenchmark/TestStrategy.hpp b/tests/MemoryStrategyBenchmark/TestStrategy.hpp new file mode 100644 index 0000000000..80d8d570ba --- /dev/null +++ b/tests/MemoryStrategyBenchmark/TestStrategy.hpp @@ -0,0 +1,31 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include +#include + +namespace armnn +{ +// ConstLayerMemoryOptimizer: Create a unique MemBin for each MemBlock and assign it an offset of 0 + class TestStrategy : public IMemoryOptimizerStrategy + { + public: + TestStrategy() + : m_Name(std::string("TestStrategy")) + , m_MemBlockStrategyType(MemBlockStrategyType::MultiAxisPacking) {} + + std::string GetName() const override; + + MemBlockStrategyType GetMemBlockStrategyType() const override; + + std::vector Optimize(std::vector& memBlocks) override; + + private: + std::string m_Name; + MemBlockStrategyType m_MemBlockStrategyType; + }; + +} // namespace armnn \ No newline at end of file -- cgit v1.2.1