« 上一篇下一篇 »

体系结构总结及名词解释

体系结构问题:被优化代码调度利用了现代计算机体系结构的一些特性。这样的机器常常允许以流水线方式执行代码,也就是多条指令在同一个时刻处于不同的执行阶段。有些机器还允许多条指令在同一个时刻开始执行。

•数据依赖:在调度运算指令时,我们必须知道这些指令对于每个内存位置和寄存器的影响。如果一条指令必须在另一指令对某个内存位置写人之后才读取该位置的值,那么这两条指令之间具有真依赖关系。如果有一个对同一位置的读指令之后的写指令,那么两条指令之间就出现反依赖关系;当有两个对同一位置的写指令时就会出现输出依赖。


•消除依赖关系:通过使用附加的位置存放数据,可以消除反依赖和输出依赖。只有真依赖不能被消除,并且在调度代码时必须保证遵守这类依赖关系。

•基本块的数据依赖图:这些图表示了一个基本块中的语句之间的时间安排约束。图的结点对应于这些语句。从n到m的标号为d的边表明指令m的开始时刻必须比i的开始时刻晚至少d个时钟周期。

•带优先级的拓扑排序:一个基本块的数据依赖图总是无环的,通常有很多个与这个依赖图一致的拓扑排序。为一个给定依赖图选择较好的拓扑排序的启发式规则之一是首先选择具有最长关键路径的结点。

•列表调度:给定一个数据依赖图的带优先级的拓扑排序,我们可以按照这个顺序考虑对结点的调度。在对每个结点进行调度时,把每个结点安排在最早的满足下列条件的时钟周期上:满足图的边所蕴涵的时间安排约束,并且和所有之前已经调度好的结点的调度方案一致,同时满足该机器的资源约束。

•基本块之间的代码移动:在某些情况下,可以把一些语句从它所在的基本块移动到该基 本块的前驱或后继。进行这种移动的好处在于有机会在新的位置上并行执行新指令,而在原位置上可能没有这个机会。如果原基本块和新位置之间没有支配关系,那么有必要 在某些路径上插人补偿代码,以保证不管控制流如何运行,被执行的总是相同的代码 序列。

•do-al丨循环:一个do-all循环的迭代之间不存在依赖关系,因此各个迭代都可以并行运行。

•do-all循环的软件流水线化:软件流水线化技术充分利用了目标机器能够同时执行多条指令的能力。通过调度使得循环的各个迭代的开始財劾只相镉很短的时间。在此过程中可能需要在迭代中插人no-op指令以避免迭代之问产生机器资源冲突。结果,循环可以很快地执行,其中包括序言、尾声和(通常)较小的内部循环。

•do-across循环:很多循环具有从每个迭代到后续迭代的依赖关系。这些循环称为do-across 循环。

•do-across循环的数据依輔图:为了表7K—个do-across循环的指令之间的依赖关系,依赖图中的边的标号由两个值组成:必须的延时(和表示基本块的依赖图中的延时含义相同)以及在具有依赖关系的两条指令之间相隔的迭代数量。

•循环的列表调度算法:为了调度一个循环,我们必须为所有的迭代选择同一个调度方案, 并选择启动间隔,即连续迭代的启动时刻的间隔。这个算法还需要获取针对循环中不同指令的相对调度方案的约束。它通过计算两个结点之间的最长无环路径的长度来获得这种约束。算法求得的这些长度把启动间隔作为参数,因此给启动间隔设定了一个下界。

« 上一篇下一篇 »