MCPcopy Create free account
hub / github.com/MegEngine/MegEngine / apply_discard_plan

Method apply_discard_plan

src/core/impl/graph/seq_sublinear_memory.cpp:220–361  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

218}
219
220void SeqModifierForSublinearMemory::ModifyActionPlanner::apply_discard_plan() {
221 ThinHashSet<Var*> alive_vars;
222
223 // map from original var to duplicated var
224 ThinHashMap<Var*, Var*> var_map;
225
226 auto add_alive = [&](Var* var) {
227 auto&& ins = alive_vars.insert(var);
228 mgb_assert(ins.second);
229 };
230
231 auto remove_alive = [&](Var* var) {
232 auto nr = alive_vars.erase(var);
233 mgb_assert(nr);
234 };
235
236 auto check_and_remove = [&](size_t timestamp, Var* var) {
237 auto acc = var->visit_discard_tailing_access();
238 if (!acc || (acc && acc->opr->time >= timestamp)) {
239 mgb_assert(var->owner_opr()->output.size() > 1);
240 for (size_t i = 0; i < var->access_rec.size(); ++i) {
241 if (var->access_rec[i].time >= timestamp) {
242 mgb_assert(i > 0);
243 auto acc_rec_begin = var->access_rec.data();
244 var->access_rec.resize(i);
245 var->discard_tailing_access = i - 1;
246 mgb_assert(var->access_rec.data() == acc_rec_begin);
247 break;
248 }
249 }
250 }
251 };
252
253 auto try_discard = [&](Opr* opr, Var* var) {
254 auto acc = var->visit_discard_tailing_access();
255 if (acc && acc->opr == opr) {
256 remove_alive(var);
257 acc[1].opr->inputs_to_recompute.push_back(var);
258 auto acc_rec_begin = var->access_rec.data();
259
260 // make this opr as the last reader for original var
261 var->access_rec.resize(acc - acc_rec_begin + 1);
262 mgb_assert(var->access_rec.data() == acc_rec_begin);
263 }
264 };
265
266 // recompute a var by inserting new oprs
267 auto recompute = [&](Opr* reader, Var* var) {
268 mgb_assert(!alive_vars.count(var));
269
270 auto block_begin = var->owner_opr()->block_begin_time,
271 block_end = var->owner_opr()->block_end_time;
272
273 thin_function<Var*(Var*)> add_dep;
274 add_dep = [&](Var* var) {
275 if (alive_vars.count(var))
276 return var;
277 {

Callers

nothing calls this directly

Calls 15

resizeMethod · 0.80
alloc_uniqueMethod · 0.80
emplace_backMethod · 0.80
last_access_oprMethod · 0.80
is_bad_oprFunction · 0.70
insertMethod · 0.45
eraseMethod · 0.45
sizeMethod · 0.45
owner_oprMethod · 0.45
dataMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected