Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp、blob.hpp等或者外部调用Caffe库使用时,一般都会include<caffe/common.hpp>文件,下面分析此文件的内容:

1.      include的文件:

boost中的智能指针头文件<boost/shared_ptr.hpp>,作用类似于C++11中的模板类shared_ptr,通过引用计数方式自动释放所指的对象,不用显示执行delete,关于C++11中shared_ptr的使用可以参考http://blog.csdn.net/fengbingchun/article/details/52202007 .

在Caffe中,封装boost的智能指针using boost::shared_ptr,不使用C++11中的shared_ptr。

GFlags库的<gflags/gflags.h>,它是google的一个开源的处理命令行参数的库,其使用可以参考 http://blog.csdn.net/fengbingchun/article/details/48768039 。

GLog库的<glog/logging.h>,它是google的一个开源的日志库,其使用可以参考  http://blog.csdn.net/fengbingchun/article/details/48768039 。

一些系统头文件,如<climits>、<cmath>、<utility>等。

< caffe/util/device_alternate.hpp >文件。

2.      caffe/util/device_alternate.hpp文件:

定义了一些在CPU或GPU+CPU模式下使用的宏和函数。

在CPU模式下(通过#ifdef CPU_ONLY)定义了四个宏用于提示在CPU模式下如果调用GPU函数给出error信息:

#define NO_GPU
#define STUB_GPU(classname)
#define STUB_GPU_FORWARD(classname, funcname)
#define STUB_GPU_BACKWARD(classname, funcname)

在GPU+CPU模式下定义了五个cuda宏、三个函数和一个常量:

#define CUDA_CHECK(condition)
#define CUBLAS_CHECK(condition)
#define CURAND_CHECK(condition)
#define CUDA_KERNEL_LOOP
#define CUDA_POST_KERNEL_CHECK
const char* cublasGetErrorString(cublasStatus_t error);
const char* curandGetErrorString(curandStatus_t error);
inline int CAFFE_GET_BLOCKS(const int N);
const int CAFFE_CUDA_NUM_THREADS;

3.      common.hpp文件中定义的宏:

#define DISABLE_COPY_AND_ASSIGN(classname)
#define INSTANTIATE_CLASS(classname)
#define INSTANTIATE_LAYER_GPU_FORWARD
#define INSTANTIATE_LAYER_GPU_BACKWARD
#define INSTANTIATE_LAYER_GPU_FUNCS
#define NOT_IMPLEMENTED

其中宏DISABLE_COPY_AND_ASSIGN的作用是禁用指定类的拷贝和赋值操作;宏NOT_IMPLEMENTED的作用是标记没有实现的代码,并给出fatal log;宏INSTANTIATE_CLASS的作用是用于实例化指定的模板类(类模板显示实例化);剩余的三个宏的作用是用于GPU模式下实例化指定的模板类的函数(GPU forward/backward,类似于函数模板显示实例化)。

关于模板显示实例化的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/51339659

4.      GlobalInit函数:

全局初始化函数,用于初始化google开源库gflags(gflags::ParseCommandLineFlags)和glog(google::InitGoogleLogging)。

5.      Caffe类:

(1)、采用单例模式(singleton)实现,封装了boost和cuda的一些操作,提供了一套统一的接口,关于单例模式的内容可以参考: http://blog.csdn.net/fengbingchun/article/details/22584107 。

(2)、内部定义了嵌套类RNG,RNG类内部又定义了私有嵌套类Generator,Generator类用于产生随机数.RNG类为随机数生成器,隐藏了boost和CUDA的rng实现,对外提供了一套统一的RNG类。

(3)、构造函数为private,防止直接通过构造函数创建对象,也可防止重复实例化。

(4)、禁止执行拷贝和赋值操作。

(5)、通过Get方法来创建或获取实例。

(6)、枚举类型Brew,指定运行模式:CPU、GPU。

以下是common文件的测试代码:

int test_caffe_common()
{// 1. test macro NOT_IMPLEMENTED//NOT_IMPLEMENTED; // error, fatal log// 2. test global initialization function GlobalInitint argc = 2;char** argv = nullptr;argv = new char*[2];
#ifdef _DEBUGargv[0] = "E:/GitCode/Caffe_Test/lib/dbg/x64_vc12/Caffe_Test.exe";
#elseargv[0] = "E:/GitCode/Caffe_Test/lib/rel/x64_vc12/Caffe_Test.exe";
#endifargv[1] = "caffe_test";caffe::GlobalInit(&argc, &argv);delete[] argv;// 3. test caffe class// caffe::Caffe caffe_; // error, can't create Caffe object directly// verify Caffe is a singleton classcaffe::Caffe& caffe1 = caffe::Caffe::Get();caffe::Caffe& caffe2 = caffe::Caffe::Get();fprintf(stderr, "caffe1 addr: %p\n", &caffe1);fprintf(stderr, "caffe2 addr: %p\n", &caffe2);auto addr_caffe1 = std::addressof(caffe1);auto addr_caffe2 = std::addressof(caffe2);if (addr_caffe1 != addr_caffe2) {fprintf(stderr, "caffe1 and caffe2 addr are different: caffe1 addr: %p, caffe2 addr: %p\n", &caffe1, &caffe2);return -1;}// get run mode: CPU or GPUcaffe::Caffe::Brew run_mode = caffe1.mode();fprintf(stderr, "0: CPU, 1: GPU, run_mode: %d\n", run_mode);// set solver_countcaffe::Caffe::set_solver_count(5);// get solver_countint solver_count = caffe::Caffe::solver_count();fprintf(stderr, "solver count: %d\n", solver_count);// set root_solvercaffe::Caffe::set_root_solver(false);// get root_solverbool root_solver = caffe::Caffe::root_solver();fprintf(stderr, "root solver: %d\n", root_solver);// set device// caffe::Caffe::SetDevice(2); // error, fatal log: Cannot use GPU in CPU-only Caffe: check mode.// device query// caffe::Caffe::DeviceQuery(); // error, fatal log: Cannot use GPU in CPU-only Caffe: check mode.// RNG: generate random numbercaffe::SyncedMemory data_a(10 * sizeof(int));caffe::Caffe::set_random_seed(8888);caffe::caffe_rng_bernoulli(10, 0.5, static_cast<int*>(data_a.mutable_cpu_data()));caffe::SyncedMemory data_b(10 * sizeof(int));caffe::Caffe::set_random_seed(8888);caffe::caffe_rng_bernoulli(10, 0.5, static_cast<int*>(data_b.mutable_cpu_data()));for (int i = 0; i < 10; ++i) {fprintf(stderr, "%d, %d\n", static_cast<const int*>(data_a.cpu_data())[i], static_cast<const int*>(data_b.cpu_data())[i]);if (static_cast<const int*>(data_a.cpu_data())[i] != static_cast<const int*>(data_b.cpu_data())[i]) {fprintf(stderr, "same seed should be generate same random number\n");return - 1;}}// set run modecaffe::Caffe::set_mode(caffe::Caffe::GPU);run_mode = caffe1.mode();fprintf(stderr, "0: CPU, 1: GPU, run_mode: %d\n", run_mode);return 0;
}

执行结果如下图:

GitHub:https://github.com/fengbingchun/Caffe_Test

Caffe源码中common文件分析相关推荐

  1. Caffe源码中Solver文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/solver.hpp文件的 ...

  2. Caffe源码中Net文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/net.hpp文件的内容: ...

  3. Caffe源码中layer文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/layer.hpp文件的内 ...

  4. Caffe源码中io文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/util/io.hpp文件 ...

  5. Caffe源码中blob文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/blob.hpp文件的内容 ...

  6. Caffe源码中math_functions文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1.      include文件: ...

  7. Caffe源码中syncedmem文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下syncedmem文件. 1.      include文件: (1).& ...

  8. lodash源码中debounce函数分析

    lodash源码中debounce函数分析 一.使用 在lodash中我们可以使用debounce函数来进行防抖和截流,之前我并未仔细注意过,但是不可思议的是,lodash中的防抖节流函数是一个函数两 ...

  9. Caffe源码中Pooling Layer文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/vision_layers ...

最新文章

  1. 顺序表-删除所有元素值为x结点(另建表存放+复制到原表)
  2. Java多线程- 线程池的基本使用和执行流程分析 - ThreadPoolExecutor
  3. 25元、264KB内存的微处理器,树莓派官方出品,自带快速休眠模式
  4. linux 命令 cd -p,Linux_实例讲解Linux中cd命令切换目录的使用技巧,cd命令大家再熟悉不过了,bash sh - phpStudy...
  5. php 信号量 关闭,php 信号量
  6. java 过滤器 弹出提示_JavaWeb 过滤器——验证登录 防止未登录进入界面
  7. 特征工程系列之降维:用PCA压缩数据
  8. ReactNative调研结果
  9. 【实践】一站式数据开发平台在有赞的最佳实践.pdf(附下载链接)
  10. 慕课网 机器学习任务 笔记
  11. linux mutex使用检测锁,Linux驱动:互斥锁mutex测试
  12. C语言指针详解(经典,非常详细)
  13. Java编写ASCII码转换
  14. html大作业网页代码 web网页设计实例作业 ——二手书店-大学生书店(13页) 学生个人网站作业模板 简单个人网页制作
  15. 深度时空3D卷积神经网络用于交通预测(文末附数据链接)
  16. 延时消息推送的正确姿势你get到了吗?
  17. 恩智浦智能车四轮组-- 1.电磁检测方案、运放选型
  18. 信息技术智库丨月度大考试
  19. Aspose.Words for .NET使用教程:如何使用脚注和尾注并设置每页行字数
  20. 数据结构上机实验6.29

热门文章

  1. 基于pytorch的卷积神经网络量化实现
  2. 树莓派视觉小车 -- 小球追踪(颜色追踪)(OpenCV色彩空间HSV)
  3. c++创建包含opencv的dll供C,C#调用
  4. php 比较字符串差,PHP字符串比较函数strcmp()和strcasecmp()使用总结
  5. 基于python的数据分析方法五种_利用Python进行数据分析 第5章 pandas入门(1)
  6. 修改IDEA运行jsp文件的时候浏览器地址栏的虚拟访问路径网址
  7. 融资关键技巧一5分钟 ,8个部分
  8. 在Ubuntu 14.04 64bit上使用Sphinx转换MonaServer项目文档
  9. 二叉树:路径之和 Path Sum
  10. b-blkid查看磁盘设备文件系统类型