caffe源码分析--SyncedMemory类代码研究

转载:linger的博客:http://blog.csdn.net/lingerlanlan/article/details/24379607



数据成员:

void*cpu_ptr_;数据在cpu的指针

void*gpu_ptr_;数据在gpu的指针

size_tsize_;数据的大小

SyncedHeadhead_;表示数据的状态,有四种状态,分别是未初始化,数据在cpu中,数据在gpu中,数据在cpugpu中都有

enumSyncedHead { UNINITIALIZED,HEAD_AT_CPU,HEAD_AT_GPU,SYNCED};



构造函数

SyncedMemory()

:cpu_ptr_(NULL),gpu_ptr_(NULL),size_(0),head_(UNINITIALIZED){}

简单的初始化


explicitSyncedMemory(size_tsize)

:cpu_ptr_(NULL),gpu_ptr_(NULL),size_(size),head_(UNINITIALIZED){}

只是把size(大小)设置了,并未申请内存


析构函数

SyncedMemory::~SyncedMemory(){

//如果cpu有数据,则释放

if(cpu_ptr_){

CaffeFreeHost(cpu_ptr_);

}

//如果gpu有数据,则释放

if(gpu_ptr_){

CUDA_CHECK(cudaFree(gpu_ptr_));

}

}


函数voidto_cpu()

功能:把数据放到cpu

1数据未初始化,则在cpu申请内存。此时状态为HEAD_AT_CPU

2数据本来在gpu,则从gpu拷贝内存到cpu。此时状态为SYNCED

3数据本来在cpu,不做处理

4数据在cpugpu都有,不做处理

inlinevoidSyncedMemory::to_cpu(){

switch(head_){

caseUNINITIALIZED:

CaffeMallocHost(&cpu_ptr_,size_);

memset(cpu_ptr_,0,size_);

head_=HEAD_AT_CPU;

break;

caseHEAD_AT_GPU:

if(cpu_ptr_==NULL){

CaffeMallocHost(&cpu_ptr_,size_);

}

CUDA_CHECK(cudaMemcpy(cpu_ptr_,gpu_ptr_,size_,cudaMemcpyDeviceToHost));

head_=SYNCED;

break;

caseHEAD_AT_CPU:

caseSYNCED:

break;

}

}




函数voidto_gpu();

功能:把数据放到gpu

1数据未初始化,在gpu申请内存。此时状态为HEAD_AT_GPU

2数据在cpu,从cpu拷贝到gpu。此时状态为SYNCED

3数据在gpu,不做操作。

4数据在cpugpu都有,不做操作。

inlinevoidSyncedMemory::to_gpu(){

switch(head_){

caseUNINITIALIZED:

CUDA_CHECK(cudaMalloc(&gpu_ptr_,size_));

CUDA_CHECK(cudaMemset(gpu_ptr_,0,size_));

head_=HEAD_AT_GPU;

break;

caseHEAD_AT_CPU:

if(gpu_ptr_==NULL){

CUDA_CHECK(cudaMalloc(&gpu_ptr_,size_));

}

CUDA_CHECK(cudaMemcpy(gpu_ptr_,cpu_ptr_,size_,cudaMemcpyHostToDevice));

head_=SYNCED;

break;

caseHEAD_AT_GPU:

caseSYNCED:

break;

}

}








constvoid*cpu_data();

功能:返回数据在cpu的指针

constvoid*SyncedMemory::cpu_data(){

to_cpu();

return(constvoid*)cpu_ptr_;

}


函数constvoid*gpu_data();

功能:返回数据在gpu的指针

constvoid*SyncedMemory::gpu_data(){

to_gpu();

return(constvoid*)gpu_ptr_;

}


函数void*mutable_cpu_data();

功能:返回数据在cpu的指针,并改变数据的状态为HEAD_AT_CPU

void*SyncedMemory::mutable_cpu_data(){

to_cpu();

head_=HEAD_AT_CPU;

returncpu_ptr_;

}


函数void*mutable_gpu_data();

功能:返回数据在cpu的指针,并改变数据的状态为HEAD_AT_GPU

void*SyncedMemory::mutable_gpu_data(){

to_gpu();

head_=HEAD_AT_GPU;

returngpu_ptr_;

}



函数SyncedHeadhead(){returnhead_;}

功能:返回数据的状态



函数size_tsize(){returnsize_;}

功能:返回数据的大小



DISABLE_COPY_AND_ASSIGN(SyncedMemory);

一个宏,把该类的拷贝函数和等号操作符给禁止掉

其实就是

private:\

SyncedMemory(constSyncedMemory&);\

SyncedMemory&operator=(constSyncedMemory&)


如果想让你的类不能使用copy构造函数和赋值操作符,只要将该类的copy构造函数和赋值操作符函数定义为private即可,并且只是声明,不用实现.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值