(self, program: Program)
| 2282 | return pipeline_num |
| 2283 | |
| 2284 | def split_program_by_device(self, program: Program) -> list[int] | None: |
| 2285 | ops_list = [] |
| 2286 | type_list = [] |
| 2287 | pre = None |
| 2288 | type_cpu = "cpu" |
| 2289 | for op in program.global_block().ops: |
| 2290 | if self._is_optimizer_op(op): |
| 2291 | break |
| 2292 | if op.has_attr("op_device"): |
| 2293 | cur_attr = ( |
| 2294 | op.attr("op_device") |
| 2295 | if op.attr("op_device") != "" |
| 2296 | else type_cpu |
| 2297 | ) |
| 2298 | if pre is None or pre != cur_attr: |
| 2299 | ops_list.append([]) |
| 2300 | type_list.append(cur_attr) |
| 2301 | ops_list[-1].append(op) |
| 2302 | pre = cur_attr |
| 2303 | l = len(type_list) |
| 2304 | i = 0 |
| 2305 | type_heter = None |
| 2306 | while i < l: |
| 2307 | while i < l and type_list[i] == type_cpu: |
| 2308 | i += 1 |
| 2309 | if i == l: |
| 2310 | break |
| 2311 | |
| 2312 | type_heter = type_list[i] |
| 2313 | i += 1 |
| 2314 | start = i |
| 2315 | valid = True |
| 2316 | while i < l and type_list[i] != type_heter: |
| 2317 | if type_list[i] != type_cpu: |
| 2318 | valid = False |
| 2319 | break |
| 2320 | i += 1 |
| 2321 | |
| 2322 | if i == l: |
| 2323 | break |
| 2324 | elif not valid: |
| 2325 | continue |
| 2326 | |
| 2327 | for j in range(start, i): |
| 2328 | for op in ops_list[j]: |
| 2329 | op._set_attr("op_device", type_heter) |
| 2330 | type_list[j] = type_heter |
| 2331 | j += 1 |
| 2332 | |
| 2333 | pre = None |
| 2334 | merged_ops_list = [] |
| 2335 | merged_type_list = [] |
| 2336 | for i in range(l): |
| 2337 | if pre is None or pre != type_list[i]: |
| 2338 | merged_ops_list.append([]) |
| 2339 | merged_type_list.append(type_list[i]) |
| 2340 | merged_ops_list[-1].extend(ops_list[i]) |
| 2341 | pre = type_list[i] |
nothing calls this directly
no test coverage detected