SyncedMemory::~SyncedMemory() { #ifndef CPU_ONLY if (gpu_ptr_) { if (device_context_->backend() == Backend::BACKEND_CUDA) { #ifdef USE_CUDA // Free device memory cudaFree(gpu_ptr_); gpu_ptr_ = nullptr; device_context_->DecreaseMemoryUsage(size_); #endif // USE_CUDA } else { #ifdef USE_GREENTEA // Free device memory viennacl::ocl::context ctx = viennacl::ocl::get_context( device_context_->id()); ctx.get_queue().finish(); CHECK_EQ(CL_SUCCESS, clReleaseMemObject(cl_gpu_mem_)) << "OpenCL memory corruption"; gpu_ptr_ = nullptr; cl_gpu_mem_ = nullptr; ctx.get_queue().finish(); device_context_->DecreaseMemoryUsage(size_); #endif // USE_GREENTEA } } #endif // !CPU_ONLY // Free host memory if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_); cpu_ptr_ = nullptr; } }
inline void SyncedMemory::to_cpu() { if(cpu_ptr_!=NULL) { CaffeFreeHost(cpu_ptr_); } switch (head_) { case UNINITIALIZED: CaffeMallocHost(&cpu_ptr_, size_); caffe_memset(size_, 0, cpu_ptr_); head_ = HEAD_AT_CPU; own_cpu_data_ = true; break; case HEAD_AT_GPU: #ifndef CPU_ONLY if (cpu_ptr_ == NULL) { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; #else NO_GPU; #endif break; case HEAD_AT_CPU: case SYNCED: break; } }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_) { CaffeFreeHost(cpu_ptr_); } if (gpu_ptr_) { } }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_) { CaffeFreeHost(cpu_ptr_); } if (gpu_ptr_) { CUDA_CHECK(cudaFree(gpu_ptr_)); } }
void SyncedMemory::set_cpu_data(void* data) { CHECK(data); if (own_cpu_data_) { CaffeFreeHost(cpu_ptr_); } cpu_ptr_ = data; head_ = HEAD_AT_CPU; own_cpu_data_ = false; }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_); } #ifndef CPU_ONLY if (gpu_ptr_) { CUDA_CHECK(cudaFree(gpu_ptr_)); } #endif // CPU_ONLY }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_); cpu_ptr_ = NULL; } if (gpu_ptr_) { CUDA_CHECK(cudaFree(gpu_ptr_)); gpu_ptr_ = NULL; } }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_, cpu_malloc_use_cuda_); } #ifndef CPU_ONLY if (gpu_ptr_ && own_gpu_data_) { int initial_device; cudaGetDevice(&initial_device); if (gpu_device_ != -1) { CUDA_CHECK(cudaSetDevice(gpu_device_)); } CUDA_CHECK(cudaFree(gpu_ptr_)); cudaSetDevice(initial_device); } #endif // CPU_ONLY }
// 析构函数就是释放内存 SyncedMemory::~SyncedMemory() { if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_, 0); } #ifndef CPU_ONLY// 只要不是定义的CPU_ONLY的编译模式 if (gpu_ptr_ && own_gpu_data_) { int initial_device; // 获取可用设备 cudaGetDevice(&initial_device); if (gpu_device_ != -1) { // 当前所使用的设备 CUDA_CHECK(cudaSetDevice(gpu_device_)); } // 释放当前 CUDA_CHECK(cudaFree(gpu_ptr_)); cudaSetDevice(initial_device); } #endif // CPU_ONLY }
SyncedMemory::~SyncedMemory() { if (cpu_ptr_ && own_cpu_data_) { CaffeFreeHost(cpu_ptr_, cpu_malloc_use_cuda_); } }