指令跟踪调度:提升程序性能的有效策略
1. 指令调度概述
指令的执行顺序对程序执行时间有着显著影响。指令可能需要多个执行周期才能产生结果,这会阻塞依赖于它们的其他指令;内存访问也可能延迟指令的执行;特定的指令组合会使处理器流水线停顿,而其他组合则允许在超标量流水线上同时执行。指令调度,也称为代码压缩,是一种流行的汇编级优化方法,旨在找到能够提高并行执行指令数量的良好指令顺序。
指令调度可分为局部调度和全局调度。局部指令调度局限于单个基本块,由于可调度的指令数量有限,这种方法往往无法充分挖掘指令级并行性。为解决这一问题,指令调度可扩展到多个基本块,即全局调度。跟踪调度就是一种著名的全局调度方法,它是一种基于分析的方法,旨在减少平均执行时间(ACET),本文将探讨如何利用跟踪调度来改善最坏情况执行时间(WCET)。
2. 动机示例
以WCC的目标架构英飞凌TriCore TC1796处理器为例,它属于超标量按序发射处理器,具有整数流水线、加载/存储流水线和循环流水线这3个不同的流水线,可同时执行指令。为了利用这种并行性,程序代码中的指令需要以特定顺序排列。
考虑一个来自基准测试crc的非优化汇编代码的控制流图(CFG)片段。在原始指令顺序下,TriCore的流水线无法并行使用,因为任何块中都没有可以同时在整数和加载/存储流水线上发射的指令组合,即使局部指令调度器也无法生成具有更高并行性的代码,此时最坏情况执行路径(WCEP)的长度为16个周期。
而跟踪调度允许指令跨块边界移动。通过将指令在块L0、L1和L2之间移动,可以生成在不同流水线上同一周期发射的指令束。例如,“mov D8, 8”和“movh.a A12, HI:
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



