zoukankan      html  css  js  c++  java
  • 对于syncedmen类的代码分析

    对于数据在cpu与GPU之间同步的问题,caffe中用syncedMemory这个类来解 决;在GPU模式下,并且使用CUDA时,可以用CaffeMallocHost函数与CaffeFreeHost函数 来申请与释放内存;

    SyncedMemory的构造函数与析构函数不多说,可以看源码;

    在该类中定义的变量有:

    void* cpu_ptr_;   //数据在CPU上的指针;
      void* gpu_ptr_;   //数据在GPU上的指针;
      size_t size_;     //数据的大小;
      SyncedHead head_;  //表示数据的状态;
      bool own_cpu_data_;
      bool cpu_malloc_use_cuda_;
      bool own_gpu_data_;
      int gpu_device_;

    注:该类禁止copy与赋值;

    下面的私有函数:

    它的作用是把让 cpu_ptr_可以访问到数据,(to_cpu,意思差不多就是让数据放到cpu访问到的内存上,做法就是用指针指过去就好啦,如果在gpu上的显存上的话, 需要复制到内存),然后更改一下head_的状态(它表示数据的状态,包括:UNITIALIZED,HEAD_AT_CPU, HEAD_AT_GPU, SYNCED)。

    inline void SyncedMemory::to_cpu()

    它的作用与上面类似:

    inline void SyncedMemory::to_gpu()

    看看其它的函数:

    //获得数据的cpu_str_指针:
    void SyncedMemory::set_cpu_data(void* data)
     
    // 获得数据gpu_ptr_指针
    const void* SyncedMemory::gpu_data()
    //获得可以修改的数据的cpu_str_的指针,与上面的区别在于,获取了cpu_str_指针时,会把head_的状态设置为HEAD_AT_CPU,这样可以确保上GPU上的数据保持同步(原因很简单,当访问gpu上的数据时,分发现head_的状态为HEAD_AT_CPU,所以它会首先把数据复制到GPU上去,再进行下一步操作);
     void* SyncedMemory::mutable_cpu_data() 
    
    // 方法类似,它会把head_的状态设置为HEAD_AT_GPU;
    void* SyncedMemory::mutable_gpu_data()
    // 设置cpu_data(方法为把指针cpu_ptr_所指的内存释放掉,重新指向新传入的地址),并把head_的状态设置为HEAD_AT_CPU
    void SyncedMemory::set_cpu_data(void* data)
    
    //方法类似,并把head_的状态设置为HEAD_AT_GPU
    void SyncedMemory::set_gpu_data(void* data)

    另外还有一个函数,暂时不明白干毛用的,

    void SyncedMemory::async_gpu_push(const cudaStream_t& stream) {
      CHECK(head_ == HEAD_AT_CPU);
      if (gpu_ptr_ == NULL) {
        CUDA_CHECK(cudaGetDevice(&gpu_device_));
        CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_));
        own_gpu_data_ = true;
      }
      const cudaMemcpyKind put = cudaMemcpyHostToDevice;
      CUDA_CHECK(cudaMemcpyAsync(gpu_ptr_, cpu_ptr_, size_, put, stream));
      // Assume caller will synchronize on the stream before use
      head_ = SYNCED;
    }
  • 相关阅读:
    观念真的非常重要
    POJ 2031 prim
    在asp.net mvc中使用PartialView返回部分HTML段
    JavaScript实现获取table中某一列的值
    poj2533--Longest Ordered Subsequence(dp:最长上升子序列)
    74HC595的中文资料
    cocos 事件分发2
    从二叉搜索树到平衡二叉搜索树
    Opencv中integral计算积分图
    函数多个“返回值”
  • 原文地址:https://www.cnblogs.com/yinheyi/p/5943595.html
Copyright © 2011-2022 走看看