您的位置:首页 > Web前端

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

2014-11-12 10:06 405 查看
转载:linger的博客:http://blog.csdn.net/lingerlanlan/article/details/24379607

数据成员:

void*cpu_ptr_;数据在cpu的指针

void*gpu_ptr_;数据在gpu的指针

size_tsize_;数据的大小

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

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数据在cpu和gpu都有,不做处理

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数据在cpu和gpu都有,不做操作。

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即可,并且只是声明,不用实现.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: