From 0d10c60e68b9268faae73930c96a49173f24c915 Mon Sep 17 00:00:00 2001 From: haozech Date: Wed, 27 May 2020 17:26:48 +0800 Subject: [PATCH] [Framework][Op_regitry]reconstruct op_registry (#3699) * reconstruct op_registry. test=develop * remove function GetKernelOffset. test=develop --- docs/develop_guides/add_layout.md | 4 +--- lite/core/op_registry.cc | 23 ++++++++++------------- lite/core/op_registry.h | 28 ++++++++++------------------ 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/docs/develop_guides/add_layout.md b/docs/develop_guides/add_layout.md index 26b7a07cc5..ef998f0e07 100644 --- a/docs/develop_guides/add_layout.md +++ b/docs/develop_guides/add_layout.md @@ -165,9 +165,7 @@ std::set ExpandValidLayouts(DataLayoutType layout) { // 该文件第2处 // 找到文件中的下面的函数 KernelRegistry::KernelRegistry() - : registries_(static_cast(TARGET(NUM)) * - static_cast(PRECISION(NUM)) * - static_cast(DATALAYOUT(NUM))) + : registries_() { // 在该函数中加入新增Layout的下面内容 INIT_FOR(kOpenCL, kFP16, kNCHW); diff --git a/lite/core/op_registry.cc b/lite/core/op_registry.cc index 29c853c70c..7904636a24 100644 --- a/lite/core/op_registry.cc +++ b/lite/core/op_registry.cc @@ -124,19 +124,16 @@ std::list> KernelRegistry::Create( return std::list>(); } -KernelRegistry::KernelRegistry() - : registries_(static_cast(TARGET(NUM)) * - static_cast(PRECISION(NUM)) * - static_cast(DATALAYOUT(NUM))) { -#define INIT_FOR(target__, precision__, layout__) \ - registries_[KernelRegistry::GetKernelOffset()] \ - .set *>( \ - &KernelRegistryForTarget *>( \ + &KernelRegistryForTarget::Global()); // Currently, just register 2 kernel targets. INIT_FOR(kCUDA, kFloat, kNCHW); diff --git a/lite/core/op_registry.h b/lite/core/op_registry.h index 5b58fd2bb9..9872e38e7e 100644 --- a/lite/core/op_registry.h +++ b/lite/core/op_registry.h @@ -332,7 +332,7 @@ class KernelRegistry final { &&creator) { using kernel_registor_t = KernelRegistryForTarget; - auto &varient = registries_[GetKernelOffset()]; + auto &varient = registries_[std::make_tuple(Target, Precision, Layout)]; auto *reg = varient.template get(); CHECK(reg) << "Can not be empty of " << name; reg->Register(name, std::move(creator)); @@ -349,10 +349,12 @@ class KernelRegistry final { using kernel_registor_t = KernelRegistryForTarget; std::list> kernel_list; - if (registries_[GetKernelOffset()].valid()) { - kernel_list = registries_[GetKernelOffset()] - .template get() - ->Creates(op_type); + std::tuple temp_tuple( + Target, Precision, Layout); + if (registries_[temp_tuple].valid()) { + kernel_list = + registries_[temp_tuple].template get()->Creates( + op_type); } return kernel_list; } @@ -362,18 +364,6 @@ class KernelRegistry final { PrecisionType precision, DataLayoutType layout); - // Get a kernel registry offset in all the registries. - template - static int GetKernelOffset() { - CHECK_LT(static_cast(Target), static_cast(TARGET(NUM))); - CHECK_LT(static_cast(Precision), static_cast(PRECISION(NUM))); - CHECK_LT(static_cast(Layout), static_cast(DATALAYOUT(NUM))); - return static_cast(Target) * static_cast(PRECISION(NUM)) * - static_cast(DATALAYOUT(NUM)) + // - static_cast(Precision) * static_cast(DATALAYOUT(NUM)) + // - static_cast(Layout); - } - std::string DebugString() const { #ifndef LITE_ON_MODEL_OPTIMIZE_TOOL return "No more debug info"; @@ -404,7 +394,9 @@ class KernelRegistry final { } private: - mutable std::vector registries_; + mutable std::map, + any_kernel_registor_t> + registries_; #ifndef LITE_ON_TINY_PUBLISH mutable std::map< std::string, -- GitLab