aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp
diff options
context:
space:
mode:
authorJim Flynn <jim.flynn@arm.com>2021-10-26 21:26:10 +0100
committerJim Flynn <jim.flynn@arm.com>2021-10-26 21:27:22 +0100
commite1fdd2866b0f403b5e80994890d62c2c038c16c9 (patch)
treed7398443532cbafde7c6824015397e6bac6dd502 /src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp
parentca5883951ab51191eb19502459f0936fc96e14f1 (diff)
downloadarmnn-e1fdd2866b0f403b5e80994890d62c2c038c16c9.tar.gz
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 <finwil01@e127804.cambridge.arm.com> Signed-off-by: Jim Flynn <jim.flynn@arm.com>
Diffstat (limited to 'src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp')
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp273
1 files changed, 0 insertions, 273 deletions
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 <backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp>
-
-#include <doctest/doctest.h>
-#include <vector>
-
-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<MemBin> Optimize(std::vector<MemBlock>& memBlocks) override
- {
- std::vector<MemBin> 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<MemBlock> 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<TestMemoryOptimizerStrategy>(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<TestMemoryOptimizerStrategy>(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<MemBlock> 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<TestMemoryOptimizerStrategy>(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<TestMemoryOptimizerStrategy>(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<MemBlock> 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<TestMemoryOptimizerStrategy>(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<TestMemoryOptimizerStrategy>(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<MemBin> Optimize(std::vector<MemBlock>& memBlocks) override
- {
- std::vector<MemBin> 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<MemBlock> 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<TestMemoryOptimizerStrategyDuplicate>(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<TestMemoryOptimizerStrategyDuplicate>(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<MemBin> Optimize(std::vector<MemBlock>& memBlocks) override
- {
- std::vector<MemBin> 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<MemBlock> 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<TestMemoryOptimizerStrategySkip>(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<TestMemoryOptimizerStrategySkip>(testMemoryOptimizerStrategyMulti);
- MemoryOptimizerValidator validatorMulti(std::move(ptrMulti));
- CHECK(!validatorMulti.Validate(memBlocks));
-}
-
-}