GitOrigin-RevId: f56aa5a505
tags/v1.11.0
| @@ -11,7 +11,8 @@ MGE_WIN_DECLSPEC_FUC size_t setup_algo( | |||
| const typename mgb::rdnn::AlgoChooser<Opr>::FixedTensorLayouts& layouts, | |||
| Opr* megdnn_opr, uint32_t shared_batch_size, bool binary_equal_between_batch, | |||
| bool no_profiling_on_shape_change, CompNode comp_node, | |||
| megdnn::param::ExecutionPolicy execution_policy, bool allow_weight_preprocess) { | |||
| megdnn::param::ExecutionPolicy execution_policy, bool allow_weight_preprocess, | |||
| SmallVector<megdnn::TensorND>* inp_tensornds = nullptr) { | |||
| megdnn::AlgorithmCache::Key cache_key( | |||
| megdnn_opr->handle(), megdnn_opr->get_opr_type(), layouts.data(), | |||
| layouts.size(), &megdnn_opr->param(), sizeof(megdnn_opr->param())); | |||
| @@ -39,7 +40,7 @@ MGE_WIN_DECLSPEC_FUC size_t setup_algo( | |||
| using AlgoChooserHelper = typename mgb::rdnn::AlgoChooser<Opr>::AlgoChooserHelper; | |||
| AlgoChooserHelper helper( | |||
| layouts, megdnn_opr, param_str, comp_node, execution_policy, | |||
| allow_weight_preprocess, desc); | |||
| allow_weight_preprocess, desc, inp_tensornds); | |||
| megdnn::ExecutionPolicy policy; | |||
| policy = mgb::rdnn::AlgoChooser<Opr>::get_policy(helper); | |||
| @@ -141,11 +141,8 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| def, inputs[0]->layout().ndim, inputs[0]->layout(), | |||
| inputs[1]->layout()); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, out_layout); | |||
| using TensorND = megdnn::TensorND; | |||
| SmallVector<TensorND> inp_tensornds(inputs.size()); | |||
| SmallVector<TensorND> inp_tensornds(inputs.size() + 2); | |||
| TensorLayoutArray inp_shapes(inputs.size()), oup_shapes(output_descs.size()); | |||
| for (unsigned i = 0; i < inputs.size(); ++i) { | |||
| inp_tensornds[i] = inputs[i]->dnn_tensor(); | |||
| @@ -168,13 +165,20 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| TensorLayout empty_shp({0}, inputs[0]->dtype()); | |||
| empty_shp.ndim = 0; | |||
| DeviceTensorND empty_bias = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, empty_shp); | |||
| inp_tensornds[2] = empty_bias.as_megdnn(); | |||
| inp_tensornds[3] = empty_bias.as_megdnn(); | |||
| size_t sz = setup_algo<megdnn::ConvBiasForward>( | |||
| {inp_shapes[0], inp_shapes[1], empty_shp, empty_shp, oup_shapes[0]}, | |||
| dnn_opr.op.get(), 0, false, false, cn, conv.policy(), false); | |||
| dnn_opr.op.get(), 0, false, false, cn, conv.policy(), false, | |||
| &inp_tensornds); | |||
| // alloc memory | |||
| DeviceTensorND empty_bias = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, empty_shp); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, out_layout); | |||
| TensorLayout w_layout({sz}, dtype::Byte()); | |||
| auto dnn_wk = dnn_opr.create_workspace(w_layout); | |||
| @@ -364,9 +368,6 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| def, inputs[1]->layout().ndim, inputs[0]->layout(), inputs[1]->layout(), | |||
| cn); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, out_layout); | |||
| using TensorND = megdnn::TensorND; | |||
| SmallVector<TensorND> inp_tensornds(inputs.size()); | |||
| TensorLayoutArray inp_shapes(inputs.size()), oup_shapes(output_descs.size()); | |||
| @@ -380,7 +381,10 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| size_t sz = setup_algo<megdnn::ConvolutionBackwardData>( | |||
| {inp_shapes[0], inp_shapes[1], oup_shapes[0]}, dnn_opr.op.get(), 0, false, | |||
| false, cn, convbwd.policy(), false); | |||
| false, cn, convbwd.policy(), false, &inp_tensornds); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, out_layout); | |||
| auto wk = Blob::make(cn, sz); | |||
| auto ptr = wk->storage().get(); | |||
| @@ -542,7 +546,7 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| // shape infer | |||
| size_t sz = setup_algo<megdnn::Convolution3D>( | |||
| {inp_shapes[0], inp_shapes[1], oup_shapes[0]}, dnn_opr.op.get(), 0, false, | |||
| false, cn, conv.policy(), false); | |||
| false, cn, conv.policy(), false, &inp_tensornds); | |||
| // alloc memory | |||
| DeviceTensorND out = | |||
| @@ -598,8 +602,9 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| SmallVector<LogicalTensorDesc>& output_descs, const bool& validated) { | |||
| auto&& op_def = def.cast_final_safe<Convolution3DBackwardData>(); | |||
| auto cn = inputs[0]->comp_node(); | |||
| megdnn::TensorND weight = inputs[0]->dnn_tensor(); | |||
| megdnn::TensorND diff = inputs[1]->dnn_tensor(); | |||
| auto&& wlayout = inputs[0]->layout(); | |||
| auto&& dlayout = inputs[1]->layout(); | |||
| DnnOprCaller<megdnn::Convolution3DBackwardData> caller(cn); | |||
| auto&& dnn_opr = caller.op; | |||
| @@ -608,21 +613,24 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| TensorLayout& oup_layout = output_descs[0].layout; | |||
| if (!validated) { | |||
| megdnn::Convolution3DBackwardData::deduce_layout_impl( | |||
| weight.layout, diff.layout, op_def.param(), oup_layout); | |||
| wlayout, dlayout, op_def.param(), oup_layout); | |||
| } | |||
| DeviceTensorND oup = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, oup_layout); | |||
| SmallVector<megdnn::TensorND> inp_tensornds(inputs.size()); | |||
| inp_tensornds[0] = inputs[0]->dnn_tensor(); | |||
| inp_tensornds[1] = inputs[1]->dnn_tensor(); | |||
| size_t wk_size = setup_algo<megdnn::Convolution3DBackwardData>( | |||
| {weight.layout, diff.layout, oup_layout}, dnn_opr.get(), 0, false, false, | |||
| cn, op_def.policy(), false); | |||
| {wlayout, dlayout, oup_layout}, dnn_opr.get(), 0, false, false, cn, | |||
| op_def.policy(), false, &inp_tensornds); | |||
| megdnn::Workspace dnn_wk; | |||
| if (wk_size != 0) { | |||
| TensorLayout w_layout({wk_size}, dtype::Byte()); | |||
| dnn_wk = caller.create_workspace(w_layout); | |||
| } | |||
| dnn_opr->exec(weight, diff, oup.as_megdnn(), dnn_wk); | |||
| dnn_opr->exec(inp_tensornds[0], inp_tensornds[1], oup.as_megdnn(), dnn_wk); | |||
| return {Tensor::make(oup)}; | |||
| } | |||
| @@ -229,12 +229,11 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| inp_tensornds[0].layout = layout_a; | |||
| inp_tensornds[1].layout = layout_b; | |||
| } | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, dst_layout); | |||
| size_t sz = setup_algo<megdnn::MatrixMul>( | |||
| {layout_a, layout_b, dst_layout}, dnn_opr.op.get(), 0, false, false, cn, | |||
| matmul.policy(), false); | |||
| matmul.policy(), false, &inp_tensornds); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, dst_layout); | |||
| TensorLayout w_layout({sz}, dtype::Byte()); | |||
| auto dnn_wk = dnn_opr.create_workspace(w_layout); | |||
| @@ -470,21 +469,22 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| return {Tensor::make(out)}; | |||
| } | |||
| using TensorND = megdnn::TensorND; | |||
| TensorND inp_nd1 = inp1->dnn_tensor(); | |||
| inp_nd1.layout = layout1; | |||
| TensorND inp_nd2 = inp2->dnn_tensor(); | |||
| inp_nd2.layout = layout2; | |||
| SmallVector<megdnn::TensorND> inp_tensornds(2u); | |||
| inp_tensornds[0] = inp1->dnn_tensor(); | |||
| inp_tensornds[0].layout = layout1; | |||
| inp_tensornds[1] = inp2->dnn_tensor(); | |||
| inp_tensornds[1].layout = layout2; | |||
| size_t sz = setup_algo<megdnn::BatchedMatrixMul>( | |||
| {layout1, layout2, dst_layout}, dnn_opr.op.get(), 0, false, false, cn, | |||
| matmul.policy(), false, &inp_tensornds); | |||
| DeviceTensorND out = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, dst_layout); | |||
| size_t sz = setup_algo<megdnn::BatchedMatrixMul>( | |||
| {layout1, layout2, dst_layout}, dnn_opr.op.get(), 0, false, false, cn, | |||
| matmul.policy(), false); | |||
| TensorLayout w_layout({sz}, dtype::Byte()); | |||
| auto dnn_wk = dnn_opr.create_workspace(w_layout); | |||
| dnn_opr.op->exec(inp_nd1, inp_nd2, out.as_megdnn(), dnn_wk); | |||
| dnn_opr.op->exec(inp_tensornds[0], inp_tensornds[1], out.as_megdnn(), dnn_wk); | |||
| shp1[shp1.ndim - 2] = dst_layout[dst_layout.ndim - 2]; | |||
| shp1[shp1.ndim - 1] = dst_layout[dst_layout.ndim - 1]; | |||
| @@ -49,23 +49,25 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| auto&& op_def = def.cast_final_safe<Pooling>(); | |||
| auto cn = inputs[0]->comp_node(); | |||
| megdnn::TensorND inp_tensornd = inputs[0]->dnn_tensor(); | |||
| DnnOprCaller<megdnn::Pooling> caller(cn); | |||
| auto&& dnn_opr = caller.op; | |||
| dnn_opr->param() = op_def.param(); | |||
| SmallVector<megdnn::TensorND> inp_tensornds(inputs.size()); | |||
| inp_tensornds[0] = inputs[0]->dnn_tensor(); | |||
| TensorLayout& oup_layout = output_descs[0].layout; | |||
| if (!validated) { | |||
| megdnn::Pooling::deduce_layout_impl( | |||
| inp_tensornd.layout, op_def.param(), oup_layout); | |||
| inp_tensornds[0].layout, op_def.param(), oup_layout); | |||
| } | |||
| DeviceTensorND out_devtensor = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, oup_layout); | |||
| size_t wk_size = setup_algo<megdnn::Pooling>( | |||
| {inp_tensornd.layout, oup_layout}, dnn_opr.get(), 0, false, false, cn, | |||
| op_def.policy(), false); | |||
| {inp_tensornds[0].layout, oup_layout}, dnn_opr.get(), 0, false, false, cn, | |||
| op_def.policy(), false, &inp_tensornds); | |||
| DeviceTensorND out_devtensor = | |||
| BlobManager::inst()->alloc_workspace_with_defrag(cn, oup_layout); | |||
| megdnn::Workspace dnn_wk; | |||
| if (wk_size) { | |||
| @@ -73,7 +75,7 @@ SmallVector<TensorPtr> apply_on_physical_tensor( | |||
| dnn_wk = caller.create_workspace(w_layout); | |||
| } | |||
| dnn_opr->exec(inp_tensornd, out_devtensor.as_megdnn(), dnn_wk); | |||
| dnn_opr->exec(inp_tensornds[0], out_devtensor.as_megdnn(), dnn_wk); | |||
| return {Tensor::make(out_devtensor)}; | |||
| } | |||
| @@ -265,7 +265,8 @@ std::vector<megdnn::Algorithm::SearchItem> flatten_search_space( | |||
| typename rdnn::AlgoChooser<_Opr>::AlgoChooserHelper sub_helper( | |||
| to_fixed_layouts<_Opr>(_item.layouts), megdnn_opr.get(), | |||
| _item.param, helper.comp_node(), helper.execution_policy(), | |||
| helper.allow_weight_preprocess(), helper.desc()); | |||
| helper.allow_weight_preprocess(), helper.desc(), | |||
| helper.get_input()); | |||
| auto space = flatten_search_space<_Opr>(sub_helper, checker); | |||
| ret.insert(ret.end(), space.begin(), space.end()); | |||
| }); | |||
| @@ -488,7 +489,8 @@ AlgoChooser<Opr>::AlgoChooserHelper::AlgoChooserHelper( | |||
| const FixedTensorLayouts& layouts, Opr* megdnn_opr, | |||
| const std::string& param_str, const CompNode& cn, | |||
| const megdnn::param::ExecutionPolicy& execution_policy, | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc) | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc, | |||
| SmallVector<megdnn::TensorND>* inputs) | |||
| : m_fastrun_layouts{layouts}, | |||
| m_incache_layouts{layouts}, | |||
| m_dnn_opr{megdnn_opr}, | |||
| @@ -496,7 +498,8 @@ AlgoChooser<Opr>::AlgoChooserHelper::AlgoChooserHelper( | |||
| m_cn{cn}, | |||
| m_execution_policy{execution_policy}, | |||
| m_allow_weight_preprocess{allow_weight_preprocess}, | |||
| m_desc{desc} { | |||
| m_desc{desc}, | |||
| m_inputs{inputs} { | |||
| auto fastrun_batch_size = desc.shared_batch_size; | |||
| if (fastrun_batch_size) { | |||
| @@ -604,7 +607,7 @@ typename AlgoChooser<Opr>::ImplExecutionPolicy AlgoChooser<Opr>::AlgoChooserHelp | |||
| typename AlgoChooser<_Opr>::AlgoChooserHelper sub_helper( | |||
| to_fixed_layouts<_Opr>(_item.layouts), megdnn_opr.get(), | |||
| _item.param, m_cn, m_execution_policy, m_allow_weight_preprocess, | |||
| m_desc); | |||
| m_desc, m_inputs); | |||
| sub_helper.profile(selected_strategy); | |||
| }); | |||
| } | |||
| @@ -868,6 +871,7 @@ Maybe<AlgoChooserProfileCache::ResultEntry> AlgoChooser<Opr>::AlgoChooserHelper: | |||
| param.shapes[i] = m_fastrun_layouts[i]; | |||
| param.opr_param = m_dnn_opr->param(); | |||
| param.allow_weight_preprocess = m_allow_weight_preprocess; | |||
| param.inp_tensornds = m_inputs; | |||
| Algorithm* palgo = m_dnn_opr->get_algorithm_from_desc(policy.algo); | |||
| mgb_assert(palgo, "can not find algo when profile single algo"); | |||
| @@ -964,7 +968,9 @@ void AlgoChooser<Opr>::AlgoChooserHelper::profile( | |||
| if (!policy.algo.valid()) | |||
| continue; | |||
| size_t workspace_needed = get_workspace_size_bytes(policy); | |||
| if (data_size + workspace_needed > | |||
| if (m_inputs != nullptr) | |||
| workspace_needed += data_size; | |||
| if (workspace_needed > | |||
| m_desc.get_workspace_limit(m_cn, m_execution_policy.workspace_limit)) { | |||
| continue; | |||
| } | |||
| @@ -1101,7 +1107,8 @@ std::pair<AlgoAttribute, AlgoAttribute> AlgoChooser<Opr>::AlgoChooserHelper:: | |||
| const FixedTensorLayouts& layouts, megdnn::Opr* megdnn_opr, \ | |||
| const std::string& param_str, const CompNode& cn, \ | |||
| const megdnn::param::ExecutionPolicy& execution_policy, \ | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc); \ | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc, \ | |||
| SmallVector<megdnn::TensorND>* inputs); \ | |||
| template typename AlgoChooser<megdnn::Opr>::ImplExecutionPolicy \ | |||
| AlgoChooser<megdnn::Opr>::AlgoChooserHelper::choose_by_heuristic( \ | |||
| const ExecutionStrategy& select_strategy) const; \ | |||
| @@ -143,7 +143,7 @@ template <typename Opr> | |||
| void TimedProfiler<Opr>::preprocess( | |||
| const TensorLayoutArray&, const megdnn::SmallVector<DeviceTensorND>&, | |||
| UniqPtrWithCN<Opr>&, megdnn::Workspace&, std::array<TensorLayout, arity>&, | |||
| std::array<DeviceTensorND, arity_in>&, PreprocessFilter<Opr>&) { | |||
| std::array<megdnn::TensorND, arity_in>&, PreprocessFilter<Opr>&) { | |||
| // Opr is neither convbias nor convolution.This function do nothing. | |||
| } | |||
| @@ -154,7 +154,7 @@ void TimedProfiler<megdnn::ConvBias>::preprocess( | |||
| const SmallVector<DeviceTensorND>& flt_val, | |||
| UniqPtrWithCN<megdnn::ConvBias>& megdnn_opr, megdnn::Workspace& mdn_workspace, | |||
| std::array<TensorLayout, arity>& layouts, | |||
| std::array<DeviceTensorND, arity_in>& inp_val, | |||
| std::array<megdnn::TensorND, arity_in>& inp_val, | |||
| PreprocessFilter<megdnn::ConvBias>& prep_flt) { | |||
| if (!preprocessed_layout.empty()) { | |||
| auto&& pf = prep_flt; | |||
| @@ -164,8 +164,7 @@ void TimedProfiler<megdnn::ConvBias>::preprocess( | |||
| pf.tensors[i] = flt_val[i].as_megdnn(); | |||
| } | |||
| APPLY(megdnn_opr->exec_preprocess(args..., &pf, mdn_workspace), | |||
| std::forward_as_tuple( | |||
| layouts[0], inp_val[1].as_megdnn(), inp_val[2].as_megdnn()), | |||
| std::forward_as_tuple(layouts[0], inp_val[1], inp_val[2]), | |||
| array_skip<arity_in - 1>(layouts)); | |||
| } | |||
| } | |||
| @@ -177,7 +176,7 @@ void TimedProfiler<megdnn::ConvolutionForward>::preprocess( | |||
| const megdnn::SmallVector<DeviceTensorND>& flt_val, | |||
| UniqPtrWithCN<megdnn::ConvolutionForward>& megdnn_opr, | |||
| megdnn::Workspace& mdn_workspace, std::array<TensorLayout, arity>& layouts, | |||
| std::array<DeviceTensorND, arity_in>& inp_val, | |||
| std::array<megdnn::TensorND, arity_in>& inp_val, | |||
| PreprocessFilter<megdnn::ConvolutionForward>& prep_flt) { | |||
| if (!preprocessed_layout.empty()) { | |||
| auto&& pf = prep_flt; | |||
| @@ -187,8 +186,7 @@ void TimedProfiler<megdnn::ConvolutionForward>::preprocess( | |||
| pf.tensors[i] = flt_val[i].as_megdnn(); | |||
| } | |||
| APPLY(megdnn_opr->exec_preprocess(args..., &pf, mdn_workspace), | |||
| std::forward_as_tuple(layouts[0], inp_val[1].as_megdnn()), | |||
| array_skip<2>(layouts)); | |||
| std::forward_as_tuple(layouts[0], inp_val[1]), array_skip<2>(layouts)); | |||
| } | |||
| } | |||
| @@ -259,8 +257,12 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| std::max(cn.get_free_mem(), cn.get_max_block_size_available()); | |||
| auto align = cn.get_mem_addr_alignment(); | |||
| size_t tot_size = align; | |||
| for (int i = 0; i < arity; ++i) { | |||
| tot_size += layouts[i].span().high_byte + align; | |||
| for (size_t i = 0; i < arity; ++i) { | |||
| // if input tensornds are given, only consider output tensornds | |||
| if (param.inp_tensornds != nullptr) { | |||
| if (i >= (*param.inp_tensornds).size()) | |||
| tot_size += layouts[i].span().high_byte + align; | |||
| } | |||
| } | |||
| for (const auto& layout : preprocessed_layout) { | |||
| tot_size += layout.span().high_byte + align; | |||
| @@ -275,20 +277,34 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| #endif | |||
| // allocate input and output memory | |||
| std::array<DeviceTensorND, arity_in> inp_val; | |||
| std::array<DeviceTensorND, arity_out> out_val; | |||
| std::array<DeviceTensorND, arity_in> inp_dev; | |||
| std::array<DeviceTensorND, arity_out> out_dev; | |||
| std::array<megdnn::TensorND, arity_in> inp_val; | |||
| std::array<megdnn::TensorND, arity_out> out_val; | |||
| DeviceTensorND workspace; | |||
| for (int i = 0; i < arity_in; ++i) { | |||
| inp_val[i].comp_node(cn).dtype(layouts[i].dtype).resize(layouts[i]); | |||
| if (param.inp_tensornds != nullptr) { | |||
| // if inp_tensornds exists, then reusing it | |||
| for (int i = 0; i < arity_in; ++i) { | |||
| inp_val[i] = (*param.inp_tensornds)[i]; | |||
| } | |||
| } else { | |||
| // inp_tensornds does not exist, create zero tensor with the same layout | |||
| for (int i = 0; i < arity_in; ++i) { | |||
| inp_dev[i].comp_node(cn).dtype(layouts[i].dtype).resize(layouts[i]); | |||
| fill_zero_dev_tensor(inp_dev[i]); | |||
| inp_val[i] = inp_dev[i].as_megdnn(); | |||
| } | |||
| } | |||
| for (int i = 0; i < arity_out; ++i) { | |||
| out_val[i] | |||
| out_dev[i] | |||
| .comp_node(cn) | |||
| .dtype(layouts[arity_in + i].dtype) | |||
| .resize(layouts[arity_in + i]); | |||
| out_val[i] = out_dev[i].as_megdnn(); | |||
| } | |||
| megdnn::Workspace mdn_workspace; | |||
| megdnn::Workspace mdn_workspace; | |||
| // allocate workspace | |||
| if (param.workspace) { | |||
| workspace.comp_node(cn).dtype(dtype::Byte()).resize({param.workspace}); | |||
| @@ -304,10 +320,6 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| preprocessed_layout[i].format}; | |||
| } | |||
| for (int i = 0; i < arity_in; ++i) { | |||
| fill_zero_dev_tensor(inp_val[i]); | |||
| } | |||
| PreprocessFilter<Opr> prep_flt; | |||
| preprocess( | |||
| preprocessed_layout, flt_val, megdnn_opr, mdn_workspace, layouts, inp_val, | |||
| @@ -322,13 +334,12 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| auto&& opr = _(megdnn_opr); | |||
| PreprocessFilter<Opr>* pf = | |||
| preprocessed_layout.empty() ? nullptr : &prep_flt; | |||
| APPLY(opr->exec(args.as_megdnn()..., pf, mdn_workspace), inp_val, | |||
| out_val); | |||
| APPLY(opr->exec(args..., pf, mdn_workspace), inp_val, out_val); | |||
| }, | |||
| /* else */ | |||
| [&](auto _) { | |||
| APPLY(_(megdnn_opr)->exec(args.as_megdnn()..., mdn_workspace), | |||
| inp_val, out_val); | |||
| APPLY(_(megdnn_opr)->exec(args..., mdn_workspace), inp_val, | |||
| out_val); | |||
| }); | |||
| } | |||
| ev_start->record(); | |||
| @@ -337,13 +348,11 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| auto&& opr = _(megdnn_opr); | |||
| PreprocessFilter<Opr>* pf = | |||
| preprocessed_layout.empty() ? nullptr : &prep_flt; | |||
| APPLY(opr->exec(args.as_megdnn()..., pf, mdn_workspace), inp_val, | |||
| out_val); | |||
| APPLY(opr->exec(args..., pf, mdn_workspace), inp_val, out_val); | |||
| }, | |||
| /* else */ | |||
| [&](auto _) { | |||
| APPLY(_(megdnn_opr)->exec(args.as_megdnn()..., mdn_workspace), inp_val, | |||
| out_val); | |||
| APPLY(_(megdnn_opr)->exec(args..., mdn_workspace), inp_val, out_val); | |||
| }); | |||
| ev_end->record(); | |||
| @@ -370,10 +379,10 @@ typename TimedProfiler<Opr>::TResult TimedProfiler<Opr>::prof_impl( | |||
| DeviceTensorStorage storage; | |||
| for (int i = 0; i < arity_in; ++i) { | |||
| inp_val[i].reset(storage, TensorLayout{}); | |||
| inp_dev[i].reset(storage, TensorLayout{}); | |||
| } | |||
| for (int i = 0; i < arity_out; ++i) { | |||
| out_val[i].reset(storage, TensorLayout{}); | |||
| out_dev[i].reset(storage, TensorLayout{}); | |||
| } | |||
| for (size_t i = 0; i < preprocessed_layout.size(); i++) { | |||
| flt_val[i].reset(storage, TensorLayout{}); | |||
| @@ -60,13 +60,15 @@ public: | |||
| megdnn::param::ExecutionPolicy m_execution_policy; | |||
| bool m_allow_weight_preprocess; | |||
| const AlgoChooserDesc& m_desc; | |||
| SmallVector<megdnn::TensorND>* m_inputs; | |||
| public: | |||
| MGE_WIN_DECLSPEC_FUC AlgoChooserHelper( | |||
| const FixedTensorLayouts& layouts, Opr* megdnn_opr, | |||
| const std::string& param_str, const CompNode& cn, | |||
| const megdnn::param::ExecutionPolicy& execution_policy, | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc); | |||
| bool allow_weight_preprocess, const AlgoChooserDesc& desc, | |||
| SmallVector<megdnn::TensorND>* inputs = nullptr); | |||
| Opr* megdnn_opr() const { return m_dnn_opr; } | |||
| @@ -93,6 +95,8 @@ public: | |||
| const AlgoChooserDesc& desc() const { return m_desc; } | |||
| SmallVector<megdnn::TensorND>* get_input() const { return m_inputs; } | |||
| //! construct algo chain by heuristic | |||
| ImplExecutionPolicy choose_by_heuristic( | |||
| const ExecutionStrategy& selected_strategy) const; | |||
| @@ -122,6 +122,8 @@ public: | |||
| //! filled by profile() | |||
| mutable double actual_timeout; | |||
| // input | |||
| SmallVector<megdnn::TensorND>* inp_tensornds; | |||
| }; | |||
| struct Result { | |||
| @@ -141,7 +143,7 @@ private: | |||
| const megdnn::TensorLayoutArray& preprocessed_layout, | |||
| const SmallVector<DeviceTensorND>& flt_val, UniqPtrWithCN<Opr>& megdnn_opr, | |||
| megdnn::Workspace& mdn_workspace, std::array<TensorLayout, arity>& layouts, | |||
| std::array<DeviceTensorND, arity_in>& inp_val, | |||
| std::array<megdnn::TensorND, arity_in>& inp_val, | |||
| PreprocessFilter<Opr>& prep_flt); | |||
| static TResult prof_impl(const TParam& raw_param); | |||
| static void prof_init_device(const TParam& raw_param); | |||