Polyhedral Model: DNN Nested Loop 的实现模型
循环是迭代空间的一个点
使用嵌套循环(Nested Loop)抽象不同的 DNN 乘加算子[1],使用多面体数学模型(Polyhedral Model)抽象循环的变换优化。
多面体模型里循环可以用迭代向量或者迭代点表示,我们以常见的 Linear Projection Layer 为例分析,该循环的迭代向量表示为
For b in [0, B-1]:
For o in [0, O-1]:
For i in [0, I-1]:
y[b][o] += x[b][i] * w[o][i] // 循环语句 S
则循环被抽象为了迭代向量按某个次序排序,比如这个循环就是
为了便于用仿射变换表示后续操作,我们使用向量的增广表示
也有添加多个常数表示迭代向量的[2],比如
,它们数学本质是一样的
迭代变量的定义域叫做迭代空间(Iteration Space),迭代空间是一组不等式组, e.g.
迭代空间可以用
调度是迭代空间上超平面的序列
一个循环可以以多种方式执行,这称作调度(Scheduling)。比如可以先遍历 i
对于迭代空间上的每个点,都能通过调度函数映射到时间步
特别的,满足线性时调度也能用调度变量表示,此时调度函数为调度向量和迭代向量的内积,即
e.g.
调度的超平面并非可以任意选取,要满足数据依赖性,比如以下的例子:
For i in [0, I-1]:
x[i+2] += x[i+1] * x[i] // 循环语句 S
显然,迭代点
循环变换
将算法抽象表示并不能直接得到硬件部署,我们要先能够映射到目标平台(Mapping),再进行优化。
不同的算法平台的硬件规格(比如空间计算的维度),执行算法范式(比如存算、脉动阵列)不同,要将循环和目标硬件对齐。
就拿存算举例,Linear 的 nested loop 表示每个循环语句单元是元素乘加,然而存算是向量乘加(向量内积),粒度比 nested loop 更高,且一部分累加要靠后续的累加器完成。
一种处理到存算计算范式的方法是循环分块(Tilling),即将一个循环切换为多个循环。e.g. 对 i 循环切为多个长度为 R 的小块,则每个小块代表执行了一次向量内积。
映射到存算计算范式的方法并不唯一,Tilling 是一种保持数据连续性的映射方法
For b in [0, B-1]:
For o in [0, O-1]:
For ir in [0, floor(I/R)-1]:
For r in [0, R-1]:
y[b][o] += x[b][ir*R + r] * w[o][ir*R + r] // 循环语句 S
对于原循环,我们定义了迭代空间、约束条件,变换后的循环应当依然满足。比如迭代空间,很显然从新循环中能看出两个不等式
常见变换有,Fission, Fusion, Interchange, Tilling, Unrolling 等,其中一部分可以用仿射变换表示,其余不可(比如 Tilling 和 Unrolling)。
综上分析,循环的一部分子集可以用仿射变换表示,这有利于规范统一编译优化器,非仿射变换则要复杂得多。编译器有了初始值、有了迭代方法(变换方法)、有了性能评估(Evaluator),就可以开始迭代优化算法了。本文不讨论 Evaluator 和 Optimize 部分。
控制信号是 Trigger
假设我们通过优化得到某个调度方案
控制信号本质是在时间上的脉冲序列:
Parashar, A., Raina, P., Shao, Y. S., Chen, Y.-H., Ying, V. A., Mukkara, A., Venkatesan, R., Khailany, B., Keckler, S. W., & Emer, J. (2019). Timeloop: A Systematic Approach to DNN Accelerator Evaluation. 2019 IEEE International Symposium on Performance Analysis of Systems and Software (ISPASS), 304–315. https://doi.org/10.1109/ISPASS.2019.00042 ↩︎
《可重构计算》,魏少军,刘雷波,尹首一 ↩︎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律