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

Method optimize_fwd_graph

src/opr/impl/loop/forward.cpp:430–493  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

428}
429
430void Loop::optimize_fwd_graph(int level, FwdDesc& desc) {
431 // setup endpoints
432 VarNodeArray endpoints;
433 endpoints.reserve(desc.all_inputs().size() + desc.output_record_spec().size());
434 for (auto i : desc.all_inputs()) {
435 if (i->param().has_assign) {
436 endpoints.push_back(i->assignor());
437 }
438 }
439 for (auto&& i : desc.output_record_spec()) {
440 endpoints.push_back(i.var_sub());
441 }
442 auto cond = desc.loop_cond_manager().var();
443 mgb_throw_if(!cond.node(), GraphError, "loop condition not set");
444 endpoints.push_back(cond.node());
445
446 // optimize also extra_vardeps
447 size_t nr_extra_deps = 0;
448 auto&& extra_deps = desc.sub_graph()->options().extra_vardeps;
449 {
450 auto on_opr = [&](OperatorNodeBase* opr) {
451 for (auto i : opr->output()) {
452 auto&& iter = extra_deps.find(i);
453 if (iter != extra_deps.end()) {
454 nr_extra_deps += iter->second.size();
455 endpoints.insert(
456 endpoints.end(), iter->second.begin(), iter->second.end());
457 extra_deps.erase(iter);
458 }
459 }
460 };
461 cg::DepOprIter opr_iter{on_opr};
462 for (size_t i = 0; i < endpoints.size(); ++i) {
463 opr_iter.add(endpoints[i]->owner_opr());
464 }
465 }
466
467 // apply opt and reset vars
468 gopt::GraphOptimizer()
469 .add_preset_passes()
470 .verbosity(0)
471 .enable_check_result(level < 0)
472 .apply_inplace(endpoints);
473
474 auto ep_iter = endpoints.begin();
475 for (auto i : desc.all_inputs()) {
476 if (i->param().has_assign) {
477 i->set_assignor(*(ep_iter++));
478 }
479 }
480 for (auto&& i : desc.output_record_spec()) {
481 const_cast<OutputRecordSpecItem&>(i).var_sub(*(ep_iter++));
482 }
483 desc.loop_cond_manager().setup(*(ep_iter++));
484
485 auto&& cond_deps = extra_deps[desc.loop_cond_manager().var().node()];
486 for (size_t i = 0; i < nr_extra_deps; ++i) {
487 cond_deps.push_back(*(ep_iter++));

Callers

nothing calls this directly

Calls 15

var_subMethod · 0.80
sub_graphMethod · 0.80
apply_inplaceMethod · 0.80
verbosityMethod · 0.80
GraphOptimizerClass · 0.50
reserveMethod · 0.45
sizeMethod · 0.45
paramMethod · 0.45
push_backMethod · 0.45
varMethod · 0.45
nodeMethod · 0.45

Tested by

no test coverage detected