第1章 绪论

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "第1章 绪论"

Transcription

1 高效能通用微处理器芯片体系结构关键技术途径探讨 安虹 摘要 21 世纪, 计算机系统的核心评价指标由高性能转向高效能, 设计驱动由计算为中心的应用转向以数据为中心的应用, 实现技术由深亚微米工艺转向纳米工艺, 这些变化将对微处理器体系结构技术的未来发展产生深刻的影响 本文从分析传统的通用微处理器体系结构方法面临的挑战和技术局限性入手, 撷取学术界和工业界在未来微处理器芯片体系结构领域具有重要意义的研究和开发实例, 探讨了高效能通用微处理器芯片体系结构的关键技术途径及值得关注的研究问题 1. 通用微处理器芯片体系结构面临的挑战 传统的通用微处理器芯片设计主要采用冯. 诺依曼模型, 利用指令级并行性 (Instruction-Level parallelism, 简称 ILP) 开发资源集中的单处理器单指令流的芯片 自 80 年代中期以来微处理器的性能每年提高 50-60% 70 年代, 微处理器的进步主要是提高数据通路的宽度和对存储管理提供硬件支持 80 年代, 工艺和集成电路技术的发展, 允许将大型机上的很多体系结构技术, 如 : 超标量 多级存储 推测执行等指令级并行处理技术在微处理器芯片上实现 进入 90 年代, 人们继续为提高微处理器的指令级并行度做不懈的努力, 但实际的商用微处理器性能的提高越来越多地得益于时钟频率的提高 目前通用微处理器的指令并行度一般维持在平均每个周期完成不到 2 条指令, 甚至不到 1 条指令 相比之下, 在 90 年代的 10 年中, 微处理器的主频由 90 年的 33MHz 提高到 2001 年的 2G 以上, 每年大约提高 40%, 仅由时钟频率带来的性能提高就占 4/5 时钟频率的提高一方面源于工艺的进步提供了开关速度更快的晶体管 ; 另一方面更多地源于深度流水的结构设计 这一时期, 流水线深度的增加与时钟频率的提高大概呈现出 4 倍的线性关系 但是, 随着深度流水线设计接近每一级流水门数 8~16 的最低下限, 流水深度的增加即将终止 此后, 时钟频率的提高将只能依赖门电路速度的提高, 预计门电路的速度将每年提高 12-19% 因此, 为了获得更高的微处理器性能, 需要开发更多更粗粒度的片上并行性 但是, 随着半导体工艺进入深亚微米, 线延迟超过门延迟, 使得在传统结构上提高 ILP 变得越来越困难, 甚至于连维持现有的 ILP 水平都很困难 这个问题已经成为微体系结构设计的首要约束 在 35nm 工艺下, 在芯片上传输一个信号即使借助于优化的转发器也需要大约 30 个时钟周期的延迟 当工艺进入 100 纳米以下, 指令级并行处理器中一些集中的大结构, 如指令发射窗口 重命名表 分支预测器 旁路网络 寄存器文件和 Cache 都将变慢, 将导致某一特定频率下的 IPC(Instructions Per Cycle) 降低 正因为如此,Intel Pentium4 芯片在 20 级的流水线中, 花费了两个流水级专门用于驱动信号将数值传送到寄存器文件 ;Alpha21264 芯片则采用成簇的功能单元和划分的寄存器文件来解决线延迟问题 指令级并行处理器中集中的 大结构 设计是不可扩展的 随着芯片集成度的增加和线宽变窄, 设计 验证和测试变得越来越困难 ; 为提高性能而增加的硬件资源利用率不高 ; 性能的增长空间有限, 目前已很难继续维持每年 50% 的增长幅度 ; 功耗的增长比性能的增长则要快得多 例如, 从 Intel Pentium PentiumIII, 到 PentiumIV 这 4 代处理器, 整数性能提高了 5 倍左右, 而晶体管数增加了 15 倍, 相对功耗则增加了 8 倍 微处理器芯片呈现出更快 更大 更热的发展趋势 通用微处理器性能的进一步提高将不得不依赖于开发指令级并行性以外的其它更粗粒度的 1

2 并行性, 如数据级并行性和线程级并行性 这要求体系结构和微体系结构进行根本的变革 下面我们从分析传统的 ILP 技术的局限性入手进一步阐明这个观点 2. 传统的通用微处理器芯片体系结构的局限性 传统上, 开发 ILP 主要有两种方法 : 一是采用超流水结构提高主频, 增加每秒钟执行的指令数 另一是采用超标量或超长指令字 (VLIW) 结构增加指令发射和执行的并行度, 每个周期发射多条指令到多个功能部件上执行, 从而提高每个时钟周期执行的指令数 其中, 超标量用硬件动态地从指令窗口中调度相互独立的指令, 发射到空闲的功能部件执行 ; VLIW 则是依靠编译器找出 ILP, 静态地调度这些相互独立的指令执行 然而,ILP 进一步提高受到以下各因素的限制 : 2.1. 硬件复杂度 ILP 的开发主要依靠指令间的独立性 直观上, 增加处理器的发射宽度可以带来 ILP 的提高 但是, 这要求编译器或硬件分析更大的指令窗口才能抽取出更多的 ILP 现代微处理器为开发更多的指令级并行性普遍采用宽发射和大指令窗口, 例如 :PentiumIII 允许有 40 条指令处于执行状态 (in-flight),athlon 有 72 条,Alpha 有 80 条,PentiumIV 则有 126 条, 目的是要找出更多的相互独立的指令 对超标量处理器来说, 加大指令窗口会大大增加动态调度所需的硬件复杂度 一方面, 指令窗口加大以后, 更新处在指令槽中的指令状态 寻找可并行执行的指令将导致流水线在发射阶段的硬件逻辑变得十分复杂, 甚至难以实现 另一方面, 宽发射需要配套宽带取指, 即需要更准确和更宽的分支预测, 势必增加取指部件和动态预测器的复杂度 硬件过于复杂, 不仅难以保证结构的正确性, 而且也难以优化流水线和电路, 实现更高的主频 因此, 为了降低发射的硬件成本和提高处理器的频率, 必需限制指令窗口的大小 这样, 即便程序中存在更多的指令级并行性, 在有限的指令窗口下能够被开发的总的并行性会受到潜在的限制 目前大多数超标量处理器的发射宽度一般为 4-6 发射 例如,UltraSPARC III (6 发射 ), MIPS12000 Alpha PA-RISC 8700 Power3(4 发射 ), 而实际能开发出的 IPC 平均不到 2 对 VLIW 处理器来说, 表面上看, 不需要用硬件调度指令的执行, 而是在复杂的编译器支持下做踪迹 (trace) 调度找出应用程序中的 ILP 但是, 在 VLIW 处理器中, 增加发射宽度需要扩大集中结构的寄存器文件来支持 该寄存器文件还必须提供更多的端口, 以便向更多的功能部件提供操作数 这些寄存器文件的访问时间和连向功能部件的总线的复杂度也会限制时钟频率的提高 我们看到, 从 VLIW 结构发展为 EPIC 1 结构的 Itanium 处理器只做到了 6 发射, 这个发射宽度已难以再提高 2.2. 应用中固有的指令级并行性 ILP 处理器微体系结构的优化主要受到以 SPEC CPU 2000 为代表的传统的科学技术应用的驱动 这类应用大都具有较规则的控制流和较高的 ILP, 可以使现今的动态分支预测器的预测准确率达到 90% 以上 但是, 并非所有的应用都固有很高的 ILP 一般而言, 整型程序中固有的 ILP 较低, 浮点程序中固有的 ILP 较高 因为浮点程序多为科学和工程计算类应用 1 Explicitly Parallel Instruction Computing 2

3 这类应用中存在大量循环 用循环展开, 软流水等编译技术, 可将循环级并行性转换为 ILP 许多研究表明, 处理器从传统的单指令流中实际能开发出的 ILP 是有限的 使用 SPEC92 基准程序,PowerPC 620 的 IPC 达到 0.96~1.77, 8 发射的 Alpha 处理器能维持的 IPC 不到 1.5 乱序超标量处理器 MIPS R10000 和 HP PA-8000 达到的 IPC 稍高是因为它们有更大的指令窗口和乱序发射的能力 Pentium Pro 对 SPEC95 基准程序有类似的 CPI 2 值, 在 0.5~1.5 ( 相当 IPC 为 2~0.667) 之间 有研究表明, 用无限多的资源从单个控制流能够开发出的 IPC 为 7, 用大量资源 ( 例如 8 到 16 个执行部件 ) 能够开发出的 IPC 大约为 4 一些服务器应用, 像商业的在线事务处理 ( 简称 OLTP 3 ) 和决策支持系统 ( 简称 DSS 4 ), 其控制流非常不规则,ILP 较低 在一台由 4 个 Pentium Pro 组成的对称多处理器系统上运行 OLTP 工作负载达到的 CPI 为 3.39(IPC 为 0.295) 在 4 发射的 Alpha21164 处理器上运行 DSS 工作负载测得的 CPI 为 1.3~1.9(IPC 为 0.769~0.526). 这是因为在数据库事务处理中, 有 75% 的时间花在了等候访问大的工作集引起的停顿上 即使有很大的二级 Cache, 这种负载也会使 Cache 不命中率升高 2.3. 传统结构中的长延迟事件 ILP 技术为达到高性能而面临的另一个主要障碍是越来越长的延迟 这些延迟, 短的有几个 ~ 几十个周期, 长的高达几十到数百个周期 短延迟事件主要来源于 :1 浮点除法 2 分支处理 3 访问本地存储系统 ; 长延迟事件主要来源于 :1 访问远程的存储系统 ( 一般称为通信 ) 2 由并发操作引起的延迟不确定的同步等待事件 在当代微处理器中, 通过使用 Cache 已经避免了大量的存储延迟, 许多先进的技术也帮助消除或隐藏一小部分的存储延迟 例如, 乱序执行 预取 非阻塞 Cache 写缓存和流水的系统总线等 然而, 程序的第一次使用或循环的第一次访问将不可避免带来 Cache 不命中, 从而导致流水线停顿 Cache 的某一行数据常常在被访问之前就被别的数据替换了 对于空间局部性较好的应用, 解决访存延迟问题可以通过对内存地址的预取来实现 这种方法对于像路由表更新这样的应用非常有效, 但对于访存行为不规则的应用, 由于经常预取的是不被马上使用的数据, 可能反而会降低系统的存储带宽 通过网络访问远程处理器节点局部存储器上的数据将导致更大的延迟 而且, 这样的远程存储访问延迟通常是不可预测的, 使得一些填充流水线延迟槽的技术不再有效 例如, 在 SGI Origin 2000 分布共享存储系统中, 一级 Cache 不命中的访问延迟为 11 个处理器周期 ; 二级 Cache 不命中的延迟为 60 个周期 ; 远程存储访问不命中的延迟达到 180 个周期 因此现代微处理器经常出现停顿, 不能充分利用更宽的多发射硬件提供的高度的 ILP 并行能力 2.4. 单条串行指令流中的偏序关系 传统的 ILP 处理器体系结构都是单线程结构 一台单线程机器通过一个顺序的状态在某一时间将计算向前推进一步, 每一步对应于一条指令的执行 顺序程序执行的特点是只有一条 控制轨迹, 指令指针 ( 程序计数器 PC 5 ) 唯一地确定下一条可用的指令, 从而控制着到下一个状态的转移 从现代高级程序语言中得到的一条顺序机器程序的 控制流, 不仅受过程嵌套调用的管制, 还要受过程执行实例中各 基本块 间分支的条件测试的管制 对 2 Clocks per Instruction 3 On-Line Transaction Processing 4 Decision Support Systems 5 program counter 3

4 计算模型的分析可以发现, 从根本上讲,ILP 的提高受限于串行指令流中的偏序关系 一条指令流中总的序关系源于冯. 诺依曼语言, 虽然允许乱序地执行指令, 但结果必须按指令流的串行语义顺序回退 (Retire) 或提交 (Commit) 由于这个限制, 无论重定序缓存 ( 或指令窗口 ) 多大, 到一定时候都会引起阻塞, 对在处理器中开发更多的 ILP 构成严重的障碍 例如, 如果有一条 load 指令引起了二级 Cache 不命中, 则整个重定序缓存有可能不久就被已经完成执行的 在串行程序顺序中的后续指令阻塞, 即使这些后续指令独立于这条引起 Cache 不命中的 load 指令 因为这些指令在回退阶段不能在 load 指令提交之前存回结果, 所以这些指令不能马上回退并且从重定序缓存中移走 原理上, 在冯. 诺依曼计算模型中, 由于控制和数据依赖, 一个算法定义了指令间的偏序关系 程序员设计一个偏序算法, 再采用串行的冯. 诺依曼语言, 将算法编码为总的序关系 ; 编译器根据依赖图生成一个新的偏序关系, 再生成一个重定序的 优化的 串行机器代码 ( 在编译阶段解开的串行序只是一个部分串行序 ); 微处理器在它的乱序执行部分, 又一次动态地重新生成偏序关系, 根据微数据流原理 ( 如 Tomasulo 算法 ) 执行 ; 最后, 在回退阶段, 为顺序提交结果重新建立非自然的串行程序顺序 在理想情况下, 一个算法应该以适当高度有序的语言来编码 ( 例如, 用一种类数据流的语言 ) 接下来, 编译器应该产生仍然反映全局并行性的机器码, 而不再是不必要的串行化 因此, 正确的做法是用数据流图 (Data-flow Graph, DFG) 作为机器语言 并行化编译器应能从串行的冯. 诺依曼语言编写的程序中产生这种数据流机器代码 这种编译器可以使用编译优化和编码来简化动态的 ILP 分析和指令发射 总之, 从根本上来讲, 传统的通用微处理器对于并发活动缺少专门的硬件支持 数据的发送 / 接收和处理切换的软件开销以及协调同步的操作开销非常之大, 使得细粒度的延迟容忍技术不再奏效 导致从高级语言表达的应用代码中自动构造出能在由传统的通用微处理器上有效运行的并行程序非常困难 超标量和 VLIW 结构其实并不是性价比最好的开发指令级并行性的方法, 它们都没有提供对长延迟操作的延迟容忍机制 3. 设计驱动的变化对微处理器体系结构发展的影响 3.1. 应用的发展 进入 21 世纪, 微处理器的市场已从以 SPEC CPU2000 所代表的传统的科学技术应用, 扩展到三类不同的应用 : 服务器应用 ( 科学计算和商业事务处理 ) 桌面应用和市场增长最快的部分 嵌入式应用 应用的发展对微处理器的设计带来的挑战主要体现在 : 一是新应用已从计算密集型转向数据密集型, 展现出与传统的科学技术应用完全不同的执行和数据访问行为 当前的系统从计算模型 结构和操作上都没有对此提供很好的支持 传统的应用具有很高的程序和数据访问局部性, 允许有效地利用 Cache 寄存器和 Tomasulo 算法等细粒度的延迟容忍技术 这类应用多是计算敏感的, 对数据的运算操作与装入数据的操作 ( 这种操作目的是获得运算所需的操作数 ) 的比率远远大于 1 而很多新应用的数据访问的时间局部性和空间局部性很差, 或者说很少有数据重用 这类应用是数据敏感的, 大而复杂的 Cache 不仅对这类应用没有多大用处, 甚至成为障碍 传统的单线程串行计算模型和采用指令级并行技术的单处理器结构处理这类应用的能力很差, 尽管花了很大的软硬件代价却收效甚微 最主要的原因在于对这些新的应用没有采取适当的计算方法 4

5 3.2. 工艺的发展 根据美国半导体工业协会制订的 2003 年国际半导体技术发展指南, 未来 10 年集成电路仍将按摩尔定律持续高速发展 预测到 2010 年, 单片上可集成的晶体管数将超过 10 亿, 局部时钟频率将达到 11.2 GHz 半导体技术现在已经允许将许多种不同类型的晶体管( 如,P 型和 N 型沟道 MOS 晶体管,PNP 和 NPN 双极性晶体管 ) 浮动栅器件, 熔丝和反熔丝集成到同一个衬底上, 并允许将处理器和存储器集成到一块芯片上 半导体技术的这些进步, 一方面使得单片上可用的晶体管数量和种类越来越多, 为处理器的设计者提供了更多的资源来实现更高性能的芯片, 可以在单个芯片上创造更复杂和更灵活的系统 另一方面直接引发了微体系结构新的设计约束 : 线宽变窄 ( 线延迟超过门延迟 ) 和功耗增大, 使得微体系结构设计总的发展趋势是越来越强调结构的层次化 功能部件的模块化和分布化, 即每个功能部件都相对地简单, 具有非常高的时钟频率, 部件内部尽可能保持通信的局部性 目前, 许多计算机系统, 从移动 嵌入式到超级计算机, 其性能的提高受到的主要约束不是来自摩尔定律, 而是功耗带来的温度 供电和散热问题 例如, 可穿戴计算机的温度影响舒适度, 移动计算机的电池寿命影响重量和体积, 超级计算机的能耗影响供电和散热成本 越来越高的集成度和时钟频率导致每一代处理器功耗较上一代成倍地增加 因此, 当前无论是通用处理器还是嵌入式处理器, 其体系结构和微体系结构设计的一个主要特点是试图同时满足高性能和低功耗这对相互矛盾的设计目标和设计约束 3.3. 计算机系统核心评价指标正在发生根本变化 当前, 受应用需求和系统实现技术的驱动, 高端计算机系统的核心评价指标正在发生根 本的变化, 从高性能计算 (High Performance Computing) 转向高效能计算 (High Productivity Computing) 这一变化的根本原因在于传统高性能计算机的构造方法越来越不适应未来的应用和系统实现技术 具体表现在以下几个方面 :1 大量的新应用从计算密集型转向数据密集型, 传统的以计算为中心构造系统的体系结构 ( 冯. 诺依曼体系结构 ) 方法, 不适应新应用中不规则的计算和访存特性, 不适应这些应用中程序局部性的变化 2 应用的物理计算模型 并行算法模型与实际的并行体系结构不匹配, 人们至今不知道适当的表示并行计算的方法, 不知道在实际的体系结构上什么样的并行算法才是有效的 3 计算, 存储,I/O 的速度越来越不匹配, 平衡体系结构的设计越来越困难 当前主流的商用微处理器主频已达 2.5GHz 以上, 存储总线主频仅 400MHz; 处理器速度每年增长 60%, 存储器存取延迟每年仅改善 7% 由通信带宽和延迟构成的 存储墙 (Memory wall) 成为提高系统性能的最大障碍, 大量的结构复杂性花在了解决数据访问延迟问题上 4 传统的体系结构方法已跟不上摩尔定律的发展, 大量浪费 ( 滥用 ) 了摩尔定律所提供的计算潜力 这些方面的不适应造成的后果是, 在当今的 HPC 系统上,1 并行程序开发难 开发周期长, 可移植性差, 正确性和效率无法保证 目前, 把一个大型题目从一台串行机移植到一台大型并行机上运行时, 困难可能成百倍地增加 应用人员为求解问题花在学习使用并行系统, 以及开发并行软件上的时间和代价可能比在并行系统上实际算题的时间和代价要大得多 2 系统使用和管理难, 硬件的可靠性和稳定性下降 目前主流的高性能计算系统的全系统平均故障间隔时间 (MTBF 6 ) 明显下降 例如,Intel 为 ASIC 计划研制的 ASIC Red, 装有 9632 个 6 Mean Time between Failures 5

6 P2-333, 每个 CPU+MM 7 的 MTBF 大于 10 年, 但全系统的 MTBF 仅 10 小时 3 计算资源利用率低, 系统的体积和功耗急剧增大 例如, 在当前主流的商用微处理器芯片中, 只有 20% 的面积用于寄存器和运算部件,80% 的面积用于开发并行性 目前在超级计算机 TOP500 中排名第一的日本的地球模拟器 8, 机房面积 平方米, 相当于 7.74 个蓝球场 ; 耗电 千瓦, 相当于一个小城市的用电量 4 应用持续性能低, 大多数应用在当前万亿次计算机上运行时的计算效率只有 10% 左右 面对这种局面,2002 年 4 月美国国防先进研究项目局 (Defense Advanced Research Projects Agency, 简称 DARPA) 提出了研制新一代千万亿次高效能计算系统 (High Productivity Computing System, 简称 HPCS) 的计划 该计划的目标是面向多种国防 国家安全和工业用户的应用, 填补 20 世纪 80 年代末传统超级计算机技术与未来量子计算技术之间的空白, 期望在 2010 年左右研制出新一代经济可行 高效能的千万亿次系统 该计划的要点是 : 1. 性能 ( 实际性能而非峰值指标 ): 将关键的国家安全方面应用的性能提高 10 到 40 倍 2. 可编程性 : 大大降低开发高效能计算机上的应用所需的费用和时间 3. 可移植性 ( 对应用的透明度 ): 把研究与应用软件和系统特征分开 ( 即, 将科学 家和使用应用软件的人员与系统隔离开来, 系统自动实现串行程序的高效并行 化, 使科学家和程序员只需关注求解问题本身, 不必了解结构细节 ) 4. 鲁棒性 ( 可靠性 ): 开发抵御外来攻击 承受硬件故障与编程错误的技术 5. 鼓励学术界对高效能计算的兴趣及工业界在投资和产品方面的介入 概括起来,HPCS 计划的核心思想就是要以创新的思路和革命的手段, 实现超级计算机 的综合效能在未来 20 年内沿摩尔定律向前发展, 将在一台并行计算系统上求解问题所花费 的全部时间 TOS (Time-to-Solution) 作为衡量系统性能的关键指标 从 80 年代开始, 通用微处理器就已成为构造从桌面系统 服务器到超级计算系统的基础部件 90 年代的大规模并行计算机主要采用商用的通用微处理器来构造 实现高效能计算, 作为基础部件的微处理器芯片首当其冲要实现高效能 未来的微处理器芯片将把原来在板上 机柜中实现的并行系统 ( 例如 SMP MPP 机群) 集成到一块芯片上 实现片上超级计算机 SoC(Supuercomputer on a Chip), 使单芯片的性能达到万亿次已变得非常现实 HPCS 计划提出的高效能计算思想不仅将深刻地影响高端计算机系统芯片的构造方法, 也必将带动中低端计算机系统芯片构造方法的变革 因为它们在面临的体积 功耗 成本 编程复杂性 设计复杂性 可靠性等方面的问题是一致的, 最终都归结为如何达到 高效能 这一核心评价指标 7 Memory Module 8 按照 2004 年 11 月的排名, 为第三 6

7 4. 高效能通用微处理器体系结构的几个关键技术途径 4.1. 支持向量处理 向量处理可以很好地挖掘应用中存在的数据并行性 数据并行负载的主要特征是 :(1) 大量数据元素的处理过程之间没有依赖关系, 数据并行性很高 (2) 对每个数据元素往往要连续实施多种运算, 计算密集, 操作规则 (3) 通常要求实时处理能力 (4) 存储访问和 I/O 密集, 数据访问具有很好的空间局部性 ( 即数据访问模式比较规则, 通常表现为对大数据块的相邻访问和跨距访问 ), 但时间局部性很差 ( 即数据重用性极低 ) (5) 与数据访问的延迟相比, 更强调高带宽的数据访问 传统的通用微处理器体系结构主要建立在指令级并行处理的基础上, 采用 Cache 来利用数据重用性, 从而减小了数据访问延迟 复杂的 Cache 优化机制降低了数据访问带宽 但是在数据并行应用中, 要求的数据供应量大, 并且数据重用性极低 采用 Cache 给运算单元供应数据, 不仅容量有限, 无法为大量的计算单元提供数据 ; 而且没有重用性的数据经过复杂的 Cache 机制来存取反而会降低数据访问的性能 最根本的问题是, 指令级并行处理器上的运算单元极其匮乏, 不能很好地开发数据并行性 向量处理器体系结构采用编码效率极高的向量指令, 提供大量的运算部件和高带宽的数据访问能力以匹配计算和访存密集的数据并行应用 采用向量指令可以大大缩短这类应用的代码长度, 并且能在一定程度上减少运算量 每条指令可以编码 N 个相互独立的操作, 从而大大减少了取指和译码的工作量, 同时也减少了由循环产生的分支处理的工作量 ; 向量指令还减少了 load 操作的地址计算量, 一次地址计算可以取进 N 个有用的数据 向量指令自然地表达了对 N 组数据可以相互独立地在多个相同的运算部件上并行计算的数据并行语义, 具有相同的寄存器和存储器访问模式, 不需要复杂的相关性检查和发射逻辑 向量结构具有很强的可扩展性, 通过简单地增加运算部件数目或增加运算部件的流水线深度, 以及增加向量寄存器长度即可方便地实现计算能力的扩展 向量结构大大降低了硬件设计的复杂度, 并能很好地支持低功耗设计 向量处理需要编译器提供自动向量化的支持 数据并行应用的重要性, 多样性以及对硬件的性能需求正在不断增长 向量处理器的设 计需要结合不同的数据并行应用特征研究以下几方面的关键问题 1. 数据并行体系结构模型 传统上存在三种不同的数据并行体系结构模型 : 向量 SIMD 9 和 MIMD 10, 它们是为不同特点的应用构造的, 主要差别在于对指令执行的控制, 以及存储器与 ALU 11 间的通信方式不同 我们可以用执行二维的离散余弦变换 ( 简称 2D DCT 12 ) 这个例子来阐明这些结构的不同 向量结构 : 向量结构的例子有 Cray-1,VectorIRAM,T0 以及 Tarantula 它们采用 简单的取指和译码单元进行全局控制 向量寄存器文件 ( 简称 VRF 13 ) 作为在存储器与 9 Single-Instruction Stream Multiple-Data Stream 10 Multiple-Instruction Stream Multiple- Data Stream 11 Arithmetic-Logic Unit 12 2-Dimension Discrete Cosine Transform 13 vector register file 7

8 ALU 之间传送值的中转区域 中央控制单元对 VRF 和 ALU 间的向量元素进行排序 向量结构利用 VRF 提供了有效规则的存储访问, 但由于没有链接硬件, 向量迭代之间的所有通信都必须在 VRF 内进行 ALU 间的全局同步消除了 ALU 级带数据依赖的分支 在向量机中,2D DCT 被分解为先在列上做一维的 DCT, 在 VRF 中做一次变换, 然后再对行做一次一维的 DCT SIMD 结构 :SIMD 结构的例子有 CM-2 和 Maspar MP1, 它们也是用简单的取指和译码进行全局控制 与向量结构不同的是,SIMD 结构要么每个节点都带私有存储器, 要么以规则的方式从中央存储器广播数据 SIMD 机器通常提供相邻 ALU 间点到点的通信机制, 但是缺少向量寄存器文件和存储系统中有效变换的支持 SIMD 体系结构的特点是对不同数据实体的同一操作通过几条数据通路并行执行 早期的 SIMD 机器的一个严重局限性是缺少对不规则索引存储访问的支持 为了执行一个 8x8 块上的 2D DCT, 需要将图像均匀地分解到不同的处理单元中, 每个 ALU 对分配给它的图像子块执行部分的 DCT, 然后与相邻的 ALU 交换值来完成整个 2D DCT SIMD 执行以子字并行 (sub-word parallelism) 的方式出现在传统的高性能微处理器中, 作为多媒体功能的扩展, 如 MMX, SSE,Altivec 以及 VIS 更新的面向 DSP 14 的处理器如 Imagine 和 Intrinsity, 以及现代实时图像硬件的分片处理中也采用这种结构方式 MIMD 结构 :MIMD 机器采用与 SIMD 机器类似的存储组织 每个处理单元使用独立的指令控制和私有的指令存储进行独立的控制 MIMD 处理器具有广泛的结构粒度, 从细粒度的处理器 ( 如 iwarp) 到粗粒度的多处理器 ( 如 CM-5) 或现代的 SMP( 如 IBM 的 Regatta 系统 ) 通信和同步一般也是粗粒度的, 通过消息传递 共享存储和专用的同步网络来实现 现代实时图像硬件已经朝着为顶点处理提供细粒度 MIMD 执行模型的方向发展 每个 ALU 是局部控制的, 并行处理不同的顶点 像 2D DCT 这样的数据并行应用可以在足够细粒度的 MIMD 结构上执行 2D DCT 的 MIMD 计算除了不同处理单元上的指令不是在指令级同步外, 其它方面都与 SIMD 计算类似 值的交换要用到显式的同步操作 当应用具有规则的存储访问和静态循环边界时 ( 或者没有控制流时 ) 最好采用向量结构或 SIMD 结构 当存在不规则存储访问或访问索引标量常数时, 如果依然采用传统的向量或 SIMD 结构则会导致性能大大下降 当应用带有数据依赖的分支时, 细粒度的 MIMD 结构是最好的选择 2. 数据并行处理的结构粒度 向量 SIMD 和 MIMD 的结构粒度依次增大 向量结构处理那些需要在多个向量元素上进行计算或者以一种无组织或不规则的方式访问存储器的应用时性能较差 SIMD 结构提供了在执行单元间通信的功能 ( 因而能够在多个数据元素上进行计算 ), 但它也是全局同步的, 因此对于带条件执行和数据相关分支的应用支持较差 MIMD 结构一般由粗粒度处理器构成, 使用单程序多数据 (SPMD) 的执行模型来对大块的数据进行操作, 对于细粒度的同步支持较差 新兴的应用, 如实时图像处理, 需要细粒度的 MIMD 完成执行单元间的细粒度通信 早期的细粒度 SIMD 机器, 如 CM-2 和 MasPar MP-1 提供了高的 ALU 密度但是缺 14 Digital Signal Processing 8

9 少对不规则存储访问的细粒度控制和延迟容忍 为了解决这个问题,Intrinsity 处理器在传统的 Cache 存储系统中加入了一个 SIMD 数组 Imagine 流处理器是一个 SIMD 与向量混合的结构, 它将 SIMD 控制单元与向量机的内存系统耦合起来 其他形式的流处理系统都与 MIMD 的执行很相似, 数据流以高度结构化的方式流过多个处理器 新的细粒度片上 MIMD 体系结构例子有 Smart Memory 和 RAW, 它们都是针对流处理而做的设计 3. 数据并行处理机制的通用性 数据并行负载根据要处理的数据类型可以分为几个不同的应用领域, 主要包括 : 数 字信号处理 科学计算 网络和安全 以及实时的多媒体处理 传统上, 不同特征的数据并行应用由不同的体系结构和专用部件执行 例如, 大多数的实时图像处理硬件需要联合采用 MPEG4 解码的可编程专用部件 TMS320C6416 DSP 芯片集成了卷积编码和纠错处理两个专用部件 这些专用部件每个都只能提供简单而有限的功能, 把大量这样的专用部件集成在一起将产生不同种类的处理器, 导致应用系统设计开销和面积增加 现今大多数的数据并行体系结构只针对数据并行应用的一个子集来设计, 对于子集以外的应用缺乏支持 现有的向量体系结构使用昂贵的 SRAM 来提供高速的内存和大的向量寄存器, 对规则的存储访问和具有简单控制行为的程序能够提供有效的计算 处理那些需要在多个向量元素上进行计算或者以一种无组织或不规则的方式访问存储器的应用则性能较差 使用播撒 (scatter) 和收集 (gather) 操作可以容忍一定程度的不规则 ( 但结构化的 ) 内存访问, 但执行有频繁的不规则内存访问和查表的程序时性能很差 已提出和构造了很多体系结构用于克服向量执行模型的严格限制, 并允许动态指令调度 如果只提供对数据并行程序的一个子集的支持, 即使消除这些限制也不能使这些体系结构适应广泛的应用 在理想情况下, 通用的数据并行体系结构模型要能支持每个数据并行应用领域, 即要能支持这些应用的各种不同的计算和存储行为 我们已经非常熟悉专用向量体系结构在多媒体处理 数字信号处理 网络处理以及高性能科学计算领域里的应用 虽然这些数据并行应用领域有许多共同的特性, 但它们在计算 控制和存储访问方面仍有许多不同的特殊需要 多媒体应用典型的数据类型长度是 8 位 12 位 16 位 24 位和 32 位, 与科学计算和其他整数运算程序相比有更多的整数 ALU 操作, 可组织成短向量处理 短向量处理已经在商用处理器的指令集扩展中找到了应用, 如 :Intel x86 上的 MMX SSE SSE2 和 3Dnow!,SUN UltraSparc 上的 VIS,HP PA-RISC 上的 MAX-2,Digital Alpha 上的 MVI, 以及 MIPS V 上的 MDMX 等 一些指令集扩展如 MMX 和 SSE2, 缺少支持标量 - 向量的操作, 当用到一个标量寄存器作为一个操作数时, 只是操作 MMX/SSE2 寄存器的一个子字 (sub-word) 而科学计算程序中通常包含大量的浮点运算, 对计算精度有较高的要求, 所以常要求 64 位甚至更多位数的数据类型, 向量寄存器的长度往往达到 64,128,256 甚至 1024 个元素, 每个元素 64 位 4.2. 支持多线程处理 对多线程处理器体系结构的研究主要有两大推动力 : 9

10 1. 提高对传统的指令级并行处理器中存在的大量延迟的容忍能力, 这是发展当前各类多线程处理器的主要目的 在传统的只采用指令级并行技术的单线程处理器中, 主要利用指令的动态调度 乱序执行 寄存器重命名 数据前馈 (Forwarding) 高速缓存 (Cache) 分支预测和推测执行等多种技术, 分别避免和隐藏由于数据依赖或控制依赖产生的各种不同情况的延迟, 结果硬件做得越来越复杂 与这些技术不同的是, 多线程技术能够隐藏指令级并行方法中出现的各种情况的延迟 在分布式共享存储多处理机系统中, 最为严重的延迟问题是, 访问远程数据时可能要先经由片上 Cache 不命中而访问本地存储器 ; 如果本地存储访问还不命中, 再通过互连通信网络访问远程存储器 这个过程往往需要数百个周期, 比访问本地数据所花的时间要高出 10 倍左右 线程或进程间的同步操作还可能会引起不确定的长时间等待 数据访问延迟已成为提高现代处理器和计算机系统性能的主要瓶颈 解决这个严峻问题的有效办法就是当流水线出现过长时间的等待时, 通过硬件切换到其它线程上执行 2. 开发和利用应用中更多的粗粒度并行性, 增加指令吞吐量, 提高处理器的资源利用率, 这是未来半导体和集成电路技术发展推动的结果 未来单片上可集成 10 亿个晶体管的能力, 允许单处理器具有每周期发射 8~32 条指令的能力, 并且允许在单块芯片上集成成百甚至上千个完整的处理器, 从而引发了两种相互正交的多线程体系结构方法 : 单处理器多线程和多处理器多线程 1 单处理器多线程方法 : 现代单线程处理器进一步提高性能的方法是采用激进的动态预测和推测执行技术, 用复杂的硬件抽取单个线程中更多的指令级并行性 这类方法存在的问题是 : 一方面单个应用内在的 ILP 是有限的, 提高单线程性能的潜力很快就会达到极限 ; 另一方面将导致芯片的硬件复杂度过高, 功耗急剧增加, 使得一个完整的芯片设计 验证和测试成本变得令人难以接受 多线程处理器打破单线程执行模型, 在处理器流水线中并行执行 2 条以上的线程, 可以减少单处理器中指令发射能力的水平浪费和垂直浪费, 提高处理器的资源利用率和指令吞吐量 2 多处理器多线程方法 在一块芯片上放置多个相对简单的处理器核 ( 不超过现今的 4 发射处理器的复杂度 ), 这些核可以是同构的也可以是异构的, 每个处理器核上执行 1~ 多个线程 目的是实现可扩展的芯片系统设计, 降低芯片设计的复杂度和功耗压力 这些处理器核可用多种体系结构方法构成, 包括 RISC/CISC, 或向量 /DSP/ 超标量 /VLIW 等等 硬件多线程正在成为下一代各类高性能微处理器 ( 包括通用微处理器, 多媒体处理器 网络处理器 数字信号处理器等 ) 的主流体系结构技术 从计算模型上分类, 已提出的多线程处理器结构一类源自数据流, 如 Papadopoulos 和 Culler 的 Monsoon, 麻省理工 / 摩托罗拉的 *T, 我们称它们是基于数据流模型的多线程体系结构 其余的称为基于非数据流模型的多线程体系结构 它们由各种传统的处理器结构发展而来, 有多线程的超标量结构, 如华盛顿大学为代表研究的 SMT 15 和 Stanford 大学为代表研究的 Hydra CMP 16 ; 多线程的 VLIW 结构, 如 Sun 的 MAJC; 多线程的向量结构, 如 Espasa 的 SMV 等 不同的多线程处理器体系结构之间的最基本差别在于每一流水阶段对指令的调度执行 方式 这个差别很大程度上影响处理器体系结构设计的其它方面 据此, 多线程处理器可分 15 Simultaneous MultiThreading 16 Chip Multiprocessing 10

11 为指令交错多线程 (Interleaved MultiThreading, 简称 IMT) 块交错多线程(Blocked MultiThreading, 简称 BMT) 和同时多线程 (SMT) 三种基本的体系结构 需要指出的是, 不少文献把 IMT 和 BMT 分别称为细粒度多线程 (Fine-Grained Multithreading, 简称 FGMT) 和粗粒度多线程 (Coarse-Grained Multithreading, 简称 CGMT) 作者认为, 这种说法容易与线程的粒度概念混淆 事实上,FGMT 和 CGMT 并不意味着线程的大小, 主要指线程的调度执行方式 ( 可以看作是一种线程交错执行的 周期粒度 ) 为避免概念上的混淆, 作者倾向于本文的说法 另一个需要说明的是, 我们不把指令调度方式限定为只针对发射阶段, 因为在实际的多线程处理器中, 从每个流水级观察, 可能会综合运用上述指令调度方式从不同的线程中提取指令, 因此这里的定义适于更方便地描述具体的多线程处理器体系结构特征 IMT BMT 和 SMT 中利用的线程级并行性是显式说明的, 因此又可将它们归为显式多线程 (Explicit MultiThreading) 处理器 如果处理器上执行的线程是根据串行程序的控制流和数据流特点, 由编译器或硬件自动划分出来的, 则这样的处理器称为隐式多线程 (Implicit MultiThreading) 处理器 除了以上几种主要的分类以外, 还可以按硬件的组成区分单处理器多线程结构和多处理 器多线程结构 线程级并行技术与其它新型的体系结构技术 ( 例如, 可重构技术 PIM 17 技术 SoC 18 技 术 超导技术等 ) 相结合产生了许多种同时支持多种并行性的多线程处理器体系结构 例如, 德州大学奥斯汀分校与 IBM 联合提出研制的万亿次芯片 TRIPS, 利用可重构技术动态配置片 上大量的处理器核 存储单元和互连, 支持包括线程级并行性 指令级并行性和数据级并行 性混合的并行计算模型, 从而能在一个很宽的应用范围内达到高性能, 提高片上硬件资源的 利用率, 既具有通用处理器那样适应大量应用的灵活性又具备专用处理器那样的高性能和高 效率 美国的 HPCS(High Productivity Computing System) 计划选中的三个 petaflops( 万亿 次 ) 系统方案 Cray 的 Cascade SUN 的 HERO, 以及 IBM 的 PERCS 方案都采用了混合多种 并行的多线程处理器体系结构 在 IBM 的 BlueGene 项目中, 其基于多核 SoC 的单元化体系结 构设计采用了 SMT 技术 NASA 的 HTMT 项目利用超导芯片 PIM 光通信和光全息存储等 全新的技术构建 petaflops 系统, 引入了渗透多线程计算模型, 有效地平衡了计算与存储 多线程处理器需要研究的关键问题包括 : 1. 多线程处理器上的程序执行模型 多线程处理器设计的首要问题是选择程序执行模型 程序执行模型的适用性决定多线程处理器能否以最低的代价提供最高的性能 程序执行模型是编译器设计人员与系统实现人员之间的接口 编译器设计人员决定如何将一种高级语言程序按一种程序执行模型转换成一种目标机器语言程序 ; 系统实现人员则决定该程序执行模型在具体目标机器上的有效实现 当目标机器是多线程体系结构时, 产生的问题是 : 多线程体系结构如何支持重要的程序执行模型? 是否有其它的程序执行模型更适于多线程的体系结构? 这些程序执行模型能多大程度上满足应用的需要并为用户所接受? 2. 上下文切换 17 Processor In Memory 或 Processing In Memory 18 System on a Chip 11

12 在传统的分时和多处理机系统中, 线程的切换是事件驱动, 由操作系统完成的 线程切换要求保存前一个线程的状态, 换入将执行的另一个线程的状态, 以及其它一些管理开销 每次上下文切换需保存和恢复的上下文的大小取决于 :1 已被修改的状态 2 以后还要用的状态 3 线程的粒度 通常短线程的状态所占存储空间较小 现代的商用处理器倾向于运行长线程, 并减少线程切换的频度, 从而降低线程切换代价 如果切换线程的总开销比处理该延迟事件的时间还长, 就不值得切换上下文 硬件多线程在处理器上保存多个线程的上下文, 能够大大降低线程切换的代价, 因此允许做更频繁的切换 指令交错的多线程处理器的线程切换是隐式的, 无论是否发生长延迟事件, 程序总是周期交错地切换到不同的线程执行 同时多线程处理器的线程切换也是隐式的, 每个周期程序都可能切换到新的线程执行 块交错的多线程处理器的线程切换由事件驱动, 可以是隐式的, 也可以是显式的 不同的结构对线程切换的时机和方式有不同的选择 上下文切换是块交错多线程处理器设计中的一个关键问题 由于上下文切换取决于一些动态事件, 这些事例 ( 例如 Cache 失效 ) 只有到达流水线后面的阶段时才能发现 发生切换时流水线中已经引入了许多无效指令, 这些指令须从流水线中清除掉 另一方面, 新线程的指令进入流水线达到执行段也会带来几个周期的垂直延迟槽, 数目取决于流水线的长度 因此, 上下文切换处理不当将引入较大的开销 如果为每个线程复制了流水线寄存器, 每次切换时保存所有流水线的当前状态, 这样可以减少线程下次切换回来的开销, 但这要以增加硬件复杂度为代价 对于长流水线设计这样方案比较合适, 但对于短流水线设计, 为节省少量的流水线周期 (3~4 个 ) 增加太多的硬件复杂度可能不划算 因为块交错的线程切换往往能够隐藏上百个周期的 Cache 不命中延迟, 省下几个周期也不能使性能提高多少 3. 分支处理 在单线程处理器中, 分支误预测的代价很高 例如, 在 Pentium II/III 和 Alpha 中, 分支预测错, 重新刷新流水线需要 11 个周期以上, 将浪费 1~4 个取指周期取来的指令 当前动态预测技术的准确率对 SPEC CPU 中的非数值程序平均已能达到 95%, 这对单条分支指令来说预测精度已经很高了, 但对 n 条分支指令连续做预测的精度却只有 (0.95) n 也即在经过 5~6 次动态预测后, 其精度就下降到不可接受的程度 在多线程处理器中, 可以采取等待分支结果的处理策略, 通过调度多个活动线程, 遇到分支指令则从其它线程取指令, 使分支在进入指令窗口之前已获得分支结果, 从而最大限度减少提取的无用指令数 在当前的 SMT 和 CMP 处理器中, 采用多个粗粒度的线程共享分支预测器的处理策略, 如 Intel PentiumIV 和 IBM Power4 那样 分支预测的精度是改进还是降低取决于正在执行的路径 如果两个线程循环执行的是相同的代码, 但使用的是不同的数据, 分支预测器对这两个线程或其中之一的预测精度就很差 例如, 有一种情形, 如果低的值走一条路径, 高的值要走另一条路径, 两个线程从相反的一端穿过一个数据集, 则每个线程的分支历史将是不同的 另一种相反的情形是, 如果每个线程中这个循环正在做相同类型的操作, 他们的分支模式可能是类似的, 分支预测器能更快地学习这个模式, 因此能做更准的预测 循环执行相同代码的两个线程对分支预测精度将有积极的影响 如果将分支预测器设计成对每个线程分开预测, 则会增加预测器的规模, 或者减小它对单个线程的预测精度 12

13 4. Cache 的作用 在多线程处理器中, 处在不同地址空间上的多个粗粒度的线程共享 Cache, 会减少程序的访存局部性, 增加 Cache 不命中率 而从一个程序中划分出来的处于同一个地址空间的细粒度线程, 经常执行相同的代码段, 因而可能经常访问相同的指令 Cache 项, 数据 Cache 的局部性一般不会有很大改变 相同的数据将被一个线程顺序访问, 或被多个线程稍微乱序地访问 指令或数据 Cache 引用的局部性是增加还是减少主要依赖于被执行代码的性质 在多线程处理器,Cache 不命中的损耗将大大减小 一个线程访问数据 Cache 不命中, 在完成从片外取数的同时, 可以从其它线程中取指令执行 对于指令 Cache 不命中, 可以采用非阻塞指令 Cache, 从其它线程中取指 比较来说, 非阻塞指令 Cache 在多线程处理器中的作用比在单线程处理器中的作用要大 5. 全局存储 对全局存储访问的支持是并行处理的基本问题, 线程级并行技术也不例外 对程序员来说, 支持全局共享存储器的抽象是非常重要的 任何可扩展机器的存储器物理上都是分布的, 为其建立全局共享存储抽象有两个基本方法 :1 建立在消息传递基础上的共享存储协议 ; 2 全局 Cache 这两种方法已经成为实现不同规模并行计算机的流行方式 通过消息传递允许实现一定形式的全局共享存储的基本工作原理如下 : 一个处理器 a, 想得到位于处理器 b 存储器里信息, 可以发送一个消息给 b, 请求这个值 当 b 收到这个请求以后, 向 a 回送所要求的值 当 a 正在等待来自 b 的响应时处理器可以什么也不做, 只是等待这个结果 如果这样处理的话, 就有可能产生死锁 因为 b 在它响应 a 之前, 可能等待 a 返回一个请求 一个解决方案是需要另一条路径, 从其它处理器访问 b 的存储器, 这个方案已被用于 *T 和商用的 Cray T3D, 这个解决方案只要整个要读的值是可用的就能工作 另一个方案是所有的处理器周期轮询以满足其它处理器的请求 这可能使代码生成很复杂, 并降低串行线程的性能 另一个提供全局共享存储的基本方法是使用全局 Cache 即, 在计算处理器中将全局数据缓存到局部 Cache 处理器 a 在全局位置执行一个 load, 如同在局部位置做一样 即, 先检查 Cache, 对于在局部 Cache 里能找到的值, 计算如同在串行机中一样继续执行, 这个值被直接放到寄存器中 如果这个值不在局部 Cache 中, 再通过 a 的标准存储总线接口从远程位置将这个值取过来 在存储总线上必须增加一个设备, 由它来识别全局访问, 再与实际拥有该值的处理器 b 的存储进行通信来完成这个取数请求 全局 Cache 的重要问题是保持 Cache 一致性 如果两个处理器都有每个 Cache 行的拷贝, 并修改了该行, 其它的处理器必须设法自动地获知这个改变 6. 硬件支持和资源共享 多线程处理器更高的指令吞吐量增加了资源的利用率, 这是它好的一面 但是, 多 线程处理器中的某些资源可能被过度利用, 甚至可能变成新的瓶颈 为了满足多线程对 硬件的需求, 可能要对硬件资源做以下改变 : 最需要增加的硬件是线程控制部件 例如, 控制 fork 和 join 过程, 控制互斥运行用 的锁, 识别线程号等 在理想的情况下, 多线程处理器中的每个线程需要一套完整的 13

14 独立使用的寄存器文件, 这将使得 n- 路多线程处理器的寄存器文件增加 n 倍 在多线程的指令窗口中, 可能需要对每条指令存储相应的线程号, 在寄存器重映射期间用其作为寄存器号的高位, 在 Load/Store 调度时用于做检查 当指令由于例外或分支误预测变得无效时也要检查这个线程号 非阻塞指令 Cache 非常适合多线程处理器, 这比阻塞的 Cache 要稍微多花些面积 采用双端口 Cache 用另外的缓冲或多体的 Cache 也可以达到同样的目的, 但非阻塞 Cache 要便宜些 用多个线程交错执行可以容忍更大分支延迟, 所以多线程处理器对分支预测器的依赖可以降低, 并且不会太多地降低单线程处理器的性能 4.3. 智能存储芯片体系结构 采用 ILP TLP 19 和 DLP 20 技术能大大提高处理器内部指令执行的并行度, 而指令和数据 的供应是充分发挥这些技术作用的关键 传统上以处理器为中心的设计思想已经导致处理器 为解决访存延迟问题而大大增加了复杂性 已有许多研究工作致力于减小或缓解访存延迟, 包括 lookup-free Cache( 非阻塞 Cache) Cache 旁路 硬件和软件的指令和数据预取 乱序 取指 取数推测和推测执行 流式缓存 多线程技术等等 即使这样, 处理器与存储器性能 的差距仍在增大, 使得访存速度将成为未来提高处理器性能的主要瓶颈 根据目前的片上并 行处理技术的发展趋势, 不久就会出现当处理器发射数百甚至上千条指令时只能取进一个值 到片上存储器的情况 基于对上述事实的观察, 以及未来半导体技术所提供的能力和数据敏感应用对访存带宽的要求, 智能存储器技术提出将处理器与存储器做在同一块芯片上, 这样可使访存延时减少 5-10 倍以上, 存储器带宽增加 倍以上 在大多数情况下, 整个应用在运行期间都可放到片上存储器里 将存储器集成到芯片上以后, 原来用于增加处理器 - 存储器带宽的大量存储总线引脚可以被节省下来用于增加 I/O 带宽, 这将有利于提高未来大量的网络应用性能 ; 并且由于减少了对片外存储器的访问, 将使得处理器的功耗大大降低 传统上, 逻辑的制造工艺与 DRAM 的制造工艺是根本不同的, 因而难以将处理逻辑与 DRAM 存储在单片上耦合 DRAM 的制造工艺比逻辑工艺要难, 时钟速率做不高 ; 而逻辑的结构不像 DRAM 那样规整 DRAM 工艺为保持稳定性趋向于最大化电容面积, 使用多层硅, 但不需要更多的金属层 逻辑工艺则趋向于用更多的金属层, 对晶体管开关速度做优化 在逻辑工艺中实现 DRAM 单元存储密度做不高, 估计密度仅能达到优化的 DRAM 工艺的 5~25%; 而在 DRAM 工艺中实现逻辑电路则速度做不上去 目前, 半导体工艺已经允许将处理器与存储器集成到单块芯片上, 尽管在密度或速度上 还赶不上它们分开制作的工艺, 但是这种混合的工艺可以大大改进系统的整体性能 智能存储芯片可以看作是让存储离计算更近, 这种结构与传统的体系结构没有本质的区别, 仍然是以计算为中心的结构, 是将大块的 DRAM 集成到处理器芯片上 最具代表性的研究工作是加州大学大学伯克利分校提出的 IRAM 方法 实验的向量 IRAM 处理器原型在 1GHz 的主频下可达到 16Gflops 的峰值性能 另一种智能存储芯片可以看作是以数据为中心的结构, 在存储器中嵌入运算器, 让存储 19 Thread level parallel 20 Data-level parallel 14

15 器芯片具有一定的数据处理能力, 这就是 PIM 芯片结构的思想 PIM 结构的一个显著特点是将存储器分成很多独立的存储小块, 每一个存储小块对应一个节点, 连接一个运算部件 在多线程运行的时候, 这些独立的存储小块可以并行访问, 这样就提高了访存带宽 PIM 技术将很宽的运算部件直接与存储器的行寄存器相联, 这样片内数据传输就会比传统的片间数据传输快很多 ( 一般快 1 个数量级 ), 宽的运算部件可以直接对宽的寄存器数据进行处理, 即一次最多可以处理存储器取出的一行数据 第一个 PIM 芯片是 1993 年推出的 EXECUBE 芯片 1996 年, 第一款商用的 PIM 芯片 M32R/D 诞生 采用 PIM 技术的系统有 Active Pages FlexRAM Gilgamesh,DIVA HTMT BlueGene BG/C Pim-Lite 等 相比之下,PIM 技术能够支持建立可扩展的超大规模并行计算机系统, 适应流式应用和不规则应用数据密集的访存需要 从并行规模上看,PIM 结构有点类似于 MPP 但是, 如何让数百万个 PIM 处理器协同求解单个并行应用问题, 需要寻找不同于 MPP 结构的大规模并行处理和存储平衡的体系结构方法 这种计算方法必须处理全系统的语义需要, 提供共享存储的程序执行模型 与 MPP 相比,PIM 的计算性能与存储能力的比非常之低, 但访存带宽却高数百倍 在 PIM 系统中, 处理器的利用率不如存储带宽来得重要 基于 PIM 技术实现的大规模并行计算系统需要研究的关键问题包括 : (1) 不同 PIM 节点的通信机制 - 这是首要问题 大多数 PIM 系统都采用一种称为 parcel 的通信机制,parcel 的长度是可变的, 其中包含需要通信的信息 BlueGene 系统中的 parcel 主要用来传送数据, 但 Gilgamesh 中提到的 parcel 概念与此大不一样 更多的 PIM 结构中提到的 parcel 概念与 Gilgamesh 的相同, 只是不同系统可能具体参数定义不太一致, 原因是 PIM 结构目前还没制订统一的标准 在 Gilgamesh 中,parcel 是用来传送操作的 这种通信机制适于面向数据的计算, 允许在数据存放的地方调度和执行计算, 计算任务经常根据数据所在的位置从一个 PIM 处理器移到另一个 PIM 处理器上, 而不是把数据在计算单元间移来移去 这种计算方式有点类似于在 Web 上完成一个计算任务, 使用 Java 和面向对象的方法将代码迁移到一个拥有数据和计算资源的本地节点上完成计算, 然后返回计算结果, 从而大大减少了数据通信的开销 parcel 机制要求信息包的大小要尽量压缩, 要有安全保护机制 虽然程序是并行执行的, 但是对信息包的处理仍然要保证原来顺序执行时的语义 (2) 存储模型和地址转换机制 要求应用程序可以控制数据的放置, 支持 PIM 芯 片的数量 大小和主处理器的个数的可扩展性, 支持虚拟存储技术等 (3) 编译和操作系统 要求编译器能够开发粗粒度的并行性, 如把任务分配给各 个 PIM 及节点 ; 同时又能够开发细粒度的并行, 如在节点内的各个处理单元 上并行执行 要求能够划分数据和计算, 支持静态和动态的负载平衡 (4) 应用程序的特性 要求应用程序要有很好的可并行性, 包括粗粒度和细粒度 层次的 粗粒度的并行性便于开发 PIM 芯片之间的并行, 细粒度的并行性便 于开发 PIM 芯片内部的并行 (5) PIM 和非 PIM 系统之间的接口 15

16 4.4. 多型处理器芯片体系结构 多型处理器芯片体系结构能够很好地利用未来的半导体技术提供的能力解决应用的多样性问题 传统设计的通用处理器难于同时很好地运行许多不同的工作负载, 于是出现了桌面 网络服务器 商用服务器 科学计算等 专用化 的通用处理器, 以及图形图像处理器 数字信号处理器 (DSP) 和网络处理器等专用处理器 目标应用的特征直接决定了处理器的体系结构 没有哪个体系结构在运行所有的应用时都能达到最优性能, 因此处理器的设计者必需调整体系结构设计来适应目标应用的要求 专用化 的体系结构匹配于特定应用领域的并行性特征, 从而达到高性能和高效率 这种设计策略虽然降低了单个芯片的设计难度, 但却背离了通用芯片设计 通用性 的基本特征 每种芯片只有在运行适当的应用时才会获得好的性能, 否则性能就很差, 因而降低了系统的灵活性, 增加了芯片系列设计和掩模的成本 并且, 各种专用芯片的出现使得计算机系统的设计复杂度越来越高 由这些芯片构成的插卡 ( 板 ) 越来越多, 由地址和中断冲突造成的系统级复杂性增加, 可靠性大大下降 多型处理器芯片体系结构的基本思想是通过动态配置片上大量的处理器核 存储单元和互连, 支持各种不同类型并行性的计算模型, 从而能在一个很宽的应用范围内达到高性能, 提高片上硬件资源的利用率, 获得通用处理器适应大量应用的灵活性与专用处理器的高性能和高效率 多型处理器芯片体系结构的主要特征包括 : (1) 多型性 (Polymorphism): 指的是具有多种不同的程序执行模型, 能有效地支 持从应用中提取出的 ILP,TLP 和 DLP, 从而能有效地运行广泛的应用 (2) 自适应性 (Adaptability): 硬件是粗粒度 ( 而非 FPGA 那样在细粒度的门级 ) 可重构的 结构资源 ( 计算, 存储和通信 ) 能有效地匹配应用的并行性特征, 实现最佳的动态资源配置, 从而达到接近专用处理器的高性能和有效的资源利用率 (3) 可扩展性 (Scalability): 采用模块化 / 分布化的设计, 基本的构造块设计成简单的 ( 小结构的 ) 和可重用的, 通过简单设计 ( 大量复制相同的简单结构 ) 构成复杂设计 充分考虑未来线宽变窄的半导体制作工艺, 实现高度的可扩展性, 达到一次设计, 多个实现 这样的结构易于实现分布的时钟控制, 克服线延迟问题, 降低芯片设计 验证和测试的复杂度 结构资源的分布设计有利于功率的均匀分布和实现低功耗设计 相关的研究工作主要有 : 麻省理工的 RAW 项目 斯坦福大学的 Smart Memories 项目 德州大学奥斯汀分校的 TRIPS 项目 日本东京大学物理与化学研究院的 MDGrape3 项目 多型处理器芯片体系结构需要研究的关键问题包括 : (1) 计算的表示和程序执行模型的研究 : 如何对各种不同的应用建立所要做计算的静态表示? 如何提取应用中固有的 ILP,TLP 和 DLP? 16

17 如何在多型结构上重建一个动态的计算并执行该计算? 如何与未来的应用集合如何达到最佳匹配? 如何改进该结构以扩展应用集合? (2) 微体系结构的研究 : 需要什么样的内核构造块 (RISC,DSP,ASIC,ASIP, 图形芯片 )? 需要什么样的存储器? 需要什么样的互联和 I/O? 基本构造模块的粒度应该多大 : 是由数千个细粒度的处理单元组成, 还是只由几个粗粒度的处理器组成? 什么样的处理器和存储器粒度对多型能力更好? (3) 资源重构的研究 : 如何平衡结构资源, 以有效地匹配结构资源和应用特征, 提高资源的利用率? 用于开发各种并行性的 (ILP,TLP,DLP) 资源所占的比例? 优化何种并行性? (4) 软硬接口的研究 : 如何兼容现有的系统和应用? 如何适应未来的系统级环境? 等等 5. 几点启示 以上分析使我们对通用微处理器体系结构的发展方向获得如下一些启示 : (1) 现有的体系结构和微体系结构方法已经跟不上半导体技术的进步, 滥用 了摩尔定律提供给我们的计算潜力 大量的结构复杂性放在了解决计算, 存储, I/O 的速度的平衡设计上, 资源的利用率大幅度下降, 增加资源带来的性能提高越来越少, 使得芯片和系统的体积 功耗 成本急剧增加 我们期望通过改变体系结构和微体系结构方法, 相对延长摩尔定律的使用寿命, 在量子计算 分子计算等新的计算方法还没有成为主流之前, 仍能为应用领域不断提供日益强大的计算能力 (2) 长期以来, 商用通用微处理器芯片几乎是构造各种高性能计算系统无可替代的选择 板级 / 柜级并行系统的体系结构千变万化, 但其核心的微处理器体系结构却长期一成不变, 被动地适应系统级变化的需要, 使得系统设计的复杂性和成本越来越高 要降低系统设计的复杂性和成本, 微体系结构必须改变 针对应用固有的并行性特征设计微体系结构是大幅度提高性能 降低功耗和 17

18 设计复杂性的有效方法 (3) 可重构技术使得 DIY(Do It by Yourself) 各种类型的高效能的微处理器芯片成为可能 可重构计算能匹配半导体技术的进步, 将硬件变成是可 编译 的, 在可编程的介质中提供更大的计算能力和密度, 能在单片系统上以低的硬件复杂度适应包含 ILP TLP 和 DLP 等各种类型的应用, 适应完成各种各样新的任务, 适应现代微处理器设计周期短和变化更新快的要求 我们甚至可以设想可重构技术将带来微处理器芯片前端设计和后制作的根本分离, 这将从根本上改变计算机系统的设计 制造和使用方式 致谢 : 感谢中科院研究生院和中国科大研究生院 03 级和 04 级的研究生们, 在我开设的 处理器体系结构前沿 课程上, 积极参与了对高性能微处理器和存储器体系结构前沿问题的讨论, 完成了探索性的小型课程研究项目 本文的许多认识是参与该课程的两届研究生们共同的研究成果 感谢系统结构室主任唐志敏研究员和 CPU 组的胡伟武研究员, 他们对我的研究工作给予了极大的支持 关心和指导 感谢朱书汉和李文银两位老师, 长期不间断地热心为我提供处理器体系结构相关的国内外研究动态, 研究论文和图书资料等, 大大开拓了我的研究工作思路 感谢冀复生老师逐字逐句地对本文进行了修改 18