| 165 | } |
| 166 | |
| 167 | void ElemwiseMultiType::perform( |
| 168 | Mode mode, DType out_dt, DeviceTensorND& dest, |
| 169 | const SmallVector<DeviceTensorND>& inputs, |
| 170 | intl::UniqPtrWithCN<megdnn::ElemwiseMultiType>& opr) { |
| 171 | megdnn::TensorNDArray dnn_inputs(inputs.size()); |
| 172 | TensorShapeArray inp_shapes(inputs.size()); |
| 173 | CompNode out_cn; |
| 174 | for (size_t i = 0; i < inputs.size(); ++i) { |
| 175 | auto&& t = inputs[i]; |
| 176 | if (!i) { |
| 177 | out_cn = t.comp_node(); |
| 178 | } else { |
| 179 | mgb_assert(t.comp_node() == out_cn); |
| 180 | } |
| 181 | if (t.shape().is_empty()) { |
| 182 | mgb_assert(dest.empty()); |
| 183 | return; |
| 184 | } |
| 185 | inp_shapes[i] = t.shape(); |
| 186 | } |
| 187 | if (!opr) { |
| 188 | opr = intl::create_megdnn_opr<megdnn::ElemwiseMultiType>(out_cn); |
| 189 | } else { |
| 190 | mgb_assert(out_cn == opr.comp_node()); |
| 191 | } |
| 192 | out_cn.activate(); |
| 193 | for (size_t i = 0; i < inputs.size(); ++i) |
| 194 | dnn_inputs[i] = inputs[i].as_megdnn(); |
| 195 | dest.comp_node(out_cn).dtype(out_dt).resize(get_output_var_shape(mode, inp_shapes)); |
| 196 | opr->param() = {mode}; |
| 197 | call_megdnn_opr_exec(out_cn, dnn_inputs, dest.as_megdnn(), opr.get(), nullptr); |
| 198 | } |
| 199 | |
| 200 | // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} |
nothing calls this directly
no test coverage detected