| 704 | /* ======================= RecordedComputingSequence ======================= */ |
| 705 | |
| 706 | std::unique_ptr<ComputingGraphImpl::RecordedComputingSequence> ComputingGraphImpl:: |
| 707 | ComputingSequence::as_recorded_seq() { |
| 708 | on_first_exec(); |
| 709 | mgb_assert( |
| 710 | m_enable_comp_node_seq_recorder, |
| 711 | "can not enable comp_node_seq_record_level=2; more details are " |
| 712 | "included in previous log messages"); |
| 713 | |
| 714 | mgb_assert(m_used_comp_node.size() == 1); |
| 715 | auto comp_node = *m_used_comp_node.begin(); |
| 716 | MegDNNDtorCheck megdnn_dtor_check{comp_node}; |
| 717 | |
| 718 | // execute to get recorded comp seq |
| 719 | mgb_assert(!m_owner_graph->options().fake_next_exec); |
| 720 | m_owner_graph->options().fake_next_exec = true; |
| 721 | do_execute(&megdnn_dtor_check); |
| 722 | // to avoid wait at graph dtor which causes segfault because the events |
| 723 | // would have been moved away from this seq |
| 724 | m_wait_finished = true; |
| 725 | |
| 726 | auto ret = std::make_unique<RecordedComputingSequence>(m_owner_graph); |
| 727 | m_owner_graph->m_recorded_seq_level2_dtor_chk.reset( |
| 728 | new MegDNNDtorCheck{comp_node, ret.get()}); |
| 729 | |
| 730 | // record opr dependencies |
| 731 | ThinHashSet<OperatorNodeBase*> used_oprs; |
| 732 | for (auto&& i : *m_opr_seq) { |
| 733 | i->record_execute_deps(ret->m_exec_deps); |
| 734 | used_oprs.insert(i); |
| 735 | } |
| 736 | for (auto&& i : ret->m_exec_deps) { |
| 737 | if (i->has_runtime_check()) { |
| 738 | ret->m_runtime_checks.push_back(i.get()); |
| 739 | } |
| 740 | } |
| 741 | |
| 742 | // also record unused oprs so the MegDNNDtorCheck would not fail |
| 743 | auto&& unused_deps = |
| 744 | m_owner_graph->m_recorded_seq_level2_dtor_chk->safe_dtor_objs(); |
| 745 | for (auto&& i : m_owner_graph->m_opr_refkeeper) { |
| 746 | if (!used_oprs.count(i.get())) { |
| 747 | i->record_execute_deps(unused_deps); |
| 748 | } |
| 749 | } |
| 750 | |
| 751 | // graph user data main contain ref holders for tmp variables |
| 752 | ret->m_graph_user_data.swap(m_owner_graph->options().user_data); |
| 753 | |
| 754 | // move other dependencies |
| 755 | unpack_vector( |
| 756 | m_owner_graph->var_node_mem_manager().static_device_memory_refholder(), |
| 757 | ret->m_static_mem); |
| 758 | mgb_assert(m_event_start.size() == 1 && m_event_end.size() == 1); |
| 759 | ret->m_event_start = std::move(m_event_start.begin()->second); |
| 760 | ret->m_event_end = std::move(m_event_end.begin()->second); |
| 761 | ret->user_data().swap(user_data()); |
| 762 | ret->m_recorder = std::move(m_comp_node_seq_recorder); |
| 763 |
no test coverage detected