目录
什么是卷积
百度一下"卷积"会有满屏幕的搜索结果,这里就不再赘述它的定义和描述了,上动图展示典型的一个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]
}
}
}
}
}
}
}
性能分析
![](https://img-blog.csdnimg.cn/20201221141224163.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hhb0JCTnVhbk1N,size_16,color_FFFFFF,t_70)
用Roofline模型(论文链接)可以定义提升性能要解决两个问题
- 提升计算强度(Attainable Performance FLOP/s)- 即通过多CPU Core 或者GPU进行并行计算
- 提升计算密度(Operational Intensity FLOP/Byte)- 即减少内存带宽占用
减少内存带宽占用本质上即提升Cache访问的命中率,减少RAM内存搬运数据的次数
![](https://img-blog.csdnimg.cn/20201221151540153.gif)
在以行优先存储的计算机中,本文开头的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