3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-21 22:55:53 +00:00
Brooklyn/arch/arm/ARMnn/include/armnn/backends/IMemoryOptimizerStrategy.hpp
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

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