@@ -56,10 +56,12 @@ Graph::Graph(const ProgramDesc &program, const int64_t start_op_index,
5656 // sub_graph.
5757 std::unique_ptr<Graph> first_sub_graph = std::make_unique<Graph>(
5858 program_.Block (0 ), this , start_op_index, end_op_index);
59+ first_sub_graph->block_id_ = 0 ;
5960 sub_graphs_.push_back (std::move (first_sub_graph));
6061 for (size_t idx = 1 ; idx < program_.Size (); ++idx) {
6162 std::unique_ptr<Graph> sub_graph =
6263 std::make_unique<Graph>(program_.Block (idx), this );
64+ sub_graph->block_id_ = idx;
6365 sub_graphs_.push_back (std::move (sub_graph));
6466 }
6567 } else {
@@ -90,14 +92,32 @@ std::map<std::string, std::vector<ir::Node *>> Graph::InitFromProgram(
9092std::map<std::string, std::vector<ir::Node *>> Graph::InitFromBlock (
9193 const BlockDesc &block, const int64_t start_op_index,
9294 const int64_t end_op_index) {
93- std::unordered_map<std::string, VarDesc *> all_vars;
95+ std::unordered_map<std::string, std::pair<VarDesc *, int >>
96+ name_to_desc_block_id;
97+
98+ const BlockDesc *block_var_visible = █
99+ while (block_var_visible != nullptr ) {
100+ for (auto *var : block_var_visible->AllVars ()) {
101+ name_to_desc_block_id.emplace (
102+ var->Name (), std::make_pair (var, block_var_visible->ID ()));
103+ }
104+ const BlockDesc *forward_block = block_var_visible->ForwardBlock ();
105+ if (forward_block != nullptr ) {
106+ for (auto *var : forward_block->AllVars ()) {
107+ name_to_desc_block_id.emplace (var->Name (),
108+ std::make_pair (var, forward_block->ID ()));
109+ }
110+ }
111+ block_var_visible = block_var_visible->ParentBlock ();
112+ }
94113 // var nodes for each var name, will have multiple versions in SSA
95114 std::map<std::string, std::vector<ir::Node *>> var_nodes;
115+ std::unordered_map<std::string, VarDesc *> not_visited_vars;
96116 for (auto *var : block.AllVars ()) {
97- all_vars .emplace (var->Name (), var);
117+ not_visited_vars .emplace (var->Name (), var);
98118 }
99119
100- auto not_visited_vars = all_vars ;
120+ int desc_order = 0 ;
101121 auto all_ops = block.AllOps ();
102122 PADDLE_ENFORCE_LE (
103123 end_op_index, all_ops.size (),
@@ -109,15 +129,18 @@ std::map<std::string, std::vector<ir::Node *>> Graph::InitFromBlock(
109129 auto *op = all_ops[i];
110130 VLOG (3 ) << " create OpNode by " << op->Type ();
111131 ir::Node *node = CreateOpNode (op);
132+ node->SetDescOrder (desc_order);
133+ ++desc_order;
112134 // For input args, reuse the same var name if it was created before.
113135 // Otherwise, create a new one.
114136 for (auto &each_var_name : op->InputArgumentNames ()) {
115137 not_visited_vars.erase (each_var_name);
116138 ir::Node *var = nullptr ;
117139 if (var_nodes.find (each_var_name) != var_nodes.end ()) {
118140 var = var_nodes.at (each_var_name).back ();
119- } else if (all_vars.count (each_var_name) != 0 ) {
120- var = CreateVarNode (all_vars.at (each_var_name));
141+ } else if (name_to_desc_block_id.count (each_var_name) != 0 ) {
142+ auto desc_and_block_id = name_to_desc_block_id.at (each_var_name);
143+ var = CreateVarNode (desc_and_block_id.first , desc_and_block_id.second );
121144 var_nodes[each_var_name].push_back (var);
122145 } else {
123146 // Operation input var can be optional (dispensable). Which means
@@ -143,8 +166,9 @@ std::map<std::string, std::vector<ir::Node *>> Graph::InitFromBlock(
143166 }
144167
145168 ir::Node *var = nullptr ;
146- if (all_vars.count (each_var_name) != 0 ) {
147- var = CreateVarNode (all_vars.at (each_var_name));
169+ if (name_to_desc_block_id.count (each_var_name) != 0 ) {
170+ auto desc_and_block_id = name_to_desc_block_id.at (each_var_name);
171+ var = CreateVarNode (desc_and_block_id.first , desc_and_block_id.second );
148172 } else {
149173 // Operation output vars can be @EMPTY@. For example, while_grad
150174 // can have multi @EMPTY@ outputs with no VarDesc.
@@ -270,6 +294,7 @@ std::shared_ptr<Graph> Graph::Clone() {
270294 auto cloned_graph = std::make_shared<Graph>(this ->program_ );
271295 cloned_graph->ReleaseNodes ();
272296 cloned_graph->num_node_created_ = 0 ;
297+ cloned_graph->block_id_ = this ->block_id_ ;
273298 std::unordered_map<ir::Node *, ir::Node *> origin_to_cloned;
274299 for (auto *n : this ->node_set_ ) {
275300 PADDLE_ENFORCE_NOT_NULL (n, platform::errors::InvalidArgument (
@@ -313,6 +338,7 @@ std::unique_ptr<Graph> Graph::CloneSubGraph(const size_t idx) {
313338 std::make_unique<Graph>(this ->program_ .Block (idx), this );
314339 cloned_sub_graph->ReleaseNodes ();
315340 cloned_sub_graph->num_node_created_ = 0 ;
341+ cloned_sub_graph->block_id_ = idx;
316342 std::unordered_map<ir::Node *, ir::Node *> origin_to_cloned;
317343 for (auto *n : this ->sub_graphs_ .at (idx)->Nodes ()) {
318344 PADDLE_ENFORCE_NOT_NULL (n, platform::errors::InvalidArgument (
0 commit comments