论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication

这篇具有很好参考价值的文章主要介绍了论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矩阵乘法优化的知名论文goto paper:

矩阵乘法的优化需要将矩阵切分成子矩阵,用子矩阵相乘的结果组合为原矩阵相乘的结果:

论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

上图是拆分矩阵的方法,M表示矩阵,X方向和Y方向的两个维度都是未知的。P表示横条或竖条,X方向或Y方向有一个方向的维度是极小的。B表示block块,X方向和Y方向的两个维度都是极小的。

为了减小单个子矩阵计算量,要拆开A的整行和B的整列。不能让A的整行B的整列作为子矩阵放入缓存进行计算。因此下图中第二列的Fig8和Fig10拆得最好,把A按列拆,使A的行不再完整,把B按行拆,使B的列不再完整。

下图是拆分矩阵后矩阵相乘的优化方法:

论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

图中每列算法的含义:
第一列是 Matrix += Matrix * Matrix,就是矩阵乘加C += A * B。
第二列,(只讨论图8和图10,别的图不一样)是把 A 拆成多列、B 拆成多行,每次得到 与C尺寸相同的薄片,多层叠加得到完整的 C。
第三列是 更细致的拆分选择,A 的一列乘以 B 的一行,对于A 的一列乘以 B 的一行这一过程:

在第三列,Fig.8是把 A 的一列先拆成M个block,再将每个block(第i个)依次和 B 行相乘,相乘的结果是得到一个片(尺寸与C的子矩阵Ci相同),多个片叠加起来得到C矩阵;

                                               论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

在第三列,Fig.10是把 B 行拆成N个 block,再将每个block(第j个)依次被 A 乘,也是A列乘B行,得到C的一个片(尺寸与C的子矩阵Cj相同),再将C的多个片叠加得到C: 

                                                论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

第四列和第三列的含义类似。

在第四列,Fig.8一个block乘以一行,共N个block。由于要放到register里,要减少数据的大小。必然行切成更小的slice;即把B竖着切成小块放进寄存器:

                                                论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

在第四列,Fig.10含义类似,把A横着切成小块放进寄存器。共M个block:

                                                论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

Fig.8在第四列处理竖着的小slice时,列主序是内存连续的,但行主序不连续。因此Fig.8更适合列主序。同理,此Fig.10更适合行主序。

 论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

因此最终结论是:列主序用Fig.8最优,因为竖着切;行主序用Fig.10最优,因为横着切。

对于Fig8的GEBP计算:

                                                   论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication,论文阅读,矩阵,线性代数

如下 5 个前提都满足的情况下,理想的GEBP的计算过程和开销是怎么样的?

(前 3 个前提不考虑内存和寄存器存储结构中的 TLB,假设只有 内存、cache 和 ALU :)

  1. mc * kc 要小,小到 『 A + B的 nr 列 + C 的 nr 列 』能够一起塞进 cache
  2. 如果 1. 被满足,CPU 计算时不再受内存速度的限制,即得到的gflops值就是真实的计算能力
  3. A 或 A 的分块只会被加载进 Cache 一次,gemm过程中不会被换入又换出

(后 2 个前提要考虑 TLB,因为 TLB miss 会 stall CPU:)
      4. mc 和 kc 要小,小到 『 A + B的 nr 列 + C 的 nr 列 』能够被 TLB 索引,即一定是小于 L2 cache 的。
      5. A 或 A 的分块只被加载到 L2 cache 一次

因为Fig.8用的就是GEBP,所以想要高性能(高gflops)就得满足上面 5 个前提。落到实处上就是如下4个参数限制,这些限制也是 OpenBLAS level3.c循环里写一堆if-else的理论根源:文章来源地址https://www.toymoban.com/news/detail-601479.html

  1. mc ≈ kc
  2. nr ≥ (Rcomp / 2 / Rload),其中 Rcomp 是算力、Rload 是 L2 cache 到 register 的带宽
  3. mc * kc ≤ K
  4. mc * kc 只能占 cache 的一半

到了这里,关于论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

    黎明灰烬 博客 技术 杂谈 标签 关于 通用矩阵乘(GEMM)优化算法 黎明灰烬 • 2019-06-12 | 知乎 | 幻灯片 | 点击查看目录 引言 气象预报、石油勘探、核子物理等现代科学技术大多依赖计算机的计算模拟,模拟计算的核心是表示状态转移的矩阵计算。另一方面,计算机图形处理以

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

    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日
    浏览(43)
  • 混合输入矩阵乘法的性能优化

    作者 |  Manish Gupta OneFlow编译 翻译|宛子琳、杨婷 AI驱动的技术正逐渐融入人们日常生活的各个角落,有望提高人们获取知识的能力,并提升整体生产效率。语言大模型(LLM)正是这些应用的核心。LLM对内存的需求很高,通常需要专用的硬件加速器,以高效地提供数百亿亿次

    2024年03月11日
    浏览(63)
  • 论文阅读,ProtoGen: Automatically Generating Directory Cache Coherence Protocols(三)

    目录 一、Article:文献出处(方便再次搜索) (1)作者 (2)文献题目 (3)文献时间 (4)引用 二、Data:文献数据(总结归纳,方便理解) (1)背景介绍 (2)目的 (3)结论 (4)主要实现手段 4.1 系统模型和定义 4.2 ProtoGen概述 4.3 ProtoGen的输入,输出和限制 4.4 ProtoGen示例

    2024年02月19日
    浏览(37)
  • 高性能计算的矩阵乘法优化 - Python + OpenMP实现

    关于上一节读者某些疑问 :为什么你用进程并行不是线程并行? 回答 :由于Python解释器有GIL(全局解释器锁),在单进程的解释器上有线程安全锁,也就是说每次只能一个线程访问解释器,因此Python在语法上的多线程(multithreads)实现是不会提高并行性能的。 这一点和C

    2024年02月15日
    浏览(69)
  • 高性能计算的矩阵乘法优化 - Python +MPI的实现

    本次实验的目的是使用MPI的并行性来进行矩阵乘法优化,本人使用 Python 实现 实验硬件: CPU :AMD Ryzen 7 5800H(3.20 GHz) 内存 :32GB (3200MHz) 要求 :使用一个矩阵,一个向量相乘,分别用单进程和多进程的mpi接口实现。 全局的规模参数是 Scale 数据示例 : 当 Scale=5 时,数据示例如

    2023年04月22日
    浏览(103)
  • 高性能计算实验——矩阵乘法基于MPI的并行实现及优化

    熟练掌握MPI编程方法,并将通用矩阵乘法转为MPI并行实现,进一步加深MPI的使用与理解。 进一步熟悉MPI矩阵乘法的实现,学习MPI点对点通信与集合通信的异同点和各自的优缺点,学会比较二者的性能以及各自使用的情形。 学习如何将自己编写的代码改造为标准库函数,供其

    2024年02月03日
    浏览(55)
  • FPGA HLS Matrix_MUL 矩阵乘法的计算与优化

    设置clock,10表示一个周期10ns,带宽100M vivado工具比较保守,计算需要的延迟是14,实际优化可以在10,设置大一点,优化的计算更多,一般约束设置大一点在30-50 选择开发板 xc7z020clg400-1 Source:描述功能模块的cpp和h代码 Test Bench:测试代码的 main.cpp matrix_mul.h #ifndef __xxxx__ #def

    2024年02月09日
    浏览(48)
  • GEMM优化、并行优化、算子优化,从BLISlab项目入手! GEMM重要且典型

    BLISlab 是一个开源教学项目,提供了完整的代码范例和测试脚本教人如何一步步优化矩阵乘法。为此, 张先轶(中科院博士,OpenBLAS国际知名开源项目发起人) 录制了一个公开课系列,基于BLISlab项目给大家系统讲解GEMM优化。  视频三连发,您能不能也三连发?“点赞--转发

    2023年04月22日
    浏览(48)
  • 最优化方法——最小二乘法与梯度下降法

    目录 系列文章目录 一、问题 二、实验思路综述 1.实验工具及算法 2.实验数据 3.实验目标 4.实验步骤 三、最小二乘问题引入 1.最小二乘问题样例 2.最小二乘问题解决方案及数学模型化 3.相关线性代数知识导入 3.1 梯度 3.2 矩阵的逆 3.3 QR分解 四、最小二乘法 1.定义 2.数学模型化

    2024年02月01日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包