diff --git a/.jenkins/check/config/filter_cpplint.txt b/.jenkins/check/config/filter_cpplint.txt index 152c4aca829..fd9db225916 100644 --- a/.jenkins/check/config/filter_cpplint.txt +++ b/.jenkins/check/config/filter_cpplint.txt @@ -18,6 +18,7 @@ "mindspore/mindspore/ccsrc/utils/convert_utils_py.cc" "whitespace/indent" "mindspore/mindspore/core/utils/log_adapter.cc" "runtime/references" "mindspore/mindspore/ccsrc/runtime/hardware/device_context.h" "readability/braces" +"mindspore/mindspore/ccsrc/transform/graph_ir/convert.h" "runtime/references" # Modelzoo "mindspore/model_zoo/official/cv/yolov4_tiny/infer/mxbase/src/Yolov4TinyDetection.h" "runtime/references" diff --git a/mindspore/ccsrc/transform/graph_ir/convert.cc b/mindspore/ccsrc/transform/graph_ir/convert.cc index abd6b347e18..b2e5545901c 100644 --- a/mindspore/ccsrc/transform/graph_ir/convert.cc +++ b/mindspore/ccsrc/transform/graph_ir/convert.cc @@ -911,8 +911,8 @@ void DfGraphConvertor::BuildWhileSubGraph() { continue; } SetNodeInput(it); - SetSubgraph(it); SetOpControlInput(it); + SetSubgraph(it); UpdateOpDesc(it); } MS_LOG(DEBUG) << "trace output"; @@ -1783,14 +1783,16 @@ void DfGraphConvertor::AddEdgeForLoad(const AnfNodePtr &node) { auto user_node = iter.first; auto name = GetCNodeTargetFuncName(user_node->cast()); if (name == prim::kPrimUpdateState->name()) { - FindDestOps(user_node, dst_node_list, false); + mindspore::HashMap flag_map; + FindDestOps(user_node, dst_node_list, false, &flag_map); continue; } if (IsControlEdgeNode(user_node)) { src_node_list->push_back(user_node); continue; } - FindDestOps(user_node, src_node_list, false); + mindspore::HashMap flag_map; + FindDestOps(user_node, src_node_list, false, &flag_map); } // add to cache @@ -1802,8 +1804,9 @@ void DfGraphConvertor::AddEdgeForLoad(const AnfNodePtr &node) { } void DfGraphConvertor::FindDestOps(const AnfNodePtr &node, const std::shared_ptr> &node_list, - bool top) { + bool top, mindspore::HashMap *flag_map) { MS_EXCEPTION_IF_NULL(node); + MS_EXCEPTION_IF_NULL(flag_map); auto func_graph = node->func_graph(); MS_EXCEPTION_IF_NULL(func_graph); auto mng = func_graph->manager(); @@ -1814,20 +1817,29 @@ void DfGraphConvertor::FindDestOps(const AnfNodePtr &node, const std::shared_ptr auto manager = func_graph->manager(); MS_EXCEPTION_IF_NULL(manager); + (*flag_map)[node] = DfsVisitFlag::kVisiting; auto users = manager->node_users()[node]; for (const auto &iter : users) { auto user_node = iter.first; if (IsSubGraph() && user_node == call_node_in_while_body_) { continue; } - if (IsControlEdgeNode(user_node)) { - if (!top) { - node_list->push_back(user_node); - } + if ((*flag_map)[user_node] == DfsVisitFlag::kVisiting) { + MS_LOG(INFO) << "there exists a loop in graph."; + break; + } else if ((*flag_map)[user_node] == DfsVisitFlag::kVisited) { + continue; } else { - FindDestOps(user_node, node_list, false); + if (IsControlEdgeNode(user_node)) { + if (!top) { + node_list->push_back(user_node); + } + } else { + FindDestOps(user_node, node_list, false, flag_map); + } } } + (*flag_map)[node] = DfsVisitFlag::kVisited; } void DfGraphConvertor::AutoMonadCollectInput(const AnfNodePtr &node) { @@ -1844,7 +1856,8 @@ void DfGraphConvertor::AutoMonadCollectInput(const AnfNodePtr &node) { if (src_ops != nullptr) { // Find dest ops list std::shared_ptr> dst_node_list = std::make_shared>(); - FindDestOps(node, dst_node_list, true); + mindspore::HashMap flag_map; + FindDestOps(node, dst_node_list, true, &flag_map); for (auto &dest : *dst_node_list) { AddEdgeToCache(node, dest); } diff --git a/mindspore/ccsrc/transform/graph_ir/convert.h b/mindspore/ccsrc/transform/graph_ir/convert.h index 3746aaa2278..4aa5809f6b9 100644 --- a/mindspore/ccsrc/transform/graph_ir/convert.h +++ b/mindspore/ccsrc/transform/graph_ir/convert.h @@ -54,6 +54,7 @@ using OpAdapterPtr = std::shared_ptr; using ParamIndexMap = std::map; enum class GraphType { kNormal, kCond, kBody, kAfter, kBranch }; +enum class DfsVisitFlag { kUnVisited, kVisiting, kVisited }; class DfGraphConvertor { public: explicit DfGraphConvertor(const AnfGraphPtr &anf_graph) : anf_graph_(anf_graph) { @@ -199,7 +200,8 @@ class DfGraphConvertor { bool IsControlEdgeNode(const AnfNodePtr &node); void AddEdgeForLoad(const AnfNodePtr &node); void AddEdgeToCache(const AnfNodePtr &src, const AnfNodePtr &dest); - void FindDestOps(const AnfNodePtr &node, const std::shared_ptr> &node_list, bool top); + void FindDestOps(const AnfNodePtr &node, const std::shared_ptr> &node_list, bool top, + mindspore::HashMap *flag_map); AnfNodePtr ParseLoadInput(const CNodePtr &cnode); void AutoMonadSetControlInput(const AnfNodePtr &node); void AutoMonadCollectInput(const AnfNodePtr &node);