! * get all operands of a chain of element-wise oprs of the same mode */
| 26 | * get all operands of a chain of element-wise oprs of the same mode |
| 27 | */ |
| 28 | std::vector<VarNode*> expand_elem_chain(VarNode* var, opr::Elemwise::Mode mode) { |
| 29 | if (var->owner_opr()->same_type<opr::Elemwise>()) { |
| 30 | auto&& op = var->owner_opr()->cast_final<opr::Elemwise>(); |
| 31 | if (op.param().mode == mode) { |
| 32 | auto ret = expand_elem_chain(op.input(0), mode); |
| 33 | for (size_t i = 1; i < op.input().size(); ++i) { |
| 34 | auto cur = expand_elem_chain(op.input()[i], mode); |
| 35 | ret.reserve(ret.size() + cur.size()); |
| 36 | ret.insert(ret.end(), cur.begin(), cur.end()); |
| 37 | } |
| 38 | return ret; |
| 39 | } |
| 40 | } |
| 41 | return {var}; |
| 42 | } |
| 43 | |
| 44 | SymbolVar fma3(SymbolVar a, SymbolVar b, SymbolVar c) { |
| 45 | return Elemwise::make({a, b, c}, Mode::FUSE_MUL_ADD3); |