| 190 | } |
| 191 | |
| 192 | void test_base_impl(bool dyn_inp, bool dyn_tshp) { |
| 193 | HostTensorGenerator<> gen; |
| 194 | auto host_x = gen({10}); |
| 195 | auto host_tshp = |
| 196 | std::make_shared<HostTensorND>(host_x->comp_node(), dtype::Int32()); |
| 197 | |
| 198 | host_tshp->resize({1}).ptr<int>()[0] = 1; |
| 199 | HostTensorND host_y, expected{host_x->comp_node(), dtype::Float32()}; |
| 200 | DeviceTensorND static_calc_x{CompNode::default_cpu()}, |
| 201 | static_calc_workspace{CompNode::default_cpu()}, |
| 202 | static_calc_y{CompNode::default_cpu()}; |
| 203 | auto static_calc_opr = |
| 204 | opr::intl::create_megdnn_opr<megdnn::Reduce>(CompNode::default_cpu()); |
| 205 | auto graph = ComputingGraph::make(); |
| 206 | auto x = opr::Host2DeviceCopy::make(*graph, host_x, {"x"}), |
| 207 | tshp = opr::Host2DeviceCopy::make(*graph, host_tshp, {"tshp"}); |
| 208 | if (dyn_inp) |
| 209 | x = opr::MarkDynamicVar::make(x); |
| 210 | if (dyn_tshp) |
| 211 | tshp = opr::MarkDynamicVar::make(tshp); |
| 212 | auto y = opr::reduce_sum(x, tshp); |
| 213 | auto func = graph->compile({make_callback_copy(y, host_y)}); |
| 214 | |
| 215 | if (!dyn_tshp) { |
| 216 | ASSERT_TRUE(cg::is_static_var_shape(y.node())); |
| 217 | } |
| 218 | if (!dyn_inp && !dyn_tshp) { |
| 219 | ASSERT_TRUE(cg::is_static_var_value(y.node())); |
| 220 | } |
| 221 | |
| 222 | bool check_succ = false; |
| 223 | auto do_check = [&](const TensorShape& ishp, |
| 224 | const std::vector<size_t>& reduce_axes) { |
| 225 | check_succ = false; |
| 226 | host_x->copy_from(*gen(ishp)); |
| 227 | auto oshp = ishp; |
| 228 | if (reduce_axes.size() == 1 && reduce_axes[0] == (size_t)-1) { |
| 229 | oshp.shape[0] = 1; |
| 230 | oshp.ndim = 1; |
| 231 | } else { |
| 232 | for (auto i : reduce_axes) |
| 233 | oshp.shape[i] = 1; |
| 234 | } |
| 235 | { |
| 236 | DeviceTensorND tmp; |
| 237 | cg::copy_shape_to_tensor_value(tmp, oshp); |
| 238 | host_tshp->copy_from(tmp); |
| 239 | } |
| 240 | func->execute(); |
| 241 | |
| 242 | if (reduce_axes.empty() && !(!dyn_inp && dyn_tshp)) { |
| 243 | ASSERT_EQ(x.node()->prev_dev_ptr(), y.node()->prev_dev_ptr()); |
| 244 | } |
| 245 | |
| 246 | expected.resize(oshp); |
| 247 | reduce_raw<Mode::SUM, float>(expected, *host_x); |
| 248 | |
| 249 | MGB_ASSERT_TENSOR_NEAR(expected, host_y, 1e-5); |
no test coverage detected