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

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

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

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

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

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

图中每列算法的含义:
第一列是 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矩阵;

                                               

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

                                                

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

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

                                                

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

                                                

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

 

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

对于Fig8的GEBP计算:

                                                   

如下 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的理论根源:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端监控一vue指令实现埋点

前端监控一vue指令实现埋点 https://v2.vuejs.org/v2/guide/custom-directive.html 自定义指令 需要在main.js中执行 import Vue from vue // 自定义埋点指令 Vue.directive(track, {//钩子函数,只调用一次,指令第一次绑定到元素时调用。在这里可以…

Linux 下 nc 发送接收 udp、tcp数据

nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注:这种方式只能发…

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广,交流充电桩迎来了巨大的市场需求,人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩,充电桩和汽车之间只能通过CP信号进行通讯,判断、控制充电电流和状态。 汽车充电桩CP信号…

124.【SpringBoot 源码刨析C】

SpringBoot源码刨析C (三)、SpringBoot核心功能2.Web4.数据响应与内容协商(1).响应JSON(1.1)jackson.jarResponseBody(1.1.1)、返回值解析器(1.1.2)、返回值解析器原理 (1.2).SpringMVC到底支持哪些返回值(…

【STL】模拟实现简易 list

目录 1. 读源码 2. 框架搭建 3. list 的迭代器 4. list 的拷贝构造与赋值重载 拷贝构造 赋值重载 5. list 的常见重要接口实现 operator--() insert 接口 erase 接口 push_back 接口 push_front 接口 pop_back 接口 pop_front 接口 size 接口 clear 接口 别…

Window环境RabbitMq搭建部署

Erlang下载安装及配置环境变量 下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言Erlang编写的 Erlang下载 Erlang官网下载: http://www.erlang.org/downloads Erlang国内镜像下载(推荐): http://erlang.org/d…

旧版Xcode文件较大导致下载总是失败但又不能断点续传重新开始的解决方法

问题: 旧版mac下载旧版Xcode时需要进入https://developer.apple.com/download/all/?qxcode下载,但是下载这些文件需要登录。登录后下载中途很容易失败,失败后又必须重新下载。 解决方案: 下载这里面的内容都需要登录&#xff0…

Appium+python自动化(十九)- Monkey(猴子)参数(超详解)

前边几篇介绍了Monkey以及Monkey的事件&#xff0c;今天就给小伙伴们介绍和分享一下Monkey的参数。 首先我们看一下这幅图来大致了解一下&#xff1a; 1、Monkey 命令 基本参数介绍 -p <允许的包名列表> 用此参数指定一个或多个包。指定包之后&#xff0c;mon…

用html+javascript打造公文一键排版系统7:落款排版

一、公文落款的格式 公文落款包括单位署名和成文日期两个部分&#xff0c;其中成文日期中的数字 用阿拉伯数字将年、月、日标全&#xff0c;年份应标全称&#xff0c;月、日不编虚位&#xff08;即 1 不编为 01&#xff09;。 在实际应用工作中分为三种情况&#xff1a; &am…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

保护数字世界的壁垒

随着科技的不断发展和互联网的普及&#xff0c;我们的生活日益依赖于数字化的世界。然而&#xff0c;随之而来的是网络安全威胁的不断增加。网络攻击、数据泄露和身份盗窃等问题已经成为我们所面临的现实。因此&#xff0c;网络安全变得尤为重要&#xff0c;我们需要采取措施来…

什么是分布式操作系统?我们为什么需要分布式操作系统?

分布式操作系统是一种特殊的操作系统&#xff0c;本质上属于多机操作系统&#xff0c;是传统单机操作系统的发展和延伸。它是将一个计算机系统划分为多个独立的计算单元(或者也可称为节点)&#xff0c;这些节点被部署到每台计算机上&#xff0c;然后被网络连接起来&#xff0c;…

Win10环境下Android Studio中运行Flutter HelloWorld项目

一、引言 Android Studio是Android的官方IDE(Integrated Development Environment)。它专为Android而打造&#xff0c;可以加快开发速度&#xff0c;为Android设备构建最高品质的应用。 Flutter是Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开…

【STL】list用法试做_底层实现

目录 一&#xff0c;list 使用 1. list 文档介绍 2. 常见接口 1. list中的sort 2. list sort 与 vector sort效率对比 3. 关于迭代器失效 4. clear 二&#xff0c;list 实现 1.框架搭建 2. 迭代器类——核心框架 3. operator-> 实现 4. const——迭代…

【计算机网络 01】说在前面 信息服务 因特网 ISP RFC技术文档 边缘与核心 交换方式 定义与分类 网络性能指标 计算机网络体系结构 章节小结

第一章--概述 说在前面1.1 计算机网络 信息时代作用1.2 因特网概述1.3 三种交换方式1.4 计算机网络 定义与分类1.5 计算机网络的性能指标1.6 计算机网络体系结构1 常见的计算机网络体系结构2 计算机网络体系结构分层的必要性3 计算机网络体系结构分层思想举例4 计算机网络体系结…

RuntimeError: DataLoader worker (pid 2105929) is killed by signal: Killed.

PyTorch DataLoader num_workers Test - 加快速度 可以利用PyTorch DataLoader类的多进程功能来加快神经网络训练过程。 加快训练进程 为了加快训练过程&#xff0c;我们将利用DataLoader类的num_workers可选属性。 num_workers属性告诉DataLoader实例要使用多少个子进程进…

23.多项式与非多项式曲线拟合对比(matlab程序)

1.简述 拟合标准&#xff1a; (1)原始数据向量与拟合向量之间的距离最小&#xff0c;该距离的度量一般使用误差平方和表示&#xff0c;即均方误差&#xff1a;R||Q-Y||22 (2)当均方误差最小时&#xff0c;说明构造的拟合向量与原始向量最为接近&#xff0c;这种曲线拟合的方法…

git commit -m时候没有保存package.json等文件

项目场景&#xff1a; 提示&#xff1a;git add . 和 git commit -m "保存" 操作&#xff0c;没有保存package.json等文件。 解决方案&#xff1a; 1.确保 package.json 文件没有被列在 .gitignore 文件中。打开 .gitignore 文件&#xff0c;检查是否有类似于 packa…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…

4.2 Bootstrap HTML编码规范

文章目录 Bootstrap HTML编码规范语法HTML5 doctype语言属性IE 兼容模式字符编码引入 CSS 和 JavaScript 文件HTML5 spec links 实用为王属性顺序布尔&#xff08;boolean&#xff09;型属性减少标签的数量JavaScript 生成的标签 Bootstrap HTML编码规范 语法 用两个空格来代替…