编译原理——数据依赖和不定方程

•数据依赖和数组访问。为了处理并行性和局部性优化,我们必须解决的核心问题是两个数组访问是否具有数据依赖性(可以触及相同的数组元素)。当访问和环路边界是仿射的时,问题可以表示为在多面体内是否存在定义迭代空间的矩阵 - 向量方程的解。
•矩阵秩和数据重用。描述数组访问的矩阵可以告诉我们关于访问的几个重要的事情。如果矩阵的级别尽可能大(行数和列数的最小值),那么在循环迭代时访问不会触及相同的元素两次。如果数组以行(列)形式存储,那么删除最后一行(第一行)矩阵的排名告诉我们访问是否具有良好的局部性;即大约同时访问单个高速缓存行中的元素。
•数据依赖和不定方程。仅仅因为对相同阵列的两次访问触及数组的相同区域并不意味着它们实际上访问任何共同的元素。原因是每个人都可能跳过一些元素;例如一个访问偶数元素而另一个访问奇数元素。为了确定有数据依赖性,我们必须解决不定方程(仅整数解)。
•求解不定方程线性方程组。关键技术是计算变量系数的最大公约数(GCD)。只有GCD除了常数项之外,才会有整数解。
•空间分区约束。为了并行执行循环嵌套,我们需要将循环的迭代映射到处理器的空间,处理器可以有一个或多个维度。空间分割约束表示如果两个不同迭代中的两个访问共享数据依赖性(即它们访问相同的数组元素),则它们必须映射到相同的处理器。只要迭代到处理器的映射是仿射的,我们就可以用矩阵向量来表示问题。
•原始代码转换。用于仿射数组访问并行化程序的转换是七个基元的组合:循环融合、循环分裂、重新索引(向循环索引添加常量)、缩放(将循环索引乘以常量)、反转(循环索引)、排列(循环顺序)和倾斜(重写循环,因此穿过迭代空间的线不再沿着一个轴)。
•并行操作的同步。如果我们在程序的各个步骤之间插入同步操作,有时可以获得更多的并行性。例如,连续循环嵌套可能具有数据依赖性,但是循环之间的同步可以允许循环单独并行化。

你可能感兴趣的:(编译原理——数据依赖和不定方程)