




已阅读5页,还剩72页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章依赖于机器的优化,在指令级并行的机器上,程序的运行速度依赖于下面几个因素程序中潜在的并行处理器上可用的并行从串行程序提取并行的能力在给定的调度约束下发现最佳并行调度的能力并行的提取和并行执行的调度都可以静态地在软件中或动态地在硬件中完成,第十章依赖于机器的优化,本章内容使用指令级并行的基础问题提取并行的数据相关性分析代码调度的基本概念基本块调度的技术、发现通用程序中的高度数据相关控制流的方法、调度数值程序的软件流水线技术在多处理器系统上,使用数组的计算密集型程序的并行化和数据局部性优化的概念和方法,10.1处理器体系结构,在考虑指令级并行时,通常想象成一个处理器在单个时钟周期内发射几个操作事实上,在每周期内发射一个操作是可能的,而指令级并行的获得是通过使用流水线技术本节先解释流水线,然后讨论多指令发射,10.1处理器体系结构,10.1.1指令流水线和分支延迟ii+1i+2i+3i+41.if2.idif3.exidif4.memexidif5.wbmemexidif6.wbmemexid7.wbmemex8.wbmem9.wb,取指令if,译码id,执行操作ex,访问内存mem,回写结果wb,5级指令流水线中的5条连续指令,10.1处理器体系结构,10.1.1指令流水线和分支延迟分支延迟发现应该执行一个分支而不是直接后继转向一个分支时会引起取分支目的地址指令的延迟并引起指令流水线“打嗝”可以通过使用硬件,根据分支的执行历史来预测分支结果并从预测的目的地址预取指令分支延迟不可避免,因为分支预测会发生偏差,10.1处理器体系结构,10.1.2流水化的执行如果不依赖一条指令结果的随后指令在该结果产生前就被允许执行有些指令的执行需要几个周期,几个操作同时出现在它们的执行级上可能的如果最长的执行流水线是n级,n个操作同时进行的可能性是存在的并非所有的指令都能被完全流水化,例如浮点除通用处理器大都动态察觉相继指令之间的依赖性嵌入式系统把数据相关性的检查交给软件,10.1处理器体系结构,10.1.3多指令发射每周期发射几个操作,让更多操作同时进行超长指令字机器将若干个操作编码在单周期中发射编译器需要确定哪些操作可以并行发射超标量机器超标量机器有按普通顺序执行语义的正规指令集硬件自动察觉指令之间的相关性,并且在它们的操作数可用时就发射它们更复杂的调度器能够“乱序”执行指令,10.2代码调度的约束,代码调度用在代码生成器产生的机器代码上的优化技术本节讨论代码调度的约束控制相关约束在原程序中执行的所有操作都必须在优化代码中执行数据相关约束优化程序中的操作产生的结果必须同原程序对应操作的结果一样资源约束调度不能过分占用机器的资源优化程序很难调试内存状态可能和顺序执行的任何内存状态不匹配,10.2代码调度的约束,10.2.1数据相关真相关如果对同一个单元先写后读,那么读依赖于所写的值反相关如果对同一个单元先读后写。可以通过把值存在不同的单元来删除反相关输出相关如果对同一个单元先后写两次。也可删除数据相关概念可同时用于内存访问和寄存器访问,10.2代码调度的约束,10.2.2发现内存访问中的相关性例(1)a=1(2)p=2(3)x=a语句(1)和(2)可能构成输出相关语句(1)和(3)可能构成真相关语句(2)和(3)可能构成真相关除非编译器知道p不可能指向a,否则3个操作必须串行执行,10.2代码调度的约束,10.2.2发现内存访问中的相关性发现数据相关需要不同形式的分析数组元素间的别名分析ai和aj是否互为别名指针别名分析若p和q相等,则p和q、p-next和q-next、p-data和q-data等都分别互为别名过程间分析引用调用场合:形参和形参之间、形参和全局变量之间因实参而引起互为别名,10.2代码调度的约束,10.2.3寄存器使用和并行执行之间的折衷例:(a+b)+c+(d+e)ldr1,aldr2,baddr1,r1,r2ldr2,caddr1,r1,r2ldr2,dldr3,eaddr2,r2,r3addr1,r1,r2,若瞄准极小化寄存器的使用个数,则只需使用3个寄存器,10.2代码调度的约束,10.2.3寄存器使用和并行执行之间的折衷例:(a+b)+c+(d+e)ldr1,aldr2,baddr1,r1,r2ldr2,caddr1,r1,r2ldr2,dldr3,eaddr2,r2,r3addr1,r1,r2,完成整个计算需要7步,10.2代码调度的约束,10.2.3寄存器使用和并行执行之间的折衷例:(a+b)+c+(d+e),如果对每个中间结果使用不同寄存器,则完成计算只需要4步,10.2代码调度的约束,10.2.4寄存器分配和代码调度的次序安排先寄存器分配结果代码中会有很多存储相关非数值应用本质上没有多少并行,采用这种方式先代码调度导致寄存器溢出,抵消指令级并行的优点适用于有许多大表达式的数值应用在假定伪寄存器就是物理寄存器情况下,先调度指令,然后寄存器分配,把处理寄存器溢出的代码附加在必要的地方,并再次进行代码调度,10.2代码调度的约束,10.2.5控制相关在非数值计算中,基本块非常小,其中的操作通常高度相关,几乎不能并行调查跨基本块的并行是至关重要的若一条指令很可能被执行且有空闲的资源可“免费”用于完成该指令的操作,则可以投机地执行该指令;若投机成功,则程序运行得快一些例if(at)b=aa依赖于比较at的结果b=aa;若aa不会产生副作用,则d=a+c;aa可以投机地执行,10.2代码调度的约束,10.2.6投机执行的支持内存读取是一类使用频繁,且能从投机执行大大获益的指令但在if(p!=null)q=p中,投机地对p脱引用将引起该程序因p等于null而错误地停止许多高性能处理器提供专门的特性来支持投机地内存访问,10.2代码调度的约束,10.2.6投机执行的支持预取指令在数据使用前将其从内存取到缓存,若该单元无效或访问它会引起缺页,则忽略抑制位允许投机地从内存将数据读取到寄存器堆,若出现非法内存访问或缺页,则设置目标寄存器的抑制位判定指令在判定条件为真时才执行的指令例if(a=0)翻译成addr3,r4,r5b=c+d;cmovzr2,r3,r1假定a、b、c和d分别被分配了r1、r2、r4和r5可用来将相邻基本块组合成一个更大基本块,10.2代码调度的约束,10.2.7一个基本的机器模型机器模型m=(r,t)t:操作类型集,如读取、存储和算术运算等r=r1,r2,:硬件资源向量集,如内存访问部件、算术运算部件和浮点功能部件ri代表第i类资源中可用的部件数每个操作有一组输入操作数、一组输出操作数和一个资源需求和每个输入操作数相关的是一个输入延迟和每个输出操作数相关的是一个输出延迟,10.2代码调度的约束,10.2.7一个基本的机器模型机器模型m=(r,t)对每种操作类型t,资源使用由一张二维资源预留表rtt来建模条目rtti,j是t类型的一个操作在它被发射i时钟周期后,使用第j种资源的部件数对任何t、i和j,rtti,j必须小于或等于rj,10.3基本块调度,10.3.1数据依赖图基本块由数据依赖图g=(n,e)来表示结点集合n表示该块的机器指令中的操作集合有向边集合e表示这些操作之间的数据相关约束g的结点集n和边集e按如下两步构造n中的每个操作n有一张资源预留表rtn,其值直接就是n的操作类型的资源预留表每条边e都标示有延迟de,表示e的目的结点必须在它源结点发射de个时钟周期之后才可以发射,10.3基本块调度,灰色表示1白色表示0,操作是全流水的,只需显示在第1行使用的资源,10.3基本块调度,10.3.2基本块的表调度关键路径包括最后5个结点,故第3条指令先调度再调度第1条指令,因为第4条指令还需等1周期第4周期调度2条,10.3基本块调度,10.3.2基本块的表调度根据每个结点同先前已经被调度的各结点之间的数据相关约束,来计算一个结点可以执行的最早时间槽这个结点所需资源根据一张资源预留表来进行检查,该资源预留表收集了所有到目前为止被占用资源。这个结点的调度按有足够资源的最早时间槽来安排,10.4全局代码调度,对于有适度指令级并行的机器,仅对每个基本块进行紧凑调度会引起许多资源空闲全局调度:为了更好地利用机器资源,需要考虑把指令从一个基本块移到另一个基本块的代码生成策略必须保证原来程序中所有指令在优化程序中都被执行当优化程序可以投机地执行额外指令时,这些指令肯定不能有任何多余的副作用,10.4全局代码调度,10.4.1简单的代码移动先用例子展示操作在基本块之间移动涉及的问题,10.4全局代码调度,假定a,b,c,d和e的地址不同,分别保存在r1到r5由于数据相关,块内的指令必须串行执行,且插入nop,10.4全局代码调度,假定机器在一个时钟周期执行任意的两个操作读取操作有2周期的延迟,其他指令1周期的延迟,10.4全局代码调度,b3肯定要执行,因而可以和b1并行执行b2的读取操作在执行b1时投机地完成b2的存储操作放到b3的一份拷贝中,10.4全局代码调度,10.4全局代码调度,基本块之间的支配关系指令在基本块之间的移动因支配关系不同而不同b1和b3控制等价:b1支配b3,b3后支配b1b1支配b2,但是b2并非后支配b1b2不支配b3,但是b3后支配b2,10.4全局代码调度,10.4.2向上的代码移动从块src向上移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次,10.4全局代码调度,10.4.2向上的代码移动从块src向上移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次若src未后支配dst,被移动操作可利用空闲资源免费执行,在控制流到达src时获益,10.4全局代码调度,10.4.2向上的代码移动从块src向上移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次若src未后支配dst,被移动操作可利用空闲资源免费执行,在控制流到达src时获益若dst不支配src,需要插入被移动操作的拷贝,10.4全局代码调度,10.4.3向下的代码移动从块src向下移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次,10.4全局代码调度,10.4.3向下的代码移动从块src向下移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次src未后支配dst,向下移动的代码经常是存储操作,复制从src到dst路径上的各块,并把被移动操作仅放置在dst的新拷贝中,10.4全局代码调度,9.5节的例子可作为参考,10.4全局代码调度,10.4.3向下的代码移动从块src向下移动到块dst,假定移动未违反数据相关,并使得通过dst到src的路径运行得较快若dst和src等价,则被移动操作应该被执行时,它正好仅被执行一次src未后支配dst,向下移动的代码经常是存储操作,复制从src到dst路径上的各块,并把被移动操作仅放置在dst的新拷贝中dst没有后支配src,插入补偿代码以保证被移动操作在不经dst路径上也执行,10.4全局代码调度,10.4.4更新数据相关代码移动会改变操作之间的数据相关关系两个对x的赋值之一可以移动到最上面的基本块,该变换能维持原来程序中的所有相关性一旦一个对x的赋值被上移,另一个就不能移动了移动使得x在最上面块的出口由不活跃变成活跃一个变量在某个程序点活跃,则就不能把对它的投机定值移到该点的上面,10.4全局代码调度,10.4.5全局调度的其他问题程序调度应该使经常执行的路径运行得快一些,不经常执行的路径可能会因调度变得慢一些编译器可用来估计执行频率的技术有若干种(1)内循环比外循环执行得更频繁(2)分支指令往回跳转比不跳转要更经常(3)看守程序出口或异常处理例程的分支语句很少被执行最好的频率估计来自动态剖析,程序被静态插桩以用来运行时记录条件分支每次的走向,10.4全局代码调度,10.4.5全局调度的其他问题最简单的全局调度算法也相当复杂,不介绍在一些全局调度算法中,循环迭代的边界是代码移动的一种屏障,需循环展开for(i=0;in;i+)for(i=0;i+4n;i+=4)s(i);s(i);s(i+1);s(i+2);s(i+3);for(;in;i+)s(i);,10.4全局代码调度,10.4.6静态调度器和动态调度器的相互影响动态调度器的优点是可以根据运行时的情况建立新的调度表,无需事先编码所有可能的调度表,10.4全局代码调度,10.4.6静态调度器和动态调度器的相互影响存在动态调度情况下,静态调度器的作用保证尽早地取高延迟的指令,使得动态调度器能够尽早发射它们尽早安排预取指令,使数据到要用时已经在缓存,或尽早安排可能不命中缓存的操作只需要给数据相关的操作安排正确的次序,无需通过极小化延迟来分离每一对数据相关的操作给分支预测指令较高优先级,以减少预测错误的代价,10.5软件流水,10.5.1引言软件流水是一种调度算法,它每次调度一个完整的循环,以充分利用穿越迭代的并行性单次迭代的操作中几乎没有什么并行性软件流水技术不断地重叠一些相继迭代,直到所有迭代都填入流水线为止能产生高效和紧凑的代码以一周期内可以同时发射一个读取、一个存储、一个算术运算(全流水)和一个分支操作的机器来举例,10.5软件流水,每次调度一个迭代的结果见右边for(i=0;in;i+)/r1,r2,r3=/r4=c/r10=n1l:ldr5,0(r1+)ldr6,0(r2+)mulr7,r5,r6nopaddr8,r7,r4nopst0(r3+),r8,blr10,l,该计算大部分是串行的,它需要7周期,只有循环回跳指令和迭代中最后一条指令重叠,10.5软件流水,循环展开4次迭代的调度结果见右边for(i=0;i=5)n2=1+2(n1)/2);elsen2=0;for(i=0;in2;i+)/该循环被流水化di=aibi+c;for(i=n2;in;i+)/不需要优化di=aibi+c;,10.5软件流水,10.5.4do-across循环软件流水也可以用到迭代之间存在数据相关的循环,这样的循环叫做do-across循环for(i=0;in;i+)sum=sum+ai;bi=aib;该循环的执行不可能快于每2周期1次迭代即使有更多的加法器或乘法器,也不可能更快吞吐能力受到穿越迭代的数据相关链的限制,10.5软件流水,10.5.5软件流水的目标和约束目标基本目标是极大化耗时较长的循环的吞吐能力次要目标是保持所产生代码的规模较小达到目标的体现软件流水化的循环应该有较小的流水线稳定状态实现策略让每次迭代的相对调度都相同,并且这些迭代以同样的时间间隔逐步启动,10.5软件流水,10.5.5软件流水的目标和约束资源约束令机器资源由r=r1,r2,.表示,其中ri是第i类资源可用部件数若循环的一次迭代需要第i类资源ni个部件流水化循环的平均启动间隔至少是maxi(ni/ri)周期如果maxi(ni/ri)小于1,则将源代码展开几次是有用的,10.5软件流水,10.5.5软件流水的目标和约束数据相关一个操作可能依赖于前一次迭代中同样操作的结果,不同于到目前为止碰到的数据相关仅用延迟来标记边不够用,需要区别不同迭代中同一操作的实例,例如:for(i=2;in;i+)ai=bi+ai2写ai和读ai2的依赖边上标记的迭代次数差是2,10.6并行性和数据局部性优化概述,并行编程模型任务并行数据并行数据流并行(前面几节涉及较多)本节内容围绕任务并行和数据并行介绍并行计算机系统结构的概况给出并行化的基本概念,程序循环的变换,还有对并行化有用的概念类似的考虑怎样用于优化数据局部性以矩阵乘算法的优化为例,10.6并行性和数据局部性优化概述,10.6.1多处理器对称多处理器的体系结构,多个高性能处理器集成在一块芯片上,10.6并行性和数据局部性优化概述,10.6.1多处理器对称多处理器的体系结构,多个高性能处理器集成在一块芯片上通过共享内存来进行通信,必须在处理器的缓存中找到它操作的大部分数据,以保证性能,10.6并行性和数据局部性优化概述,10.6.1多处理器分布式内存机器,在内存分层中又引入一层处理器能迅速访问自己的局部内存,10.6并行性和数据局部性优化概述,10.6.1多处理器分布式内存机器,在内存分层中又引入一层处理器能迅速访问自己的局部内存,非均匀内存访问的机器和消息传递的机器;为获得良好的性能软件都必须有很好局部性,10.6并行性和数据局部性优化概述,10.6.2应用中的并行性并行应用性能衡量的两种标准并行覆盖:整个计算中并行运行部分的百分比并行粒度:处理器上无需和其它处理器同步或通信的计算量循环对并行化来说特别有吸引力,循环可以有许多次迭代计算,如果这些计算相互独立,则它们是并行计算的主要来源许多控制结构简单、数据量大并且耗时长的科学和工程应用,很容易以较细粒度被并行化,10.6并行性和数据局部性优化概述,10.6.3循环级并行耗时的应用一般都使用大数组,导致程序中出现有许多次迭代的循环,这些迭代经常相互独立,可以把这类循环的大量迭代分到各处理器上,10.6并行性和数据局部性优化概述,10.6.3循环级并行for(i=0;in;i+)zi=xiyi;zi=zizi;/变换成如下代码b=ceil(n/m);/m个处理器,p=0,1,m1for(i=bp;imin(n,b(p+1);i+)zi=xiyi;zi=zizi;/数据并行的例子,10.6并行性和数据局部性优化概述,10.6.3循环级并行对并行化来说,任务级不像循环级那样有吸引力对一个程序而言,独立的任务数是一个常数,它不像典型的循环那样,独立的计算单元随迭代次数增加而增加任务通常不是等规模的,因此很难保证所有的处理器在所有时间都处于忙碌,10.6并行性和数据局部性优化概述,10.6.4数据局部性程序局部性大多数程序的大部分时间在执行一小部分代码,并且仅涉及一小部分数据时间局部性程序访问的内存单元在很短的时间内可能再次被程序访问空间局部性毗邻被访问单元的内存单元在很短的时间内可能被访问,10.6并行性和数据局部性优化概述,10.6.4数据局部性同一个缓存行上的元素一起被使用的情况是空间局部性的一种重要形式这种空间局部性将缓存未命中降到最低,因此使得程度获得明显的加速,10.6并行性和数据局部性优化概述,10.6.4数据局部性for(i=0;in;i+)/该程序段对向量机来zi=xiyi;/说是一种优化形式for(i=0;in;i+)zi=zizi;for(i=0;in;i+)/有较好的数据局部性zi=xiyi;zi=zizi;,10.6并行性和数据局部性优化概述,10.6.4数据局部性对行为主的数组z,根据空间局部性,显然更愿意逐行地给该数组元素置零for(j=0;jn;j+)for(i=0;in;i+)for(i=0;in;i+)for(j=0;jn;j+)zi,j=0;zi,j=0;为了获得最好的性能,应该并行化外循环b=ceil(n/m);for(i=bp;imin(n,b(p+1);i+)for(j=0;jn;j+)zi,j=0;,10.6并行性和数据局部性优化概述,10.6.4数据局部性操作在数组上的数值应用的几个重要特征数组代码经常有许多可以并行化的循环当循环有并行性时,它们的迭代可按任意次序执行,因而可重新安排计算次序以彻底改进数据局部性在创建相互独立的并行计算大单元时,串行执行这些单元往往会产生较好的数据局部性,10.6并行性和数据局部性优化概述,10.6.5矩阵乘法算法该算法是计算密集型的,原则上内存访问不应该构成瓶颈假定矩阵的布局是行为主假定正好c个数组元素能够放满一个缓存行,x的一行仅散布在n/c个缓存行上假定缓存足以放下x所有的缓存行,读入x出现n2/c次缓存未命中,for(i=0;in;i+)for(j=0;jn;j+)zi,j=0.0;for(k=0;kn;k+)zi,j=zi,j+xi,kyk,j;,10.6并行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机械设计制造企业人事代理招聘考试模拟题
- 2025年房地产行业招聘面试技巧大解密预测问题与答案参考
- 2025年物流经理高级面试必-备知识点与预测题详解
- 2025年注册验船师资格考试(B级船舶检验法律法规)综合练习题及答案一
- 2025年监理工程师之交通工程目标控制题库含答案(能力提升)
- 特种设备事故应急救援预案和演练方案(模板及记录表)
- 2025年初中地理模拟试卷(地理环境与可持续发展)及答案详解
- 桃花源记全文朗诵课件
- 2025年能源企业环保主管岗位培训与实操考核试题
- 2025年民政领域公务员面试高频考点公共突发事件应对
- 妇产科危重护理常规、应急预案、工作流程
- 土木工程毕业设计最终模板
- 彩妆行业发展趋势
- 【培训课件】跨部门沟通与协作(讲解版)
- 物流建设项目可研报告
- 声音和影像的数字化行业研究报告
- 2024-2030年中国白银境外融资报告
- 韦莱韬悦-东方明珠新媒体职位职级体系咨询项目建议书-2017
- 中国心力衰竭诊断和治疗指南2024解读(完整版)
- 八上外研版英语书单词表
- 高标准农田建设项目施工合同
评论
0/150
提交评论