Caffe中SyncedMemory类阅读

SyncedMemory简单的管理分配内存,并且负责同步CPU和GPU。

1.成员变量

void* cpu_ptr_;\\cpu中指针
void* gpu_ptr_;\\GPU中指针
size_t size_;\\数据大小
SyncedHead head_;\\当前数据状态
bool own_cpu_data_;\\cpu数据释放被本类所拥有,即没有其他指针指向该数据。
bool cpu_malloc_use_cuda_;\\分配cpu内存是否用的cudaMallocHost()分配。
bool own_gpu_data_;\\作用own_cpu_data类似
int gpu_device_;\\GPU序号

关于SymceHead,有四种状态,分别是未初始化,数据在 cpu 中,数据在 gpu 中,数据在 cpu 和 gpu 中都有。enum SyncedHead { UNINITIALIZED , HEAD_AT_CPU , HEAD_AT_GPU , SYNCED };

2.函数

inline函数

inline void CaffeMallocHost(void** ptr, size_t size, bool* use_cuda);
inline void CaffeFreeHost(void* ptr, bool use_cuda);

分别是分配和释放内存,这里指的是CPU内存。

私有成员函数

 void to_cpu();
 void to_gpu();

分别为将数据导入CPU和GPU。

共有成员函数
首先是构造函数

SyncedMemory();
explicit SyncedMemory(size_t size);

第一个为简单初始化,第二个只是把 size (大小)设置了,并未申请内存。

然后是析构函数

  ~SyncedMemory();

主要就是释放数据。这里说明一点是,own_gpu_data和own_cpu_data。这两个成员变量的作用我是到这里才明白。表示是否拥有该数据,也即在cpu或gpu中是否有其他指针指向该数据。

接下来可能看着比较繁琐无趣了。

const void* cpu_data();
const void* gpu_data();

分别是获取cpu,gpu中数据的指针,需要说明的一点是,该过程会同步数据。
有获取,就有设置,下面两个函数就是设置数据了。

void set_cpu_data(void* data);
void set_gpu_data(void* data);

需要说明的是,这里设置后就不是拥有该数据,即own_cpu_data或own_gpu_data就为false,因为还有data指向该数据。一般来说,只有当同步后才会为true。也即to_cpu()或者to_gpu()后。

void* mutable_cpu_data();
void* mutable_gpu_data();

这里理解不是很明了,从功能上说,是返回cpu或gpu数据的指针,并设置数据状态为在cpu或gpu上。具体有什么显著的功效还没看出来。

 SyncedHead head();
 size_t size()

返回数据状态和大小。

最后一个

void async_gpu_push(const cudaStream_t& stream);

只有在没定义CPU_ONLY时才编译。感觉是同步用的,将cpu上的数据同步到gpu上。

3.关于DISABLE_COPY_AND_ASSIGN

在头文件中有这样一句

DISABLE_COPY_AND_ASSIGN(SyncedMemory);

这其实是一个宏,用来把该类的拷贝函数和等号操作符给禁止掉。
其实就是

private:\
SyncedMemory( const SyncedMemory&);\
SyncedMemory& operator =( const SyncedMemory&)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值