总结:编译原理--第十章 指令级并行性

第十章  指令级并行性

每一个现代高性能处理器都能够在一个时钟周期内执行多条指令。在一个具有指令级并行机制的处理器上一个程序能够以多快的速度运行?这可是一个 “价值十亿美元的问题”。对这个问题的回答要考虑下列因素:

1)该程序中潜在的并行性。

2)该处理器上可用的并行性。

3)从原来的顺序程序中抽取并行性的能力。

4)在给定的指令调度约束之下找到最好的并行调度方案的能力。

  • 体系结构问题:被优化的代码调度利用了现代计算机体系结构的一些特性。
  • 数据依赖:在调度运算指令时,我们必须知道这些指令对于每个内存位置和寄存器的影响。
  • 消除依赖关系:通过使用附加的位置存放数据,可以消除反依赖和输出依赖。只有真依赖不能被消除,并且在调度代码时必须保证遵守这类依赖关系。
  • 基本块的数据依赖图:这些图表示了一个基本块中的语句之间的时间安排约束。
  • 带优先级的拓扑排序:一个基本块的数据依赖图总是无环的,通常有很多个与这个依赖图一致的拓扑排序。
  • 列表调度:给定一个数据依赖图的带优先级的拓扑排序,我们可以按照这个顺序考虑对结点的调度。
  • 基本块之间的代码移动:在某些情况下,可以把一些语句从它所在的基本块移动到该基本块的前驱或后继。
  • do-all 循环:一个 do-all 循环的迭代之间不存在依赖关系。因此各个迭代都可以并行运行。
  • do-all 循环的软件流水线化:软件流水线化技术充分利用了目标机器能够同时执行多条指令的能力。
  • do-across 循环:很多循环具有从每个迭代到后续迭代的依赖关系。这些循环称为 do-across 循环。
  • do-across 循环的数据依赖图:为了表示一个 do-across 循环的指令之间的依赖关系,依赖图中的边的标号由两个值组成:必须的延时以及在具有依赖关系的两条指令之间相隔的迭代数量。
  • 循环的列表调度算法:为了调度一个循环,我们必须为所有的迭代选择同一个调度方案,并选择启动间隔,即连续迭代的启动时刻的间隔。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81272279