1、6.1 基本指令调度及循环展开 6.2 跨越基本块的静态指令调度 6.3 静态多指令流出:VLIW技术 6.5 开发更多的指令级并行,第6章 指令级并行的开发 软件方法,指令调度:找出不相关的指令序列,让它们在流水线上重叠并行执行。 制约编译器指令调度的因素 程序固有的指令级并行 流水线功能部件的延迟,6.1 基本指令调度及循环展开,6.1.1 指令调度的基本方法,表6.1本节使用的浮点流水线的延迟,6.1 基本指令调度及循环展开,例6.1 对于下面的源代码,转换成MIPS汇编语言,在不进行指令调度和进行指令调度两种情况下,分析其代码一次循环所需的执行时间。for (i=1000; i0; i
2、-)xi = xi + s; 解: 先把该程序翻译成MIPS汇编语言代码Loop: L.D F0, 0(R1)ADD.D F4, F0, F2S.D F4, 0(R1)DADDIU R1, R1, #-8BNE R1, R2, Loop,6.1 基本指令调度及循环展开,在不进行指令调度的情况下,根据表中给出的浮点流水线中指令执行的延迟,程序的实际执行情况如下:指令流出时钟 Loop: L.D F0, 0(R1) 1(空转) 2ADD.D F4, F0, F2 3(空转) 4 (空转) 5S.D F4, 0(R1) 6DADDIU R1, R1, #-8 7(空转) 8BNE R1, R2, L
3、oop 9(空转) 10,6.1 基本指令调度及循环展开,在用编译器对上述程序进行指令调度以后,程序的执行情况如下:指令流出时钟 Loop: L.D F0, 0(R1) 1DADDIU R1, R1, #-8 2ADD.D F4, F0, F2 3(空转) 4 BNE R1, R2, Loop 5S.D F4, 8(R1) 6,循环展开 把循环体的代码复制多次并按顺序排放, 然后相应调整循环的结束条件。 开发循环级并行的有效方法例6.2 将例6.1中的循环展开3次得到4个循环体,然后对展开后的指令序列在不调度和调度两种情况下,分析代码的性能。假定R1-R2的初值为32的倍数,即循环次数为4的倍
4、数。消除冗余的指令,并且不要重复使用寄存器。,6.1.2 循环展开,6.1 基本指令调度及循环展开,展开后没有调度的代码如下(需要分配寄存器),指令流出时钟 Loop: L.D F0, 0(R1) 1(空转) 2ADD.D F4, F0, F2 3(空转) 4(空转) 5S.D F4, 0(R1) 6L.D F6, -8(R1) 7(空转) 8ADD.D F8, F6, F2 9(空转) 10(空转) 11S.D F8, -8(R1) 12L.D F10, -16(R1) 13(空转) 14,指令流出时钟ADD.D F12, F10, F2 15(空转) 16(空转) 17S.D F12, -
5、16(R1) 18L.D F14, -24(R1) 19(空转) 20ADD.D F16, F14, F2 21(空转) 22(空转) 23S.D F16, -24(R1) 24DADDIUR1, R1, # -32 25(空转) 26BNE R1, R2, Loop 27(空转) 28,50%是空转周期!,调度后的代码如下:,指令流出时钟 Loop: L.D F0, 0(R1) 1L.D F6, -8(R1) 2L.D F10, -16(R1) 3L.D F14, -24(R1) 4ADD.D F4, F0, F2 5ADD.D F8, F6, F2 6ADD.D F12, F10, F2
6、7ADD.D F16, F14, F2 8S.D F4, 0(R1) 9S.D F8, -8(R1) 10DADDIU R1, R1, # -32 12S.D F12, 16(R1) 11BNE R1, R2, Loop 13S.D F16, 8(R1) 14,没有空转周期!,结论:通过循环展开、寄存器重命名和指令调度,可以有效开发出指令级并行。,6.1 基本指令调度及循环展开,循环展开和指令调度的注意事项 保证正确性 注意有效性 使用不同的寄存器 删除多余的测试指令和分支指令,并对循环结束代码和新的循环体代码进行相应的修正。 注意对存储器数据的相关性分析 注意新的相关性 三种(对于循环展开收
7、益的)限制:循环开销、代码大小和寄存器的缺乏,VLIW vs. 超标量 在动态调度的超标量处理器中,相关检测和指令调度基本都由硬件完成。 在静态调度的超标量处理器中,部分相关检测和指令调度工作交由编译器完成。 在VLIW处理器中,相关检测和指令调度工作全部由编译器完成,它需要更“智能”的编译器。,6.3 静态多指令流出:VLIW技术,实例分析,6.3 静态多指令流出VLIW技术,例6.3 假设某VLIW处理器每个时钟周期可以同时流出5个操作,包括2个访存操作,2个浮点操作以及1个整数或分支操作。将例6.1中的代码循环展开,并调度到该VLIW处理器上执行。循环展开次数不定,但至少要能够保证消除所
8、有流水线“空转”周期,同时不考虑分支延迟。,解:循环被展开7次,经调度后可以消除所有流水线“空转”。在不考虑分支延迟的情况下,每执行一个叠代需要9个时钟周期,计算出7个结果,即平均每得到一个结果需要1.29个周期。,6.3 静态多指令流出VLIW技术,编码效率仅比50%略高一些 所需要的寄存器数量也大大增加,VLIW性能分析 VLIW目标代码编码效率低为消除流水线“空转”需要增加循环展开的次数 很难从应用程序中找到足够多的并行指令填满VLIW指令中的每一个slot VLIW流水线的互锁机制早期VLIW处理器中没有冲突检测硬件,而是靠互 锁机制保证执行结果的正确所有功能部件保持同步 二进制代码兼
9、容性 具体的流水线结构 不同的功能单元数量和延迟需要不同版本的代码,6.3 静态多指令流出VLIW技术,循环携带相关 循环携带相关是指一个循环的某个叠代中的指令与其他叠代中的指令之间的数据相关。例6.7 在下面的循环中,for(i=1;i=100;i=i+1)Ai+1 = Ai + Ci; /* S1 */Bi+1 = Bi + Ai+1; /* S2 */假设数组A、B和C中所有元素的存储地址都互不相同,请问语句 S1与S2之间存在哪些数据相关?,6.5.1 挖掘更多的循环级并行,6.5 开发更多的指令级并行,解 S1和S2之间存在两种不同类型的数据相关: 循环携带RAW数据相关:相邻连词叠
10、代的语句S1之间,相邻两次叠代中的语句S2之间。 RAW数据相关:同一叠代内的语句S2与S1之间。分析:循环携带相关迫使指令只能按照所在叠代的先后顺序依次执行。限制了同一叠代内存在数据相关的各语句之间的相对顺序。,6.5 开发更多的指令级并行,怎样消除循环携带数据相关?例6.8 在下面的循环中,语句S1和S2之间存在哪些数据相关? 该循环的各次叠代是否可以并行执行?如果不能,请修改其代码, 使之可以并行。for(i=1;i=100;i=i+1)Ai = Ai + Bi; /* S1 */Bi+1 = Ci + Di; /* S2 */,6.5 开发更多的指令级并行,解 第i次叠代中语句S1与第
11、i-1次叠代中语句S2之间存在RAW类型 的循环携带数据相关,但它们之间没有形成环(S2与上次叠代的S1不 相关)。修改后代码A1 = A1 + B1;for(i=1;i=99;i=i+1)Bi+1 = Ci + Di; /* 原S2 */Ai+1 = Ai+1 + Bi+1; /* 原S1 */B101 = C100 + D100;,6.5 开发更多的指令级并行,修改方法:将存在循环携带相关的各条指令放在同一个叠代中,复杂循环携带数据相关的处理for(i=6;i=100;i=i+1)Yi = Yi-5 + Yi; / 相关距离为5for(i=2;i=100;i=i+1)Yi = Yi-1 +
12、 Yi; / 相关距离为1,6.5 开发更多的指令级并行,编译器必须检测出这种递归关系 (1) 某些系统结构(特别是向量计算机)为递归提供了专门的硬件支持 (2) 这样的递归结构中通常隐藏着大量的循环级并行,存储别名分析 什么是存储别名一个元素可能同时拥有多个合法的地址表达式Ai+5、Aj*2-6、Ak 数组是仿射的如果一个一维数组Am:n的下标可以被表示为形如ai+b的形式,那么就称该数组是仿射的(affine)。一个多维数组,如果它每一维的下标都是仿射的,那么它就是仿射的。,6.5 开发更多的指令级并行,GCD测试法 算法描述 如果GCD(c, a)可以整除(d-b),那么有可能存在存储别
13、名。 如果GCD测试的结果为假(不能整除),那么一定没有存储别名存在。例6.9 使用GCD测试方法判断下面的循环中是否存在存储别名。for(i=1;i=100;i=i+1)x2*i+3 = x2*i * 5.0;解 在这个循环中,a=2,b=3,c=2,d=0,那么GCD(a, c)=2,而d-b=-3。由于2不能整除-3,因此没有存储别名,即无论i取何值,x2*i+3 与x2*i都将表示数组x的不同元素。,6.5 开发更多的指令级并行,数据相关分析 除了检测指令之间是否存在数据相关外,编译器还会将识别出的数据相关进一步细分为真数据相关、输出相关和反相关等不同类型,以便利用不同的优化技术消除这
14、些相关。 常用的优化有重命名、值传播、高度消减等。,6.5 开发更多的指令级并行,重命名优化实例例6.10 找出下面循环中的所有数据相关,指出它们究竟是真数据 相关、输出相关、还是反相关,并利用重命名技术消除其中的输出 相关和反相关。for(i=1;i=100;i=i+1)Yi = Xi / a; /* S1 */Xi = Xi + a; /* S2 */Zi = Yi + a; /* S3 */Yi = a Yi; /* S4 */,6.5 开发更多的指令级并行,解 这4条语句中存在以下相关:1. S3与S1和S4与S1之间分别存在真数据相关。2. S2和S1之间存在反相关。3. S3和S4
15、之间存在反相关。4. S1和S4之间存在输出相关。for(i=1;i=100;i=i+1)Yi = Xi / a; /* S1 */Xi = Xi + a; /* S2 */Zi = Yi + a; /* S3 */Yi = a Yi; /* S4 */,6.5 开发更多的指令级并行,将原代码变换为下面的形式,可以消除所有输出相关和反相关。for(i=1;i=100;i=i+1)/* 将数组Y重命名为T以消除输出相关 */Ti = Xi / c;/* 将数组X重命名为X1以消除反相关 */X1i = Xi + c;/* 将Y重命名为T以消除反相关 */Zi = Ti + c;Yi = c Ti
16、;,6.5 开发更多的指令级并行,值传播优化实例 优化前代码DADDUI R1,R2,#4DADDUI R1,R1,#4 优化后代码DADDUI R1,R2,#8 值传播优化通过将变量替换为已知的值或表达式以达到消除数据相关,6.5 开发更多的指令级并行,高度消减优化实例 目的:缩短数据流图中关键路径的长度 优化前代码IADD R1,R2,R3 /* I1 */ADD R4,R1,R6 /* I2 */ADD R8,R4,R7 /* I3 */ 优化后代码IADD R1,R2,R3ADD R4,R6,R7ADD R8,R1,R4,6.5 开发更多的指令级并行,高度消减优化实例 优化前代码IIs
17、um = sum + Xi;sum = sum + Xi+1;sum = sum + Xi+2;sum = sum + Xi+3;sum = sum + Xi+4; 优化后代码IIsum = sum + Xi;t1 = Xi+1 + Xi+2;t2 = Xi+3 + Xi+4;t1 = t1 + t2;sum = sum + t1;,6.5 开发更多的指令级并行,关键路径长度为5,关键路径长度为3,Five Primary Approaches in Multiple-issue Processors (Again),EPIC and the IA-64 Development The roo
18、ts of the EPIC approach lie in earlier attempts to build LIW and VLIW machinesespecially those at Cydrome and Multiflowand in a long history of compiler work that continued after these companies failed at HP, the University of Illinois, and elsewhere. Insights gained from that work led designers at
19、HP to propose a VLIW-style, 64-bit architecture to follow the HP PA RISC architecture. Intel was looking for a new architecture to replace the x86 (now called IA-32) architecture and to provide 64-bit capability. In 1995, they formed a partnership to design a new architecture, IA-64 (see Huck et al.
20、 2000), and build processors based on it. Itanium (see Sharangpani and Arora 2000) is the first such processor. In 2002, Intel introduced the second-generation IA-64 design, the Itanium 2 (see McNairy and Soltis 2003 and McCormick and Knies 2002).,31,CS152 Labs,Each lab has directed plus open-ended
21、assignments Directed portion (2/7) is intended to ensure students learn main concepts behind lab Each student must perform own lab and hand in their own lab report Open-ended assignment (5/7) is to allow you to show your creativity Roughly a “mini-project” E.g., try an architectural idea and measure
22、 potential, or try to improve a design. Negative results OK (if explainable!) Students can work individually or in groups of two Group open-ended lab reports must be handed in separately (but state who you worked with) Students can work in different groups for different assignments Lab reports must
23、be readable English summaries Two free two-day extensions per student You may have to learn scripting languages,RISC-V ISA,RISC-V is a new simple, clean, extensible ISA we developed at Berkeley for education and research RISC-I/II, first Berkeley RISC implementations Berkeley research machines SOAR/
24、SPUR considered RISC-III/IV Both of the dominant ISAs (x86 and ARM) are too complex to use for teaching RISC-V ISA manual available on web page See “resources” on class website Full GCC-based tool chain available,32,Chisel simulators,Chisel is a new hardware description language we developed at Berk
25、eley based on Scala Constructing Hardware in a Scala Embedded Language Labs will use RISC-V processor simulators derived from Chisel processor designs Gives you much more detailed information than other simulators Can map to FPGA or real chip layout You need to learn some minimal Chisel in CS152, but well make Chisel RTL source available so you can see all the details of our processors Can do lab projects based on modifying the Chisel RTL code if desired,33,