当前位置:   article > 正文

计算机体系结构 第6章 指令级并行的开发——软件方法(1)_在处理器中,以下属于开发指令级并行的方法为

在处理器中,以下属于开发指令级并行的方法为

第6章 指令级并行的开发——软件方法

6.1 基本指令调度及循环展开

6.1.1 指令调度的基本方法

指令调度:找出不相关的指令序列,让它们在流水线上重叠并行执行。

制约编译器指令调度的因素

  • 程序固有的指令级并行
  • 流水线功能部件的延迟

为了讨论方便,以下内容使用的浮点流水线的延迟如下表

产生结果的指令使用结果的指令延迟(cycles)
浮点计算另一个浮点计算3
浮点计算浮点store(S.D)2
浮点Load(L.D)浮点计算1
浮点Load(L.D)浮点store(S.D)0
  • 浮点load指令的结果可以通过定向路径及时送给store指令,所以延迟为0

再假设:分支延迟,整数load延迟都是1,整数运算部件每个时钟都能流出一条整数指令。

例6.1 对于下面的源代码,转换成MIPS汇编语言,在不进行指令调度和进行指令调度两种情况下,分析其代码一次循环所需的执行时间。

for (i=1000; i>0; i--)
	x[i] = x[i] + s; 
  • 1
  • 2

解:

先把该程序翻译成MIPS汇编语言代码

Loop:	L.D	 	F0, 0(R1)
		ADD.D	F4, F0, F2
		S.D	 	F4, 0(R1)
		DADDIU 	R1, R1, #-8
		BNE	 	R1, R2, Loop
  • 1
  • 2
  • 3
  • 4
  • 5

不进行指令调度的情况下,根据表中给出的浮点流水线中指令执行的延迟,程序的实际执行情况如下:

指令流出时钟
Loop: L.D F0, 0(R1)1
(空转)2
ADD.D F4, F0, F23
(空转)4
(空转)5
S.D F4, 0(R1)6
DADDIU R1, R1, #-87
(空转)8
BNE R1, R2, Loop9
(空转)10

可以看出,每完成一个元素的操作需要10个时钟周期,其中有五个是空转周期。

用编译器对上述程序进行指令调度以后,程序的执行情况如下:

指令流出时钟
Loop: L.D F0, 0(R1)1
DADDIU R1, R1, #-82
ADD.D F4, F0, F23
(空转)4
BNE R1, R2, Loop5
S.D F4, 0(R1)6

进一步分析:

  • 编译时指令调度是怎样减少整个指令序列在流水线上的执行时间的?
  • 指令调度能否跨越分支边界?
  • 怎样提高整个执行过程中有效操作的比率?

6.1.2 循环展开

循环展开

  1. 把循环体的代码复制多次并按顺序排放, 然后相应调整循环的结束条件。
  2. 开发循环级并行的有效方法

例6.2 将例6.1中的循环展开3次得到4个循环体,然后对展开后的指令序列在不调度和调度两种情况下,分析代码的性能。假定R1的初值为32的倍数,即循环次数为4的倍数。消除冗余的指令,并且不要重复使用寄存器。

展开后没有调度的代码如下(需要分配寄存器)

展开后没有调度的代码如下

  • 可以看出,其中50%是空转周期,程序执行效率极差

调度后的代码如下(没有空转周期!):

调度后的代码

结论:

  • 通过循环展开、寄存器重命名和指令调度,可以有效开发出指令级并行。

循环展开和指令调度的注意事项

  • 保证正确性
  • 注意有效性
  • 使用不同的寄存器
  • 删除多余的测试指令和分支指令,并对循环结束代码和新的循环体代码进行相应的修正。
  • 注意对存储器数据的相关性分析
  • 注意新的相关性
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/271838
推荐阅读
相关标签
  

闽ICP备14008679号