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

Caffe源码中syncedmem文件分析

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

1.      include文件:

(1)、<caffe/common.hpp>:此文件的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/54955236  ;

(2)、<caffe/util/math_functions.hpp>:此文件的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/56280708 ;

2.      内联函数CaffeMallocHost/CaffeFreeHost:

(1)、CaffeMallocHost:CPU模式下,通过调用C语言的malloc函数分配内存;

(2)、CaffeFreeHost:CPU模式下,通过调用C语言的free函数释放内存;

3.        类SyncedMemory:在主机(CPU)和设备(GPU)之间管理内存分配和数据同步,封装CPU和GPU之间数据交互操作。

<caffe/syncedmem.hpp>文件的详细介绍如下:

#ifndef CAFFE_SYNCEDMEM_HPP_
#define CAFFE_SYNCEDMEM_HPP_#include <cstdlib>#include "caffe/common.hpp"
#include "caffe/util/math_functions.hpp"namespace caffe {// If CUDA is available and in GPU mode, host memory will be allocated pinned,
// using cudaMallocHost. It avoids dynamic pinning for transfers (DMA).
// The improvement in performance seems negligible in the single GPU case,
// but might be more significant for parallel training. Most importantly,
// it improved stability for large models on many GPUs.
// CPU模式下,通过调用C语言的malloc函数分配内存
inline void CaffeMallocHost(void** ptr, size_t size) {
#ifndef CPU_ONLYif (Caffe::mode() == Caffe::GPU) {CUDA_CHECK(cudaMallocHost(ptr, size));return;}
#endif*ptr = malloc(size);CHECK(*ptr) << "host allocation of size " << size << " failed";
}// CPU模式下,通过调用C语言的free函数释放内存
inline void CaffeFreeHost(void* ptr) {
#ifndef CPU_ONLYif (Caffe::mode() == Caffe::GPU) {CUDA_CHECK(cudaFreeHost(ptr));return;}
#endiffree(ptr);
}/*** @brief Manages memory allocation and synchronization between the host (CPU)*        and device (GPU).** TODO(dox): more thorough description.*/
// 在主机(Host/CPU)和设备(Device/GPU)之间管理内存分配和数据同步,封装CPU和GPU之间数据交互操作
class SyncedMemory {public:
// 默认构造函数,简单初始化,数据状态置为UNINITIALIZEDSyncedMemory(): cpu_ptr_(NULL), gpu_ptr_(NULL), size_(0), head_(UNINITIALIZED),own_cpu_data_(false), own_gpu_data_(false), gpu_device_(-1) {}
// 带size参数的显示构造函数,并未分配内存,数据状态置为UNINITIALIZEDexplicit SyncedMemory(size_t size): cpu_ptr_(NULL), gpu_ptr_(NULL), size_(size), head_(UNINITIALIZED),own_cpu_data_(false), own_gpu_data_(false), gpu_device_(-1) {}
// 析构函数,CPU模式下,当cpu_ptr_非空并且own_cpu_data_为true时,仅会调用CaffeFreeHost函数释放内存~SyncedMemory();
// 获取CPU数据指针,数据不可更改,内部会调用to_cpu函数,在CPU模式下,数据状态为HEAD_AT_CPU,在GPU模式下,数据状态置为SYNCEDconst void* cpu_data();
// 调用CaffeFreeHost释放内存,如果own_cpu_data_为非空,则调用CaffeFreeHost释放内存,并修改CPU数据指针使其指向data,并置own_cpu_data_为false,数据状态置为HEAD_AT_CPUvoid set_cpu_data(void* data);
// 获取GPU数据指针,数据不可更改,在GPU模式下,数据状态为HEAD_AT_GPU,在CPU模式下,数据状态置为SYNCEDconst void* gpu_data();
// 在GPU模式下,内部会调用to_gpu函数,如果own_gpu_data_为非空,调用cudaFree释放显存,并修改GPU数据指针使其指向data,并置own_gpu_data_为false,在GPU模式下,数据状态置为HEAD_AT_GPUvoid set_gpu_data(void* data);
// 获取CPU数据指针,数据可更改,内部会调用to_cpu函数,数据状态置为HEAD_AT_CPUvoid* mutable_cpu_data();
// 获取GPU数据指针,数据可更改,在GPU模式下,内部会调用to_gpu函数,数据状态置为HEAD_AT_GPUvoid* mutable_gpu_data();
// SyncedHead为枚举类型,数据存放的位置,包括四种数据状态,依次为未初始化、在CPU、在GPU、已同步enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };
// 返回数据状态,即数据存放的位置SyncedHead head() { return head_; }
// 返回数据大小(字节)size_t size() { return size_; }#ifndef CPU_ONLY
// 异步推送数据从CPU到GPU,并置数据状态为SYNCEDvoid async_gpu_push(const cudaStream_t& stream);
#endifprivate:
// 把数据存放到CPU上,
// 如果数据状态为UNINITIALIZED,则调用CaffeMallocHost分配内存,并初始化数据内容为0,置own_cpu_data_为true,置数据状态为HEAD_AT_CPU,
// 如果数据状态为HEAD_AT_GPU,如果在GPU模式下,如果cpu_ptr_为空,则调用CaffeMallocHost分配内存,并置own_cpu_data_为true,然后则将显存数据拷贝到内存(数据同步),并将数据状态置为SYNCED// 其它数据状态不作任何操作void to_cpu();
// 把数据存放到GPU上,仅在GPU模式作操作,在CPU模式下不作任何操作,
// 如果数据状态为UNINITIALIZED,则调用cudaMalloc分配显存,并初始化数据内容为0,置数据状态为HEAD_AT_GPU,并置own_gpu_data_为true
// 如果数据状态为HEAD_AT_CPU,如果gpu_ptr_为空,则调用cudaMalloc分配显存,并置own_gpu_data_为true,然后将内存数据拷贝到显存(数据同步),并将数据状态置为SYNCED
// 其它数据状态不作任何操作void to_gpu();
// 指向CPU的数据指针void* cpu_ptr_;
// 指向GPU的数据指针void* gpu_ptr_;
// 数据大小(字节)size_t size_;
// 数据状态,当前数据存放的位置SyncedHead head_;
// 是否通过SyncedMemory类分配了CPU内存bool own_cpu_data_;
// 是否通过SyncedMemory类分配了GPU显存bool own_gpu_data_;
// 设备编号int gpu_device_;// 禁止使用SyncedMemory类的拷贝和赋值操作DISABLE_COPY_AND_ASSIGN(SyncedMemory);
};  // class SyncedMemory}  // namespace caffe#endif  // CAFFE_SYNCEDMEM_HPP_
测试代码如下:

int test_caffe_syncedmem()
{caffe::SyncedMemory mem(10);caffe::SyncedMemory* p_mem = new caffe::SyncedMemory(10 * sizeof(float));if (mem.head() != caffe::SyncedMemory::UNINITIALIZED ||mem.size() != 10 ||p_mem->size() != 10 * sizeof(float) ||mem.cpu_data() == nullptr ||mem.mutable_cpu_data() == nullptr ||mem.head() != caffe::SyncedMemory::HEAD_AT_CPU) {fprintf(stderr, "Error\n");return -1;}fprintf(stderr, "p_mem size: %d\n", p_mem->size());fprintf(stderr, "mem size: %d\n", mem.size());void* cpu_data = mem.mutable_cpu_data();if (mem.head() != caffe::SyncedMemory::HEAD_AT_CPU) {fprintf(stderr, "Error\n");return -1;}caffe::caffe_memset(mem.size(), 1, cpu_data);for (int i = 0; i < mem.size(); ++i) {if ((static_cast<char*>(cpu_data))[i] != 1) {fprintf(stderr, "Error\n");return -1;}}cpu_data = mem.mutable_cpu_data();if (mem.head() != caffe::SyncedMemory::HEAD_AT_CPU) {fprintf(stderr, "Error\n");return -1;}caffe::caffe_memset(mem.size(), 2, cpu_data);for (int i = 0; i < mem.size(); ++i) {if ((static_cast<char*>(cpu_data))[i] != 2) {fprintf(stderr, "Error\n");return -1;}}delete p_mem;return 0;
}
测试结果如下:


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

相关文章:

免费开源!新学期必收藏的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;助力数字福州、数字中国的建设…

在 Azure 网站上使用 Memcached 改进 WordPress

编辑人员注释&#xff1a;本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写。 您是否希望改善在 Azure 网站服务上运行的 WordPress 网站的性能&#xff1f;如果是&#xff0c;那么您就需要一个可帮助加快您…

Caffe源码中io文件分析

Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件&#xff0c;这里介绍下include/caffe/util/io.hpp文件的内容&#xff1a;1. include文件&#xff1a;(1)、<google/protobuf/message.h>&#xff1a;关于protobuf的介绍可以参考&…

DeepMind悄咪咪开源三大新框架,深度强化学习落地希望再现

作者 | Jesus Rodriguez译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近几年&#xff0c;深度强化学习&#xff08;DRL&#xff09;一直是人工智能取得最大突破的核心。尽管取得了很多进展&#xff0c;但由于缺乏工具和库&#xff0c;DRL 方法仍…

seq2seq

链接&#xff1a; https://blog.csdn.net/wuzqchom/article/details/75792501 转载于:https://www.cnblogs.com/yttas/p/10631442.html

vip能ping通,但80不通的解决方法

最近遇到一个很奇怪的问题&#xff0c;在做两台服务器负载均衡的时候&#xff0c;vip已经添加了&#xff0c;而且能ping通了&#xff0c;但是页面访问不了&#xff0c;也就是说80端口一直不通&#xff0c;ipvsadm -lnc查看链接状态全部是SYN_RECV。网上找了好长时间&#xff0c…

OpenCV中imread/imwrite与imdecode/imencode的异同

OpenCV中的cv::imdecode函数是从指定的内存缓存中读一幅图像&#xff0c;而cv::imencode是将一幅图像写进内存缓存中。cv::imread是从指定文件载入一幅图像&#xff0c;cv::imwrite是保存一幅图像到指定的文件中。cv::imread和cv::imdecode内部都是通过ImageDecoder类来进行图像…

奖金+招聘绿色通道,这一届算法大赛关注下?

大赛背景伴随着5G、物联网与大数据形成的后互联网格局的逐步形成&#xff0c;日益多样化的用户触点、庞杂的行为数据和沉重的业务体量也给我们的数据资产管理带来了不容忽视的挑战。为了建立更加精准的数据挖掘形式和更加智能的机器学习算法&#xff0c;对不断生成的用户行为事…

Linux文件属性

文件属性和权限 [rootdaf root]# ls -al total 64 drwxr-x--- 4 root root 4096 Feb 14 22:02 . drwxr-xr-x 23 root root 4096 Feb 16 13:35 .. -rw-r--r-- 1 root root 1210 Feb 10 06:03 anaconda-ks.cfg -rw------- 1…

Caffe源码中layer文件分析

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

全球首个软硬件推理平台 :NVDLA编译器正式开源

作者 | 神经小姐姐来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09;【导读】为深度学习设计新的定制硬件加速器&#xff0c;是目前的一个趋势&#xff0c;但用一种新的设计&#xff0c;实现最先进的性能和效率却具有挑战性。近日&#xff0c;英伟达开源了软硬件推理平台…

【leetcode】1018. Binary Prefix Divisible By 5

题目如下&#xff1a; Given an array A of 0s and 1s, consider N_i: the i-th subarray from A[0] to A[i] interpreted as a binary number (from most-significant-bit to least-significant-bit.) Return a list of booleans answer, where answer[i]is true if and only …

php中magic_quotes_gpc对unserialize的影响

昨天朋友让我帮他解决下他网站的购物车程序的问题&#xff0c;程序用的是PHPCMS&#xff0c;换空间前是好的&#xff08;刚换的空间&#xff09;&#xff0c;具体问题是提示成功加入购物车后跳转到购物车页面&#xff0c;购物车里为空。 我看了下代码&#xff0c;大致的原理就是…

值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)

作者 | 黄浴转载自知乎专栏自动驾驶的挑战和发展【导读】上周&#xff0c;我们在激光雷达&#xff0c;马斯克看不上&#xff0c;却又无可替代&#xff1f;》一文中对自动驾驶中广泛使用的激光雷达进行了简单的科普&#xff0c;今天&#xff0c;这篇文章将各大公司和机构基于激光…

Caffe源码中Pooling Layer文件分析

Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件&#xff0c;这里介绍下include/caffe/vision_layers文件中PoolingLayer类&#xff0c;在最新版caffe中&#xff0c;PoolingLayer类被单独放在了include/caffe/layers/pooling_layer.hpp文件中…

手持终端以物联网的模式

近年来&#xff0c;物联宇手持终端以物联网的模式&#xff0c;开启了信息化的管理模式&#xff0c;迸发了新的自我提升和业务新商机。手持终端是一款智能的电子设备&#xff0c;它的核心功能为用户速带来业务效率的提升&#xff0c;如快递行业&#xff0c;每天的工作量需求大&a…

Linux系统基础-管理之用户、权限管理

Linux用户、权限管理一、如何实现"用户管理"1.什么是用户 "User" : 是一个使用者获取系统资源的凭证&#xff0c;是权限的结合&#xff0c;为了识别界定每一个用户所能访问的资源及其服务的。只是一种凭证。会有一个表示数字&#xff0c;计算机会首…

Ubuntu14.04 LTS中安装Ruby 2.4源码操作步骤

(1)、查看是否已安装ruby&#xff0c;执行命令&#xff0c;如下图&#xff0c;可见机子上还没有安装ruby&#xff0c;即使通过apt-get install命令安装也只能安装1.8版本&#xff1b;(2)、从 http://www.ruby-lang.org/en/downloads/ 下载最新稳定版2.4即ruby-2.4.0.tar.gz&a…

图森未来完成2.15亿美元D轮融资,将拓展无人驾驶运输服务

AI科技大本营消息&#xff0c;9月17日&#xff0c;图森未来宣布获得1.2亿美元的D2轮投资&#xff0c;并完成总额为2.15亿美元的D轮融资。D2轮的投资方除了此前已宣布的UPS外&#xff0c;还包括新的投资方鼎晖资本&#xff0c;以及一级供应商万都&#xff08;Mando Corporation&…

中国互联网公司开源项目调研报告

近年来&#xff0c;开源技术得到越来越多的重视&#xff0c;微软收购GitHub、IBM收购红帽&#xff0c;都表明了开源的价值。国内公司也越来越多的参与开源&#xff0c;加入开源基金会/贡献开源项目。但是&#xff0c;它们到底做得如何呢&#xff1f;为此InfoQ统计了国内在GitHu…

ReSharper 配置及用法

1:安装后&#xff0c;Resharper会用他自己的英文智能提示&#xff0c;替换掉 vs2010的智能提示&#xff0c;所以我们要换回到vs2010的智能提示 2:快捷键。是使用vs2010的快捷键还是使用 Resharper的快捷键呢&#xff1f;我是使用re的快捷键 3: Resharper安装后&#xff0c;会做…

Ubuntu14.04 LTS中升级gcc/g++版本到4.9.4的操作步骤

Ubuntu14.04 LTS中默认的gcc/g版本为4.8.4&#xff0c;如下图&#xff0c;在C11中增加了对正则表达式的支持&#xff0c;但是好像到gcc/g 4.9.2版本才会对正则表达式能很好的支持&#xff0c;这里介绍下Ubuntu14.04 LTS升级gcc/g版本到4.9.4的操作步骤&#xff1a; 1&#xff0…