当前位置: 首页 > news >正文

基于多面体模型的编译优化技术

1)

经过近三十年的发展,多面体模型已经成为自动并行化和程序优化领域最强大的工具
之一。不管是科学研究、还是工业控制,很多领域已经有大量基于多面体编译优化技术的
开源和商业实现。与传统并行化编译系统中使用的幺模矩阵相比,多面体模型具有以下特
点:(1)由于能够转换非完美循环嵌套而具有更广泛的应用范围,(2)通过支持几乎所有的
循环变换技术建模而具有更强大的表示能力,(3)通过一次组合更多的变换而具有更全面
的优化空间。如今,多面体编译优化技术正逐渐成为并行化编译领域的核心技术。

2)2.1 多面体模型的表示


基于多面体模型的编译优化技术对程序中的循环结构进行抽象表示,将嵌套循环的一
条语句表示为空间多面体,将语句的每个实例表示为多面体中的一个坐标点,通过各种复
杂的循环变换实现多面体建模。多面体模型是在程序控制流静态可知的前提下,通过将语
句实例的集合表示成空间多面体,利用这些多面体上的仿射变换来分析和优化程序的数学
抽象模型。与传统并行化编译系统采用的中间表示不同,多面体模型的分析对象是语句实
例,也就是循环中的语句在循环一次迭代内的动态执行过程。每个分析对象用Presburger
关系进行表示。本节首先介绍Presburger 关系中的基本概念。本节只针对文中使用的概念
进行介绍,有关Presburger 逻辑系统的详细描述,参见文献[17][18]。

3)

迭代空间(Domain)。迭代空间是所有语句实例的集合,使用联合集合表示,其中每
个整数集为一条语句的所有实例,由一组边界不等式来约束。图2.1(a)所示嵌套循环的迭
代空间表示为:

Domain = {R(); S(0,0); S(0,1); S(1,0); S(1,1); T(0); T(1)}

其中,语句R 在循环体外,迭代1 次;语句S 在双重循环内,根据迭代因子i、j 的不同
取值,迭代4 次;语句T 在迭代因子k 的单循环内,迭代2 次。显然在多维嵌套循环中,
随着迭代因子取值范围的增大,这种表示方式变得非常繁琐。为了简化描述,Presburger
关系将约束抽象表示为{语句编号(迭代变量):变量初始值≤迭代变量≤变量终止值}。采
用这种紧致表示法,迭代空间表示为:

Domain = {R(); S(i, j): 0 ≤ i < 2 ∧ 0 ≤ j < 2; T(k): 0 ≤ k < 2} (2-3)
如图2.1(b)所示,S 的语句实例由4个整数点构成,T 的语句实例由2个整数点构成。

这个抽象是没有错的,前面完全 不知道 在讲什么。

4)访存映射(Access Relations)。

访存映射是语句实例和访存数据的二元关系,由一组
边界不等式约束的联合映射表示。访存映射包含写访存关系(Write)和读访存关系(Read)。
多面体模型通常通过读、写访存关系来计算语句实例之间的依赖关系。在优化时,写访存
还可以再细分为强制写访存关系和非强制写访存关系。访存映射的定义域为语句实例的集
合构成的迭代空间,访存映射的值域为数组元素。图2.1(a)所示嵌套循环的读访存映射和
写访存映射分别表示为

这个说法也是对的。就是表达读写依赖,

Write = {S(0,0) → A(0); S(0,1) → A(1); S(1,0) → A(1); S(1,1) → A(2)}
Read = {R() → A(2); T(0) → A(0); T(1) → A(1); T(1) → A(0)}

语句R 访问了数组元素A[2],语句S 访问了数组元素A[i + j],语句T 访问了数组元素A[k]
和A[0]。其中,只有语句S 进行了写操作,写访存的次数由迭代空间决定。迭代空间中,
语句S 包含4 个语句实例,写访存映射则包含4 个二元关系:S(0,0)写数组元素A[0],S(0,1)
写数组元素A[1],S(1,0)也写数组元素A[1],两次迭代写了同一个数组单元,这个问题在
后面依赖关系分析中进行详细描述,最后,S(1,1)写数组元素A[2]。读访存关系与此类似。
同样可以得到访存映射的紧致表示形式:

解释得特别清楚,

Write = {S(i, j) → A(i + j): 0 ≤ i < 2 ∧ 0 ≤ j < 2}
Read = {R() → A(2); T(k) → A(0): 0 ≤ k < 2; T(k) → A(k): 0 ≤ k < 2}

5)调度(Schedule)。

多面体模型将多维逻辑的执行顺序映射到每个语句实例,调度即
多面体模型指定的语句实例之间的多维执行顺序,使用两个多维整数元组的二元关系表示。
从字典序出发,较小的调度意味着语句实例更早被执行。原始调度表示调度变换前语句实
例之间的执行顺序,图2.1(a)所示嵌套循环的原始调度表示为:

Schedule = {
R() → (0); S(0,0) → (1); S(0,1) → (2);
S(1,0) → (3); S(1,1) → (4); T(0) → (5); T(1) → (6)
}

其中,语句R 最先被执行,编号为0;而后执行语句S,语句S 包含4 个语句实例,四次
迭代依次编号为1-4;语句T 最后被执行,依据迭代空间得到包含两次迭代,编号为5-6。
这种表示方式可以更直观的理解调度的含义,而在实际应用中,并不需要明确每个语句实
例在整个嵌套循环的迭代空间上执行的全局编号。同样简化调度的描述,语句R、S、T
有先后顺序,依次编号为0-2。定义了语句之间的先后次序,语句内部语句实例之间的执

行顺序由迭代因子决定。R 没有迭代因子,后面补0;S 迭代因子为i 和j,而T 只有一个
迭代因子k,后面补0。采用紧致的表示形式,原始调度表示为:
Schedule = {R() → (0,0,0); S(i, j) → (1, i, j): 0 ≤ i, j < 2; T(k) → (2, k, 0): 0 ≤ k < 2} (2-5)
其中,二元关系值域的第一个数字表示语句之间的先后执行次序,二元关系值域后面的部
分为迭代因子,如果语句没有迭代因子,或者达不到最多迭代因子个数,在相应位置补0。

这其实是一种数据结构。

6)依赖关系(Dependence)。

依赖关系体现了语句实例之间的访问冲突问题,用联合映
射表示。假设在嵌套循环中,有两次迭代分别为i 和j,如果(1)原始调度中,迭代i 先于
迭代j 执行,(2)迭代i 和迭代j 需要访问相同的存储单元,(3)迭代i 和迭代j 的访存中,
至少有一个为写操作,则迭代j 和迭代i 之间存在依赖。依赖关系不同于迭代空间、访存
映射和调度,无法从输入的程序段中直接提取其多面体的表示,依赖关系需要借助线性整
数规划工具(Integer Linear Programming,ILP),根据迭代空间、访存映射和原始调度计
算得到。用Presburger 关系计算依赖的公式为:

Dependence = ((W−1 ∘ R)⋃(W−1 ∘ W)⋃(R−1 ∘ W))⋂(Schedule ≺ Schedule) (2-6)
其中,W 表示写访存映射,R 表示读访存映射,Schedule 表示原始调度,W−1表示写访存
的逆映射,R−1表示读访存的逆映射,∘表示映射组合,≺表示字典序小于。

根据式2-6,下面首先计算W−1 ∘ R、W−1 ∘ W 和R−1 ∘ W,而后计算Schedule ≺
Schedule,根据两者的计算结果得到依赖关系,最后分析依赖和调度的关系。

7)(1) 计算𝐖−𝟏 ∘ 𝐑、𝐖−𝟏 ∘ 𝐖和𝐑−𝟏 ∘ 𝐖

已知R 和W 表示语句实例到数组元素的映射,含义是当前语句实例访问了哪个数组
元素;R−1和W−1即表示数组元素到语句实例的映射,含义是当前数组元素被哪个语句实
例访问。图2.1(a)所示嵌套循环,它的访存映射如图2.2 所示,棕色箭头表示读访存映射
R,红色箭头表示读访存的逆映射R−1。用同样的方法,可以通过写访存映射W 得到写访
存的逆映射W−1。R−1和W−1分别表示为:

R−1 = {A(2) → R(); A(0) → T(k): 0 ≤ k < 2; A(k) → T(k): 0 ≤ k < 2}
W−1 = {A(a) → S(i, j): a = i + j ∧ 0 ≤ i < 2 ∧ 0 ≤ j < 2}

R−1和W−1其实表示的是依赖吧

数据依赖分为读后写(Write After Read,WAR)、写后读(Read After Write,RAW)
和写后写(Write After Write,WAW)。借助Presburger 关系中的组合(Composition)运算
计算这三种类型的依赖。如图2.3(a)所示已知W 和W−1,棕色箭头为写访存映射W,蓝色箭头为写访存的逆映射W−1。将W−1和W 进行组合得到语句实例到语句实例的映射,
表示写相同数组元素的语句实例对,得到图2.3(b)所示的红色箭头,即为W−1 ∘ W。从图
中可以发现,除了语句S 的四个语句实例分别有一条自身到自身的映射以外,特别值得
注意的是,还有两组映射是S(0,1) → S(1,0)和S(1,0) → S(0,1)。这个问题在前面介绍写访
存映射关系时已提到,语句实例S(0,1)和S(1,0)写了相同的数组元素A[1]。用同样的方法,
可以得到W−1 ∘ R和R−1 ∘ W。W−1 ∘ W、W−1 ∘ R和R−1 ∘ W分别表示为:

W−1 ∘ W = {S(i, j) → S(i′, j′): 0 ≤ i, i′, j, j′ < 2⋀i + j = i′ + j′}
W−1 ∘ R = {R() → S(1,1); T(i + j) → S(i, j): 0 ≤ i, j, i + j < 2; T(k) → S(0,0): 0 ≤ k < 2}
R−1 ∘ W = {S(1,1) → R(); S(i, j) → T(i + j): 0 ≤ i, j, i + j < 2; S(0,0) → T(k): 0 ≤ k < 2}

自己定义 的一个概念,不是特别明白。

8)

(2) 计算𝐒𝐜𝐡𝐞𝐝𝐮𝐥𝐞 ≺ 𝐒𝐜𝐡𝐞𝐝𝐮𝐥𝐞

Schedule 表示语句实例之间的先后执行顺序,Schedule ≺ Schedule表示语句实例对之
间的字典序关系。首先描述Presburger 关系中集合字典序小于和映射字典序小于的定义:

没有太搞懂这个

9)

多面体模型的开创性工作是Karp 等人[76]关于齐次递推方程系统的研究。随着多面体
编译优化技术的发展,才陆续将整数多面体[77]和Presburger 关系[78]引入模型中,使其具
有更强大的表达力和灵活性。多面体模型既可以作为模块集成到通用编译器中,例如
LLVM 中的Polly 模块[79]、GCC 中的Graphite 框架[80]等;也可以作为独立的源到源翻译
器被使用(如多面体编译器Pluto[21]和PPCG[26])。这种独立性和兼容性使多面体编译优化
技术备受关注,并在很大程度上扩展了其适用范围。

返回高级语言才有意思。

多面体提取是多面体编译器的前端。解析输入语言的代码段是否满足“SCoP”(静态
仿射约束,Static Control Parts)条件。静态仿射约束即在程序控制流静态可知的情况下,
借助高级语言程序或中间表示中的语句实例和数组元素提取多面体表示(提取过程见
2.1.2 节),用Presburger 关系描述程序的迭代空间(Domain)、访存映射(Access Relations)
和原始调度(Schedule)。而后,依据迭代空间、访存映射和原始调度借助线性整数规划
工具进行依赖关系计算(Dependence)和数据流分析(Dataflow)。其中,依赖关系的计
算已在2.1.2 节进行描述,数据流分析将在2.3.1 节描述。多面体提取通常以库的形式封装
在多面体编译器中,pet[81]和clan[82]是两种常用的解析器。

调度变换是多面体编译器的核心。在原迭代空间根据依赖关系分析的结果,借助线性
整数规划工具计算满足某种(如通信量最小)或多种优化目标的新调度,以充分利用目标
平台的并行硬件资源。调度变换的过程将在2.3.2.2 节描述。调度变换作为三个阶段的中
间环节:首先,和前端依赖关系分析紧密结合。满足依赖的前提即保留了程序的语义,同
时最小化可重用的依赖距离来提升数据的局部性;其次,调度变换是各种循环变换的组合。
第三章针对不同维度的stencil 计算先后采用了循环倾斜和循环分块技术,调度变换通过
不同循环变换的组合开发细粒度、粗粒度等不同层级的并行性;最后,为后端代码生成提
供支持。第四章描述面向GPU 架构生成CUDA 代码,调度树中可以直接引入线程级同步
等语句。调度变换被认为是多面体编译流程中最复杂的阶段,通过寻求语句实例间更好的
执行顺序,以提升程序的并行性和数据的局部性。

线性整数规划工具是多面体编译优化技术的基础和核心,如图2.4 所示,通过为每个
阶段提供最小整数解实现多面体中各种复杂的变换技术。线性整数规划工具通常以库的形
式封装在多面体编译器中,像isl 库[18]、Omega 库[83]和PolyLib 库[84]等,根据需求不同,
功能也各不相同。其中,isl 库是基于Presburger 关系进行数学抽象表示,在多面体编译
器中应用非常广泛。

感谢《面向异构系统的多面体编译优化关键技术研究_李颖颖》

相关文章:

  • 代码训练LeetCode(32)Z字形变换
  • 浅谈MapReduce--基本操作
  • Vue开发学习笔记:动态渲染自定义封装的uview-plus的Toast组件
  • 大模型技术30讲-5-利用数据来减少过拟合现象
  • 上海市计算机学会竞赛平台2022年5月月赛丙组最远城市距离
  • 新零售视域下实体与虚拟店融合的技术逻辑与商业模式创新——基于开源AI智能名片与链动2+1模式的S2B2C生态构建
  • win11系统部署tomcat10教程
  • @SchedulerLock处理Spring Task在分布式环境下的重复执行问题
  • 2025 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第七届CCPC河南省大学生程序设计竞赛 Problem F. 幻形之路
  • 在rust中执行命令行输出中文乱码解决办法
  • Systemd 服务配置完整指南
  • 注册bean和自动配置的原理、过程
  • 初识MySQL · 事务 · 下
  • 使用最新Dify1.4.1集成LM Studio的QWQ32B绘制工作流
  • HashMap真面目
  • ( github actions + workflow 03 ) 手动添加 token, 防止权限不够
  • 价格性价比高系列的高性能单片机MS32C001-C
  • 新加坡金融管理局责令未获许可加密货币公司于6月30日前退出,Bitget、Bybit考虑撤离
  • 大模型在关键社会领域的应用研究:金融、医疗和法律
  • 河南农担携手Gitee企业版:构建农业金融数字化研发新基建
  • 番禺南村网站建设/做网页的网站
  • 新沂网站制作/图片优化是什么意思
  • 中国移动idc建设网站/旅游推广赚佣金哪个平台好
  • 江门网站建设设计/网站seo设计方案案例
  • 涿州网站建设公司有哪些/灰色关键词排名代发
  • 做网站需要的合同/独立站优化