From 4ba1eb6d2fc0fa5aeb5f17aecc434795a4c500ab Mon Sep 17 00:00:00 2001 From: nihuini Date: Tue, 18 Jan 2022 14:54:44 +0800 Subject: [PATCH] assign unique names for all pnnx operator and operand names. fix #3493 --- tools/pnnx/src/CMakeLists.txt | 1 + tools/pnnx/src/pass_level3.cpp | 3 + .../src/pass_level3/assign_unique_name.cpp | 77 +++++++++++++++++++ .../pnnx/src/pass_level3/assign_unique_name.h | 21 +++++ 4 files changed, 102 insertions(+) create mode 100644 tools/pnnx/src/pass_level3/assign_unique_name.cpp create mode 100644 tools/pnnx/src/pass_level3/assign_unique_name.h diff --git a/tools/pnnx/src/CMakeLists.txt b/tools/pnnx/src/CMakeLists.txt index e41d8d048..29e09016c 100644 --- a/tools/pnnx/src/CMakeLists.txt +++ b/tools/pnnx/src/CMakeLists.txt @@ -207,6 +207,7 @@ set(pnnx_pass_level2_SRCS ) set(pnnx_pass_level3_SRCS + pass_level3/assign_unique_name.cpp pass_level3/eliminate_tuple_pair.cpp pass_level3/expand_quantization_modules.cpp pass_level3/fuse_attribute_expression.cpp diff --git a/tools/pnnx/src/pass_level3.cpp b/tools/pnnx/src/pass_level3.cpp index 5cd4718ad..959dcc253 100644 --- a/tools/pnnx/src/pass_level3.cpp +++ b/tools/pnnx/src/pass_level3.cpp @@ -14,6 +14,7 @@ #include "pass_level3.h" +#include "pass_level3/assign_unique_name.h" #include "pass_level3/eliminate_tuple_pair.h" #include "pass_level3/expand_quantization_modules.h" #include "pass_level3/fuse_attribute_expression.h" @@ -34,6 +35,8 @@ namespace pnnx { void pass_level3(Graph& g) { + assign_unique_name(g); + fuse_cat_stack_tensors(g); fuse_chunk_split_unpack(g); diff --git a/tools/pnnx/src/pass_level3/assign_unique_name.cpp b/tools/pnnx/src/pass_level3/assign_unique_name.cpp new file mode 100644 index 000000000..7a789e00c --- /dev/null +++ b/tools/pnnx/src/pass_level3/assign_unique_name.cpp @@ -0,0 +1,77 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "assign_unique_name.h" +#include + +namespace pnnx { + +void assign_unique_name(Graph& graph) +{ + // assign unique name for all operators + { + std::unordered_set names; + int make_unique_index = 0; + + for (size_t i = 0; i < graph.ops.size(); i++) + { + Operator* op = graph.ops[i]; + const std::string& name = op->name; + + if (names.find(name) == names.end()) + { + names.insert(name); + } + else + { + // duplicated found + std::string new_name = std::string("pnnx_unique_") + std::to_string(make_unique_index); + fprintf(stderr, "assign unique operator name %s to %s\n", new_name.c_str(), name.c_str()); + op->name = new_name; + names.insert(new_name); + + make_unique_index++; + } + } + } + + // assign unique name for all operands + { + std::unordered_set names; + int make_unique_index = 0; + + for (size_t i = 0; i < graph.operands.size(); i++) + { + Operand* operand = graph.operands[i]; + const std::string& name = operand->name; + + if (names.find(name) == names.end()) + { + names.insert(name); + } + else + { + // duplicated found + std::string new_name = std::string("pnnx_unique_") + std::to_string(make_unique_index); + fprintf(stderr, "assign unique operand name %s to %s\n", new_name.c_str(), name.c_str()); + operand->name = new_name; + names.insert(new_name); + + make_unique_index++; + } + } + } +} + +} // namespace pnnx diff --git a/tools/pnnx/src/pass_level3/assign_unique_name.h b/tools/pnnx/src/pass_level3/assign_unique_name.h new file mode 100644 index 000000000..afdd5b73c --- /dev/null +++ b/tools/pnnx/src/pass_level3/assign_unique_name.h @@ -0,0 +1,21 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "ir.h" + +namespace pnnx { + +void assign_unique_name(Graph& graph); + +} // namespace pnnx