循环优化:多面体优化
- Compilers
- 2025-07-24
- 405 Views
- 0 Comments
- 529 Words
多面体模型最关注的(可能也是唯一关注的)就是循环的优化。因此对于多面体模型,它只会把一段段程序当成一堆嵌套循环,至于循环里面的内容他是不大关心的。因此在整个框架中,重要的概念只有4个:Domain,instance,dependency和schedule
-
Statement与Instance:
接触过编译器的同学知道Instruction或者Statement,代表一行代码。而在循环中的代码,每个Stmt的每次执行都是一个Instance -
Domain:
对于一个N重循环,每个instance对应的循环可以被表示成一个长度为N的vector。而所有可能的vector的集合就是Domain。在例子中,输入是左上角的一段程序,多面体模型的框架会分析这段程序(主要就是把循环拉出来),然后转换成左下角的格式。这里面Domain用了一个不等式来描述:所有满足这个不等式的<i, j>的vector构成的集合就是Domain

从左下角也可以看出来这是一个仿射变换(Affine transformation),这个概念在多面体模型中非常重要(其实就是最基本的线性代数) -
Dependency:
我们都知道程序的语句之间会有数据依赖(读写依赖,写写依赖,写读依赖),我们做优化也要遵守这些约束,不然程序快是快了,结果不对,也没用
和Domain的定义类似,dependency也可以用一个仿射变换的不等式表达
dependency是两个Stmt之间的,不是instance之间

多面体优化
当我们把程序(源代码)转换成多面体模型(就是把Domain,dependency这些信息提取出来)后,我们可以通过数学上的分析将代码做优化。整个多面体优化有各种各样的研究针对于运用这些数据提升代码性能。本文只是一个最基础的概述,自然不能覆盖到所有的。因此这里面只举最基础的例子

