【算法分析】Conv卷积算子

目录

 

什么是卷积

性能分析


什么是卷积

百度一下"卷积"会有满屏幕的搜索结果,这里就不再赘述它的定义和描述了,上动图展示典型的一个3D卷积过程如下

Conv3D-signed

卷积算法

上图展示的是一种很简单粗暴的卷积算法,姑且称之为朴素卷积算法,算法的形式化描述如下

//输入: F(N,Ci,Df,Df),卷积核K(Co,Ci,Dk,Dk)
//输出: G(N,Co,Dg,Dg)
for (n in N) {//遍历输入F的所有Batch输入
    for (co in Co) {//遍历kernel的所有Output Channel
        for (ci in Ci) {//遍历第n个输入F的所有Input Channel
            for (i in Df) {//遍历F的第ci个Input Channel上的所有行
                for (j in Df) {//遍历F第i行上的所有列
                    for (m in Dk) {//遍历第ci个kernel的所有行
                        for (n in Dk) {//遍历kernel第m行上的所有列
                            //卷积计算得到输出G(n,co,i,j)
                            G[n][co][i][j] += F[n][ci][i+m][j+n] * K[co][ci][m][n]
                        }
                    }
                }
            }
        }
    }
}

 

性能分析

roofline模型

用Roofline模型(论文链接)可以定义提升性能要解决两个问题

  • 提升计算强度(Attainable Performance FLOP/s)- 即通过多CPU Core 或者GPU进行并行计算
  • 提升计算密度(Operational Intensity FLOP/Byte)- 即减少内存带宽占用

减少内存带宽占用本质上即提升Cache访问的命中率,减少RAM内存搬运数据的次数

行优先次序存储数据

在以行优先存储的计算机中,本文开头的3D卷积计算需要的输入F和Kernel以如上示意图的次序存储在RAM内存中,这种方式简单直观,但按照朴素卷积算法执行会造成大量的Cache Miss与数据内存搬运

Conv3D-访存Cache Miss示意图

上面示意图假想的存储模型为2层(Cache - RAM),设Cache里面有4条Cache Line,每条Cache Line可以一次读取连续4个元素,求解输入 F(2,3,3) 与 K(2,2,2) 卷积,从朴素卷积计算的过程可以看到 ,Kernel数据可以一直keep在Cache中保持命中,但F的数据由于按行存储在RAM就会发生多次Cache无效触发从RAM Load数据到Cache的过程,从而影响了计算性能,在上图的假想模型下Cache Miss的次数计算如下

  • 每个Input Channel上的F,每次卷积计算会有2次Cache Miss,4次卷积总共发生8次Cache Miss
  • 总共有2个Input Channel,4次卷积总共发生16次Cache Miss
  • 每个Input Channel上的kernel在第一次读取的时候发生1次Cache Miss
  • 总共有2个Input Channel kernel,第一次读取共发生2次Cache Miss
  • 整个卷积过程共发生16+2 = 18 次Cache Miss

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值