资料介绍
作者:安平博,Xilinx高级工程师;来源:AI加速微信公众号
Schedule是和硬件体系结构相关的一些列优化,Halide在其文章中对其做了以下定义:
1 When and where should be the value at each coordinate in each function be computed?
2 Where should they be stored?
3 How long are values cached and communicated across multiple consumers, and when are they independently recomputed by each?
第一条是描述了数据计算顺序对性能的影响,第二条是数据的存储位置对性能影响,最后一条是多线程处理过程中,不同线程数据应该如何进行交互。
参考文章:https://zhuanlan.zhihu.com/p/94846767,常用的shcedule有:
1 cache_read
将数据存储到片上缓存,减少访问数据时间。
2 cache_write
将结果写入片上缓存,然后再写入片外缓存。当然这里的片上和片外并不是绝对的概念,也可以理解为不同层次的存储结构。
3 set_scope
为数据指定存储位置,相比于cache_read和cache_write提供了更灵活的指定数据存储方式。本质上是相同的。
4 storage_align
在我看的文章中,storage_align是针对GPU shared memory的一个优化,目的是为了减少同一个bank的访问冲突。在GPU中shared memory被分割成多个bank,这些bank可以被独立线程同时访问。Storage_align就是为了将数据和bank大小匹配,减少bank conflict的发生。AI芯片中也有类似的问题,只有尽量减少bank冲突的发生,才能最大化并行计算。
5 compute_at
不懂CUDA,所以对文章中的代码不是很理解,但是从其解释看,对于多次循环的计算(或者多维计算),可以通过并行计算来降维。
6 compute_inline
将独立操作转化为内联函数,有点类似FPGA上的流水线计算。转化成内联函数从上层层面减少了stage。在FPGA中也有类似问题,可以将具有相同迭代的多条指令放在一起执行。
7 compute_root
Compute_at的反操作。
8 fuse
将多个循环iter融合为一个iter。
9 split
Fuse的反操作,将一次循环迭代拆分为多次。
10 reorder
调整循环计算迭代顺序。
11 tile
Tile也是将循环迭代进行拆分,拆分多次计算。是split+reorder。
12 unroll
将循环展开,增加并发执行。
13 vectorize
将循环迭代替换成ramp,可以通过SIMD指令实现数据批量计算,也就是单指令多数据计算。这在AI加速中会很常用,每条指令都是多数据计算的。
14 bind
CUDA中使用的优化方法,将iter绑定到不同线程,实现并发计算。
15 parallel
实现多设备并行.
16 pragma
可以在代码中人为添加编译注释,人为干预编译优化。HLS中就是通过这样的方式来实现c的硬件编程的。
17 prefetch
将数据计算和load后者store数据重叠起来,在FPGA中是很常见优化方法。
18 tensorize
将tensor作为一个整体匹配硬件的计算核心,比如一个卷积运算就可以实现在FPGA上的一个匹配。
文章https://zhuanlan.zhihu.com/p/166551011 是通过官网的一个例子来介绍schedule的。在这个例子中,首先利用te的节点表达式建立了计算函数,然后调用create_schedule来创建schedule实例,然后再调用lower函数实现schedule优化。代码如下:
# declare a matrix element-wise multiply A = te.placeholder((m, n), nam) B = te.placeholder((m, n), nam) C = te.compute((m, n), lambda i, j: A[i, j] * B[i, j], nam) s = te.create_schedule([C.op]) # lower will transform the computation from definition to the real # callable function. With argument `simple_mode=True`, it will # return you a readable C like statement, we use it here to print the # schedule result. print(tvm.lower(s, [A, B, C], simple_mode=True))
我这里依然延续上一章的内容,看代码中关于schedule的处理。
在上一章我们在codegen生成中,通过以下调用链转到了schedule的处理。Codegen -> VisitExpr(CallNode* op) -> relay.backend._CompileEngineLower -> LowerInternal。LowerInternal函数为:
如果是外部定义的编译器,就只是建立cache_node节点和cache_func。如果是使用内部编译器,就会调用CreateSchedule建立schedule。接下来调用链为CreateSchedule -> ScheduleGetter.create -> te::create_schedule -> Schedule。create_schedule函数调用在文件re/schedule.h和te/schedule_lang.cc中。
create_schedule中主要有两件工作:
1 创建ReadGraph,获取post-dfs顺序的算符图。
2 初始化stage。
TVM中引入了stage的概念,一个op相当于一个stage,schedule优化是对stage的一个更改,可以增加,删减,更改其特性等。
通过createReadGraph可以遍历op图,返回op和其依赖的tensor列表。和遍历有关的主要函数为:
Op -> InputTensors -> PostOrderVisit -> IRApplyVisit,在IRApplyVisit中定义了VisitExpr和VisitStmt函数用于遍历节点。
Stmt节点通常是节点中的主体实现,PrimExpr是TIR中节点的一个简单表达式。比如if节点:
ReadGraph创建完成后,通过PostDFSOrder来获取post-dfs列表,其函数具体实现在graph.cc中,
通过不断迭代来进行深度优先搜索。
接下来是对stage进行初始化。
首先对postorder中的所有op初始化一个stage对象。我们看以下stage的定义:
Stage类中主要定义了set_scope, compute_at, compute_root, bind, split, fuse等几种优化算法。同时定义了StageNode,在StageNode中定义了和优化相关的变量,包括op,iter变量等。看一下stage初始化代码:
关键的几个变量lef_iter_vars,all_iter_vars,这些有什么作用还需要深入看优化函数的代码。我们看几个schedule函数,先看一个最简单的:compute_inline。代码只有一行:
(*this)->attach_type = kInline
对于标记了kInline的节点,在lower的时候会进行处理。应该会将其直接和调用的节点结合,合并两个op。
再看fuse函数,其代码为:
IterVar表示计算中坐标轴,比如一个两级循环,每级循环就是一个axis。从代码中看出,fuse函数会对输入的所有axis进行合并,用fused变量替换合并后的axis。
这块代码比较抽象,先熟悉以下流程,之后再深入读一下。
- spring-schedule-admin(SSA)SpringSchedule管理插件
- 使用TVM在android中进行Mobilenet SSD部署
- 单片机学习(五)LCD1602和矩阵键盘的使用
- 基于LSTM网络的在线学习课程推荐模型 6次下载
- 基于成对学习和图像聚类的肺癌亚型识别 4次下载
- 基于预训练模型和长短期记忆网络的深度学习模型 19次下载
- 3小时学习神经网络与深度学习课件下载 0次下载
- 在线学习的交互网络模型和质量评价方法 11次下载
- 深度模型中的优化与学习课件下载 3次下载
- 电机学第五版电子书 0次下载
- Linux内核进程调度schedule深入理解的详细资料说明 5次下载
- TVM学习(二):算符融合
- TVM学习(四)codegen
- TVM学习(三)编译流程
- PSIM仿真入门学习-课件下载 186次下载
- SemiDrive X9 AI 开发环境搭建 175次阅读
- 计算机视觉的五大技术 878次阅读
- 人工智能深度学习的五大模型及其应用领域 2161次阅读
- TVM编译器的整体架构和基本方法 1825次阅读
- 超详细的嵌入式学习路线图 3287次阅读
- 编译器中的图论算法是什么 727次阅读
- TVM学习之从relay到TOPI 1368次阅读
- 从五个方面详谈机器学习和深度学习的区别 1.6w次阅读
- 在云计算成功使用AI所需的五种机器学习技能 1403次阅读
- 深度学习模型小型化处理的五种方法 4096次阅读
- 学习电子应该学习什么?学习的顺序应该是怎么样的 9221次阅读
- 人工智能明年的五个重要发展方向的预测概述 3183次阅读
- 区块链学习,五个基础课程介绍 1.4w次阅读
- 将TVM用于移动端常见的ARM GPU,提高移动设备对深度学习的支持能力 1w次阅读
- 如何区分深度学习与机器学习 1891次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1491次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 95次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 11次下载 | 免费
- 6100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 7基于单片机和 SG3525的程控开关电源设计
- 0.23 MB | 4次下载 | 免费
- 8基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537793次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多