矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵

这篇具有很好参考价值的文章主要介绍了矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 论文自然还是 Anatomy of High-Performance Matrix Multiplication。

如何拆分

一个矩阵乘法有 6 种拆分方式,其中对 row-major 效率最高的是:

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵,矩阵,线性代数,c++

第一次拆分

先做第一次拆分,取 A 的 kc 列(PanelA)和 B 的 kc 行(PanelB),得到待累加的一部分结果;

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵,矩阵,线性代数,c++

第二次拆分

第二次拆分,把 PanelB 按 nc 大小切分成多个 BlockB,分别与 PanelA 相乘;

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵,矩阵,线性代数,c++

第三次拆分

最后一次切分,把 PanelA 按 mr 大小切分,与 BlockB 乘(注意具体代码里的kernel4x4或者kernel8x8是指 mr 的大小)。

GEPB 约束条件

我们考察最后一次 GEPB 的切分过程,如何使其性能最高?

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵,矩阵,线性代数,c++

GEPB参数

以上是 GEPB 的参数,如果这个运算所需数据都加载到 L1 cache 里,那计算效率自然是最高的。此时运算 ops 为 2∗m∗kc∗nc ,同时做的数据搬运量为 kc∗nc+m(kc+2nc) ,我们期望做最小的 io 产生最大的计算,即

max(2∗m∗kc∗nc/(kc∗nc+m(kc+2nc)))

由于 nc 远小于 m,上式约等于

maximize(2∗kc∗nc/(kc+2∗nc))

可以得到以下约束/倾向:

约束1: maximize(2∗kc∗nc/(kc+2∗nc))

约束2:kc*nc 越大效果越好

Cache 层级分配

由于 L1Cache 通常比较小,不太可能得到比较大的 kc∗nc kc∗nc 值,是否可能把 BlockB 放到 L2Cache 里,尽量让 kc∗nc 最大?已知 GEPB 计算的伪代码为

Load PanelB into cache
for j = 0...M-1
  Load Aj into cache
  Load Cj into cache
  subkernel_calculation
  Store Cj
endfor

循环里每次取 PanelA 的 mr 行做计算,每次计算的时间开销为

2∗mr∗kc∗nc/cpu_frequency

假设 PanelB 放入了 L2Cache,每次加载需要的时间为
kc∗nc/l2cache_speed

计算时间要大于加载时间,才能防止 CPU 等待 IO 从而让 CPU ALU 跑满,代入上式可得到约束条件

约束3:mr≥cpu_frequency/(l2cache_speed∗2)

因为计算用的数据都在 L1Cache,所以每次从 PanelA 加载的 nr 行不宜超过 L1Cache大小。同时计算结果 C 也需要空间,可以得到

约束4: mr∗kc≤l1_cachesize/2

当数据全放到了 L1Cache 里计算时,每次是用 kernel4x4 还是 kernel8x8,取决于 CPU 有多少寄存器。一般是尽可能利用所有 reg。可以得到

约束5:nr kr 的选择完全看寄存器情况

  • 需要一半的寄存器存结果
  • nr 和 kr 接近,效果最佳
  • armv8 浮点一般是 、8x8

来自 TLB 的约束

我们知道计算机存储结构长这个样子

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵,矩阵,线性代数,c++

计算机存储结构

上文说到要把 BlockB 放到 L2Cache,随着 ALU 的计算不断加载到 L1Cache。实际上两个 Cache 中间还隔着个 TLB,因此要考虑 TLB 寻址空间的限制。L1Cache miss 可以用 prefetch 指令处理掉,TLB miss 会真的 stall CPU,影响 ALU 利用率。

Cache 寻址空间(256K)一般小于 L2Cache 大小(2M),因此有

约束6: GEPB内循环一次计算所需数据总大小( 的行的行BlockB+A的mr行+C的mr行 )不能超过 TLB 寻址空间

约束7:计算数据要 Packing,防止 TLB miss

总结一下行主序 GEMM 分块的参数选择

mr、nr 和 kr 如何取值

  1. 尽可能是个正方形,尽量用满寄存器
  2. 约束3 限制了 mr 的最小值

kc 的取值

  1. nc*kc 尽可能大,但不能大过 TLB 寻址空间的一半
  2. kc 不超过 l1_cachesize/2/mr ,其中 mr 已在上文选取
  3. 按经验是页表大小的一半,即 pagesize/2

nc 的取值

nc=kc ,参见约束1

mc 的取值

mc∗k<l2_cachesize 我们期望 A 尽可能放到 L2Cache 里面

就已知的情况来看,fp32 GEMM 极限可达到 10-11 gflops 左右(即 CPU 峰值的 80+%,packA 和 packB 开销跟着矩阵形状走大约是20%),结合具体的任务,例如 2D 卷积、全连接,可以做到 90% 左右。文章来源地址https://www.toymoban.com/news/detail-859509.html

到了这里,关于矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数 --- 矩阵与向量的乘法

    矩阵x向量(注:可以把列向量看成是nx1的矩阵)         现有如下方程组:  9个系数,3个未知数,等式右边有3个数         上述方程组可用矩阵的方式改写成,一个系数矩阵A与一个未知数向量x的乘积,乘积的结果等于右端向量b: 现在我们分别用两种方法,行乘和

    2024年02月05日
    浏览(73)
  • 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

    目录 加减 数乘  矩阵与矩阵相乘  矩阵的幂 矩阵转置  方阵的行列式  方阵的行列式,证明:|AB| = |A| |B|        

    2024年01月22日
    浏览(50)
  • 线性代数矩阵乘法中的行向量和列向量

    在矩阵中有两个概念,行向量与列向量,这是从两个不同的角度看待矩阵的组成。这篇文章将从 行向量 和 列向量 两个角度来分解 矩阵的乘法 。 假设有两个矩阵 A 和 B 一般矩阵的乘法分解 简单的理解就是A矩阵的第一行与B矩阵的第一列逐元素相乘,就是 结果矩阵 的左上角

    2024年02月11日
    浏览(45)
  • <3>【深度学习 × PyTorch】必会 线性代数 (含详细分析):点积 | 矩阵-向量积 | Hadamard积 | 矩阵乘法 | 范数/矩阵范数

      拍照的意义在于你按下快门的那一刻,万里山河的一瞬间变成了永恒。   🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[3] 阿里云社区特邀专家博主🏅   🏆[4] CSDN-人工智能领域

    2024年02月05日
    浏览(54)
  • 线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

    本系列文章将从下面不同角度解析线性代数的本质,本文是本系列第二篇 向量究竟是什么? 向量的线性组合,基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵,列空间,秩与零空间 克莱姆法则 非方阵 点积与对偶性 叉积 以线性

    2024年02月02日
    浏览(52)
  • 第一百二十一天学习记录:线性代数:矩阵乘法运算(宋浩板书)

    在编程和学习数据结构的过程中,发现有些算法会用到矩阵和矩阵的乘法运算,因此先将这一个知识点学习一下。 乘法☆ 总结三条不满足

    2024年02月13日
    浏览(40)
  • 【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

    如果你进行的矩阵乘法涉及一个线性方程组 Ax = b,并且你乘以一个可逆矩阵 M,且产生新的方程组 M(Ax) = Mb,那么这两个系统是等价的;它们具有相同的解集。这是因为可逆矩阵的乘法可以视为一个可逆的线性变换,不会改变方程解的存在性或唯一性。 换句话说,如果你将原

    2024年02月03日
    浏览(58)
  • 矩阵乘法优化:4x4矩阵块优化方法

    MMult_4x4_3.h 一次计算C中的4x4小块 0.24gflops 2.1% 1 MMult_4x4_4.h 一次计算C中的4x4小块 0.24gflops 2.1% 1 MMult_4x4_5.h 一次计算C中的4x4小块,将16个循环合并一个 0.25gflops 2.2% 1 MMult_4x4_6.h 一次计算C中的4x4小块(我们在寄存器中累加C的元素,并对a的元素使用寄存器) 1.75gflops 16.0% 1 MMult_4x4_7.h 在

    2024年02月15日
    浏览(49)
  • 矩阵乘法优化:1x4矩阵块的各种优化方法

    文件名 优化方法 gFLOPs 峰值占比 线程数 MMult1.h 无任何优化 0.24gflops 2.1% 1 MMult2.h 一次计算4个元素 0.24gflops 2.1% 1 MMult_1x4_3.h 一次计算4个元素 0.24gflops 2.1% 1 MMult_1x4_4.h 一次计算4个元素 0.24gflops 2.1% 1 MMult_1x4_5.h 一次计算4个元素(将4个循环合并为1个) 0.25gflops 2.2% 1 MMult_1x4_7.h 一次计

    2024年02月15日
    浏览(49)
  • 矩阵乘法与优化

    0 1 1 1 这是一个矩阵,那么我要让它乘以一个这样的矩阵 1 0 0 1 那么它的结果就是 0 1 1 1 如果乘以它自身,那么它的结果就是 1 1 1 2 那么矩阵乘法的公式就应该是 (此图为网图,侵权可以私信我) 可以发现,矩阵乘法的 右 单位元应该是 1 0 0 0 1 0 0 0 1 后面的以此类推 因为对于当

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包