通用矩阵乘(GEMM)优化与卷积计算

本文简要介绍通用矩阵乘(GEMM,General Matrix Multiplication)优化的基本概念和方法、神经网络量化中矩阵乘的优化方法。

通用矩阵乘优化

基本概念

通用矩阵乘(下文简称 GEMM)的一般形式是 = C=AB, 其中 A 和 B 涵盖了各自转置的含义。图一是矩阵乘计算中为计算一个输出点所要使用的输入数据。三个矩阵的形状也如图所示。

与之相对应的伪代码表示为:

for (int m = 0; m < M; m++) {
  for (int n = 0; n < N; n++) {
    C[m][n] = 0;
    for (int k = 0; k < K; k++) {
      C[m][n] += A[m][k] * B[k][n];
    }
  }
}

对这样的矩阵乘的算法优化可分为两类:

  • 基于算法分析的方法:根据矩阵乘计算特性,从数学角度优化,典型的算法包括  Strassen 算法和  Coppersmith–Winograd 算法。
  • 基于软件优化的方法:根据计算机存储系统的层次结构特性,选择性地调整计算顺序,主要有循环拆分向量化、内存重排等。

下面将简要介绍几种典型的方法。

算法分析可知,朴素的矩阵乘算法的时间复杂度为 O(n3) 。在很长的时间内,人们认为矩阵乘在算法层面是无法优化的,而自  Strassen 算法伊始,复杂度边界便被不断降低,如图一。目前最快的方法是  Coppersmith–Winograd 算法。

 

  How to optimize gemm 的优化效果

for (int m = 0; m < M; m++) {
  for (int n = 0; n < N; n += 4) {
    C[m][n + 0] = 0;
    C[m][n + 1] = 0;
    C[m][n + 2] = 0;
    C[m][n + 3] = 0;
    for (int k = 0; k < K; k++) {
      C[m][n + 0] += A[m][k] * B[k][n + 0];
      C[m][n + 1] += A[m][k] * B[k][n + 1];
      C[m][n + 2] += A[m][k] * B[k][n + 2];
      C[m][n + 3] += A[m][k] * B[k][n + 3];
    }
  }
}

 

 

for (int m = 0; m < M; m += 4) {
  for (int n = 0; n < N; n += 4) {
    C[m + 0][n + 0..3] = 0;
    C[m + 1][n + 0..3] = 0;
    C[m + 2][n + 0..3] = 0;
    C[m + 3][n + 0..3] = 0;
    for (int k = 0; k < K; k++) {
      C[m + 0][n + 0..3] += A[m + 0][k] * B[k][n + 0..3];
      C[m + 1][n + 0..3] += A[m + 1][k] * B[k][n + 0..3];
      C[m + 2][n + 0..3] += A[m + 2][k] * B[k][n + 0..3];
      C[m + 3][n + 0..3] += A[m + 3][k] * B[k][n + 0..3];
    }
  }
}

 

for (int m = 0; m < M; m += 4) {
  for (int n = 0; n < N; n += 4) {
    C[m + 0..3][n + 0..3] = 0;
    C[m + 0..3][n + 0..3] = 0;
    C[m + 0..3][n + 0..3] = 0;
    C[m + 0..3][n + 0..3] = 0;
    for (int k = 0; k < K; k += 4) {
      C[m + 0..3][n + 0..3] += A[m + 0..3][k + 0] * B[k + 0][n + 0..3];
      C[m + 0..3][n + 0..3] += A[m + 0..3][k + 1] * B[k + 1][n + 0..3];
      C[m + 0..3][n + 0..3] += A[m + 0..3][k + 2] * B[k + 2][n + 0..3];
      C[m + 0..3][n + 0..3] += A[m + 0..3][k + 3] * B[k + 3][n + 0..3];
    }
  }
}

 

 

 

 

for (int mo = 0; mo < M; mo += 8) {
  for (int no = 0; no < N; no += 8) {
    for (int mi = 0; mi < 2;mi ++) {
      for (int ni = 0; ni < 2; ni++) {
        int m = mo + mi * 4;
        int n = no + ni * 4;
        C[m + 0..3][n + 0..3] = 0;
        C[m + 0..3][n + 0..3] = 0;
        C[m + 0..3][n + 0..3] = 0;
        C[m + 0..3][n + 0..3] = 0;
        for (int k = 0; k < K; k += 4) {
          C[m + 0..3][n + 0..3] += A[m + 0..3][k + 0] * B[k + 0][n + 0..3];
          C[m + 0..3][n + 0..3] += A[m + 0..3][k + 1] * B[k + 1][n + 0..3];
          C[m + 0..3][n + 0..3] += A[m + 0..3][k + 2] * B[k + 2][n + 0..3];
          C[m + 0..3][n + 0..3] += A[m + 0..3][k + 3] * B[k + 3][n + 0..3];
        }
      }
    }
  }
}

 

神经网络量化中的矩阵乘优化

前两节探讨的是传统优化矩阵乘的两者思想,近年来兴起的神经网络中广泛应用的矩阵乘也可用类似方法优化(实际上深度学习软件可以直接使用已有的数学加速库,如 BLAS)。随着技术的演进,神经网络技术出现了一个重要的方向—— 神经网络量化。量化技术的出现使得我们可以在深度学习领域使用一些特别的方法来优化矩阵乘,例如  QNNPACK (Quantized Neural Network PACKage) 和  Gemmlowp (GEMM Low Precision) 加速库。本节以 QNNPACK 为例介绍相关的技术。

QNNPACK 是 Facebook 开源的专门用于量化神经网络的计算加速库。QNNPACK 和  NNPACK (Neural Network PACKage) 的作者都是  Marat Dukhan 。到目前为止(2019 年中),QNNPACK 是已公开的,用于移动端(手机)的,性能最优的量化神经网络加速库。

QNNPACK 开源时附带了一份 技术报告性质的博客。本节将结合上节的内容简要地从博客原作中抽取一些关于 GEMM 的内容。

量化神经网络

神经网络计算一般都是以单精度浮点(Floating-point 32, FP32)为基础。而网络算法的发展使得神经网络对计算和内存的要求越来越大,以至于移动设备根本无法承受。为了提升计算速度,量化(Quantization)被引入到神经网络中,主流的方法是将神经网络算法中的权重参数和计算都从 FP32 转换为 INT8 。

两种数值表示方法的方程如上。如果对量化技术的基本原理感兴趣,可以参考 神经网络量化简介。

应用量化技术后,计算方面显现了若干个新的问题。首先是 NNPACK 这样用于 FP32 的计算加速库无法用于 INT8 ,这导致我们需要新的加速计算方法。再者是输入输出都转化成 INT8 后,内存带宽需求直接下降为 14 。随之而来的内存容量需求变化出现了一些新的优化机会。而 QNNPACK 充分利用了这些优化方法,并结合神经网络领域的特点,大幅改进了计算性能。

 

 

内存布局与卷积性能

神经网络中卷积的内存布局主要有 NCHW 和 NHWC 两种。最后重点分析一下 im2col 1×1 卷积性能和内存布局的关系。

对于不需要额外调整输入的 1×1 卷积,将 NCHW 内存布局的卷积对应到矩阵乘 = 时, 是卷积核(filter), 是输入(input)。各个矩阵的维度如图十二所示。

图十二:NCHW 内存布局卷积转换成的矩阵乘

对该矩阵施行划分后,将计算核的访存局部性表现标记在图十二中。其中 Inside 表示小块矩阵乘内部的局部性,Outside 表示在削减维度方向的局部性。

对输出而言,小块内向量化访存局部性较差,外部表现取决于全局计算方向——行优先则局部性较好,列优先则较差。由于卷积核可以事先重排内存,因此视其局部性都较好。输入则小块内外都较差,因为削减维度是列优先的,几乎每次加载输入都会发生高速缓存缺失。

图十三是与之相对的 NHWC 内存布局的示例。值得注意的是,NHWC 和 NCHW 中 、 矩阵所代表的张量发生了调换—— = × 。具体的拆分方式仍然一样。

图十三:NHWC 内存布局卷积转换成的矩阵乘

在 NHWC 中,输出的局部性表现和 NCHW 一样。同样的,卷积核也视作局部性表现较好。对于输入,小方块的内部局部性表现不是很好,因为几次向量加载的地址不连续;而外部局部性表现则较好,因为在削减维度滑动使用的内存是连续的——这一点在「处理内存布局」小节中已有阐述。

可以看到,对于 1×1如果采用 im2col 方法计算,且不对输入输出进行额外的内存重排,那么 NHWC 的访存特征是显著优于 NCHW 的。

总结

至此,本文介绍了 GEMM 优化的基本方法概念,在神经网络领域中 QNNPACK 基于量化对 GEMM 的优化,和 im2col 方法对卷积计算及其内存布局的意义。GEMM 优化实质上是个非常重要,且和特定领域绑定很强的话题,更进一步的内容需要进入到特定领域深入研究。如果对 GEMM 各种优化技巧所带来的性能收益感兴趣,可以参考  How to optimize gemm。如果对 GEMM 优化和体系结构结合的理论感兴趣,可以参考  Anatomy of High-Performance Matrix Multiplication 。

参考

  • How to optimize gemm
  • QNNPACK
  • Anatomy of High-Performance Matrix Multiplication
  • Convolution in Caffe

 

小伟db
关注 关注
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GEMM矩阵相乘与深度学习
weixin_43728590的博客
07-08 4409
GEMM矩阵相乘与深度学习1. GEMM矩阵相乘1.1 GEMM算法基础1.2 GEMM算法优化1.2.1 循环重排充分利用缓存1.2.2 平铺(Tiling)充分利用缓存1.2.3 展开(Unrolling)1.2.4 内存对齐1.2.5 向量化1.2.6 矩阵分块1.2.7 双缓冲2. GEMM与卷积计算2.1 计算卷积的方法2.2 Img2col2.2.1 CNN中张量的存储2.2.2 卷积运算转化为GEMM 1. GEMM矩阵相乘 1.1 GEMM算法基础   GEMM(General Matrix
优先关系矩阵_通用矩阵乘法GEMM实现与优化
weixin_42467224的博客
12-31 1161
通用矩阵乘(General Matrix Multiplication,简称gemm)是深度学习框架的核心计算单元之一,广泛用于Convolution、Full connection、Matmul等算子实现。GEMM示意图上图中,LHS(left hand side)代表左矩阵,RHS代表右矩阵,[M, K]*[K, N],输出矩阵维度为[M, N]。卷积算子的计算方式通常使用im2col的方法转...
GEMM算法优化流程详解
热门推荐
独行侠
02-16 2万+
前言 神经网络前向耗时主要由卷积的耗时决定,参考賈杨青毕业论文,那么如何对卷积加速便成了重要的一个点,主流的加速方法有 以下几种: im2col+GEMM:目前几乎所有的主流计算框架包括 Caffe, MXNet 等都实现了该方法. 该方法把整个卷积过程转化成了GEMM过程,而GEMM在各种 BLAS 库中都是被极致优化的,一般来说,速度较快。 Winograd: Winograd 是存在...
CUDA算子优化矩阵GEMM优化(二)
最新发布
qq_56047026的博客
06-13 1102
A_TILE_ROW_START代表在这个维度为bm*bk的数据块中,当前线程需要搬运的数据的竖向坐标,而A_TILE_COL代表需要搬运的数据的横向坐标。那么我们需要开启(2048/128)*(2048/128)=256个block,每个block里面有(128/8)*(128/8)=256个线程,每个线程需要负责计算C矩阵中8*8=64个元素的结果,每个block负责256*64=16384个元素的结果。在一轮迭代中需要使用bm*bk的数据,为了加快后续的访存,所以需要进行一次转置。
e-a乘a的转置的秩_通用矩阵乘(GEMM)优化卷积计算
weixin_39975486的博客
10-19 1259
GEMM 主题文章写了两版,这是第一版,第二版参见我的博客。采用知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可授权,转载请注明出处。引言气象预报、石油勘探、核子物理等现代科学技术大多依赖计算机的计算模拟,模拟计算的核心是表示状态转移的矩阵计算。另一方面,计算机图形处理以及近年来兴起的深度学习也和矩阵乘高度相关。而矩阵乘对计算资源消耗较大,除了计算机体系结构的不断更新外,软件优化方面也有大...
GEMM优化、并行优化、算子优化,从BLISlab项目入手!
weixin_45571628的博客
08-22 2776
GEMM优化在深度学习、科学计算等领域都有重要意义,本文通过视频、文字、转载等各种方式,让你对gemm有一个系统的、全面的、深入的认识。
如何在CPU上优化GEMM矩阵乘法
吴建明wujianming_110117
11-16 651
如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法算法的实现组织(所谓的调度)。通常,在高性能调度中编写算法会破坏算法的可读性和模块化。此外,尝试各种看似有希望的调度也很耗时。在 TVM 的帮助下,可以有效地尝试这些调度以提高性能。 在本文中,将演示如何使用 TVM 优化方阵乘法,通过简单地添加 18 行额外代码实现比基线快 200 倍。 在 CPU 上执行的密集计算应用程序有两个重要的优化:  提高内存
MIOpenGEMM_OpencL_GPU_GEMM_amd_
09-29
MIOpenGEMM,全称为MIOPEN General Matrix Multiply,是AMD公司为优化GPU计算性能而开发的一个开源库,专用于加速通用矩阵乘法(GEMM)操作。在深度学习领域,GEMM是最基础且关键的运算单元,它构成了卷积神经网络...
GGCN:基于GPU的高光谱图像分类算法
02-03
提出基于通用矩阵乘法(GEMM)算法的GGCN(GPU based Cube-CNN improved by GEMM)并行加速算法,通过G-PNPE(GEMM based Parallel Neighbor Pixels Extraction)对输入数据和卷积核进行重新组织排列,实现卷积的并行计算,...
GEMM算法优化
11-11
GEMM算法优化库,支持自调优,能够运行在Linux和Windows平台,可以获得很高的矩阵乘加速性能。
im2col函数1
08-04
- im2col后的矩阵卷积矩阵进行通用矩阵乘法(GEMM),得到的矩阵即为卷积后的特征映射。 - 多个卷积核对应于多个特征映射,每个卷积核产生的结果按通道顺序连续存储,形成最终的特征映射矩阵。 4. **多kernel...
基于卷积神经网络的GFW加速调度算法(2019-09-16_19-19_read)1
08-04
传统的卷积计算方法如通用矩阵乘法(GEMM)、快速傅里叶变换(FFT)以及Winograd算法,虽然在一定程度上提高了计算效率,但在面对不同规模和配置的卷积层时,它们的表现并不总是最优的。 GFW加速调度算法的提出,旨在...
基于FPGA的快速樱桃缺陷检测与识别系统设计.pdf
07-13
为了提高系统效率,文章提出优化数据传输、复用网络模型中的通用矩阵乘法函数(GEMM)和对卷积操作进行并行化设计等方法来实现PL端硬件加速。使用SDSoC平台,在PS端利用高级语言映射CNN模型,实现了性能提升和开发...
GEMM优化(RISC-V平台)
ZhaoDongyu_AK47的博客
02-27 1380
本项目记录了在riscv平台上优化SGEMM(单精度浮点通用矩阵乘法)的过程。 通用矩阵乘(General Matrix Multiplication,简称gemm)是深度学习框架的核心计算单元之一,广泛用于Convolution、Full connection、Matmul等算子实现。
什么是GEMM
xfysq_的博客
04-19 693
GEMM
如何加速矩阵乘法——优化GEMM (CPU单线程篇)
sinat_22510827的博客
07-22 5513
矩阵乘法GEMM(Generalmatrixmultiply)是一个被广泛使用的基础算法,各种领域都需要应用,例如神经网络的核心计算任务就是矩阵乘法,交易中的各种信号计算也可能用到矩阵乘法。因此矩阵乘法的效率是极其关键的。关于如何优化矩阵乘法,我准备写一个较短的系列博文,包括CPU单线程篇、CPU多线程篇、GPU篇。原本计划还有一个稀疏矩阵乘法篇,由于这学期毕业前也没有时间把GPU篇做到满意,因此,稀疏矩阵篇就没了,GPU篇也很不完整。如果日后有时间且有那冲动可能会补上(大概率没有)。...
MKL 函数cblas_?gemm参数分析
u013806541的博客
04-03 3613
参考链接:https://software.intel.com/en-us/node/520775 函数原型: void cblas_sgemm (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, constCBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, cons
卷积神经网络矩阵计算方法
04-28
卷积神经网络(CNN)是一种深度学习模型,它广泛用于计算机视觉任务中,例如图像分类、目标检测和语义分割等。CNN 的核心计算卷积操作,而卷积操作可以通过矩阵乘法来实现。 卷积操作可以看作是一个滑动窗口,在输入图像上滑动并对窗口中的数据进行加权求和,得到输出特征图。为了实现卷积操作的矩阵计算方法,需要将输入数据和卷积核转换成矩阵形式。具体来说,将输入数据分解成一个列向量,然后以一定的步幅将列向量重新排列成一个矩阵。同样地,将卷积核也转换为一个矩阵。然后对这两个矩阵进行矩阵乘法,并将结果重塑为输出特征图的形状。 在实际应用中,由于输入数据和卷积核的维度通常较大,因此需要采用一些优化技巧来提高计算效率,例如 im2col 和 GEMM 等。这些技巧可以使得卷积神经网络在计算机上高效地运行。
写文章

热门文章

  • git错误The TLS connection was non-properly terminated解决 17466
  • Python随机函数random用法介绍 16155
  • 挂载问题 mount: unknown filesystem type ‘(null)‘解决 10754
  • 解决 docker 容器无法通过 IP 访问宿主机问题 9736
  • icmp简介 8302

分类专栏

  • gan
  • 推荐系统 1篇
  • 数据结构与算法 5篇
  • web,网络安全 1篇
  • 服务器 6篇
  • 算法 9篇
  • 网络编程 4篇
  • python 1篇
  • a 1篇
  • ai 3篇

最新评论

  • 报错 OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.

    starman584: 这有啥看不懂的,Ubuntu设置环境变量的命令

  • 报错 OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.

    慕溪同学: 你能看懂这个解决方案啊

  • 报错信息ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found (required by............)

    1pinkman: 按方案一全部走下来,还是不行。方案二anaconda3/lib目录找不到

  • Linux安装tmux

    qq_21042919: 安装tmux时的prefix是不是多打了一个“bin”,导致最终的tmux的路径是在$HOME/.local/bin/bin下,与2.2.3配置环境变量中的~/.bash_profile的内容不一致。

  • pytorch学习: 构建网络模型的几种方法 + BN层底层实现思路 + 六大学习率调整策略

    qq_31139891: 请问一下 如果总层数过多 20-30层 一层层单独写 太麻烦 可以用for 循环直接添加层堆起来嘛 子类写法怎么写 请问?

大家在看

  • Oracle(74)如何避免全表扫描?
  • 通义千问( 五 ) 图片分析
  • 【MySQL 07】表的增删查改 (带思维导图) 734
  • electron 官网速通 692
  • 【人工智能时代】- 深度解析AI大语言模型(LLM)在企业应用的关键技术与典型架构 406

最新文章

  • 获取.so文件中的符号
  • Stable Diffusion 原理介绍与源码分析(二、DDPM、DDIM、PLMS算法分析)
  • async 运行多线程时报错RuntimeError: There is no current event loop in thread ‘Thread-2(webui中也遇到)
2023年35篇
2022年37篇
2021年100篇
2020年86篇
2019年71篇
2018年9篇
2017年19篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码塘坑seo网站推广广州网站优化推广南山seo排名松岗模板制作双龙seo排名惠州网站排名优化大运百度网站优化排名大浪阿里店铺运营广州SEO按天收费平湖关键词排名包年推广爱联网站优化软件松岗百度seo福永网站推广东莞网站定制横岗外贸网站制作永湖优秀网站设计盐田百度标王盐田网站开发观澜seo网站推广大运SEO按天扣费石岩企业网站制作坑梓百搜标王南山建站东莞建设网站沙井网站seo优化坪山网站排名优化丹竹头百姓网标王推广爱联网络广告推广塘坑网站改版平湖网站推广工具歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化