| 29 | : SeqModifierBase(owner), m_config(config_g) {} |
| 30 | |
| 31 | void SeqModifierForDTR::modify_endpoint_vars(VarNodeArray& endpoints) { |
| 32 | var_map().clear(); |
| 33 | auto comp_seq = MemoryOptimizerHelper::CompSeq(owner_graph(), endpoints); |
| 34 | auto config = |
| 35 | MemoryOptimizerHelper::SubGraphConfig() |
| 36 | /*.add_bad_opr_flag( |
| 37 | OperatorNodeBase::NodeProp::Flag::IMPURE_FUNC) |
| 38 | .add_bad_opr_flag( |
| 39 | OperatorNodeBase::NodeProp::Flag::NO_AUTOMATIC_DUP) |
| 40 | .add_bad_opr_flag(OperatorNodeBase::NodeProp::Flag:: |
| 41 | FORCE_UPDATE_INPUT_VAR)*/ |
| 42 | // NOTE: it should not actually involve any opr with the above |
| 43 | // flags, but for better results, some ops(e.g. CudnnBatchNorm) |
| 44 | // should be involved and they are guaranteed to NEVER recompute. |
| 45 | .add_bad_var_flag(VarNode::Flag::VOLATILE_CONTENT) |
| 46 | .add_bad_var_flag(VarNode::Flag::NO_SYS_STATIC_MEM_ALLOC) |
| 47 | .add_bad_var_flag(VarNode::Flag::NO_SYS_MEM_ALLOC) |
| 48 | .add_bad_var_flag(VarNode::Flag::PERSISTENT_DEVICE_VALUE); |
| 49 | auto cn2oprseq = mem_opt().split_into_cn2oprseq(*comp_seq.m_seq, config); |
| 50 | |
| 51 | if (cn2oprseq->empty()) { |
| 52 | return; |
| 53 | } |
| 54 | SeqModifyAction action; |
| 55 | ModifyActionPlanner* planner = new ModifyActionPlanner(this); |
| 56 | for (auto&& i : *cn2oprseq) { |
| 57 | auto&& cur = planner->perform_dtr(i.first, i.second, m_config); |
| 58 | action.insert(cur.begin(), cur.end()); |
| 59 | } |
| 60 | apply_action(action, *comp_seq.m_seq); |
| 61 | for (auto&& i : endpoints) { |
| 62 | auto iter = var_map().find(i); |
| 63 | if (iter != var_map().end()) { |
| 64 | i = iter->second; |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | void SeqModifierForDTR::ModifyActionPlanner::prepare(const OprNodeArray& opr_seq) { |
| 70 | init_seq(opr_seq, false); |
no test coverage detected