循环体间相关常常以重现的形式出现的: for(i=2;1<=100;1=i+1) Y[]=Y[i-1]+Y[ 重现是对一个变量赋予前面一个循环体中一个变量的值, 而且往往是最近的一个循环体中的变量
21 循环体间相关常常以重现的形式出现的: for (i=2;1<=100;i=i+1) Y[i]=Y[i-1]+Y[i]; 重现是对一个变量赋予前面一个循环体中一个变量的值, 而且往往是最近的一个循环体中的变量
检测这种循环依赖关系有两点很重要的原因:一是有些系 统结构(如向量计算机)可以专门支持执行这种循环结构的程 序度 ;二是有些存在循环依赖关系的程序也可以获得很高的并行 for(i=6;1<=100;1=i+1) ¥[Y[i-5]+Y[; 在第i次循环中,循环引用了第i-5个元素,因此称该循环 的相关距离是5。许多有相邻体间相关的循环,它们的相关距 离是1。相关距离越大,通过展开循环可以获得的并行度就越 同
22 检测这种循环依赖关系有两点很重要的原因:一是有些系 统结构(如向量计算机)可以专门支持执行这种循环结构的程 序;二是有些存在循环依赖关系的程序也可以获得很高的并行 度。 for (i=6;1<=100;i=i+1) Y[i]=Y[i-5]+Y[i]; 在第i次循环中,循环引用了第i-5个元素,因此称该循环 的相关距离是5。许多有相邻体间相关的循环,它们的相关距 离是1。相关距离越大,通过展开循环可以获得的并行度就越 高
2.循环展开技术 循环展开技术是利用多次复制循环体并相应调整展开后的指 令和循环结束条件,增加有效操作时间与控制操作时间的比率。 这种技术也给编译器进行指令调度带来了更大的空间 例4-2:将例4-1中的循环展开成3次得到4个循环体,再对展 开后的指令序列在不调度和调度两种情况下,分析代码的性 能
23 循环展开技术是利用多次复制循环体并相应调整展开后的指 令和循环结束条件,增加有效操作时间与控制操作时间的比率。 这种技术也给编译器进行指令调度带来了更大的空间 2.循环展开技术 例4-2:将例4-1中的循环展开成3次得到4个循环体,再对展 开后的指令序列在不调度和调度两种情况下,分析代码的性 能
解:假定R的初值为32的倍数,即循环次 数为4的倍数。 寄存器分配如下: (展开后的循环体内不重复使用寄存器 F0、F4:用于展开后的第1个循环体 F2:保存常数; F6和F8:用于展开后的第2个循环体; F10和F12:用于第3个循环体 F14和F16:用于第4个循环体
24 解:假定R1的初值为32的倍数,即循环次 数为4的倍数。 寄存器分配如下: (展开后的循环体内不重复使用寄存器 。) F0、F4:用于展开后的第1个循环体; F2:保存常数; F6和F8:用于展开后的第2个循环体; F10和F12:用于第3个循环体; F14和F16:用于第4个循环体
(1)展开后没有调度的代码 流出时钟 流出时钟 F0,0R1) ADDD F12F10F2 15 (空转) (空转) ADDD F4 FOF2 3 (空转) (空转) 16(R1)F1218 (空转) LD F1424(R)、19 SD 0(R),F4 (空转) LD F6,-8(R1)7 ADDD F16..F2 2 (空转) (空转 ADDd F8.F6 F2 9 (空转) (空转) 10 SD -24(R1).F1624 (空转) SUBI R1,R1,#32 SD 8(R)F812 (空转) LD F10-16(R1)13 RILoo (空转) 14 (空转)
25 (1) 展开后没有调度的代码 流出时钟 Loop: LD F0,0(R1) 1 (空转) 2 ADDD F4,F0,F2 3 (空转) 4 (空转) 5 SD 0(R1),F4 6 LD F6,-8(R1) 7 (空转) 8 ADDD F8,F6,F2 9 (空转) 10 (空转) 11 SD -8(R1),F8 12 LD F10,-16(R1) 13 (空转) 14 流出时钟 ADDD F12,F10,F2 15 (空转) 16 (空转) 17 SD -16(R1),F12 18 LD F14,-24(R1) 19 (空转) 20 ADDD F16,F14,F2 21 (空转) 22 (空转) 23 SD -24(R1),F16 24 SUBI R1,R1,#32 25 (空转) 26 BNEZ R1,Loop 27 (空转) 28