【问题标题】:Why is the method of im2col with GEMM is more efficient than the method of direction implementation with SIMD in CNN为什么im2col用GEMM的方法比CNN中用SIMD的direction实现方法效率更高
【发布时间】:2019-04-15 01:27:17
【问题描述】:

卷积层是卷积神经网络 (CNN) 中计算量最大的部分。目前实现卷积层的常用方法是将图像扩展为列矩阵 (im2col) 并执行多通道多核 (MCMK)使用现有的并行通用矩阵乘法 (GEMM) 库进行卷积。然而im2col操作需要加载和存储图像数据,并且还需要另一个内存块来保存中间数据。

如果我需要优化卷积实现,我可以选择用 SIMD 指令直接实现。这种方法不会产生任何内存操作开销。

非常规则的内存访问模式带来的好处超过了浪费的存储成本。

来自以下链接,在链接的末尾

https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

所以我希望知道原因。浮点运算可能需要更多的指令周期吗?或者输入图像不大,可能会残留在缓存中,内存操作不需要访问DDR,消耗的周期更少。

【问题讨论】:

    标签: memory floating-point conv-neural-network cpu-architecture instruction-set


    【解决方案1】:

    缓存阻塞 GEMM 是可能的,因此您获得的主要是 L1 缓存命中(另请参阅 What Every Programmer Should Know About Memory?)。

    在典型的 x86 CPU 上安装大型共享 L3 缓存不足以提高效率。每个核心的 L2 缓存通常为 256kiB,甚至比 32kiB L1d 缓存还要慢。

    内存延迟与 CPU 核心时钟相比非常慢,但如今内存/缓存带宽在快速 DDR4 或 L3 缓存命中的情况下并不可怕。 (但就像我说的,对于具有良好缓存阻塞/循环平铺的 matmul,如果您只动态转置部分输入矩阵,您可以在 L1d 中仍然很热的情况下重用数据。减少核心外带宽要求对于提高效率也很重要matmul,而不仅仅是转置一个,因此它的列在内存中是连续的。)

    除此之外,对内存的顺序访问对于高效的 SIMD 至关重要(加载多个连续元素的向量,让您通过一条 CPU 指令乘/加/任意 4 或 8 个压缩的 float 元素)。即使矩阵足够小以适合 L1d 缓存 (32kiB),在行优先矩阵中跨列向下移动也会影响吞吐量。

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多