caffe源码阅读——SyncedMemory.cpp

SyncedMemory的主要功能是实现CPU和GPU中的数据进行同步。

SyncedMemory的构造函数

//SyncedMemory的构造函数
SyncedMemory::SyncedMemory()
  : cpu_ptr_(NULL), gpu_ptr_(NULL), size_(0), head_(UNINITIALIZED),
    own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false) {
#ifndef CPU_ONLY
#ifdef DEBUG
  CUDA_CHECK(cudaGetDevice(&device_));
#endif
#endif
}

SyncedMemory::SyncedMemory(size_t size)
  : cpu_ptr_(NULL), gpu_ptr_(NULL), size_(size), head_(UNINITIALIZED),
    own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false) {
#ifndef CPU_ONLY
#ifdef DEBUG
  CUDA_CHECK(cudaGetDevice(&device_));
#endif
#endif
}

SyncedMemory的析构函数

SyncedMemory::~SyncedMemory() {
  check_device();
  if (cpu_ptr_ && own_cpu_data_) {
    CaffeFreeHost(cpu_ptr_, cpu_malloc_use_cuda_);//释放CPU数据内存
  }

#ifndef CPU_ONLY
  if (gpu_ptr_ && own_gpu_data_) {
    CUDA_CHECK(cudaFree(gpu_ptr_));//释放GPU数据内存
  }
#endif  // CPU_ONLY
}

SyncedMemory::to_cpu()

inline void SyncedMemory::to_cpu() {    //实现把数据存入cpu
  check_device();
  switch (head_) {
  case UNINITIALIZED:    //数据未初始化,则在cpu申请内存
    CaffeMallocHost(&cpu_ptr_, size_, &cpu_malloc_use_cuda_);//申请内存
    caffe_memset(size_, 0, cpu_ptr_);//申请内存的初始化工作
    head_ = HEAD_AT_CPU;
    own_cpu_data_ = true;
    break;
  case HEAD_AT_GPU:     //数据在GPU上存储时,把数据拷贝到CPU
#ifndef CPU_ONLY
    if (cpu_ptr_ == NULL) {
      CaffeMallocHost(&cpu_ptr_, size_, &cpu_malloc_use_cuda_);
      own_cpu_data_ = true;
    }
    caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_);
    head_ = SYNCED;
#else
    NO_GPU;
#endif
    break;
  case HEAD_AT_CPU:   //数据存储在CPU时,不做任何处理
  case SYNCED:        //数据在CPU和gpu上时不做任何处理
    break;
  }
}

SyncedMemory::to_gpu()

和SyncedMemory::to_cpu()类似,主要实现在GPU上的数据存储。

SyncedMemory::cpu_data()

const void* SyncedMemory::cpu_data() {  //返回指向存储cpu数据的指针cpu_ptr_
  check_device();
  to_cpu();
  return (const void*)cpu_ptr_;
}

SyncedMemory::set_cpu_data(void* data)

void SyncedMemory::set_cpu_data(void* data) {//指向cpu内存的指针cpu_ptr_指向新的地方,并释放原先申请的内存
  check_device();
  CHECK(data);
  if (own_cpu_data_) {//如果申请过CPU内存则释放
    CaffeFreeHost(cpu_ptr_, cpu_malloc_use_cuda_);
  }
  cpu_ptr_ = data;//指针指向新的区域
  head_ = HEAD_AT_CPU;
  own_cpu_data_ = false;
}

SyncedMemory::gpu_data()

和SyncedMemory::cpu_data()类似,主要功能为返回指向存储gpu数据的指针gpu_ptr_。

SyncedMemory::set_gpu_data(void* data)

和SyncedMemory::set_cpu_data(void* data)类似,主要功能释放GPU存储的数据。

SyncedMemory::mutable_cpu_data()

void* SyncedMemory::mutable_cpu_data() {//返回指向CPU数据的指针,并把head_的状态设置为HEAD_AT_CPU
  check_device();
  to_cpu();
  head_ = HEAD_AT_CPU;
  return cpu_ptr_;
}

SyncedMemory::mutable_gpu_data()

void* SyncedMemory::mutable_gpu_data() {
  check_device();
#ifndef CPU_ONLY
  to_gpu();
  head_ = HEAD_AT_GPU;
  return gpu_ptr_;
#else
  NO_GPU;
  return NULL;
#endif
}//返回指向GPU数据的指针,并把head_的状态设置为HEAD_AT_GPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值