caffe源码解析 — blob.cpp

主要参考:linger

Reshape(const int num, const int channels, const int height, const int width)
功能:改变一个blob的大小
步骤:1.读入num_,channels_,height_,width_的大小
2.计算count_:count_ = num_ * channels_ * height_ * width_;
3.如果count_不为0,则重新为data_和diff_分配一块空间
如果count为0,则都初始化为NULL
输入:num,channels,height,width
输出:无

ReshapeLike(const Blob<Dtype>& other)
功能:为data_和diff_ 重新分配一块空间,大小和另一个blob的一样
输入:Bolb类型的other
输出:无

Blob<Dtype>::Blob(const int num, const int channels, const int height, const int width)
功能:简单的构造函数
输入:num,channels,height,width

set_cpu_data(Dtype* data)
功能:改变CPU的数据

const Dtype* Blob<Dtype>::cpu_data()
const Dtype* Blob<Dtype>::cpu_diff()
const Dtype* Blob<Dtype>::gpu_data()
const Dtype* Blob<Dtype>::gpu_diff()

功能:以上四个函数,前两个调用to_cpu(),返回cpu_ptr;第一个对于data对象,第二个对于diff对象
后两个 调用to_gpu(),返回gpu_ptr;第一个对于data对象,第二个对于diff对象

Dtype* Blob<Dtype>::mutable_cpu_data()
Dtype* Blob<Dtype>::mutable_gpu_data()
Dtype* Blob<Dtype>::mutable_cpu_diff()
Dtype* Blob<Dtype>::mutable_gpu_diff()

功能:下面是gpu_data和mutable_gpu_data函数的对比,可以看出第二个函数
只是多改变了head_的值。

const void* SyncedMemory::gpu_data() {
  to_gpu();
  return (const void*)gpu_ptr_;
}

void* SyncedMemory::mutable_gpu_data() {
  to_gpu();
  head_ = HEAD_AT_GPU;
  return gpu_ptr_;
}
void Blob<Dtype>::ShareData(const Blob& other)
void Blob<Dtype>::ShareDiff(const Blob& other)

功能:从other的blob复制data和diff的值

Update()
功能:更新data_的数据,就是减去diff_的数据。
步骤:1.判断blob的位置(HEAD_AT_CPU/HEAD_AT_GPU/SYNCED/UNINITIALIZED)
1)调用caffe_axpy:在math_functions.cpp可以找到该函数的实现,其实这函数也是封装了mkl的函数。这里调用是为了实现了两个向量的减法。
2)调用caffe_gpu_axpy:在math_functions.cpp可以找到该函数的实现,其实这函数也是封装了cublas的函数。这里调用是为了实现了两个向量的减法。

CopyFrom(const Blob& source, bool copy_diff, bool reshape)
功能:从source拷贝数据。copy_diff作为标志来区分是拷贝data还是拷贝diff。
步骤:1.如果是GPU:
如果是拷贝diff:调用cudaMemcpy函数将source的diff拷贝过来
否则拷贝data
2.如果是CPU:
如果是拷贝diff:调用memcpy函数将source的diff拷贝过来
否则拷贝data

FromProto(const BlobProto& proto)
功能:从proto读数据进来,其实就是反序列化
步骤:1.先把blob的大小改变一下
2.得到cpu中数据的地址
3.用proto中的data覆盖blob中的data
4.用proto中的diff覆盖blob中的diff

ToProto(BlobProto* proto, bool write_diff)
功能:把blob数据保存到proto中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值