Memory 为什么在CNN中,使用GEMM的im2col方法比使用SIMD的方向实现方法更有效

Memory 为什么在CNN中,使用GEMM的im2col方法比使用SIMD的方向实现方法更有效,memory,floating-point,conv-neural-network,cpu-architecture,instruction-set,Memory,Floating Point,Conv Neural Network,Cpu Architecture,Instruction Set,卷积层是卷积神经网络(CNN)中计算量最大的部分。目前,弹射卷积层的常用方法是将图像扩展为列矩阵(im2col),并执行和执行多通道多核(MCMK)卷积使用现有的并行通用矩阵乘法(GEMM)库。然而,im2col操作需要加载和存储图像数据,并且还需要另一个存储块来保存中间数据 如果需要优化卷积实现,可以选择使用SIMD指令指导实现。这种方法不会产生任何内存操作开销 非常规则的内存访问模式带来的好处超过了浪费的存储成本 从以下链接,在链接的末尾 所以我希望知道原因。浮点操作可能需要更多的指令周期

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

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

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

从以下链接,在链接的末尾


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

缓存可能会阻塞GEMM,因此您可以获得大部分一级缓存命中(另请参阅)

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

与CPU核心时钟相比,内存延迟非常慢,但内存/缓存带宽在DDR4或L3缓存命中率较高的情况下并不可怕。(但正如我所说,对于具有良好缓存阻塞/循环平铺的matmul,如果您只动态转置输入矩阵的一部分,您可以在L1d中仍然很热的情况下重用数据。降低非核心带宽要求对于高效matmul也很重要,而不仅仅是转置一个以使其列在内存中顺序排列。)

除此之外,对内存的顺序访问对于高效的SIMD至关重要(加载多个连续元素的向量,允许您使用一条CPU指令对4或8个压缩
float
元素进行乘法/加法/任意运算)。在行主矩阵中跨列将影响吞吐量,即使矩阵小到足以容纳L1d缓存(32kiB)