from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html

转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang loves baiyan/

看到SyncedMem就知道,这是在做内存同步的操作。这类个类的代码比较少,但是作用是非常明显的。文件对应着syncedmem.hpp,着syncedmem.cpp

首先是两个全局的内联函数。如果机器是支持GPU的并且安装了cuda,通过cudaMallocHost分配的host memory将会被pinned,这里我谷歌了一下,pinned的意思就是内存不会被paged out,我们知道内存里面是由页作为基本的管理单元。分配的内存可以常驻在内存空间中对效率是有帮助的,空间不会被别的进程所抢占。同样如果内存越大,能被分配的Pinned内存自然也越大。还有一点是,对于单一的GPU而言提升并不会太显著,但是对于多个GPU的并行而言可以显著提高稳定性。

这里是两个封装过的函数,内部通过cuda来分配主机和释放内存的接口

inline void CaffeMallocHost(void** ptr, size_t size, bool* use_cuda) {
#ifndef CPU_ONLYif (Caffe::mode() == Caffe::GPU) {CUDA_CHECK(cudaMallocHost(ptr, size));// GPU模式下cuda分配内存*use_cuda = true;return;}
#endif*ptr = malloc(size);//如果没有cuda则通过c的malloc函数分配*use_cuda = false;CHECK(*ptr) << "host allocation of size " << size << " failed";
}inline void CaffeFreeHost(void* ptr, bool use_cuda) {
#ifndef CPU_ONLYif (use_cuda) {CUDA_CHECK(cudaFreeHost(ptr));//cuda的主机内存释放操作return;}
#endiffree(ptr);//c的释放操作
}

SyncedMemory类,首先是构造函数和析构函数

class SyncedMemory {public:SyncedMemory() //参数构造函数,负责初始化: cpu_ptr_(NULL), gpu_ptr_(NULL), size_(0), head_(UNINITIALIZED),own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false),gpu_device_(-1) {}explicit SyncedMemory(size_t size)//带explicit关键字的,单个参数构造函数,explicit禁止单参数构造函数的隐式转换: cpu_ptr_(NULL), gpu_ptr_(NULL), size_(size), head_(UNINITIALIZED),own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false),gpu_device_(-1) {}~SyncedMemory();//其在析构时调用的也是CaffeFreeHost

这几个函数分别是

  const void* cpu_data();void set_cpu_data(void* data);const void* gpu_data();void set_gpu_data(void* data);

cpu_data()主要是获得cpu上data的地址,set_cpu_data是将cpu的data指针指向一个新的区域由data指针传入,并且将原来申请的内存释放。下面两个同理,分别是获得gpu数据地址和set gpu数据地址。

  void* mutable_cpu_data();void* mutable_gpu_data();enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };SyncedHead head() { return head_; }size_t size() { return size_; }

前两个分别是返回cpu和gpu上的data指针,并且置状态为head_ = HEAD_AT_CPU和响应的gpu版本。SyncedHead主要是个枚举类型,用来设定head_的状态,head()函数即返回相应的数据状态,而size()函数返回数据大小

#ifndef CPU_ONLYvoid async_gpu_push(const cudaStream_t& stream);
#endif

这是一个cuda拷贝的异步传输,从数据从cpu拷贝到gpu,异步传输是已经假定caller会在使用之前做同步操作。

 private:void to_cpu();void to_gpu();void* cpu_ptr_;void* gpu_ptr_;size_t size_;SyncedHead head_;bool own_cpu_data_;bool cpu_malloc_use_cuda_;bool own_gpu_data_;int gpu_device_;DISABLE_COPY_AND_ASSIGN(SyncedMemory);//禁止该类的拷贝与赋值
};  // class SyncedMemory

其实这里的东西也不多了,to_cpu(),to_gpu()这个看名字就知道了,需要注意的是,如果head 是未被初始化的状态,那么首先需要先分配内存,这个根据cpu和gpu视情况而定,之后再将数据从cpu或者gpu拷贝到另一处。之后函数会重新标记Head的状态,数据是否在cpu或者在gpu中,cpu这里是简称,其实是主机。
cpu_ptr和gpu_ptr分别是在cpu和gpu中的数据指针,size_这就不再说了,head_之前也液晶提到过了,后面都是几个相应的标记为,以及gpu的ID号

Caffe源码解析2:SycedMem相关推荐

  1. 深度学习框架Caffe源码解析

    作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂.  原文:深度学习框架Caffe源码解析  欢迎技术投稿. ...

  2. Caffe源码解析5:Conv_Layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ Vision_layer里面主要是包括了一些关于一些视觉上的操 ...

  3. caffe源码解析—image_data_layer层

    caffe data layer相关层的继承结构 image-data-layer层关键代码注释 DataLayerSetUp函数 //将imagelist中的图片以 image+label格式 读入 ...

  4. Caffe源码解析4: Data_layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ data_layer应该是网络的最底层,主要是将数据送给blo ...

  5. Caffe源码解析1:Blob

    from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 转载请注明出处,楼燚(yì)航的blog,http://www.c ...

  6. Caffe源码解析(一) —— caffe.proto

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 caffe.proto是caffe数据结构定义的主要文件,本文主要是在caffe.proto代码的基础上加上了部分 ...

  7. Caffe源码解析—核函数

    目录 forward_cpu_gemm forward_cpu_bias backward_cpu_bias weight_cpu_gemm backward_cpu_gemm 其余函数参考链接 fo ...

  8. 零基础学caffe源码 ReLU激活函数

    零基础学caffe源码 ReLU激活函数 原创 2016年08月03日 17:30:19 1.如何有效阅读caffe源码 1.caffe源码阅读路线最好是从src/cafffe/proto/caffe ...

  9. win版本caffe源码libcaffe研究

    版权声明:本文为博主在研究工作中经验分享,包括研究成果,欢迎交流和批评:其中参考资料的标注难免会有疏漏之处,如有请告知,立马更正,谢谢:未经博主允许不得转载. [cpp]  view plain co ...

最新文章

  1. L1-027 出租 (C++暴力解法)
  2. php读取mysql分页查询
  3. TensorFlow高层次机器学习API (tf.contrib.learn)
  4. Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)
  5. Redis 数据持久化之 RDB
  6. javaScript中私有属性和方法
  7. 15个问题告诉你如何使用Java泛型
  8. java程序的开发工具是jdk,分享面经
  9. HDU - 1520 Anniversary party (有向入门树形DP)
  10. CSS颜色代码(转载)
  11. 基于python/opencv/tesseract使用传统方法的,表格图片版面分析以及印刷体汉字识别(持续更新,学习备份用)
  12. 一步一步超级详细的zabbix安装教程
  13. php计算macd,macd计算公式?MACD指标的原理是什么
  14. 魅族mx6 原生android,手机 篇一:魅族16s真实使用感受漫谈
  15. 另类数据的崛起——CnOpenData在行动(上)
  16. 多级延迟效果器:D16 Group Tekturon for Mac()
  17. 《莎士比亚》文本生成
  18. 小程序怎么实现授权登录,如何保存头像和上传头像?
  19. IDEA 数据库驱动下载失败解决方法
  20. DB、DBS和DBMS关系

热门文章

  1. linux中项目部署和日志查看
  2. JS-for的衍生对象
  3. 华为机试题【10】-求数字基root
  4. IOS-UITextField类
  5. MOSS服务器场迁移1-有关切换登录用户时需要刷新一次才能成功的问题
  6. [转贴]使用jQuery自动缩图片 - [jQuery]
  7. sql2000-2 4/19
  8. elasticsearch全局analyzer声明
  9. 最长非下降子序列(O(nlogn))(offer收割)
  10. 创建型模式二:工厂方法模式