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); //禁止执行拷贝和赋值操作