| 85 | } // anonymous namespace |
| 86 | |
| 87 | TEST(TestPartialExecution, Simple) { |
| 88 | auto graph = ComputingGraph::make(); |
| 89 | HostTensorGenerator<> gen; |
| 90 | auto host_x = gen({2, 3}), host_delta = gen({1}); |
| 91 | int call0 = 0, call1 = 0; |
| 92 | auto make_expect = [&host_x](float delta) { |
| 93 | HostTensorND hv; |
| 94 | auto ptr = hv.copy_from(*host_x).ptr<float>(); |
| 95 | for (int i = 0; i < 6; ++i) |
| 96 | ptr[i] += delta; |
| 97 | return hv; |
| 98 | }; |
| 99 | auto cb0 = [&call0, &make_expect](DeviceTensorND& dv) { |
| 100 | HostTensorND hv; |
| 101 | hv.copy_from(dv).sync(); |
| 102 | MGB_ASSERT_TENSOR_EQ(make_expect(0), hv); |
| 103 | ++call0; |
| 104 | }; |
| 105 | auto cb1 = [&call1, &make_expect](DeviceTensorND& dv) { |
| 106 | HostTensorND hv; |
| 107 | hv.copy_from(dv).sync(); |
| 108 | MGB_ASSERT_TENSOR_EQ(make_expect(1), hv); |
| 109 | ++call1; |
| 110 | }; |
| 111 | host_delta->ptr<float>()[0] = -1; |
| 112 | auto x = opr::Host2DeviceCopy::make(*graph, host_x), |
| 113 | delta = opr::Host2DeviceCopy::make(*graph, host_delta), |
| 114 | y0 = opr::CallbackInjector::make(x, cb0), |
| 115 | y1 = opr::CallbackInjector::make(x + delta, cb1) + delta; |
| 116 | |
| 117 | // it should execute in part2 albeit with high priority |
| 118 | set_priority(delta, -100); |
| 119 | HostTensorND host_y1; |
| 120 | auto funcs = |
| 121 | graph->compile_multi_part({{{y0, {}}}, {make_callback_copy(y1, host_y1)}}); |
| 122 | ASSERT_EQ(2u, funcs.size()); |
| 123 | |
| 124 | for (int i = 0; i < 4; ++i) { |
| 125 | *host_x = *gen({2, 3}); |
| 126 | ASSERT_EQ(0, call0); |
| 127 | funcs[0]->execute(); |
| 128 | ASSERT_TRUE(host_y1.empty()); |
| 129 | ASSERT_EQ(1, call0); |
| 130 | ASSERT_EQ(0, call1); |
| 131 | |
| 132 | host_delta->ptr<float>()[0] = 1; |
| 133 | funcs[1]->execute(); |
| 134 | ASSERT_EQ(1, call0); |
| 135 | ASSERT_EQ(1, call1); |
| 136 | MGB_ASSERT_TENSOR_EQ(make_expect(2), host_y1); |
| 137 | |
| 138 | call0 = call1 = 0; |
| 139 | host_y1.resize({}); |
| 140 | } |
| 141 | } |
| 142 | |
| 143 | TEST(TestPartialExecution, AddUpdate) { |
| 144 | auto graph = ComputingGraph::make(); |
nothing calls this directly
no test coverage detected