gpt4 book ai didi

memory - 为什么在CNN中用GEMM的im2col的方法比用SIMD的方向实现的方法效率更高

转载 作者:行者123 更新时间:2023-12-04 15:52:34 32 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

缓存阻塞 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),在行主矩阵中向下跨列也会损害吞吐量。

关于memory - 为什么在CNN中用GEMM的im2col的方法比用SIMD的方向实现的方法效率更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53260241/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com