首页 理论教育 调度指令的相关性,实现并行执行

调度指令的相关性,实现并行执行

时间:2023-06-23 理论教育 版权反馈
【摘要】:调度必须确保任何指令执行和保存结果时,指令之间的相关性不被破坏。ADD R1,R2,R3 R1与R2相加结果放入R3MUL R1,R3,R4 R1与R3相乘结果放入R4ADD R1,R5,R6 R1与R5相加结果放入R6调度在处理器硬件中也能被实时完成,或者通过代码生成工具被提前完成。动态调度主要是用于本质上没有写成并行的代码。静态调度解除了处理器调度的负担,改而要求明确指定的指令代码可以被并行执行。高级语言编译器完成所有指令调度并加强相关性。

调度指令的相关性,实现并行执行

在一个多线程处理器上,调度(Scheduling)是必要的,用来决定哪条指令可以被安全执行的顺序。调度必须确保任何指令执行和保存结果时,指令之间的相关性不被破坏。例如,在下面的例子中,第1、3条指令的顺序可以是任意的,因为它们是不相关的,但第2条指令只有当第1条指令得出结果后才能执行。

ADD R1,R2,R3 R1与R2相加结果放入R3

MUL R1,R3,R4 R1与R3相乘结果放入R4

ADD R1,R5,R6 R1与R5相加结果放入R6

调度在处理器硬件中也能被实时完成(动态调度),或者通过代码生成工具被提前完成(静态调度)。这个选择导致根本不同的结构,每一个结构都很好地适合特定的环境。(www.xing528.com)

动态调度主要是用于本质上没有写成并行的代码。通过检查指令间的相互依存性,处理器试图发现代码中的并行性(指令级并行性)。管理功能单元分配并确保结果以正确的顺序存储。动态调度可以发掘程序的并行性,即使程序不是按并行形式编写的。这个优点使其可以在并行结构上运行串行代码(几乎所有的工作站都使用动态调度)。最主要的缺点是动态调度是一个non-trivial进程(non-trivial指普通的软件项目,由多个模块组成),所以实时完成需要额外大量的硬件,随之而来的是成本和功耗。鉴于硬件的限制,一般动态程序编排只使用可以覆盖几百条指令的观察窗,因而限制了其发现并行性的能力。超标量处理器使用多功能单元和动态调度,用处理器来加强指令间的相互依存性。确切的执行顺序直到运行时才知道,但执行保证产生和运行串行代码一样的结果。

静态调度解除了处理器调度的负担,改而要求明确指定的指令代码可以被并行执行。这种情况下,由编译器负责决定哪些指令可以并行执行,并保证操作的结果在被其他指令使用之前已经准备好。静态调度的主要优点是编译器可以对整个程序查找并行性,并且希望决定一个更有效率的代码执行顺序,并且消除了动态调度的硬件需要———节省了巨大的能量和开销。最大的缺点是其产生的代码有很大的硬件依赖性,兼容性差。用于TMS320C6x上的静态调度的超长指令结构结构一次并行取8条指令(一个取指包)并同时传给8个功能单元。如果一个功能单元没有被使用,于是它被传递一个空操作指令。高级语言编译器完成所有指令调度并加强相关性。对于这个结构编写汇编程序是富有挑战性的,但经常只是对时间决定性的代码才使用汇编以最充分利用功能单元减少执行时间。

关于超长指令处理器设计及其在嵌入式系统中的应用,读者可以参考Fisher,Faraboschi和Young所著的参考文献[75]。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈