Blob和SyncedMemory代码阅读

    Caffe中的Blob是其进行数据传递与处理的一个类,经过分析Blob中的数据(data_、diff_、shape_data_)都是SyncedMemory的类型,本文简单的分析了SyncedMemory和Blob这两个类的Public函数。


1、class SyncedMemory

 

1.1Brief

         管理内存数据以及CPUGPU之间的内存同步

 

1.2Public Types:

         enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };

         用于表示数据在CPUGPU之间传输的状态

 

1.3Public Member Functions:

 

1.3.1SyncedMemory()

         构造函数

 

1.3.2explicit SyncedMemory(size_t size)

         构造函数

 

1.3.3~SyncedMemory()

         析构函数

 

1.3.4const void* cpu_data()

         获取cpu数据,在该函数的实现中,会首先调用to_cpu(),将数据转换成cpu数据,然后返回cpu数据的指针。

 

1.3.5void set_cpu_data(void* data)

         设置cpu数据

 

1.3.6const void* gpu_data()

         获取GPU数据,在该函数的实现中,会首先调用to_gpu(),将数据转换成gpu数据,然后返回gpu数据的指针。

 

1.3.7void set_gpu_data(void* data)

         设置GPU数据

 

1.3.8void* mutable_cpu_data()

         同cpu_data(),只不过该函数返回的数据是可写的

 

1.3.9void* mutable_gpu_data()

         同gpu_data(),只不过该函数返回的数据是可写的

 

1.3.10SyncedHead head()

         获取同步头,该头用于表示数据在CPUGPU之间传输的状态

 

1.3.11size_t size()

         获取数据buffer的大小

 

1.3.12void async_gpu_push(const cudaStream_t& stream)

         向GPU异步push数据

 

2、class Blob

 

2.1Brief

         对SyncedMemory的封装,该类是LayerNetSolver之间进行交互时使用的基本计算单元。

 

2.2Public Member Functions:

 

2.2.1Blob()

         构造函数

 

2.2.2explicit Blob(const int num, const int channels, const int height, const int width)

         构造函数,已被弃用,请使用explicit Blob(const vector<int>& shape)

 

2.2.3explicit Blob(const vector<int>& shape)

         构造函数

 

2.2.4void Reshape(const int num, const int channels, const int height, const int width)

         已被弃用,请使用void Reshape(const vector<int>& shape)

 

2.2.5void Reshape(const vector<int>& shape)

         修改blob的维度,如果有必要,会创建一块新的内存。该函数既可以在初始化内存时用来创建初始内存,也可以在Layer::ReshapeLayer::Forward时用来调       整top blob的维度。

         当改变blobsize时,只有在当前内存不够用时才会重新创建,而且超过的内存资源不会被释放。

         注意:reshape一个输入blob后立即调用Net::Backward是错误的,应该通过Net::ForwardNet::Reshape将新的输入的shape传递到更高层。

 

2.2.6void Reshape(const BlobShape& shape)

         同上

 

2.2.7void ReshapeLike(const Blob& other)

         修改blob的维度,将当前blob的维度修改成和other一样

 

2.2.8inline string shape_string() const

         将shape_中的内容以及count_拼接成字符串并返回,主要打日志。

 

2.2.9inline const vector<int>& shape() const

         获取blob的维度信息

 

2.2.10inline int shape(int index) const

         获取blob的某一坐标轴上的维度(index如果是负数,则代表从最后一个坐标轴开始第-index个坐标轴)。

         参数index代表第几个坐标轴,index可以取负数。

 

2.2.11inline int num_axes()

         获取blob的坐标轴的个数。

 

2.2.12inline int count() const

         获取blob的数据的个数。

 

2.2.13inline int count(int start_axis, int end_axis) const

         获取从start_axis坐标轴到end_axis坐标轴之间的数据的个数。

 

2.2.14inline int count(int start_axis) const

         获取从start_axis坐标轴开始的数据的个数。

 

2.2.15inline int CanonicalAxisIndex(int axis_index)

         获取规范化的坐标索引,

         axis_index可以是负数,如果是负数,则返回axis_index + num_axes(),即倒数第-axis_index个索引

 

2.2.16inline int num() const

         已经弃用,请使用shape(0)

 

2.2.17inline int channels() const

         已经弃用,请使用shape(1)

 

2.2.18inline int height() const

         已经弃用,请使用shape(2)

 

2.2.19inline int width() const

         已经弃用,请使用shape(3)

 

2.2.20inline int LegacyShape(int index) const

         返回某一坐标轴上的数据个数,index为坐标轴索引

 

2.2.21inline int offset(const int n, const int c = 0, const int h = 0, const int w = 0) const

         返回数据的偏移

 

2.2.22inline int offset(const vector<int>& indices) const

         返回数据的偏移

 

2.2.23void CopyFrom(const Blob<Dtype>& source, bool copy_diff = false, bool reshape = false)

         从一个源blob中拷贝数据

         参数source:要拷贝数据的源Blob

         参数copy_diff:如果falsecopy数据;如果true拷贝差值

         参数reshape:如果false,要求当前blob和源blobshape一致;

                             如果true,shape不一致的情况下会自动reshape当前的blob

 

2.2.24inline Dtype data_at(const int n, const int c, const int h, const int w) const

         获取某一位置的数据

 

2.2.25inline Dtype data_at(const vector<int>& index) const

         获取某一位置的数据

 

2.2.26inline Dtype diff_at(const int n, const int c, const int h, const int w) const

         获取某一位置的差值

 

2.2.27inline Dtype diff_at(const vector<int>& index) const

         获取某一位置的差值

 

2.2.28inline const shared_ptr<SyncedMemory>& data() const

         获取数据指针

 

2.2.29inline const shared_ptr<SyncedMemory>& diff() const

         获取差值数据指针

 

2.2.30const Dtype* cpu_data() const

         获取cpu数据指针

 

2.2.31void set_cpu_data(Dtype* data)

         设置cpu数据指针

 

2.2.32const int* gpu_shape() const

         设置gpu数据的shape

 

2.2.33const Dtype* gpu_data() const

         设置gpu数据指针

 

2.2.34const Dtype* cpu_diff() const

         设置cpu差值数据的指针

 

2.2.35const Dtype* gpu_diff() const

         设置gpu差值数据的指针

 

2.2.36Dtype* mutable_cpu_data()

         获取可修改的cpu数据指针

 

2.2.37Dtype* mutable_gpu_data()

         获取可修改的gpu数据指针

 

2.2.38Dtype* mutable_cpu_diff()

         获取可修改的cpu差值数据指针

 

2.2.39Dtype* mutable_gpu_diff()

         获取可修改的gpu差值数据指针

 

2.2.40void Update()

         对数据进行计算,并更新数据

 

2.2.41void FromProto(const BlobProto& proto, bool reshape = true)

         从proto中读取数据

         参数reshape:如果false,需要保证当前blobprotoshape一致;

                              如果true,则在当前blobshapeproto不一致时,会对blob进行  reshape

 

2.2.42void ToProto(BlobProto* proto, bool write_diff = false) const

         将数据写入proto

         参数write_diff:如果false,则不写差值数据到proto

                                如果true,则写差值数据到proto

 

2.2.43Dtype asum_data() const

         计算blob中各数据的绝对值之和

 

2.2.44Dtype asum_diff() const

         计算blob中各差值的绝对值之和

 

2.2.45Dtype sumsq_data() const

         计算blob中各数据的平方之和

 

2.2.46Dtype sumsq_diff() const

         计算blob中各差值的平方之和

 

2.2.47void scale_data(Dtype scale_factor)

         用一个缩放因子对blob中的各数据进行缩放

 

2.2.48void scale_diff(Dtype scale_factor)

         用一个缩放因子对blob中的各差值进行缩放

 

2.2.49void ShareData(const Blob& other)

         让当前blobdata_指向入参otherdata_,这在各Layer进行Forward操作时很有用,可以进行简单的数据拷贝。

         该函数有可能会释放掉当前blobdata_,因为shared_ptr类型的data_会在使用操作符”=“进行赋值时调用其reset函数,从而调用析构函数

 

2.2.50void ShareDiff(const Blob& other)

         让当前blobdiff_指向入参otherdiff_,这在各Layer进行Forward操作时很有用,可以进行简单的数据拷贝。

         该函数有可能会释放掉当前blobdiff_,因为shared_ptr类型的diff_会在使用操作符”=“进行赋值时调用其reset函数,从而调用析构函数

 

2.2.51bool ShapeEquals(const BlobProto& other)

         判断当前blobshapeBlobProto的是否相匹配

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值