caffe1源码解析从入门到放弃1):内存管理syncedmem.hpp / syncedmem.cpp

/*这些代码都是本人在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), 
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值