/*这些代码都是本人在linux-nsight-eclipse环境下纯手打。
文章结尾都会抛出一些本人尚未解决的问题,欢迎各路大神拍砖。
文章属于学习交流性质,随着本人学力的提升,此blog将会长期修正更新。
* syncedmem.hpp
* Created on: Jun 4, 2017
* Author: pan
*/
#ifndef SYNCEDMEM_HPP_
#define SYNCEDMEM_HPP_
#include <cstdlib>
#include "caffe/common.hpp"
/*定义了caffe名称空间,内部封装了caffe所有的类和方法,
* eg:using namespace caffe / using namespace std*/
namespace caffe
{
// If CUDA is available and in GPU mode, host memory will be allocated pinned,
// using cudaMallocHost. It avoids dynamic pinning for transfers (DMA).
// The improvement in performance seems negligible in the single GPU case,
// but might be more significant for parallel training. Most importantly,
// it improved stability for large models on many GPUs.
/*如果主机支持CUDA并且工作在GPU模式下,主机内存将会 allocated(分配) pinned, 使用cudaMallocHost().
* 它避免了dynamic pinning for transfers (DMA).在单GPU情况下使用cudaMallocHost(),这个操作在性能
* 上的提高看起来几乎可以忽视。但是在多GPU并行训练的情况下,cudaMallocHost()可能会显的更重要。最重要的是,
* cudaMallocHost()的使用提高了在多GPU环境下大模型的稳定性。
* caffe工作在GPU模式下使用cudaMallocHost()在主机上分配内存将会比使用malloc()方法有性能和稳定性的提高。
*/
/*在主机上分配内存,CaffeMallocHost(&cpu_ptr_, size_, &cpu_malloc_use_cuda_);方法使用二级指针
cpu_ptr_分配内存*/
inline void CaffeMallocHost(void** ptr, size_t size, bool* use_cuda)
{
#ifndef CPU_ONLY
if(Caffe::mode() == Caffe::GPU)
{
CUDA_CHECK(cudaMallocHost(ptr, size));//*****************
*use_cuda = true;
return ;//在void类型的函数中,return用于返回空,不是返回 0 值
}
#endif
/*这里分配了size个字节的内存,由于使用的是void*最后要强制类型转换成特定类型的
* 指针eg: static_cast<int*> cpu_ptr_ 。这点在Blob中会详细陈述*/
*ptr = malloc(size);
*use_cuda = false;
CHECK(*ptr)<<"host allocation of size "<< size <<" failed";//**********************
}
/*内存释放方法,由于在cuda环境下有两种主机分配内存的方法,所以在这里做了一个宏定义处理,分别是
cudaFreeHost()和 free()*/
inline void CaffeFreeHost(void* ptr, bool use_cuda)
{
#ifndef CPU_ONLY
if(use_cuda)
{
CUDA_CHECK(cudaFreeHost(ptr));//***************
return ;
}
#endif
free(ptr);
}
/**
* @brief Manages memory allocation and synchronization between the host (CPU)
* and device (GPU).
*
* TODO(dox): more thorough description.
*/
/*
*SyncedMemory类 @简单的用于在主机(CPU)和 设备(GPU)之间进行内存分配和同步工作,也就是说在CPU和GPU
*之间管理内存。
*TODO(dox): more thorough description.
* */
class SyncedMemory
{
public:
/*构造函数将初始化各种指针*/
SyncedMemory()
: cpu_ptr_(NULL),
caffe1源码解析从入门到放弃1):内存管理syncedmem.hpp / syncedmem.cpp
最新推荐文章于 2018-09-16 08:40:17 发布