最新十章依赖于机器的优化PPT课件.ppt
第十章第十章 依赖于机器的优化依赖于机器的优化 本章内容本章内容 使用使用指令级并行指令级并行的基础问题的基础问题 提取并行的数据相关性分析提取并行的数据相关性分析 代码调度的基本概念代码调度的基本概念 基本块调度的技术、发现通用程序中的高度数据基本块调度的技术、发现通用程序中的高度数据相关控制流的方法、调度数值程序的软件流水线相关控制流的方法、调度数值程序的软件流水线技术技术 在在多处理器系统多处理器系统上,使用数组的计算密集型程序上,使用数组的计算密集型程序的并行化和数据局部性优化的概念和方法的并行化和数据局部性优化的概念和方法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)LD R1, aLD R2, bADD R1, R1, R2LD R2, cADD R1, R1, R2LD R2, dLD R3, eADD R2, R2, R3ADD R1, R1, R2+e+c+ab+d若瞄准极小化寄存器若瞄准极小化寄存器的使用个数,则只需的使用个数,则只需使用使用3个寄存器个寄存器 10.2 代码调度的约束代码调度的约束 10.2.3 寄存器使用和并行执行之间的折衷寄存器使用和并行执行之间的折衷例:例:(a + b) + c + (d + e)LD R1, aLD R2, bADD R1, R1, R2LD R2, cADD R1, R1, R2LD R2, dLD R3, eADD R2, R2, R3ADD R1, R1, R2+e+c+ab+d完成整个计算需要完成整个计算需要7步步10.2 代码调度的约束代码调度的约束 10.2.3 寄存器使用和并行执行之间的折衷寄存器使用和并行执行之间的折衷例:例:(a + b) + c + (d + e)+e+c+ab+d如果对每个中间结果如果对每个中间结果使用不同寄存器,则使用不同寄存器,则完成计算只需要完成计算只需要4步步R1 = aR6 = R1+R2R8 = R6+R3R9 = R8+R7R2 = bR7 = R4+R5R3 = cR4 = d R5 = e10.2 代码调度的约束代码调度的约束 10.2.4 寄存器分配和代码调度的次序安排寄存器分配和代码调度的次序安排 先寄存器分配先寄存器分配 结果代码中会有很多存储相关结果代码中会有很多存储相关 非数值应用本质上没有多少并行,采用这种方式非数值应用本质上没有多少并行,采用这种方式 先代码调度先代码调度 导致寄存器溢出,抵消指令级并行的优点导致寄存器溢出,抵消指令级并行的优点 适用于有许多大表达式的数值应用适用于有许多大表达式的数值应用 在假定伪寄存器就是物理寄存器情况下,先调度在假定伪寄存器就是物理寄存器情况下,先调度指令,然后寄存器分配,把处理寄存器溢出的代指令,然后寄存器分配,把处理寄存器溢出的代码附加在必要的地方,并再次进行代码调度码附加在必要的地方,并再次进行代码调度10.2 代码调度的约束代码调度的约束 10.2.5 控制相关控制相关 在非数值计算中,基本块非常小,其中的操作通在非数值计算中,基本块非常小,其中的操作通常高度相关,几乎不能并行常高度相关,几乎不能并行 调查跨基本块的并行是至关重要的调查跨基本块的并行是至关重要的 若一条指令很可能被执行且有空闲的资源可若一条指令很可能被执行且有空闲的资源可“免免费费”用于完成该指令的操作,则可以投机地执行用于完成该指令的操作,则可以投机地执行该指令;若投机成功,则程序运行得快一些该指令;若投机成功,则程序运行得快一些例例 if (a t) b = a a依赖于比较依赖于比较a t的结果的结果 b = a a; 若若a a不会产生副作用,则不会产生副作用,则d = a + c; a a可以投机地执行可以投机地执行10.2 代码调度的约束代码调度的约束 10.2.6 投机执行的支持投机执行的支持 内存读取是一类使用频繁,且能从投机执行大大内存读取是一类使用频繁,且能从投机执行大大获益的指令获益的指令 但在但在 if (p != null)q = p中,投机地对中,投机地对p脱引用将引起该程序因脱引用将引起该程序因p等于等于null而错误地停止而错误地停止 许多高性能处理器提供专门的特性来支持投机地许多高性能处理器提供专门的特性来支持投机地内存访问内存访问10.2 代码调度的约束代码调度的约束 10.2.6 投机执行的支持投机执行的支持 预取指令预取指令在数据使用前将其从内存取到缓存在数据使用前将其从内存取到缓存,若该单元无效或访问它会引起缺页,则忽略若该单元无效或访问它会引起缺页,则忽略 抑制位抑制位允许投机地从内存将数据读取到寄允许投机地从内存将数据读取到寄存器堆,若出现非法内存访问或缺页,则设置目存器堆,若出现非法内存访问或缺页,则设置目标寄存器的抑制位标寄存器的抑制位 判定指令判定指令在判定条件为真时才执行的指令在判定条件为真时才执行的指令例例 if (a = 0)翻译成翻译成 ADD R3, R4, R5b = c + d; CMOVZ R2, 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必须小于或等于必须小于或等于Rj10.3 基基 本本 块块 调调 度度10.3.1 数据依赖图数据依赖图 基本块由数据依赖图基本块由数据依赖图G = (N, E)来表示来表示 结点集合结点集合N表示该块的机器指令中的操作集合表示该块的机器指令中的操作集合 有向边集合有向边集合E表示这些操作之间的数据相关约束表示这些操作之间的数据相关约束 G的结点集的结点集N和边集和边集E按如下两步构造按如下两步构造 N中的每个操作中的每个操作n有一张资源预留表有一张资源预留表RTn,其值直,其值直接就是接就是n的操作类型的资源预留表的操作类型的资源预留表 每条边每条边e都标示有延迟都标示有延迟de,表示,表示e的目的结点必须的目的结点必须在它源结点发射在它源结点发射de个时钟周期之后才可以发射个时钟周期之后才可以发射10.3 基基 本本 块块 调调 度度数据依赖图数据依赖图资源预留表资源预留表alu menLD R2, 0(R1)ST 4(R1), R2 LD R3, 8(R1)ADD R3, R3, R2ADD R3, R3, R4ST 0(R7), R7 ST 12(R1), R3 222111111i1i2i3i4i5i6i7灰色表灰色表示示1 白色表白色表示示0操作是全流水操作是全流水的,只需显示的,只需显示在第在第1行使用行使用的资源的资源 10.3 基基 本本 块块 调调 度度10.3.2 基本块的表调度基本块的表调度 关键路径包括最后关键路径包括最后5个结点,故第个结点,故第3条指令先调度条指令先调度 再调度第再调度第1条指令,因为第条指令,因为第4条指令还需等条指令还需等1周期周期 第第4周期调度周期调度2条条资源预留表资源预留表alu men调度表调度表LD R3, 8(R1) ADD R3, R3, R2ADD R3, R3, R4ST 0(R7), R7ST 12(R1), R3ST 4(R1), R2 LD R2, 0(R1) 10.3 基基 本本 块块 调调 度度10.3.2 基本块的表调度基本块的表调度 根据每个结点同先前已经被调度的各结点之间的根据每个结点同先前已经被调度的各结点之间的数据相关约束,来计算一个结点可以执行的最早数据相关约束,来计算一个结点可以执行的最早时间槽时间槽 这个结点所需资源根据一张资源预留表来进行检这个结点所需资源根据一张资源预留表来进行检查,该资源预留表收集了所有到目前为止被占用查,该资源预留表收集了所有到目前为止被占用资源。这个结点的调度按有足够资源的最早时间资源。这个结点的调度按有足够资源的最早时间槽来安排槽来安排10.4 全局代码调度全局代码调度 对于有适度指令级并行的机器,仅对每个基对于有适度指令级并行的机器,仅对每个基本块进行紧凑调度会引起许多资源空闲本块进行紧凑调度会引起许多资源空闲 全局调度:为了更好地利用机器资源,需要全局调度:为了更好地利用机器资源,需要考虑把指令从一个基本块移到另一个基本块考虑把指令从一个基本块移到另一个基本块的代码生成策略的代码生成策略必须保证必须保证 原来程序中所有指令在优化程序中都被执行原来程序中所有指令在优化程序中都被执行 当优化程序可以投机地执行额外指令时,这些指当优化程序可以投机地执行额外指令时,这些指令肯定不能有任何多余的副作用令肯定不能有任何多余的副作用10.4 全局代码调度全局代码调度10.4.1 简单的代码移动简单的代码移动 先用例子展示操作在基本块之间移动涉及的问题先用例子展示操作在基本块之间移动涉及的问题 L:if (a = 0) goto Lc = be = d + d(a) 源代码源代码(b) 局部调度的机器代码局部调度的机器代码LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度 假定假定a, b, c, d和和e的地址不同,分别保存在的地址不同,分别保存在R1到到R5 由于数据相关,块内的指令必须串行执行,且插由于数据相关,块内的指令必须串行执行,且插入入 NOPL:if (a = 0) goto Lc = be = d + d(a) 源代码源代码(b) 局部调度的机器代码局部调度的机器代码LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度 假定机器在一个时钟周期执行任意的两个操作假定机器在一个时钟周期执行任意的两个操作 读取操作有读取操作有2周期的延迟,其他指令周期的延迟,其他指令1周期的延迟周期的延迟L:if (a = 0) goto Lc = be = d + d(a) 源代码源代码(b) 局部调度的机器代码局部调度的机器代码LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度 B3肯定要执行,因而可以和肯定要执行,因而可以和B1并行执行并行执行 B2的读取操作在执行的读取操作在执行B1时投机地完成时投机地完成 B2的存储操作放到的存储操作放到B3的的一份拷贝中一份拷贝中L:if (a = 0) goto Lc = be = d + d(a) 源代码源代码(b) 局部调度的机器代码局部调度的机器代码LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度L:全局调度前后的流图全局调度前后的流图if (a = 0) goto Lc = be = d + d(a) 源代码源代码ST 0(R5), R8(b) 局部调度的机器代码局部调度的机器代码LD R6, 0(R1), LD R8, 0(R4) LD R7, 0(R2)ADD R8, R8, R8, BEQZ R6, LST 0(R5), R8, ST 0(R3), R7L:(c) 全局调度的机器代码全局调度的机器代码B1B3 B3LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度 基本块之间的基本块之间的支配关系支配关系指令在基本块之间的移动因支配关系不同而不同指令在基本块之间的移动因支配关系不同而不同 B1和和B3控制等价:控制等价:B1支配支配B3,B3后支配后支配B1 B1支配支配B2,但是但是B2并非后支配并非后支配B1 B2不支配不支配B3,但是但是B3后支配后支配B2LD R6, 0(R1) NOPBEQZ R6, LLD R7, 0(R2) NOPST 0(R3), R7 LD R8, 0(R4) NOPADD R8, R8, R8ST 0(R5), R8B2B1B3L:10.4 全局代码调度全局代码调度10.4.2 向上的代码移动向上的代码移动从块从块src向上移动到块向上移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次dstsrc10.4 全局代码调度全局代码调度10.4.2 向上的代码移动向上的代码移动从块从块src向上移动到块向上移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次 若若src未后支配未后支配dst,被移动操作可利用空闲资源免,被移动操作可利用空闲资源免费执行,在控制流到达费执行,在控制流到达src时获益时获益dstsrc10.4 全局代码调度全局代码调度10.4.2 向上的代码移动向上的代码移动从块从块src向上移动到块向上移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次 若若src未后支配未后支配dst,被移动操作可利用空闲资源免,被移动操作可利用空闲资源免费执行,在控制流到达费执行,在控制流到达src时获益时获益 若若dst不支配不支配src,需要插入被移动操作的拷贝需要插入被移动操作的拷贝 dstsrc10.4 全局代码调度全局代码调度10.4.3 向下的代码移动向下的代码移动从块从块src向下移动到块向下移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次srcdst10.4 全局代码调度全局代码调度10.4.3 向下的代码移动向下的代码移动从块从块src向下移动到块向下移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次 src未后支配未后支配dst, 向下移动的代码经常是存储操作向下移动的代码经常是存储操作, 复制从复制从src到到dst路径上的各块,并把路径上的各块,并把被移动操作仅放置在被移动操作仅放置在dst的新拷贝中的新拷贝中srcdst10.4 全局代码调度全局代码调度9.5节的例子可作为参考节的例子可作为参考B1B2B3B4a = b + cB5B6B7d = b + cB1B2B3B4t = b + ca = tB4 B5d = td = b + cB6B6 B710.4 全局代码调度全局代码调度10.4.3 向下的代码移动向下的代码移动从块从块src向下移动到块向下移动到块dst,假定移动未违反数据相,假定移动未违反数据相关,并使得通过关,并使得通过dst到到src的路径运行得较快的路径运行得较快 若若dst和和src等价,则被移动操作应该被执行时,它等价,则被移动操作应该被执行时,它正好仅被执行一次正好仅被执行一次 src未后支配未后支配dst, 向下移动的代码经常是存储操作向下移动的代码经常是存储操作, 复制从复制从src到到dst路径上的各块,并把路径上的各块,并把被移动操作仅放置在被移动操作仅放置在dst的新拷贝中的新拷贝中 dst没有后支配没有后支配src,插入补偿代码以,插入补偿代码以保证被移动操作在不经保证被移动操作在不经dst路径上也执行路径上也执行srcdst10.4 全局代码调度全局代码调度10.4.4 更新数据相关更新数据相关代码移动会改变操作之间的数据相关关系代码移动会改变操作之间的数据相关关系 两个对两个对x的赋值之一可以移动到最上面的基本块的赋值之一可以移动到最上面的基本块,该变换能维持原来程序中的所有相关性,该变换能维持原来程序中的所有相关性 一旦一个对一旦一个对x的赋值被上移,另一个就不能移动的赋值被上移,另一个就不能移动了了 移动使得移动使得x在最上面块的出口在最上面块的出口由不活跃变成活跃由不活跃变成活跃 一个变量在某个程序点一个变量在某个程序点活跃,则就不能把对它的投机活跃,则就不能把对它的投机定值移到该点的上面定值移到该点的上面x = 1x = 210.4 全局代码调度全局代码调度10.4.5 全局调度的其他问题全局调度的其他问题 程序调度应该使经常执行的路径运行得快一些,程序调度应该使经常执行的路径运行得快一些,不经常执行的路径可能会因调度变得慢一些不经常执行的路径可能会因调度变得慢一些 编译器可用来估计执行频率的技术有若干种编译器可用来估计执行频率的技术有若干种(1) 内循环比外循环执行得更频繁内循环比外循环执行得更频繁(2) 分支指令往回跳转比不跳转要更经常分支指令往回跳转比不跳转要更经常(3)看守程序出口或异常处理例程的分支语句很看守程序出口或异常处理例程的分支语句很少被执行少被执行 最好的频率估计来自动态剖析,程序被静态插桩最好的频率估计来自动态剖析,程序被静态插桩以用来运行时记录条件分支每次的走向以用来运行时记录条件分支每次的走向10.4 全局代码调度全局代码调度10.4.5 全局调度的其他问题全局调度的其他问题 最简单的全局调度算法也相当复杂,不介绍最简单的全局调度算法也相当复杂,不介绍 在一些全局调度算法中,循环迭代的边界是代码移在一些全局调度算法中,循环迭代的边界是代码移动的一种屏障,需循环展开动的一种屏障,需循环展开for(i = 0; i N; i +) for ( i = 0; i + 4 N; i += 4) S(i);S(i); S(i +1);S(i +2); S(i +3); for ( ; i N; i +) S(i); 10.4 全局代码调度全局代码调度10.4.6 静态调度器和动态调度器的相互影响静态调度器和动态调度器的相互影响动态调度器的优点是可以根据运行时的情况建立新动态调度器的优点是可以根据运行时的情况建立新的调度表,无需事先编码所有可能的调度表的调度表,无需事先编码所有可能的调度表10.4 全局代码调度全局代码调度10.4.6 静态调度器和动态调度器的相互影响静态调度器和动态调度器的相互影响 存在动态调度情况下,静态调度器的作用存在动态调度情况下,静态调度器的作用 保证尽早地取高延迟的指令,使得动态调度器能保证尽早地取高延迟的指令,使得动态调度器能够尽早发射它们够尽早发射它们 尽早安排预取指令,使数据到要用时已经在缓存尽早安排预取指令,使数据到要用时已经在缓存, 或尽早安排可能不命中缓存的操作或尽早安排可能不命中缓存的操作 只需要给数据相关的操作安排正确的次序,无需只需要给数据相关的操作安排正确的次序,无需通过极小化延迟来分离每一对数据相关的操作通过极小化延迟来分离每一对数据相关的操作 给分支预测指令较高优先级,以减少预测错误的给分支预测指令较高优先级,以减少预测错误的代价代价10.5 软软 件件 流流 水水 10.5.1 引言引言软件流水是一种调度算法,它每次调度一个软件流水是一种调度算法,它每次调度一个完整的循环,以充分利用穿越迭代的并行性完整的循环,以充分利用穿越迭代的并行性 单次迭代的操作中几乎没有什么并行性单次迭代的操作中几乎没有什么并行性 软件流水技术不断地重叠一些相继迭代,直到所软件流水技术不断地重叠一些相继迭代,直到所有迭代都填入流水线为止有迭代都填入流水线为止 能产生高效和紧凑的代码能产生高效和紧凑的代码以一周期内可以同时发射一个读取、一个存储、以一周期内可以同时发射一个读取、一个存储、一个算术运算(全流水)和一个分支操作的机器一个算术运算(全流水)和一个分支操作的机器来举例来举例10.5 软软 件件 流流 水水 每次调度一个迭代的结果见右边每次调度一个迭代的结果见右边for (i = 0; i n; i +) / R1, R2, R3 = &A, &B, &D Di = Ai Bi + c; / R4= c / R10= n 1 L: LD R5, 0(R1+) LD R6, 0(R2+) MUL R7, R5, R6 NOP ADD R8, R7, R4 NOP ST 0(R3+),R8, BL R10, L 该计算大部分是该计算大部分是串行的,它需要串行的,它需要7周期,只有循周期,只有循环回跳指令和迭环回跳指令和迭代中最后一条指代中最后一条指令重叠令重叠 10.5 软软 件件 流流 水水 循环展开循环展开4次迭代的调度结果见右边次迭代的调度结果见右边for (i = 0; i = 5)N2 = 1 + 2 (N 1) / 2);elseN2 = 0;for (i = 0; i N2; i +)/ 该循环被流水化该循环被流水化Di = Ai Bi + c;for (i = N2; i N; i +)/ 不需要优化不需要优化Di = Ai Bi + c;10.5 软软 件件 流流 水水 10.5.4 Do-Across循环循环软件流水也可以用到迭代之间存在数据相关的循软件流水也可以用到迭代之间存在数据相关的循环,这样的循环叫做环,这样的循环叫做do-across循环循环for (i = 0; i n; i +) sum = sum + Ai;Bi = Ai b; 该循环的执行不可能快于每该循环的执行不可能快于每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; i n; i +)Ai = Bi + Ai 2写写Ai和读和读Ai 2的依赖边上标记的迭代次数差的依赖边上标记的迭代次数差是是210.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; i n; i+) Zi = Xi Yi;Zi = Zi Zi;/ 变换成如下代码变换成如下代码b = ceil (n/M); / M个处理器个处理器, p = 0, 1, , M 1 for (i = b p; i min(n, b (p+1); i+) Zi = Xi Yi;Zi = Zi Zi; / 数据并行的例子数据并行的例子10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.3 循环级并行循环级并行 对并行化来说,任务级不像循环级那样有吸引力对并行化来说,任务级不像循环级那样有吸引力 对一个程序而言,独立的任务数是一个常数,它对一个程序而言,独立的任务数是一个常数,它不像典型的循环那样,独立的计算单元随迭代次不像典型的循环那样,独立的计算单元随迭代次数增加而增加数增加而增加 任务通常不是等规模的,因此很难保证所有的处任务通常不是等规模的,因此很难保证所有的处理器在所有时间都处于忙碌理器在所有时间都处于忙碌10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.4 数据局部性数据局部性 程序局部性程序局部性 大多数程序的大部分时间在执行一小部分代码,大多数程序的大部分时间在执行一小部分代码,并且仅涉及一小部分数据并且仅涉及一小部分数据 时间局部性时间局部性 程序访问的内存单元在很短的时间内可能再次被程序访问的内存单元在很短的时间内可能再次被程序访问程序访问 空间局部性空间局部性 毗邻被访问单元的内存单元在很短的时间内可能毗邻被访问单元的内存单元在很短的时间内可能被访问被访问10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.4 数据局部性数据局部性 同一个缓存行上的元素一起被使用的情况是空间同一个缓存行上的元素一起被使用的情况是空间局部性的一种重要形式局部性的一种重要形式 这种空间局部性将缓存未命中降到最低,因此使这种空间局部性将缓存未命中降到最低,因此使得程度获得明显的加速得程度获得明显的加速10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.4 数据局部性数据局部性for (i = 0; i n; i+) / 该程序段对向量机来该程序段对向量机来 Zi = Xi Yi;/ 说是一种优化形式说是一种优化形式 for (i = 0; i n; i+) Zi = Zi Zi;for (i = 0; i n; i+) / 有较好的数据局部性有较好的数据局部性 Zi = Xi Yi; Zi = Zi Zi;10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.4 数据局部性数据局部性 对行为主的数组对行为主的数组Z,根据空间局部性,显然更愿,根据空间局部性,显然更愿意逐行地给该数组元素置零意逐行地给该数组元素置零for (j = 0; j n; j+)for (i = 0; i n; i+) for (i = 0; i n; i+) for (j = 0; j n; j+) Zi, j = 0; Zi, j = 0; 为了获得最好的性能,应该并行化外循环为了获得最好的性能,应该并行化外循环 b = ceil (n/M); for (i = b p; i min(n, b (p+1); i+) for (j = 0; j n; j+) Zi, j = 0;10.6 并行性和数据局部性优化概述并行性和数据局部性优化概述10.6.4 数据局部性数据局部性 操作在数组上的数值应用的几个重要特征操作在数组上的数值应用的