ecsimsw

TF_source ) OpKernelRegistrar 본문

TF_source ) OpKernelRegistrar

JinHwan Kim 2019. 4. 7. 07:03

"CODE"

 

///op_kernel.cc :: Kernel registration

struct KernelRegistration {
  KernelRegistration(const KernelDef& d, StringPiece c,
                     kernel_factory::OpKernelRegistrar::Factory f)
      : def(d), kernel_class_name(std::string(c)), factory(f) {}
  const KernelDef def;
  const string kernel_class_name;
  const kernel_factory::OpKernelRegistrar::Factory factory;
};

// This maps from 'op_type' + DeviceType to the set of KernelDefs and
// factory functions for instantiating the OpKernel that matches the
// KernelDef.
typedef std::unordered_multimap<string, KernelRegistration> KernelRegistry;

void* GlobalKernelRegistry() {
  static KernelRegistry* global_kernel_registry = new KernelRegistry;
  return global_kernel_registry;
}

static KernelRegistry* GlobalKernelRegistryTyped() {
  return reinterpret_cast<KernelRegistry*>(GlobalKernelRegistry());
}

static string Key(StringPiece op_type, const DeviceType& device_type,
                  StringPiece label) {
  return strings::StrCat(op_type, ":", DeviceTypeString(device_type), ":",
                         label);
}

 

 

/// op_kernel.h :: class OpKernelRegistrar 

namespace kernel_factory {

class OpKernelRegistrar {
 public:
  typedef OpKernel* (*Factory)(OpKernelConstruction*);
                      
  OpKernelRegistrar(const KernelDef* kernel_def, StringPiece kernel_class_name,
                    Factory factory) {
    // Perform the check in the header to allow compile-time optimization
    // to a no-op, allowing the linker to remove the kernel symbols.
    if (kernel_def != nullptr) {
      InitInternal(kernel_def, kernel_class_name, factory);
    }
  } 
 private:
  void InitInternal(const KernelDef* kernel_def, StringPiece kernel_class_name,
                    Factory factory);
};} 

 

 

/// op_kernel.cc :: class OpKernelRegistrar 

namespace kernel_factory {

void OpKernelRegistrar::InitInternal(const KernelDef* kernel_def,
                                     StringPiece kernel_class_name,
                                     Factory factory) {
  // See comments in register_kernel::Name in header for info on _no_register.
  if (kernel_def->op() != "_no_register") {
    const string key =
        Key(kernel_def->op(), DeviceType(kernel_def->device_type()),
            kernel_def->label());
    GlobalKernelRegistryTyped()->insert(std::make_pair(
        key, KernelRegistration(*kernel_def, kernel_class_name, factory))); 
  }
  delete kernel_def; 
}}

 

 

"CONCLUSION"

 

Class OpKernelRegister

         Constructor ( KernelDef* , StringPiece, Factory)             

                         if KernelDef* argument isn't null 

                              -> call InitInternal function

 

void InitInternal(KernelDef*, StringPiece, Factory) 

    if kernel_def->op() != "_no_register"

      -> make string key, that denote "Op_type , device type, label "

      -> make pair with key & kernelRegistration. And insert into KernelRegistry,

        which is type defined unordered_multimap < string : key , type : KernelRegistration > 

                                

struct  KernelRegistration

  const KernelDef def

  const string kernel_class_name

  const kernel_factory::OpKernelRegistrar::Factory factory

 

 

"REF"

microsoft Docs :: unordered_multimap

https://docs.microsoft.com/ko-kr/cpp/standard-library/unordered-multimap-class?view=vs-2019

 

cppreference :: make_pair

https://en.cppreference.com/w/cpp/utility/pair/make_pair

 

 

"NEXT"

-Factory

-KernelDef

'Machine Learning > tf_source' 카테고리의 다른 글

TF_source ) KernelRegistry  (0) 2019.04.20
TF_source) Opkernel  (0) 2019.04.12
TF_source) OpkernelConstruction  (0) 2019.04.12
TF_source ) Factory  (0) 2019.04.08
TF_source ) REGISTER_KERNELS  (0) 2019.04.07
Comments