为什么depthwise convolution 比 convolution更加耗时?

参考自:https://www.zhihu.com/question/265434464/answer/306493409

 

首先,caffe原先的gpu实现group convolution很糟糕,用for循环每次算一个卷积,速度极慢。

第二,cudnn7.0及之后直接支持group convolution,但本人实测,速度比github上几个直接写cuda kernel计算的dw convolution速度慢。例如对于n=128, c=512, h=32, w=32, group=512的卷积跑100次,cudnn 7.0里的group convolution需要4秒多,而yonghenglh6/DepthwiseConvolution大概只需要1秒。

 

本人分析了一下dw convolution与普通convolution的理论计算复杂度,举例如下:

卷积1:普通卷积,输入为64*64*256,输出为64*64*256,卷积核大小为3*3。

参数为3*3*256*256=590K,计算量为64*64*256*3*3*256=2.42G,计算过程的工作集内存总量(输入输出数据+参数)为64*64*256*2 + 3*3*256*256 = 2.69M。

 

卷积2:dw卷积,输入为64*64*256,输出为64*64*256,卷积核大小为3*3。

参数为3*3*256=2.3K个,计算量为64*64*256*3*3=9.44M,计算过程的工作集内存总量为64*64*256*2 + 3*3*256=2.10M。

 

卷积3:普通卷积,输入为64*64*16,输出为64*64*16,卷积核大小为3*3。

参数为3*3*16*16=2.3K个,计算量为64*64*16*3*3*16=9.44M,计算过程的工作集内存总量为64*64*16*2 + 3*3*16*16=133K。

 

可以看到卷积2肯定比卷积1快,因为计算量下降到1/256了,但卷积2实际上无法达到卷积1的256倍速度(我记得我测得结果大概是快10倍左右),因为工作集内存大小并没有显著降低。卷积2也无法达到卷积3的速度,因为虽然FLOPS相同,但工作集内存大小相差了很多倍,因此单位数据的计算密度小很多,很难充分利用GPU上的计算单元。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值