性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序
中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对
象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优
化。
其中,迭代空间表示程序中循环语句的迭代次数所构成的空间,通常被表
示为一个多维的整数向量空间。迭代空间中的每个向量表示一个循环的一次迭
代,即循环变量在该次迭代中的取值。因此,迭代空间中的每个向量都对应程
序中的一个语句实例。访问关系表示语句实例与访存数据之间的映射关系。依
赖关系指访问同一数据元素的两个语句实例之间的偏序关系。调度在程序优化
中起着至关重要的作用,指的是在满足依赖关系的前提下,语句实例之间的偏
序或全序执行顺序。图2.1 所示为多面体模型的编译流程。
2)
说起来简单,实际上做起来复杂。
3)
(1)迭代域:将一个N 重嵌套循环抽象为一个N 维迭代空间,每层循环的循
环上界和循环下界的线性约束构成整个迭代空间的约束集合。这个N 维迭代空
间对应N 重循环中各个循环索引变量的取值集合,只有满足约束的N 维向量才
是一个合法的迭代向量。
在多面体模型中,边界条件通常用于限制循环变量的
取值范围,以确保程序的正确性。
构造迭代域的核心是确定每一重循环的上界
和下界。这个过程对循环索引变量进行等价变换,将其表示为向量的形式[60]。
对于下界l、步长为d(d>1)的循环索引变量i,引入一个新的循环索引变量?',
将循环中对i 的引用的代数替换为? ∗ ?' + ?,从而实现循环索引变量的代数替换,
表达形式如下:
for(i=0; i<100; i++){
for(j=0; j<1000; j++){
CODE;
}
}
是这个意思吗?i和j确实有上界和下界。
表示成向量的形式也很简单啊
这个道理也是对的。
就是i,j表示的空间,可以做切分。
大概这个意思吧
A、B 分别为循环索引?、全局变量组成的向量?的系数矩阵,?是常
数项组成的向量,如图2.2 所示的循环嵌套,语句S 的迭代空间为二维平面,程
序的迭代域如图2.2 右侧坐标轴所示。
若令? = ?, ? , ? = (?, ?),依据图中迭代域在迭代空间中的范围限制,该
迭代域的迭代向量系数矩阵与全局参数系数矩阵分别为:
(2)语句实例:每个语句实例对应的循环都被表示为一个N 维向量。将N 重
嵌套循环中的每个静态语句及其对应的循环迭代向量的组合抽象成一个语句实
例。静态语句S 的一个动态访问实例可以写成S(i),其中,i 表示一个N 重嵌套
循环的迭代向量。
(3)访问关系:访问关系指的是程序中数据访问语句和迭代空间之间的关系。
它描述了一个数据访问语句所访问的数据元素和迭代空间中的迭代点之间的映
射关系。多面体模型用仿射函数或仿射关系来表示程序中语句和语句之间或局
域与内存单元之间的关系,语句中的每个数组引用被抽象为一个访问关系,它
将语句实例i 映射到一个或多个要读/写的数组元素。这种映射通常表示为一组
循环迭代器和全局参数(访问函数)的仿射表达式。
将N 维迭代向量对M 维数据的仿射访问函数表示为矩阵形式,其中,i 是
迭代向量,F 是整数矩阵,表示仿射函数中每个循环索引变量的系数,f 为M 维
整数向量,表示常量部分。
访问映射也能理解,
其实是对数据空间的访问及操作。
访问数据的每一个操作都对应了唯一的f,F,不同的数据访问操作的F 和
f 可以不同。仿射函数提供了从迭代空间到数据空间的一个映射关系,基于仿射
访问函数可以确定某些迭代是否会访问同一个数据或相邻的数据。
(4)依赖关系:对数据空间中的访问关系可以细分为读访问和写访问,动态
语句实例之间的依赖关系就是程序中对数据空间的读写顺序约束。利用线性整
数规划过程来计算语句之间的依赖关系。
依赖关系多面体可以使用迭代域DS1和DS2的笛卡尔乘积进行计算。三种依赖
关系分别为,读后写依赖,写后写依赖和写后读依赖,除去这三类依赖关系的
循环迭代,可以任意的执行顺序。
(5)调度函数。调度就是语句实例执行的顺序。初始为程序的串行执行顺序,
通过循环优化来找到循环并行性和局部性,计算出新的调度。利用仿射函数实
现程序变换。