真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++注冊(cè)op-創(chuàng)新互聯(lián)

文章目錄
      • paddle如何注冊(cè)op
      • 注冊(cè)op
      • 使用op
      • 說明
      • 寫一個(gè)簡(jiǎn)單demo
        • run.cc
        • single.h single.cc
        • use_op.h use_op.cc
      • pool.cc

創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!paddle如何注冊(cè)op
//a.h
#define UNUSED __attribute__((unused))

class Factory {public:
  // 靜態(tài)成員函數(shù)
  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();
注冊(cè)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是不同的編譯單元,靜態(tài)變量的初始化順序不能保證,所以為了能夠在use_op的時(shí)候已經(jīng)注冊(cè)好了,
所以必須用函數(shù)調(diào)用來保證初始化順序。

寫一個(gè)簡(jiǎn)單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(); //之所以這樣寫是因?yàn)殪o態(tài)全局變量會(huì)在程序開始前初始化,保證了個(gè)這個(gè)函數(shù)一定會(huì)被調(diào)用,也就保證了kernel被注冊(cè)
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"<

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前名稱:C++注冊(cè)op-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/dghgog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部