caffe源码:SyncedMemory

  • 主要目的
    syncedMemory主要是在CPU或GPU上分配内存、以及保持数据的同步
    主要用于Blob类
// blob中的reshape 的具体实现  
template <typename Dtype>  
void Blob<Dtype>::Reshape(const vector<int>& shape) {  
  CHECK_LE(shape.size(), kMaxBlobAxes); //是否小于规定的最大BLOB的维度(35维)  
  count_ = 1;  
  shape_.resize(shape.size());// 首先将大小设置为vector<int> shape_; 即新的形状数据的大小  
  if (!shape_data_ || shape_data_->size() < shape.size() * sizeof(int)) {  
    shape_data_.reset(new SyncedMemory(shape.size() * sizeof(int)));//  shared_ptr<SyncedMemory> shape_data_;  
  }  
  int* shape_data = static_cast<int*>(shape_data_->mutable_cpu_data());  
  for (int i = 0; i < shape.size(); ++i) {  
    // 检查形状数据是否合法  
    CHECK_GE(shape[i], 0);  
    CHECK_LE(shape[i], INT_MAX / count_) << "blob size exceeds INT_MAX";  
    // 计算数据个数  
    count_ *= shape[i];  
    // 复制shape到新的和旧的形状数据  
    shape_[i] = shape[i];  
    shape_data[i] = shape[i];  
  }  
  // 判断是否大于存储的容量  
  if (count_ > capacity_) {  
    capacity_ = count_;  
    // 重新分配内存  
    data_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));  
    diff_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));  
  }  
}  

// 注意这里的 gpu_data和mutable_gpu_data的区别是  
// mutable_gpu_data是设置了head_ 的而  
// gpu_data是不设置head_  
// 但是我并不明白为啥要有个mutable  
// 难道是因为设置了head_就可以实现互斥了?  
// 可能的解释是设置了head_可以保护gpu或者内存中的数据不被销毁  

template <typename Dtype>  
const int* Blob<Dtype>::gpu_shape() const {  
  CHECK(shape_data_);  
  // shared_ptr<SyncedMemory> shape_data_;  
  // 因此也分gpu_data和cpu_data  
  return (const int*)shape_data_->gpu_data();  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值