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

Method scn_do_execute

src/opr/impl/cond.cpp:478–517  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

476}
477
478void CondExecPred::scn_do_execute() {
479 auto&& mgr = owner_graph()->static_infer_manager();
480 PredEvaluator eval{*this, mgr.infer_value(input().back())};
481 auto mode = m_param.mode;
482 if (mode == Mode::CASE || mode == Mode::CASE_FALLBACK) {
483 bool enabled = false;
484 for (size_t i = 0; i < input().size() - 1; ++i) {
485 auto cur = eval(mgr.infer_value(input(i))) == PredEvaluator::EQ;
486 m_masks[i]->enable(cur);
487 enabled |= cur;
488 }
489 if (mode == Mode::CASE_FALLBACK) {
490 m_masks.back()->enable(!enabled);
491 }
492 } else {
493 mgb_assert(mode == Mode::PIECEWISE);
494 const DeviceTensorND *val_prev = nullptr, *val_cur = nullptr;
495 for (size_t i = 0; i < input().size(); ++i) {
496 val_prev = val_cur;
497 if (i == input().size() - 1) {
498 val_cur = nullptr;
499 } else {
500 val_cur = &mgr.infer_value(input(i));
501 }
502
503 PredEvaluator::Result el, er;
504 if (!val_prev) {
505 el = PredEvaluator::GT;
506 } else {
507 el = eval(*val_prev);
508 }
509 if (!val_cur) {
510 er = PredEvaluator::LT;
511 } else {
512 er = eval(*val_cur);
513 }
514 m_masks[i]->enable(el != PredEvaluator::LT && er == PredEvaluator::LT);
515 }
516 }
517}
518
519VarNode* CondExecPred::out_var_from_mask(ExecutionMask* mask) const {
520 for (size_t i = 0; i < output().size(); ++i) {

Callers

nothing calls this directly

Calls 15

has_no_shape_inferFunction · 0.85
is_exact_oneFunction · 0.85
fill_zero_dev_tensorFunction · 0.85
infer_valueMethod · 0.80
backMethod · 0.80
eq_layoutMethod · 0.80
copy_from_fixlayoutMethod · 0.80
resizeMethod · 0.80
as_megdnnMethod · 0.80
sizeMethod · 0.45
enableMethod · 0.45

Tested by

no test coverage detected