当前位置: 首页 > 编程日记 > 正文

Caffe源码中common文件分析

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

相关文章:

编程乐趣:C#彻底删除文件

经常用360的文件粉碎&#xff0c;删除隐私文件貌似还不错的。不过C#也可以实现彻底删除文件。试了下用360文件恢复恢复不了源文件了。代码如下&#xff1a;public class AbsoluteFile{public event EventHandler FinishDeleteFileEvent null;public event EventHandler Finish…

大数据工程师手册:全面系统的掌握必备知识与工具

作者 | Phoebe Wong译者 | 陆离编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;前言如何才能成为一名真正的“全栈&#xff08;full-stack&#xff09;”数据科学家&#xff1f;需要了解哪些知识&#xff1f;掌握哪些技能&#xff1f;概括来讲…

JSON.stringify()

写在前边 不言而喻&#xff0c;JSON.stringify() 是用来将合法的JSON数据字符串化的&#xff01;然而在正常的工作中我们用到的只是最基础的功能&#xff1b;今天我们就探索不一样的JSON.stringify()。 基础用法 基本数据类型 JSON.stringify(2) // "2" JSON.stringi…

C++中前置声明介绍

前置声明是指对类、函数、模板或者结构体进行声明&#xff0c;仅仅是声明&#xff0c;不包含相关具体的定义。在很多场合我们可以用前置声明来代替#include语句。类的前置声明只是告诉编译器这是一个类型&#xff0c;但无法告知类型的大小&#xff0c;成员等具体内容。在未提供…

在Java SE中使用Hibernate处理数据

如今&#xff0c;Hibernate正在迅速成为非常流行的&#xff08;如果不是最流行的&#xff09;J2EE O/R映射程序/数据集成框架。它为开发人员提供了处理企业中的关系数据库的整洁、简明且强大的工具。但如果外部需要访问这些已被包装在J2EE Web应用程序中的实体又该怎么办&#…

利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

作者 | Jose Garcia译者 | 吴振东校对 | 张一豪、林亦霖&#xff0c;编辑 | 于腾凯来源 | 数据派&#xff08;ID&#xff1a;datapi&#xff09;导读&#xff1a;本文将利用OpenCV&#xff0c;Python和Ubidots来编写一个行人计数器程序&#xff0c;并对代码进行了较为详细的讲解…

开源软件License汇总

开源软件英文为Open Source Software&#xff0c;简称OSS&#xff0c;又称开放源代码软件&#xff0c;是一种源代码可以任意获取的计算机软件&#xff0c;这种软件的著作权持有人在软件协议的规定之下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。 某…

前深度学习时代CTR预估模型的演化之路:从LR到FFM\n

本文是王喆在 AI 前线 开设的原创技术专栏“深度学习 CTR 预估模型实践”的第二篇文章&#xff08;以下“深度学习 CTR 预估模型实践”简称“深度 CTR 模型”&#xff09;。专栏第一篇文章回顾&#xff1a;《深度学习CTR预估模型凭什么成为互联网增长的关键&#xff1f;》。重看…

神器与经典--sp_helpIndex

每每和那些NB的人学习技术的时候&#xff0c;往往都佩服他们对各个知识点都熟捻于心,更佩服的是可以在很短时间找出很多业界大师写的文章和开发的工具,就像机器猫的口袋&#xff0c;让人羡慕嫉妒恨啊&#xff01;宋沄剑宋桑就是其中之一,打劫其硬盘的念头已计划很久,只待时机成…

评分9.7!这本Python书彻底玩大了?程序员:真香!

「超级星推官/每周分享」是一个围绕程序员生活、学习相关的推荐栏目。CSDN出品&#xff0c;每周发布&#xff0c;暂定5期。关键词&#xff1a;靠谱&#xff01;优质&#xff01;本期内容&#xff0c;我们将抽1人送出由我司程序员奉为“超级神作”的《疯狂Python讲义》1本&#…

Caffe源码中caffe.proto文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下caffe.proto文件。在src/caffe/proto目录下有一个caffe.proto文件。proto目录下除了caffe.proto文件外&#xff0c;还有caffe.pb.h和caffe.pb.cc两个文件&#xff0c;此两个文件是根…

这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙...

JDK下载与安装教程 2017年06月18日 22:53:16 Danishlyy1995 阅读数&#xff1a;349980版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u012934325/article/details/73441617学习JAVA&#xff0c;必须得安装一下JDK(java dev…

【畅谈百度轻应用】云时代·轻应用·大舞台

云时代轻应用大舞台刘志勇君不见&#xff0c;上下班的地铁上&#xff0c;低头看手机&#xff1b;同事吃饭聊天&#xff0c;低头看手机&#xff1b;甚至朋友聚会&#xff0c;忙里偷闲打个招呼&#xff0c;然后继续低头看手机。正如微博上一个流传甚广的段子&#xff1a;“世界上…

如何画出高级酷炫的神经网络图?优秀程序员都用了这几个工具

&#xff08;图片付费下载于视觉中国&#xff09;作者 | 言有三 来源 | 有三AI&#xff08;ID&#xff1a;yanyousan_ai&#xff09;【导读】本文我们聊聊如何才能画出炫酷高大上的神经网络图&#xff0c;下面是常用的几种工具。1、NN-SVGNN-SVG 可以非常方便的画出各种类型的…

OpenBLAS简介及在Windows7 VS2013上源码的编译过程

OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库&#xff0c;是一个优化的高性能多核BLAS库&#xff0c;主要包括矩阵与矩阵、矩阵与向量、向量与向量等操作。它的License是BSD-3-Clause&#xff0c;可以商用&#xff0c;目前最新的发布版本是0.…

技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

本萌最近被一则新闻深受鼓舞&#xff0c;西工大硬核“女学神”白雨桐&#xff0c;获6所世界顶级大学博士录取通知书。货真价值的才貌双全&#xff0c;别人家的孩子高考失利与心仪的专业失之交臂&#xff0c;选择了软件工程这门自己完全不懂的专业.即便全部归零&#xff0c;也要…

精美素材分享:16套免费的扁平化图标下载

在这篇文章中你可以看到16套华丽的扁平化图标素材&#xff0c;对于设计师来说非常有价值&#xff0c;能够帮助他们节省大量的时间。这些精美的扁平化图标可用于多种用途&#xff0c;如&#xff1a;GUI 设计&#xff0c;印刷材料&#xff0c;WordPress 主题&#xff0c;演示&…

Caffe源码中math_functions文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下math_functions文件。1. include文件&#xff1a;(1)、<glog/logging.h>&#xff1a;GLog库&#xff0c;它是google的一个开源的日志库&#xff0c;其使用可以参考&…

论文推荐 | 目标检测中不平衡问题算法综述

&#xff08;图片付费下载于视觉中国&#xff09;作者 | CV君来源 | 我爱计算机视觉&#xff08;ID&#xff1a;aicvml&#xff09;今天跟大家推荐一篇前几天新出的投向TPAMI的论文&#xff1a;Imbalance Problems in Object Detection: A Review&#xff0c;作者详细考察了目标…

php使用redis的GEO地理信息类型

redis3.2中增中了对GEO类型的支持&#xff0c;该类型存储经纬度&#xff0c;提供了经纬设置&#xff0c;查询&#xff0c;范围查询&#xff0c;距离查询&#xff0c;经纬度hash等操作。 <?php$redis new Redis(); $redis->connect(127.0.0.1, 6379, 60); $redis->au…

Caffe源码中syncedmem文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下syncedmem文件。1. include文件&#xff1a;(1)、<caffe/common.hpp>&#xff1a;此文件的介绍可以参考&#xff1a;http://blog.csdn.net/fengbingchun/article/detail…

免费开源!新学期必收藏的AI学习资源,从课件、工具到源码都齐了

&#xff08;图片付费下载于视觉中国&#xff09;整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;2019 年 3 月 28 日&#xff0c;教育部公布了 2018 年度普通高等学校本科专业备案和审批结果&#xff0c;共有 35 所大学新增了独立的人工智能专…

win7利用remote连接服务器,显示发生身份验证错误 要求的函数不受支持

先参考1&#xff1a; https://blog.csdn.net/qq_35880699/article/details/81240010 发现我根本没找到oracle修正的那个文件&#xff01; 然后我搜索&#xff1a;win7没有oracle修正文件&#xff0c;-------按照参考2中的链接操作&#xff0c;我发现我根本没有CredSSP文件&…

java参数传递:值传递还是引用传递

2019独角兽企业重金招聘Python工程师标准>>> 基本类型作为参数传递时&#xff0c;是传递值的拷贝&#xff0c;无论你怎么改变这个拷贝&#xff0c;原值是不会改变的&#xff1b; 在Java中对象作为参数传递时&#xff0c;是把对象在内存中的地址拷贝了一份传给了参数…

干货 | 收藏!16段代码入门Python循环语句

&#xff08;图片付费下载于视觉中国&#xff09;作者 | 李明江 张良均 周东平 张尚佳&#xff0c;本文摘编自《Python3智能数据分析快速入门》来源 | 大数据&#xff08;ID&#xff1a;hzdashuju&#xff09;【导读】本文将重点讲述for语句和while语句。for语句属于遍历循环&a…

Intel TBB简介及在Windows7 VS2013上源码的编译过程

Intel TBB(Intel Threading Building Blocks)是Intel线程构建块开源库&#xff0c;它的License是Apache 2.0.Intel TBB是一种用于并行编程的基于C语言的框架&#xff0c;它是一套C模板库。它提供了大量特性&#xff0c;具有比线程更高程度的抽象。Intel TBB可以在Windows、Linu…

react中ref的使用

在react中获取真实dom的时候就需要用到ref属性&#xff0c;具体使用如下 var MyComponent React.createClass({handleClick: function() {console.log(this.input)},render: function() {return (<div><input type"text" ref{(input) > {this.input in…

Caffe源码中blob文件分析

Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件&#xff0c;这里介绍下include/caffe/blob.hpp文件的内容&#xff1a;1. Include文件&#xff1a;(1)、<caffe/common.hpp>&#xff1a;此文件的介绍可以参考&#xff1a;http://…

jQuery之替换节点

如果要替换节点&#xff0c;jQuery提供了两个方法&#xff1a;replaceWith()和replaceAll()。 两个方法的作用相同&#xff0c;只是操作颠倒了。 作用&#xff1a;将所有匹配的元素都替换成指定的HTML或者DOM元素。&#xff08;摘自《锋利的jQuery(第二版)》P72&#xff09; 基…

比特大陆发布第三代AI芯片,INT8算力达17.6Tops

9月17日&#xff0c;福州城市大脑暨闽东北信息化战略合作发布会在数字中国会展中心隆重召开。本次发布会上&#xff0c;比特大陆正式推出了第三代AI芯片BM1684&#xff0c;同时也宣布BM1684将作为底层算力&#xff0c;赋能福州城市大脑&#xff0c;助力数字福州、数字中国的建设…