From 29c525a390b4c59f76a8bad783379e212115cdfa Mon Sep 17 00:00:00 2001 From: gukecai Date: Wed, 27 May 2020 14:53:24 +0800 Subject: [PATCH] reorder independent nodes --- .../device/ascend/ascend_stream_assign.cc | 62 +++++++++++++++++++ .../device/ascend/ascend_stream_assign.h | 1 + 2 files changed, 63 insertions(+) diff --git a/mindspore/ccsrc/device/ascend/ascend_stream_assign.cc b/mindspore/ccsrc/device/ascend/ascend_stream_assign.cc index e2cf469cd8..5e15055a08 100644 --- a/mindspore/ccsrc/device/ascend/ascend_stream_assign.cc +++ b/mindspore/ccsrc/device/ascend/ascend_stream_assign.cc @@ -531,6 +531,7 @@ void AscendStreamAssign::GetNeedActiveStreams(const shared_ptr &graph_ptr) { if (IsTaskSink()) { ResetNew(); + ReorderIndependentOrders(graph_ptr); AssignAllNodesStream(graph_ptr); FindAllReduceParallel(graph_ptr); InsertActiveNew(graph_ptr); @@ -748,6 +749,67 @@ void AscendStreamAssign::GetWaitStreams(vector *wait_active_stream_lis } uint32_t AscendStreamAssign::GetTotalStreamNum() const { return total_common_stream_num_ + total_independ_stream_num_; } +void AscendStreamAssign::ReorderIndependentOrders(const shared_ptr &graph_ptr) { + MS_EXCEPTION_IF_NULL(graph_ptr); + CNodePtr cur_cnode_ptr = nullptr; + std::vector exe_orders; + std::vector independents; + std::vector others; + + auto cnode_ptr_list = graph_ptr->execution_order(); + MS_LOG(INFO) << "before reorder, graph orders size:" << cnode_ptr_list.size(); + for (size_t i = 0; i < cnode_ptr_list.size(); ++i) { + cur_cnode_ptr = cnode_ptr_list[i]; + MS_EXCEPTION_IF_NULL(cur_cnode_ptr); + if (IsIndependentNode(cur_cnode_ptr)) { + independents.emplace_back(cur_cnode_ptr); + } else { + others.emplace_back(cur_cnode_ptr); + } + } + + if (others.empty()) { + std::copy(independents.begin(), independents.end(), std::back_inserter(exe_orders)); + graph_ptr->set_execution_order(exe_orders); + return; + } + + if (independents.empty()) { + std::copy(others.begin(), others.end(), std::back_inserter(exe_orders)); + graph_ptr->set_execution_order(exe_orders); + return; + } + + std::vector processed; + for (size_t i = 0; i < others.size(); i++) { + auto begin = others.begin() + i; + auto end = begin + 1; + bool flag = false; + for (size_t j = 0; j < independents.size(); j++) { + auto cur_independent = independents[j]; + auto it = std::find(processed.begin(), processed.end(), cur_independent); + if (it != processed.end()) { + continue; + } + + auto res = FindTargetOp(begin, end, cur_independent); + if (res != end) { + flag = true; + exe_orders.emplace_back(cur_independent); + exe_orders.emplace_back(*begin); + processed.emplace_back(cur_independent); + break; + } + } + + if (!flag) { + exe_orders.emplace_back(*begin); + } + } + + MS_LOG(INFO) << "after reorder, graph orders size:" << exe_orders.size(); + graph_ptr->set_execution_order(exe_orders); +} void AscendStreamAssign::PrintGraphExeOrders(const shared_ptr &graph_ptr) { MS_EXCEPTION_IF_NULL(graph_ptr); diff --git a/mindspore/ccsrc/device/ascend/ascend_stream_assign.h b/mindspore/ccsrc/device/ascend/ascend_stream_assign.h index 9f4ea4d667..b6f6bfd479 100755 --- a/mindspore/ccsrc/device/ascend/ascend_stream_assign.h +++ b/mindspore/ccsrc/device/ascend/ascend_stream_assign.h @@ -97,6 +97,7 @@ class AscendStreamAssign { void InsertSendRecvForIndependent(const std::shared_ptr &graph_ptr); void InsertSendRecvForHcomParallel(const std::shared_ptr &graph_ptr); void GetNeedActiveStreams(const std::shared_ptr &graph_ptr); + void ReorderIndependentOrders(const std::shared_ptr &graph_ptr); uint32_t total_common_stream_num_{0}; uint32_t total_independ_stream_num_{0};