【caffe源代码的梳理之四】common文件

1、common文件介绍

caffe中一些重要的头文件如blob.cpp、caffe.hpp等或者外部调用Caffe库的时候,一般都会包含common.hpp文件。

2、common文件分析

位置:

include/caffe/common.hpp
src/caffe/common.cpp

2.1、主要依赖的文件

boost/shared_ptr.hpp                //作用类似于C++11中的模板类shared_ptr,通过引用计数方式自动释放所指的对象,不用显示执行delete。在Caffe中,封装boost的智能指针using boost::shared_ptr,不使用C++11中的shared_ptr。
gflags/gflags.h                     //google的一个开源的处理命令行参数的库
glog/logging.h                      //google的一个开源的日志库   
caffe/util/device_alternate.hpp     //定义了一些在CPU或GPU+CPU模式下使用的宏和函数

2.2、宏定义

2.2.1、device_alternate.hpp文件中的宏定义

只有CPU的模式下:

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

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

//宏定义:
#define CUDA_CHECK(condition)
#define CUBLAS_CHECK(condition)
#define CURAND_CHECK(condition)
#define CUDA_KERNEL_LOOP(i, n)
#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError())

//函数定义:
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; 

2.2.2、common.hpp中的宏定义

#define DISABLE_COPY_AND_ASSIGN(classname)  //禁用指定类的拷贝和赋值操作
#define INSTANTIATE_CLASS(classname)        //实例化指定的模板类(类模板显式实例化)
#define INSTANTIATE_LAYER_GPU_FORWARD       //GPU模式下实例化前向的类
#define INSTANTIATE_LAYER_GPU_BACKWARD      //GPU模式下实例化反向的类
#define INSTANTIATE_LAYER_GPU_FUNCS         //GPU模式下实例化特定的函数
#define NOT_IMPLEMENTED                     //标记没有实现的代码,并给出fatal log

2.2.3、全局函数

//全局初始化函数,用于初始化google开源库gflags(gflags::ParseCommandLineFlags)和glog(google::InitGoogleLogging)。
void GlobalInit(int* pargc, char*** pargv);

2.2.4、类的内部定义

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

class RNG {     //内部嵌套类,隐藏boost和CUDA的rng实现
    public:
        RNG();
        explicit RNG(unsigned int seed);
        explicit RNG(const RNG&);
        RNG& operator=(const RNG&);
        void* generator();
    private:
        class Generator;                    //RNG的私有嵌套类,用于生成随机数
        shared_ptr<Generator> generator_;
};

Caffe的构造函数私有化,防止直接通过构造函数创建对象,可以防止重复的实例化。

private:

    Caffe();                         //防止直接通过构造函数创建对象,可以防止重复的实例化。
    DISABLE_COPY_AND_ASSIGN(Caffe);  //禁止执行拷贝和赋值操作

猜你喜欢

转载自blog.csdn.net/u013108511/article/details/79490845