| 885 | } |
| 886 | |
| 887 | void SeqModifierForSublinearMemory::reset_opr_seq(const OprNodeArray& oprseq) { |
| 888 | var_map().clear(); |
| 889 | m_opr2replace_info.clear(); |
| 890 | auto config = |
| 891 | MemoryOptimizerHelper::SubGraphConfig() |
| 892 | /*.add_bad_opr_flag( |
| 893 | OperatorNodeBase::NodeProp::Flag::IMPURE_FUNC) |
| 894 | .add_bad_opr_flag( |
| 895 | OperatorNodeBase::NodeProp::Flag::NO_AUTOMATIC_DUP) |
| 896 | .add_bad_opr_flag(OperatorNodeBase::NodeProp::Flag:: |
| 897 | FORCE_UPDATE_INPUT_VAR)*/ |
| 898 | // NOTE: it should not actually involve any opr with the above |
| 899 | // flags, but for better results, some ops(e.g. CudnnBatchNorm) |
| 900 | // should be involved and they are guaranteed to NEVER recompute. |
| 901 | .add_bad_var_flag(VarNode::Flag::VOLATILE_CONTENT) |
| 902 | .add_bad_var_flag(VarNode::Flag::NO_SYS_STATIC_MEM_ALLOC) |
| 903 | .add_bad_var_flag(VarNode::Flag::NO_SYS_MEM_ALLOC) |
| 904 | .add_bad_var_flag(VarNode::Flag::PERSISTENT_DEVICE_VALUE); |
| 905 | |
| 906 | auto cn2oprseq = mem_opt().split_into_cn2oprseq(oprseq, config); |
| 907 | |
| 908 | if (cn2oprseq->empty()) { |
| 909 | // empty graph |
| 910 | return; |
| 911 | } |
| 912 | |
| 913 | SeqModifyAction action; |
| 914 | |
| 915 | MGB_TRY { action = search_action(cn2oprseq); } |
| 916 | MGB_FINALLY(m_planner_thread_pool.stop();); |
| 917 | mgb_log_debug( |
| 918 | "apply sublinear memory action: %zu opr groups to be inserted", |
nothing calls this directly
no test coverage detected