// Copyright (c) 2021 CINN Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // 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. #pragma once #include #include #include #include #include #include #include "paddle/cinn/common/debug_manager.h" #include "paddle/cinn/common/info_registry.h" #include "paddle/cinn/common/target.h" #include "paddle/common/flags.h" namespace cinn { namespace ir { class Expr; } // namespace ir namespace common { extern const char* kRuntimeIncludeDirEnvironKey; struct NameGenerator { std::string New(const std::string& name_hint); // Reset id to initial. void ResetID() { std::lock_guard lock(mutex_); name_hint_idx_.clear(); } private: paddle::flat_hash_map name_hint_idx_; mutable std::mutex mutex_; }; struct PrettyNamer { const std::string& GetOrNew(const size_t hash_key, const std::string& name_hint) { if (pretty_names_.find(hash_key) == pretty_names_.end()) { pretty_names_[hash_key] = name_generator_.New(name_hint); } return pretty_names_.at(hash_key); } NameGenerator& GetNameGenerator() { return name_generator_; } private: paddle::flat_hash_map pretty_names_; NameGenerator name_generator_; }; class Context { public: static Context& Global(); /** * Generate a new unique name. * @param name_hint The prefix. */ std::string NewName(const std::string& name_hint) { return pretty_namer_.GetNameGenerator().New(name_hint); } std::string PrettyUniqName(const size_t hash_key, const std::string& name_hint) { return pretty_namer_.GetOrNew(hash_key, name_hint); } void ResetNameId() { pretty_namer_.GetNameGenerator().ResetID(); } const std::vector& runtime_include_dir(); void AddRuntimeIncludeDir(std::string dir); /** * The global isl ctx. */ static isl::ctx& isl_ctx() { return ctx_; } static InfoRegistry& info_rgt() { return info_rgt_; } static DebugManager& debug_mgr() { return debug_mgr_; } private: Context() = default; PrettyNamer pretty_namer_; std::vector runtime_include_dir_; mutable std::mutex mutex_; static thread_local isl::ctx ctx_; static thread_local InfoRegistry info_rgt_; static thread_local DebugManager debug_mgr_; }; static std::string UniqName(const std::string& prefix) { return Context::Global().NewName(prefix); } } // namespace common } // namespace cinn