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)