#include "megbrain/plugin/num_range_checker.h" #include "megbrain/opr/basic_arith.h" #include "megbrain/opr/io.h" #include "megbrain/opr/loop.h" #include "megbrain/test/helper.h" using namespace mgb; TEST(TestNumRangeChecker, Simple) { HostTensorGenerator<> gen; auto graph = ComputingGraph::make(); NumRangeChecker checker{graph.get(), 1e30f}; auto av = gen({3}), bv = gen({3}); auto a = opr::Host2DeviceCopy::make(*graph, av), b = opr::Host2DeviceCopy::make(*graph, bv), c = a / b; auto func = graph->compile({{c, {}}}); auto pb = bv->ptr(); pb[0] = 2; pb[1] = -1; pb[2] = 3; func->execute(); pb[1] = 0; ASSERT_THROW(func->execute(), NumRangeChecker::Error); } TEST(TestNumRangeChecker, MultiDType) { HostTensorGenerator gen; auto graph = ComputingGraph::make(); NumRangeChecker checker{graph.get(), 1e30f}; auto av = gen({3}); auto a = opr::Host2DeviceCopy::make(*graph, av), b = a + a, c = opr::TypeCvt::make(b, dtype::Float32()); auto func = graph->compile({{c, {}}}); func->execute(); } TEST(TestNumRangeChecker, MultiShape) { HostTensorGenerator<> gen; auto graph = ComputingGraph::make(); NumRangeChecker checker{graph.get(), 1e30f}; auto av = gen({1, 3}), bv = gen({3, 1}); auto a = opr::Host2DeviceCopy::make(*graph, av), b = opr::Host2DeviceCopy::make(*graph, bv), c = (a + 2) / (b - 4); auto func = graph->compile({{c, {}}}); auto pb = bv->ptr(); pb[0] = 2; pb[1] = -1; pb[2] = 3; func->execute(); pb[2] = 4; ASSERT_THROW(func->execute(), NumRangeChecker::Error); } TEST(TestNumRangeChecker, Loop) { HostTensorGenerator<> gen; auto graph = ComputingGraph::make(); NumRangeChecker checker{graph.get(), 1e30f}; auto av = gen({3}), bv = gen({3}); auto a = opr::Host2DeviceCopy::make(*graph, av), b = opr::Host2DeviceCopy::make(*graph, bv); auto loop_cb = [&](opr::Loop::Desc& desc) { auto ai = desc.add_input(a), bi = desc.add_input(b); desc.set_loop_condition(desc.get_counter_var() < 0); auto out = ai + bi; desc.add_output(out, opr::Loop::Desc::OutputMode::LAST); out.node()->owner_graph()->options().extra_vardeps[out.node()].push_back( (ai / bi).node()); }; auto c = opr::Loop::make(loop_cb)[0]; HostTensorND host_c; auto func = graph->compile({make_callback_copy(c, host_c)}); auto pb = bv->ptr(); pb[0] = 2; pb[1] = -1; pb[2] = 3; func->execute(); pb[1] = 0; ASSERT_THROW(func->execute(), NumRangeChecker::Error); } TEST(TestNumRangeChecker, MultiStreamDyn) { auto cns = load_multiple_xpus(2); HostTensorGenerator<> gen; auto graph = ComputingGraph::make(); NumRangeChecker checker{graph.get(), 1e30f}; auto xv = gen({3}, cns[0]); auto x = opr::Host2DeviceCopy::make(*graph, xv), y = opr::Copy::make(x, cns[1]); auto func = graph->compile({{y, {}}}); func->execute(); } // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}