aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/memoryOptimizationStrategies
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/backendsCommon/memoryOptimizationStrategies')
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/CMakeLists.txt23
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.cpp43
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp31
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.cpp121
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp27
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/test/CMakeLists.txt17
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/test/ConstLayerMemoryOptimizerStrategyTests.cpp77
-rw-r--r--src/backends/backendsCommon/memoryOptimizationStrategies/test/MemoryOptimizerStrategyValidatorTests.cpp273
8 files changed, 0 insertions, 612 deletions
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<MemBin> ConstLayerMemoryOptimizerStrategy::Optimize(std::vector<MemBlock>& memBlocks)
-{
- std::vector<MemBin> 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 <armnn/Types.hpp>
-#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
-
-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<MemBin> Optimize(std::vector<MemBlock>& 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 <backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp>
-
-namespace armnn
-{
-
-bool MemoryOptimizerValidator::Validate(std::vector<MemBlock>& 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 <armnn/Types.hpp>
-#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
-
-namespace armnn
-{
-
-class MemoryOptimizerValidator
-{
-public:
- explicit MemoryOptimizerValidator(std::shared_ptr<IMemoryOptimizerStrategy> strategy)
- : m_Strategy(strategy)
- {
- };
-
- bool Validate(std::vector<MemBlock>& memBlocks);
-
-private:
- std::shared_ptr<IMemoryOptimizerStrategy> 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 <backendsCommon/memoryOptimizationStrategies/ConstLayerMemoryOptimizerStrategy.hpp>
-#include <backendsCommon/memoryOptimizationStrategies/MemoryOptimizerStrategyValidator.hpp>
-
-#include <doctest/doctest.h>
-#include <vector>
-
-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<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 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<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 ConstLayerMemoryOptimizerStrategy
- ConstLayerMemoryOptimizerStrategy constLayerMemoryOptimizerStrategy;
- auto ptr = std::make_shared<ConstLayerMemoryOptimizerStrategy>(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 <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));
-}
-
-}