It was used mainly for easier quantized operator migration. It became unused now.
GitOrigin-RevId: c4a306d0a4
tags/v0.5.0
@@ -65,8 +65,6 @@ size_t MatrixMul::get_workspace_size_bytes( | |||||
TensorLayout i0(input_shapes[0], input(0)->dtype()), | TensorLayout i0(input_shapes[0], input(0)->dtype()), | ||||
i1(input_shapes[1], input(1)->dtype()), | i1(input_shapes[1], input(1)->dtype()), | ||||
out(output_shapes[0], output(0)->dtype()); | out(output_shapes[0], output(0)->dtype()); | ||||
intl::MegDNNOprInputsLayoutModifier<megdnn::MatrixMul>::apply( | |||||
tparam, {&i0, &i1, &out}); | |||||
auto transpose = [](TensorLayout& dst, bool& param) { | auto transpose = [](TensorLayout& dst, bool& param) { | ||||
std::swap(dst.shape[0], dst.shape[1]); | std::swap(dst.shape[0], dst.shape[1]); | ||||
@@ -102,8 +100,6 @@ void MatrixMul::scn_do_execute() { | |||||
MGB_TRY { | MGB_TRY { | ||||
transpose(inp0.layout, tparam.transposeA); | transpose(inp0.layout, tparam.transposeA); | ||||
transpose(inp1.layout, tparam.transposeB); | transpose(inp1.layout, tparam.transposeB); | ||||
intl::MegDNNOprInputsLayoutModifier<megdnn::MatrixMul>::apply( | |||||
tparam, {&inp0.layout, &inp1.layout, &out.layout}); | |||||
megdnn_opr()->exec(inp0, inp1, out, | megdnn_opr()->exec(inp0, inp1, out, | ||||
intl::get_megdnn_workspace_from_var(output(1))); | intl::get_megdnn_workspace_from_var(output(1))); | ||||
} | } | ||||
@@ -186,8 +182,6 @@ size_t BatchedMatrixMul::get_workspace_size_bytes( | |||||
TensorLayout i0(input_shapes[0], input(0)->dtype()), | TensorLayout i0(input_shapes[0], input(0)->dtype()), | ||||
i1(input_shapes[1], input(1)->dtype()), | i1(input_shapes[1], input(1)->dtype()), | ||||
out(output_shapes[0], output(0)->dtype()); | out(output_shapes[0], output(0)->dtype()); | ||||
intl::MegDNNOprInputsLayoutModifier<megdnn::BatchedMatrixMul>::apply( | |||||
tparam, {&i0, &i1, &out}); | |||||
auto transpose = [](TensorLayout& dst, bool& param) { | auto transpose = [](TensorLayout& dst, bool& param) { | ||||
std::swap(dst.shape[1], dst.shape[2]); | std::swap(dst.shape[1], dst.shape[2]); | ||||
@@ -224,8 +218,6 @@ void BatchedMatrixMul::scn_do_execute() { | |||||
MGB_TRY { | MGB_TRY { | ||||
transpose(inp0.layout, tparam.transposeA); | transpose(inp0.layout, tparam.transposeA); | ||||
transpose(inp1.layout, tparam.transposeB); | transpose(inp1.layout, tparam.transposeB); | ||||
intl::MegDNNOprInputsLayoutModifier<megdnn::BatchedMatrixMul>::apply( | |||||
tparam, {&inp0.layout, &inp1.layout, &out.layout}); | |||||
megdnn_opr()->exec(inp0, inp1, out, | megdnn_opr()->exec(inp0, inp1, out, | ||||
intl::get_megdnn_workspace_from_var(output(1))); | intl::get_megdnn_workspace_from_var(output(1))); | ||||
} | } | ||||
@@ -134,12 +134,6 @@ struct OprArityTrait; | |||||
megdnn::Workspace& workspace) { \ | megdnn::Workspace& workspace) { \ | ||||
opr->exec(TENSORS(cb_dnn), workspace); \ | opr->exec(TENSORS(cb_dnn), workspace); \ | ||||
} \ | } \ | ||||
\ | |||||
static void modify_input_layouts(_Opr* opr, \ | |||||
const TensorLayoutArray& layouts) { \ | |||||
intl::MegDNNOprInputsLayoutModifier<_Opr>::apply( \ | |||||
opr->param(), {LAYOUTS(cb_ref)}); \ | |||||
} \ | |||||
} | } | ||||
#define TENSORS(cb) cb(inp_val[0]), cb(inp_val[1]), cb(out_val[0]) | #define TENSORS(cb) cb(inp_val[0]), cb(inp_val[1]), cb(out_val[0]) | ||||
@@ -443,7 +437,6 @@ class AlgoChooser { | |||||
std::tuple_size<ConvTensorLayouts>::value == 8, | std::tuple_size<ConvTensorLayouts>::value == 8, | ||||
"Convolution AlgoChooser assumes arity = 3 , 5 or 8 (for " | "Convolution AlgoChooser assumes arity = 3 , 5 or 8 (for " | ||||
"deformable conv)"); | "deformable conv)"); | ||||
OprArityTrait<Opr>::modify_input_layouts(megdnn_opr, m_layouts); | |||||
} | } | ||||
Opr* megdnn_opr() const { return m_megdnn_opr; } | Opr* megdnn_opr() const { return m_megdnn_opr; } | ||||
@@ -46,21 +46,6 @@ namespace intl { | |||||
} | } | ||||
}; | }; | ||||
/*! | |||||
* \brief Template that can be specialized and modify input tensors' layout | |||||
* before passing to MegDNN. The implementation has to ensure that | |||||
* modified layout is compatible with the original one. | |||||
* Will be invoked in get_workspace_in_bytes, deduce_layout and exec. | |||||
* Note that the output layout maybe invalid during deduce_layout. | |||||
* | |||||
* \tparam Opr An MegDNN opr class | |||||
*/ | |||||
template <class MegDNNOpr> | |||||
struct MegDNNOprInputsLayoutModifier { | |||||
static inline void apply(const typename MegDNNOpr::Param&, | |||||
std::initializer_list<const TensorLayout*>) {} | |||||
}; | |||||
//! get megdnn Workspace object from a workspace var | //! get megdnn Workspace object from a workspace var | ||||
megdnn::Workspace get_megdnn_workspace_from_var(VarNode *var); | megdnn::Workspace get_megdnn_workspace_from_var(VarNode *var); | ||||
@@ -15,13 +15,8 @@ | |||||
template<> | template<> | ||||
struct _MegDNNOprMethInvoker<_NR_INPUTS, _NR_OUTPUTS> { | struct _MegDNNOprMethInvoker<_NR_INPUTS, _NR_OUTPUTS> { | ||||
#define _cb_ref_in(_x) inout[_x] | |||||
#define _cb_ref_out(_x) inout[_NR_INPUTS + _x] | |||||
#define _cb_in(_x) \ | #define _cb_in(_x) \ | ||||
{ ishp[_x], mgb_opr->input(_x)->dtype(), mgb_opr->input(_x)->format() } | { ishp[_x], mgb_opr->input(_x)->dtype(), mgb_opr->input(_x)->format() } | ||||
#define _cb_unused(_x) {} | |||||
#define _cb_ptr_in(_x) &(_cb_ref_in(_x)) | |||||
#define _cb_ptr_out(_x) &(_cb_ref_out(_x)) | |||||
template<class Opr> | template<class Opr> | ||||
static inline size_t get_workspace_in_bytes( | static inline size_t get_workspace_in_bytes( | ||||
Opr *opr, const cg::OperatorNodeBase *mgb_opr, | Opr *opr, const cg::OperatorNodeBase *mgb_opr, | ||||
@@ -29,15 +24,7 @@ struct _MegDNNOprMethInvoker<_NR_INPUTS, _NR_OUTPUTS> { | |||||
const TensorShapeArray &oshp) { | const TensorShapeArray &oshp) { | ||||
#define _cb_out(_x) \ | #define _cb_out(_x) \ | ||||
{ oshp[_x], mgb_opr->output(_x)->dtype(), mgb_opr->output(_x)->format() } | { oshp[_x], mgb_opr->output(_x)->dtype(), mgb_opr->output(_x)->format() } | ||||
TensorLayout inout[_NR_INPUTS + _NR_OUTPUTS] = { | |||||
_FOREACH_IO(_cb_in, _cb_out) | |||||
}; | |||||
MegDNNOprInputsLayoutModifier<Opr>::apply(opr->param(), { | |||||
_FOREACH_IO(_cb_ptr_in, _cb_ptr_out) | |||||
}); | |||||
return opr->get_workspace_in_bytes( | |||||
_FOREACH_IO(_cb_ref_in, _cb_ref_out) | |||||
); | |||||
return opr->get_workspace_in_bytes(_FOREACH_IO(_cb_in, _cb_out)); | |||||
#undef _cb_out | #undef _cb_out | ||||
} | } | ||||
@@ -46,51 +33,26 @@ struct _MegDNNOprMethInvoker<_NR_INPUTS, _NR_OUTPUTS> { | |||||
Opr *opr, const cg::OperatorNodeBase *mgb_opr, | Opr *opr, const cg::OperatorNodeBase *mgb_opr, | ||||
const TensorShapeArray &ishp, | const TensorShapeArray &ishp, | ||||
TensorShapeArray &oshp) { | TensorShapeArray &oshp) { | ||||
#define _cb_out(_x) \ | |||||
{ mgb_opr->output(_x)->dtype(), mgb_opr->output(_x)->format() } | |||||
TensorLayout inout[_NR_INPUTS + _NR_OUTPUTS] = { | |||||
_FOREACH_IO(_cb_in, _cb_out) | |||||
}; | |||||
MegDNNOprInputsLayoutModifier<Opr>::apply(opr->param(), { | |||||
_FOREACH_IO(_cb_ptr_in, _cb_ptr_out) | |||||
}); | |||||
opr->deduce_layout( | |||||
_FOREACH_IO(_cb_ref_in, _cb_ref_out) | |||||
); | |||||
#define _cb_out(_x) ov[_x] | |||||
TensorLayout ov[_NR_OUTPUTS]; | |||||
for (int i = 0; i < _NR_OUTPUTS; ++ i) | |||||
ov[i] = {mgb_opr->output(i)->dtype(), mgb_opr->output(i)->format()}; | |||||
opr->deduce_layout(_FOREACH_IO(_cb_in, _cb_out)); | |||||
for (int i = 0; i < _NR_OUTPUTS; ++ i) | for (int i = 0; i < _NR_OUTPUTS; ++ i) | ||||
oshp[i] = _cb_ref_out(i); | |||||
oshp[i] = ov[i]; | |||||
} | } | ||||
#undef _cb_out | #undef _cb_out | ||||
#undef _cb_ptr_out | |||||
#undef _cb_ptr_in | |||||
#undef _cb_unused | |||||
#undef _cb_in | #undef _cb_in | ||||
#undef _cb_ref_out | |||||
#undef _cb_ref_in | |||||
template<class Opr> | template<class Opr> | ||||
static inline void exec(Opr *opr, const cg::OperatorNodeBase *mgb_opr) { | static inline void exec(Opr *opr, const cg::OperatorNodeBase *mgb_opr) { | ||||
#define _cb_ref_in(_x) inout[_x] | |||||
#define _cb_ref_out(_x) inout[_NR_INPUTS + _x] | |||||
#define _cb_in(_x) mgb_opr->input(_x)->dev_tensor().as_megdnn() | #define _cb_in(_x) mgb_opr->input(_x)->dev_tensor().as_megdnn() | ||||
#define _cb_out(_x) mgb_opr->output(_x)->dev_tensor().as_megdnn() | #define _cb_out(_x) mgb_opr->output(_x)->dev_tensor().as_megdnn() | ||||
#define _cb_ptr_in(_x) &(_cb_ref_in(_x).layout) | |||||
#define _cb_ptr_out(_x) &(_cb_ref_out(_x).layout) | |||||
megdnn::TensorND inout[_NR_INPUTS + _NR_OUTPUTS] = { | |||||
_FOREACH_IO(_cb_in, _cb_out) | |||||
}; | |||||
MegDNNOprInputsLayoutModifier<Opr>::apply(opr->param(), { | |||||
_FOREACH_IO(_cb_ptr_in, _cb_ptr_out) | |||||
}); | |||||
opr->exec( | opr->exec( | ||||
_FOREACH_IO(_cb_ref_in, _cb_ref_out), | |||||
_FOREACH_IO(_cb_in, _cb_out), | |||||
get_megdnn_workspace_from_var(mgb_opr->output().back())); | get_megdnn_workspace_from_var(mgb_opr->output().back())); | ||||
#undef _cb_ptr_out | |||||
#undef _cb_ptr_in | |||||
#undef _cb_out | #undef _cb_out | ||||
#undef _cb_in | #undef _cb_in | ||||
#undef _cb_ref_out | |||||
#undef _cb_ref_in | |||||
} | } | ||||
}; | }; | ||||