caffe.cpp程序入口分析

(1)main()函数中,输入的train,test,device_query,time。 通过下面两行进入程序。

if (argc == 2) {

return GetBrewFunction(caffe::string(argv[1]))();}

(2)GetBrewFunction()函数定义如下,其返回BrewFunction函数指针。

 static BrewFunction GetBrewFunction(const caffe::string& name) 
   {
      // use map type to check name appears frequency 
      if (g_brew_map.count(name)) {     //  判断输入的是不是g_brew_map中train,
    test,device_query,time中一个,
        return g_brew_map[name];   // 如果是的话,就调用相应的train(),test(),
    device_query(),time()...
    }

(3)g_brew_map实现过程,首先通过 typedef定义函数指针

typedef int (*BrewFunction)();

这个是用typedef定义函数指针方法。这个程序定义一个BrewFunction函数指针类型,
在caffe.cpp 中 BrewFunction 作为GetBrewFunction()函数的返回类型,可以是 train(),test(),device_query(),time() 这四个函数指针的其中一个。在train(),test(),中可以调用solver类的函数,从而进入到net,进入到每一层,运行整个caffe程序。

(4)g_brew_map定义

typedef std::map<caffe::string, BrewFunction> BrewMap;// 因为输入参数可能为train,test,device_query,time,

所以定义一个容器类型:

BrewMap g_brew_map;

(5) g_brew_map 初始化

#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
 public: /* NOLINT */ \
  __Registerer_##func() { \
    g_brew_map[#func] = &func; \
  } \
}; \
__Registerer_##func g_registerer_##func; \
}

这个作用和#define RegisterBrewFunction(func) g_brew_map[#func]=&func; 这个宏定义功能类似,其中,func可以为:train,test,device_query,time。

综上, caffe中定义了train(),test(),device_query(),time()四种方式。 如果需要,咱们可以增加其他的方式,然后通过RegisterBrewFunction() 函数注册一下即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值