xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/MemoryManager.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #pragma once
6*89c4ff92SAndroid Build Coastguard Worker 
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/ICustomAllocator.hpp>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker namespace armnn
10*89c4ff92SAndroid Build Coastguard Worker {
11*89c4ff92SAndroid Build Coastguard Worker struct Allocator
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker     /// Pointer to @ICustomAllocator.
14*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<ICustomAllocator> m_CustomAllocator{};
15*89c4ff92SAndroid Build Coastguard Worker     /// Value which the size of each buffer (actual data size + padding) has to be a multiple of.
16*89c4ff92SAndroid Build Coastguard Worker     size_t m_Alignment = 0 ;
17*89c4ff92SAndroid Build Coastguard Worker };
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker struct TensorMemory
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker     /// Number of bytes the value is away from the @BufferStorage.m_Buffer.
22*89c4ff92SAndroid Build Coastguard Worker     size_t m_Offset{};
23*89c4ff92SAndroid Build Coastguard Worker     /// Identifier to be used by the @LoadedNetwork to order the tensors.
24*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_OutputSlotId{};
25*89c4ff92SAndroid Build Coastguard Worker     /// Pointer to the tensor value.
26*89c4ff92SAndroid Build Coastguard Worker     void* m_Data = nullptr;
27*89c4ff92SAndroid Build Coastguard Worker };
28*89c4ff92SAndroid Build Coastguard Worker 
29*89c4ff92SAndroid Build Coastguard Worker struct BufferStorage
30*89c4ff92SAndroid Build Coastguard Worker {
31*89c4ff92SAndroid Build Coastguard Worker     /// Vector of pointer to @TensorMemory.
32*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::shared_ptr<TensorMemory>> m_TensorMemoryVector;
33*89c4ff92SAndroid Build Coastguard Worker     /// Total size of the buffer.
34*89c4ff92SAndroid Build Coastguard Worker     size_t m_BufferSize;
35*89c4ff92SAndroid Build Coastguard Worker     /// Pointer to the first element of the buffer.
36*89c4ff92SAndroid Build Coastguard Worker     void* m_Buffer = nullptr;
37*89c4ff92SAndroid Build Coastguard Worker };
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker class MemoryManager
40*89c4ff92SAndroid Build Coastguard Worker {
41*89c4ff92SAndroid Build Coastguard Worker public:
42*89c4ff92SAndroid Build Coastguard Worker     /// Initialization method to store in m_AllocatorBufferStoragePairVector all information needed.
43*89c4ff92SAndroid Build Coastguard Worker     /// @param[in] bufferStorageVector - Vector of BufferStorage.
44*89c4ff92SAndroid Build Coastguard Worker     /// @param[in] customAllocator - Pointer to ICustomAllocator.
45*89c4ff92SAndroid Build Coastguard Worker     /// @param[in] typeAlignment - Optional parameter. Value of which the size of each value has to be multiple of.
46*89c4ff92SAndroid Build Coastguard Worker     void StoreMemToAllocate(std::vector<BufferStorage> bufferStorageVector,
47*89c4ff92SAndroid Build Coastguard Worker                             std::shared_ptr<ICustomAllocator> customAllocator,
48*89c4ff92SAndroid Build Coastguard Worker                             size_t typeAlignment = 0);
49*89c4ff92SAndroid Build Coastguard Worker 
50*89c4ff92SAndroid Build Coastguard Worker     /// Allocate the amount of memory indicated by m_BufferSize, and
51*89c4ff92SAndroid Build Coastguard Worker     /// point each m_Data to each correspondent Tensor so that they are m_Offset bytes separated.
52*89c4ff92SAndroid Build Coastguard Worker     void Allocate();
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker     /// Deallocate memory
55*89c4ff92SAndroid Build Coastguard Worker     void Deallocate();
56*89c4ff92SAndroid Build Coastguard Worker 
57*89c4ff92SAndroid Build Coastguard Worker private:
58*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::pair<Allocator, std::vector<BufferStorage>>> m_AllocatorBufferStoragePairVector;
59*89c4ff92SAndroid Build Coastguard Worker };
60*89c4ff92SAndroid Build Coastguard Worker 
61*89c4ff92SAndroid Build Coastguard Worker } // namespace armnn
62