mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-02-21 22:55:53 +00:00
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
//
|
|
// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
//
|
|
#pragma once
|
|
|
|
#include <armnn/Types.hpp>
|
|
|
|
namespace armnn
|
|
{
|
|
|
|
// A MemBlock represents a memory usage requirement in time and space and can be seen as essentially a rectangle
|
|
struct MemBlock
|
|
{
|
|
MemBlock(const unsigned int startOfLife,
|
|
const unsigned int endOfLife,
|
|
const size_t memSize,
|
|
size_t offset,
|
|
const unsigned int index)
|
|
: m_StartOfLife(startOfLife), m_EndOfLife(endOfLife), m_MemSize(memSize), m_Offset(offset), m_Index(index) {}
|
|
|
|
const unsigned int m_StartOfLife; // Y start inclusive
|
|
const unsigned int m_EndOfLife; // Y end inclusive
|
|
|
|
const size_t m_MemSize; // Offset + Memsize = X end
|
|
size_t m_Offset; // X start
|
|
|
|
const unsigned int m_Index; // Index to keep order
|
|
};
|
|
|
|
// A MemBin represents a single contiguous area of memory that can store 1-n number of MemBlocks
|
|
struct MemBin
|
|
{
|
|
std::vector<MemBlock> m_MemBlocks;
|
|
size_t m_MemSize;
|
|
};
|
|
|
|
// IMemoryOptimizerStrategy will set m_Offset of the MemBlocks,
|
|
// sort them into 1-n bins, then pair each bin of MemBlocks with an int specifying it's total size
|
|
// 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
|
|
// (a strategy cannot change the y axis or length of a MemBlock)
|
|
class IMemoryOptimizerStrategy
|
|
{
|
|
public:
|
|
virtual ~IMemoryOptimizerStrategy() {}
|
|
|
|
virtual std::string GetName() const = 0;
|
|
|
|
virtual MemBlockStrategyType GetMemBlockStrategyType() const = 0;
|
|
|
|
virtual std::vector<MemBin> Optimize(std::vector<MemBlock>& memBlocks) = 0;
|
|
};
|
|
|
|
} // namespace armnn
|