Caffe的GPU部分学习

 

Caffe的GPU部分学习

这里需要用到NVIDIA的CUDA的接口,不做详细描述,具体查看NVIDIA的官方说明,只讲解caffe的GPU单卡的基本逻辑。

  1. GPU相关的初始化
  1. GPU设备的指定,并创建cublas和curand的句柄,分别用于矩阵运算和随机数生成。通过Caffe::SetDevice()函数调用完成。
  2. 内存管理初始化。
  1. 每个带有weight和bias blob的gpu内存管理初始化在该层的LayerSetUp操作(例如,BaseConvolutionLayer::LayerSetUp)时,通过“new blob”,通过分配blob和对应的SyncedMemory来进行CPU和GPU内存管理。注意:这里并没有分配保存weight和bias 数据的内存,只是把需要的内存信息(即shape)保存了下来。
  2. 对于每个layer的top blob通过caffe 网络初始化Net::Init(调用Net::AppendTop)时,通过“new blob”,通过分配blob和对应的SyncedMemory来进行CPU和GPU内存管理。注意:这里并没有分配保存weight和bias 数据的内存,只是把需要的内存信息(即shape)保存了下来。输入layer data层没有bottom blob。
  3. Data layer层的通过调用BasePrefetchingDataLayer的构造函数和LayerSetUp函数,初始化保存训练和测试数据及对应的label数量的batch blob,并通过SyncedMemory::mutable_gpu_data操作,分配了GPU内存,并启动了预取的线程(见InternalThread类操作)。
  1. 到此,GPU相关的初始化阶段完成,进入了forward阶段

 

  1. GPU forwarding阶段的操作
  1. 内存管理
  1. Data layer层会把top blob的SyncedMemory指针设置为该层从数据集中读取数据的GPU内存地址,见“初始化阶段的data layer的初始化”。
  2. 对于其它层的GPU内存分配,以卷积层为例。如果没有进行内存分配的话,bottom和top通过SyncedMemory::mutable_gpu_data操作,分配了GPU内存;weight和bias通过gpu_data操作,分配了GPU内存。

注意:这也是为什么caffe在第一次运行要比之后的运行要慢一些的原因,它在第一次运行时,才真正的分配GPU内存,以后因为内存大小不变,因此,不会进行内存重分配操作。

  1. 相关的GPU操作
  1. 以卷积层为例,调用conv_im2col_gpu完成img按列展开大的矩阵,调用NVIDIA CUDA的cublasSgemm操作完成矩阵相乘的浮点运算。
  2. 原则上所有数据都在GPU上完成计算避免内存拷贝,只把很小部分需要的结果通过特定的接口拷贝到cpu中,例如,在SoftmaxWithLossLayer中利用cublasSasum接口,输出结果传输到cpu内存中。

 

  1. GPU backward阶段的操作

略。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值