| 472 | } // anonymous namespace |
| 473 | |
| 474 | TEST(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(); |
nothing calls this directly
no test coverage detected