32 _mem_plans[ind] = blk;
35 VERBOSE(BP_PLANNER) <<
"CLAIM(" << ind <<
"): " << blk.
offset <<
", " << blk.size << std::endl;
40 VERBOSE(BP_PLANNER) <<
"RELEASE(" << ind <<
"): "
41 <<
"NOTHING does" << std::endl;
61 uint32_t next_offset = 0;
62 for (
const auto &[claimed_base_offset, claimed_index] : _claim_table)
64 auto claimed_size = _mem_plans[claimed_index].size;
65 if (next_offset +
size <= claimed_base_offset)
71 next_offset = claimed_base_offset + claimed_size;
78 _claim_table.emplace(std::make_pair(next_offset, ind));
79 _mem_plans[ind] = {next_offset,
size};
81 VERBOSE(FF_PLANNER) <<
"claim(" << ind <<
"): [+" << next_offset <<
", " <<
size <<
"sz]"
84 if (_capacity < next_offset +
size)
86 _capacity = next_offset +
size;
92 for (
auto it = _claim_table.cbegin(); it != _claim_table.cend(); ++it)
94 if (it->second == ind)
96 uint32_t
offset = it->first;
97 uint32_t
size = _mem_plans[ind].size;
99 _claim_table.erase(it);
101 VERBOSE(FF_PLANNER) <<
"release(" << ind <<
"): [+" <<
offset <<
", " <<
size <<
"sz]"
106 assert(!
"Cannot release for given index. It has been not claimed or released already.");
109template <
typename Index>
111 : _initialized(false), _capacity(0), _mem_plans(), _live_indices(), _interference_graph(),
119 _indices.emplace(
size, ind);
120 _interference_graph[ind].insert(_interference_graph[ind].end(), _live_indices.cbegin(),
121 _live_indices.cend());
122 for (
const auto &live_operand : _live_indices)
124 _interference_graph[live_operand].emplace_back(ind);
126 _live_indices.emplace(ind);
128 VERBOSE(WIC_PLANNER) <<
"claim(" << ind <<
"): [" <<
size <<
"sz]" << std::endl;
133 _live_indices.erase(ind);
134 VERBOSE(WIC_PLANNER) <<
"release(" << ind <<
")" << std::endl;
149 for (
const auto &[
size, ind] : _indices)
151 VERBOSE(WIC_PLANNER) <<
"build_plan(" << ind <<
"): [" <<
size <<
"sz]" << std::endl;
153 uint32_t next_offset = 0;
154 if (_interference_graph.count(ind))
157 std::multimap<uint32_t, uint32_t> interfered_plans;
158 for (
const auto &interference : _interference_graph[ind])
160 if (_mem_plans.count(interference))
161 interfered_plans.emplace(_mem_plans[interference].
offset, _mem_plans[interference].
size);
165 for (
const auto &[claimed_base_offset, claimed_size] : interfered_plans)
167 VERBOSE(WIC_PLANNER) <<
"interfere : [+" << claimed_base_offset <<
", " << claimed_size
168 <<
"sz]" << std::endl;
169 if (next_offset +
size <= claimed_base_offset)
173 else if (next_offset < claimed_base_offset + claimed_size)
175 next_offset = claimed_base_offset + claimed_size;
181 VERBOSE(WIC_PLANNER) <<
"No interference" << std::endl;
184 _mem_plans[ind] = {next_offset,
size};
185 VERBOSE(WIC_PLANNER) <<
"alloc(" << ind <<
"): [+" << next_offset <<
", " <<
size <<
"sz]"
188 if (_capacity < next_offset +
size)
190 _capacity = next_offset +
size;
194 _interference_graph.clear();
Class to plan memory by bump way.
void release(const Index &) override
Release memory for tensor by bump way.
void claim(const Index &, size_t) override
Claim memory for tensor by bump way.
Class to plan memory by firstfit way.
void claim(const Index &, size_t) override
Claim memory for tensor by firstfit way.
void release(const Index &) override
Release memory for tensor by firstfit way.
Class to plan memory by Weighted Interval Color algorithm.
void release(const Index &) override
Release memory for tensor by WIC algorithm.
MemoryPlans & memory_plans() override
Get MemoryPlans.
void claim(const Index &, size_t) override
Claim memory for tensor by WIC algorithm.
__global uchar * offset(const Image *img, int x, int y)
#define VERBOSE(name, lv)
Structure to have memory offset and size.