- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
卷积层是卷积神经网络 (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/
我写了一些 Naiive GEMM 代码,我想知道为什么它比等效的单线程 GEMM 代码慢得多。 使用 200x200 矩阵,单线程:7ms,多线程:108ms,CPU:3930k,线程池中有 12
Eigen 具有惊人的快速 GEMM 实现,因此我想在我的宠物项目张量库中使用它。如果我理解正确,可以通过 Eigen::Map 实现。我编写了简单的示例并定义了 EIGEN_NO_MALLOC 以确
我注意到 cublasSgemmStridedBatched 的一些奇怪的表现,我正在寻找解释。矩阵大小固定为 20x20。以下是几种不同批量大小的一些时序(仅乘法,无数据传输): 批处理 = 100
单个 numpy einsum 语句能否复制 gemm功能?标量和矩阵乘法看起来很简单,但我还没有找到如何让“+”工作。如果更简单,D = alpha * A * B + beta * C 是可以接受
The netlib documentation of sgemm指出数组步长 LDA 和 LDB 必须是 >= 1,并且足够大,这样列就不会重叠。事实上,Apple 的 Accelerate/vec
当我尝试通过 gpu 将 TensorFlow 与 Keras 结合使用时,我收到此错误消息: C:\Users\nicol\Anaconda3\envs\tensorflow\lib\site-pa
为什么 BLAS 有 gemm矩阵-矩阵乘法函数和一个单独的gemv矩阵向量乘法的函数?矩阵向量乘法不只是矩阵矩阵乘法的一种特殊情况,其中一个矩阵只有一行/列吗? 最佳答案 在数学上,矩阵-向量乘法是
BLAS ?gemm 函数的各种 LDx 参数可以对较大数组的切片进行操作。例如,这个小型 C 程序对 (200,200) 矩阵的左上角和右上角 (100,100) 子矩阵进行矩阵乘法,并将结果存储在
我正在使用 openBLAS 编写一些线性代数程序。该程序需要将两个矩阵相乘;一种是单精度,另一种是 double 。 我查了BLAS引用“http://netlib.org/blas/blasqr.
我正在尝试使用 fortran BLAS gemm 函数进行矩阵乘法,请参阅 here . 这个函数的签名是,所有参数的含义都可以在上面的链接中找到。 call sgemm(transa, trans
我一直在努力理解(但惨遭失败)图像卷积(具有高度、宽度、 channel )是如何在软件中实现的。 我听说有人说他们的卷积实现是使用 GEMM 完成的,或者使用“直接卷积”完成的,或者使用 1x1 内
#include #include #include #include #include using namespace cv; using namespace std; int main() {
这是我的 earlier question 的扩展 , 但我是分开问的,因为我真的很沮丧,所以请不要投反对票! 问题:与密集矩阵的相同 cblas_sgemm 调用相比,对于具有大量零的矩阵,cbla
这是我第一次尝试使用 ATLAS。我无法正确链接它。这是一个非常简单的 sgemm 程序: ... #include const int M=10; const int N=8; const int
我知道 Caffe 使用通用矩阵到矩阵乘法 (GEMM),它是基本线性代数子程序 (BLAS) 库的一部分,用于执行卷积运算。其中卷积转换为矩阵乘法运算。我引用了下面的文章。 https://pete
将两个 data-mapped matrices (Eigen::Map) 相乘时我注意到显着的性能差异取决于内存的分配方式。使用来自自定义分配的内存时,与使用来自 std::vector 的(也对齐
我是一名优秀的程序员,十分优秀!