| 123 | } |
| 124 | |
| 125 | SeqModifierForSublinearMemory::SplitPointSet SeqModifierForSublinearMemory:: |
| 126 | ModifyActionPlanner::get_split_point_set(size_t block_size_thresh) { |
| 127 | auto split_point_set = make_split_point_set(); |
| 128 | size_t cur_block_usage = 0; |
| 129 | |
| 130 | ThinHashSet<Var*> cur_block_alive_vars; |
| 131 | |
| 132 | auto add_alive = [&](Var* var) { |
| 133 | auto&& ins = cur_block_alive_vars.insert(var); |
| 134 | mgb_assert(ins.second); |
| 135 | cur_block_usage += var->size; |
| 136 | }; |
| 137 | |
| 138 | auto remove_alive = [&](Var* var) { |
| 139 | if (cur_block_alive_vars.erase(var)) { |
| 140 | auto size = var->size; |
| 141 | mgb_assert(size <= cur_block_usage); |
| 142 | cur_block_usage -= size; |
| 143 | } |
| 144 | }; |
| 145 | |
| 146 | auto flush_block_member = [&](size_t p) { |
| 147 | split_point_set->push_back(p); |
| 148 | cur_block_usage = 0; |
| 149 | cur_block_alive_vars.clear(); |
| 150 | }; |
| 151 | |
| 152 | for (size_t i = 0; i < seq().size(); ++i) { |
| 153 | auto opr = seq()[i].get(); |
| 154 | |
| 155 | for (auto i : opr->output) |
| 156 | add_alive(i); |
| 157 | |
| 158 | for (auto i : opr->input) { |
| 159 | if (opr == i->last_access_opr()) |
| 160 | remove_alive(i); |
| 161 | } |
| 162 | |
| 163 | if (i + 1 < seq().size() && (cur_block_usage < block_size_thresh || |
| 164 | (nr_endpoint_oprs() && !opr->is_endpoint))) |
| 165 | continue; |
| 166 | |
| 167 | flush_block_member(i); |
| 168 | } |
| 169 | return split_point_set; |
| 170 | } |
| 171 | |
| 172 | size_t SeqModifierForSublinearMemory::ModifyActionPlanner:: |
| 173 | calc_bottleneck_from_discard_plan() { |
no test coverage detected