C++注册op-创新互联

文章目录
      • paddle如何注册op
      • 注册op
      • 使用op
      • 说明
      • 写一个简单demo
        • run.cc
        • single.h single.cc
        • use_op.h use_op.cc
      • pool.cc

创新互联公司是一家专业从事成都网站制作、成都网站设计、网页设计的品牌网络公司。如今是成都地区具影响力的网站设计公司,作为专业的成都网站建设公司,创新互联公司依托强大的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、营销型网站建设及网站设计开发服务!paddle如何注册op
//a.h
#define UNUSED __attribute__((unused))

class Factory {public:
  // 静态成员函数
  static Factory& Instance() {static Factory g_meta_fn_map; //单例模式
    return g_meta_fn_map;
  }

  void Insert(string op_name, Fn fn) {fn_map_.insert({std::move(op_name), std::move(fn)});
  }

  const Fn& Get(const string& op_name) const {auto it = fn_map_.find(op_name);
    return it->second;
  }
 private:
  Factory() = default;
  mapfn_map_;
  DISABLE_COPY_AND_ASSIGN(Factory);
};

struct OpRegistrar 
{OpRegistrar(const char* op_name, Fn function) 
  {Factory::Instance().Insert(op_name, std::move(function));
  }
  void Touch() {}
};

#define REGISTER_KERNEL(op_type, function)                                 \
  static OpRegistrar registrar_kernel_##op_type(#op_type, function);       \
  int TouchOpRegistrar_##op_type()                                         \
  {                                \
    registrar_kernel_##op_type.Touch();                                    \
    return 0;                                                              \
  }

#define USE_OP(op_type)                              \
  extern int TouchOpRegistrar_##op_type();            \
  static int use_op_##op_type  UNUSED = TouchOpRegistrar_##op_type();
注册op
//test_op.cc
#include "a.h"
REGISTER_KERNEL(test_op, func);
使用op
//use_op.h
#include "a.h"
USE_OP(test_op);
说明

我们知道test_op.cc和use_op.h是不同的编译单元,静态变量的初始化顺序不能保证,所以为了能够在use_op的时候已经注册好了,
所以必须用函数调用来保证初始化顺序。

写一个简单demo

在这里插入图片描述

run.cc
#include#include#include#include "use_op.h"

using namespace std;

int main()
{vectormodel;
        model.push_back("conv");
        model.push_back("pool");
        model.push_back("add");
		run(model);
		return 0;
}
single.h single.cc
//single.h
#ifndef __SINGLE_H_
#define __SINGLE_H_

#include#includeusing Fn = void (*) ();
std::map& single_instance();

#endif

//single.cc
#include "single.h"
std::map& single_instance()
{static std::mapmap;
        return map;
}
use_op.h use_op.cc
//use_op.h
#ifndef __USE_OP_H_
#define __USE_OP_H_
#include#includevoid run(std::vectormodel);
#endif

//use_op.cc
#include "single.h"
#include "use_op.h"

extern int reg_conv();
static int conv = reg_conv(); //之所以这样写是因为静态全局变量会在程序开始前初始化,保证了个这个函数一定会被调用,也就保证了kernel被注册
extern int reg_pool();
static int pool = reg_pool();
extern int reg_add();
static int add  = reg_add();

void run(std::vectormodel)
{for(auto x:model)
	{auto fn = single_instance()[x];
        fn();
	}
}
pool.cc
#include#include "single.h"

void show_pool()
{std::cout<<"pool_run"< std::cout<<"reg_pool"<

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:C++注册op-创新互联
文章地址:http://ybzwz.com/article/dghgog.html