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

Function TEST

src/opr/test/cond.cpp:474–540  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

472} // anonymous namespace
473
474TEST(TestCondExec, MarkSimple) {
475 int nr_call = 0;
476 auto graph = ComputingGraph::make();
477 graph->options().graph_opt_level = 0;
478 HostTensorGenerator<> gen;
479 auto host_x = gen({2, 3}), host_pred = gen({1});
480 auto x = opr::Host2DeviceCopy::make_no_fwd(*graph, host_x),
481 pred = opr::Host2DeviceCopy::make(*graph, host_pred);
482 SymbolVar xcond, ppv;
483 unpack_vector(
484 opr::CondExecPred::make(
485 pred, {pred.make_scalar(0.f)},
486 opr::CondExecPred::Param::Mode::CASE),
487 ppv);
488 ppv = opr::CondExecPredLogical::make({ppv}, opr::CondExecPredLogical::Mode::NAND);
489 unpack_vector(opr::CondExecMark::make(ppv, {x}), xcond);
490 {
491 ASSERT_THROW(opr::CondExecMark::make(xcond, {x}), GraphError);
492 // also test dedup
493 auto tmp = opr::CondExecMark::mark_if_need(xcond, {x});
494 ASSERT_EQ(xcond, tmp);
495 ASSERT_EQ(ppv.node(), tmp.node()->owner_opr()->input().back());
496 }
497 auto y = make_call_rec(xcond + 2.3f, &nr_call);
498 HostTensorND host_y;
499
500 ASSERT_EQ(0u, y.node()->owner_opr()->node_prop().dep_map().count(ppv.node()));
501
502 auto func = graph->compile({make_callback_copy(y, host_y)});
503
504 // dependency added in topo sorter
505 ASSERT_EQ(
506 y.node()->owner_opr()->node_prop().dep_map().at(ppv.node()),
507 cg::OperatorNodeBase::NodeProp::DepType::DEV_COMP_ORDER);
508
509 auto make_expect = [&host_x]() {
510 auto graph = ComputingGraph::make();
511 HostTensorND ret;
512 auto x = opr::Host2DeviceCopy::make(*graph, host_x);
513 graph->compile({make_callback_copy(x + 2.3f, ret)})->execute();
514 return ret;
515 };
516
517 auto pp = host_pred->ptr<float>();
518 pp[0] = 0;
519 func->execute();
520 ASSERT_EQ(0, nr_call);
521 ASSERT_TRUE(host_y.empty());
522
523 pp[0] = 1;
524 func->execute();
525 ASSERT_EQ(1, nr_call);
526 MGB_ASSERT_TENSOR_EQ(make_expect(), host_y);
527 host_y = {};
528
529 *host_x = *gen({5, 8});
530 pp[0] = 0;
531 func->execute();

Callers

nothing calls this directly

Calls 15

make_no_fwdFunction · 0.85
unpack_vectorFunction · 0.85
make_call_recFunction · 0.85
make_callback_copyFunction · 0.85
prev_dev_ptrFunction · 0.85
make_one_condFunction · 0.85
merge_one_outFunction · 0.85
test_merge_oprFunction · 0.85
test_simple_gradFunction · 0.85
subFunction · 0.85
test_nestedFunction · 0.85
gradFunction · 0.85

Tested by

no test coverage detected