syncedmem
- syncedmem管理一段大小为size的内存。这段内存可以从GPU或者主机内存分配,syncedmem负责GPU和主机内存之间的同步。如果数据是在GPU里而要从主机内存取出,syncedmem会先把数据从GPU内存memcpy到主机内存返回(标记为SYNCED); 相反也是一样。
- 分配/释放内存的方式
- CPU: ptr = malloc(size) / free(ptr)
- GPU: cudaMallocHost(ptr, size) / cudaFreeHost(ptr)
成员变量
void* cpu_ptr_, gpu_ptr_;
size_t size_;
SyncedHead head_;
bool cpu_malloc_use_cuda_;
bool own_gpu_data_, own_cpu_data_;
int gpu_device_;
CPU 相关方法
inline void SyncedMemory::cpu_data() {
switch (head_) {
case UNINITIALIZED:
分配内存,head_=HEAD_AT_CPU
break;
case HEAD_AT_GPU:
#ifndef CPU_ONLY
caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_);
head_ = SYNCED;
#end
return (const void*)cpu_ptr_;
}
void SyncedMemory::set_cpu_data(void* data) {
cpu_ptr_ = data;
head_ = HEAD_AT_CPU;
own_cpu_data_ = false;
}
GPU 相关方法
inline void SyncedMemory::gpu_data() {
#ifndef CPU_ONLY
switch (head_) {
case UNINITIALIZED:
分配内存, head_ = HEAD_AT_GPU;
break;
case HEAD_AT_CPU:
caffe_gpu_memcpy(size_, cpu_ptr_, gpu_ptr_);
head_ = SYNCED;
break;
#end
}
void SyncedMemory::set_gpu_data(void* data) {
gpu_ptr_ = data;
head_ = HEAD_AT_GPU;
own_gpu_data_ = false;
}
void SyncedMemory::async_gpu_push(const cudaStream_t& stream) {
CHECK(head_ == HEAD_AT_CPU);
CUDA_CHECK(cudaMemcpyAsync(gpu_ptr_, cpu_ptr_, size_, put, stream));
head_ = SYNCED;
}
Blob
- Blob是Caffe的Layer之间传输的内部数据单元
- 它存储矩阵data_和 diff_, 由shape_来表示矩阵的各个维度。比如number张图片训练数据可以表示成 number * channels * height * width 的4维矩阵,shape_ = {number, channels, height, width},具体实现上data_和diff_分别是一个大小为number * channels * height * width的一维数组(SyncedMem类型)。
Blob 成员变量
shared_ptr<SyncedMemory> data_;
shared_ptr<SyncedMemory> diff_;
vector<int> shape_;
int count_;
int capacity_;
Blob基本方法
void Reshape(const vector<int>& shape);
void cpu_data(), gpu_data(), set_cpu_data(), set_gpu_data()
void ShareData(const Blob& other);
void FromProto/toProto();
Blob矩阵操作
void Update() {
caffe_axpy<Dtype>(count_, Dtype(-1),
static_cast<const Dtype*>(diff_->cpu_data()),
static_cast<Dtype*>(data_->mutable_cpu_data()));
OR
caffe_gpu_axpy<Dtype>(count_, Dtype(-1),
static_cast<const Dtype*>(diff_->gpu_data()),
static_cast<Dtype*>(data_->mutable_gpu_data()));
}
Dtype asum_data()
Dtype asum_diff()
Dtype sumsq_data()
Dtype sumsq_diff()
void scale_data(Dtype scale_factor)
void scale_diff(Dtype scale_factor)
Dtype data_at(const vector<int>& index)
Dtype diff_at(const vector<int>& index)
int count(int start_axis, int end_axis)