本文章仅记录卷积优化原理
以下来自转载
转载地址:[link]http://shuokay.com/2018/02/21/winograd/
首先要明确一点, 这里说的卷积是是指 ConvNet 中默认的卷积, 而不是数学意义上的卷积. 其实, ConvNet 中的卷积对于与数学中的 cross correlation.
计算卷积的方法有很多种, 常见的有以下几种方法:
滑窗: 这种方法是最直观最简单的方法. 但是, 该方法不容易实现大规模加速, 因此, 通常情况下不采用这种方法 (但是也不是绝对不会用, 在一些特定的条件下该方法反而是最高效的.)
im2col: 目前几乎所有的主流计算框架包括 Caffe, MXNet 等都实现了该方法. 该方法把整个卷积过程转化成了 GEMM 过程, 而 GEMM 在各种 BLAS 库中都是被极致优化的, 一般来说, 速度较快.
FFT: 傅里叶变换和快速傅里叶变化是在经典图像处理里面经常使用的计算方法, 但是, 在 ConvNet 中通常不采用, 主要是因为在 ConvNet 中的卷积模板通常都比较小, 例如 3×3 等, 这种情况下, FFT 的时间开销反而更大.
Winograd: Winograd 是存在已久最近被重新发现的方法, 在大部分场景中, Winograd 方法都显示和较大的优势, 目前 cudnn 中计算卷积就使用了该方法.
有时间的话,详细分析以下四个实现
- ReferenceConvFunctor是按部就班的计算卷积实现
- Im2ColConvFunctor里面是将kernel平铺,input平铺,然后利用gemm或者eigen做矩阵运算实现
- fft实现卷积是利用时间域的卷积等于频域的相乘,做fft和ifft,以及相乘实现起来应该也不复杂的
参考[link]https://blog.csdn.net/xienaoban/article/details/69486299 - winograd介绍是说更多的加法来减少乘法,来达到优化的目的
参考[link]https://blog.csdn.net/dengdengma520/article/details/80541598
GEMM neon矩阵优化
参考[link]https://www.jianshu.com/p/68879baa7c1f
奇异递归模板模式
参考[link]https://blog.csdn.net/daniel_ustc/article/details/73699378
参考[link]https://blog.csdn.net/daniel_ustc/article/details/74857956