17#include "core/RuntimeGraph.h"
19#include "core/RuntimeModule.h"
22#include <unordered_map>
29 std::vector<std::vector<Tensor *>> _alloc_plan;
30 std::vector<std::vector<Tensor *>> _dealloc_plan;
39 void allocate(
size_t kernel_index)
const;
51 using Lifetime = std::pair<size_t, size_t>;
52 std::unordered_map<Tensor *, Lifetime>
lifetimes;
54 for (
size_t index = 0; index <
num_kernels; ++index)
56 const auto &kernel = graph._kernels[index];
57 for (
const Tensor *tensor : kernel->getInputTensors())
63 for (
Tensor *tensor : kernel->getOutputTensors())
69 for (
const Tensor *tensor : graph.getOutputTensors())
75 _alloc_plan.assign(
num_kernels, std::vector<Tensor *>());
76 _dealloc_plan.assign(
num_kernels + 1, std::vector<Tensor *>());
79 _alloc_plan[
item.second.first].push_back(
item.first);
80 _dealloc_plan[
item.second.second].push_back(
item.first);
87 assert(_valid && kernel_index < _alloc_plan.size());
88 for (
Tensor *tensor : _alloc_plan[kernel_index])
96 assert(_valid && kernel_index < _dealloc_plan.size());
97 for (
Tensor *tensor : _dealloc_plan[kernel_index])
111 for (
auto &tensor : _tensors)
113 if (tensor->is_data_allocated())
120 assert(tensor !=
nullptr);
121 _tensors.push_back(std::move(tensor));
122 return _tensors.back().get();
127 assert(std::all_of(input_tensors.cbegin(), input_tensors.cend(),
128 [](
Tensor *tensor) { return tensor != nullptr; }));
129 _input_tensors = input_tensors;
134 assert(std::all_of(output_tensors.cbegin(), output_tensors.cend(),
135 [](
Tensor *tensor) { return tensor != nullptr; }));
136 _output_tensors = output_tensors;
146 assert(kernel !=
nullptr);
147 _kernels.push_back(std::move(kernel));
148 _tensor_alloc_plan->invalidate();
153 if (!_tensor_alloc_plan->isValid())
154 _tensor_alloc_plan->build(*
this);
168 for (
size_t index = 0; index < _kernels.size(); ++index)
170 const auto &kernel = _kernels[index];
181 _tensor_alloc_plan->allocate(index);
190 for (
const Tensor *tensor : kernel->getOutputTensors())
197 _tensor_alloc_plan->deallocate(index);
virtual void postTensorWrite(const Tensor *tensor)=0
virtual void release_memory(luci_interpreter::Tensor &tensor)=0
virtual void allocate_memory(luci_interpreter::Tensor &tensor)=0
void allocate(size_t kernel_index) const
void build(const RuntimeGraph &graph)
void deallocate(size_t kernel_index) const
TensorAllocPlan(IMemoryManager *memory_manager)
void addKernel(std::unique_ptr< Kernel > &&kernel)
Tensor * addTensor(std::unique_ptr< Tensor > &&tensor)
void configureAllocations(Tensor *tensor)
void setOutputTensors(const std::vector< Tensor * > &output_tensors)
const std::vector< Tensor * > & getInputTensors() const
void setInputTensors(const std::vector< Tensor * > &input_tensors)
EventNotifier * getEventNotifier() const
T must_cast(loco::Node *node)