多年来,为现代计算机提供动力的微处理器的性能持续呈指数级增长,这主要有两个原因。首先,作为所有处理器和存储芯片电路核心的晶体管,其速度随着时间推移而变得更快,这符合摩尔定律1的描述,这直接影响了使用这些晶体管构建的处理器的性能。 此外,实际处理器性能的增长速度甚至超过了摩尔定律的预测2,因为处理器设计人员已经能够利用现代芯片上越来越多的晶体管,从软件中提取更多的并行性。英特尔处理器的相关情况如图1所示。
这种对更高并行性的持续追求的一个有趣方面是,它以一种对软件程序员几乎不可见的方式进行。自从20世纪70年代发明以来,微处理器一直继续实现传统的冯·诺依曼计算模型,几乎没有例外或修改。对于程序员来说,每台计算机都由一个执行顺序指令流的单处理器组成,并连接到一个容纳程序所有数据的整体式“内存”。由于与早期处理器世代向后兼容的经济效益非常强大,硬件设计人员基本上被限制在维护这种抽象概念的增强功能上,这种情况持续了几十年。在内存方面,这导致处理器配备了更大的高速缓存存储器,以将概念“内存”中经常访问的部分保存在更小、更快的存储器中,这些存储器在物理上更靠近处理器,以及更大的寄存器文件,以在极小、快速且编译器管理的“内存”区域中保存更多活动数据值。
在处理器内部,这导致了各种旨在实现以下两个目标之一的修改:增加处理器指令序列中每个周期可以发出的指令数量,或者以比摩尔定律通常允许的速度更快的速度增加处理器的时钟频率。将单个指令执行流水线化为一系列阶段,使得设计人员能够提高时钟速率,因为指令被切分成越来越多的小步骤,这些步骤旨在减少每个时钟周期内需要切换的逻辑量。在20世纪80年代需要几个周期才能执行的指令,在今天的前沿处理器中通常需要20个或更多周期,从而使可能的时钟速率几乎成比例地增加。
与此同时,开发了超标量处理器,以便在每个周期从单个传统指令流中执行多条指令。这些处理器通过动态检查指令流中的指令集,以查找每个周期能够并行执行的指令,然后执行它们,通常是相对于原始程序乱序执行。
这两种技术都蓬勃发展,因为它们允许指令更快地执行,同时为程序员保持关键的错觉,即所有指令实际上都是按顺序执行的,而不是重叠和乱序执行。当然,这种错觉并非绝对。如果程序员或编译器调整其指令调度和数据布局,以更有效地映射到下层流水线或并行架构和高速缓存存储器,通常可以提高性能,但重要的点是,旧的或未经调整的代码仍然可以在该架构上正确执行,尽管速度会低于峰值速度。
不幸的是,处理器设计人员越来越难以继续使用这些技术来提高现代处理器的速度。典型的指令流在指令之间只有有限的可用的并行性3,因此,可以每个周期发出超过大约四条指令的超标量处理器在大多数应用程序上实现的额外收益非常小。图2显示了真实的英特尔处理器在提取指令并行性方面的效率随时间的变化。在指令级并行性被强烈追求之前,有一个平坦的区域,然后随着并行性被有效地利用,出现了一个陡峭的上升,然后在最近几年,随着可用并行性被充分利用,增速逐渐放缓。
更复杂的是,构建能够利用每个周期多于几条指令的超标量处理器核心变得非常昂贵,因为动态查找并行指令所需的所有额外逻辑的复杂性大约与可以同时发出的指令数量的平方成正比。同样,超过大约10-20个阶段的流水线化也很困难,因为每个流水线阶段变得太短,甚至无法执行最少量的逻辑,例如将两个整数相加,超过这个限制,流水线的设计将变得更加复杂。此外,从向现有逻辑添加流水线寄存器和旁路路径多路复用器所产生的电路开销,以及由导致流水线状态被刷新的事件(主要是分支)引起的性能损失相结合。这抵消了大约30个阶段之后更深流水线化的任何潜在性能增益。
超标量发射和流水线方面的进一步进展也受到以下事实的限制:它们需要将越来越多的晶体管集成到每个处理器核心内的高速中央逻辑中——事实上,如此之多,以至于很少有公司能够负担得起雇用足够的工程师在合理的时间内设计和验证这些处理器核心。这些趋势在一定程度上减缓了处理器性能的提升,并迫使许多规模较小的供应商放弃高端处理器业务,因为他们再也无法有效地竞争。
然而,今天,传统处理器核心开发的所有进展基本上都已停止,原因很简单:物理限制:功耗。随着处理器在过去二十年中不断流水线化和变得越来越超标量化,典型的高端微处理器的功耗从不到1瓦特上升到超过100瓦特。尽管每个硅工艺世代都承诺降低功耗,因为越来越小的晶体管切换所需的功率更少,但这在实践中仅当现有设计简单地“缩小”以使用新的工艺技术时才成立。然而,处理器设计人员继续在其核心中使用更多的晶体管来添加流水线和超标量发射,并在更高和更高的频率下切换它们。总体效果是,每一代后续处理器都需要呈指数级增长的功率(如图3所示)。
不幸的是,冷却技术的扩展速度几乎不像指数级增长那么容易。结果,处理器从20世纪80年代不需要散热器,到20世纪90年代需要中等尺寸的散热器,再到今天巨大的散热器,通常配有一个或多个专用风扇来增加处理器上的气流。如果这些趋势继续下去,下一代微处理器将需要非常奇特的冷却解决方案,例如专用水冷,这在除最昂贵的系统之外的所有系统中在经济上都是不切实际的。
适用于超标量发射的有限指令并行性、流水线的实际限制以及受实际冷却限制限制的“功率上限”的结合,已将传统处理器核心内的未来速度提升限制在底层晶体管的基本摩尔定律改进率上。这种限制已经导致英特尔和AMD等主要处理器制造商将其营销重点从简单的核心时钟频率上转移开。
尽管更大的高速缓存存储器将通过加快对传统模型中单个“内存”的访问速度,在一定程度上继续提高性能,但简单的事实是,如果没有处理器设计的更根本性改变,微处理器性能的提升在未来将急剧放缓。处理器设计人员必须找到新的方法,以有效地利用高端硅芯片中不断增加的晶体管预算,以在最大限度地减少额外功耗和设计复杂性的情况下提高性能。微处理器市场已经分层为具有不同性能要求的领域,因此从这些不同性能要求的角度来审视问题是有益的。
随着互联网的兴起,对能够处理大量通过网络快速到达的独立请求的服务器的需求急剧增加。由于单个网络请求通常是完全独立的任务,无论这些请求是针对网页、数据库访问还是文件服务,它们通常分布在使用高性能传统微处理器构建的许多独立计算机上(图4a),这种技术多年来一直在谷歌等地方使用,以使整体计算吞吐量与输入请求速率相匹配4。
随着时间的推移,请求数量的增加,更多的服务器被添加到集合中。也可以用多处理器替换部分或全部独立服务器。现有的大多数多处理器由两个或多个独立的处理器组成,这些处理器使用公共总线、交换机集线器或网络连接到共享内存和I/O设备。与等效的单处理器系统集相比,整个系统通常在物理上更小,功耗更低,因为物理上较大的组件(如内存、硬盘驱动器和电源)可以由部分或全部处理器共享。
随着数据中心用于服务器的空间有限,并且电费可能高得惊人,每单位数据中心空间和每瓦特的性能压力随着时间的推移而增加。作为回应,服务器制造商试图通过采用更密集的服务器封装解决方案(如刀片服务器)和切换到可以共享组件的多处理器来节省空间。通过在这些系统中共享更多耗电组件,也实现了一些功耗降低。然而,这些短期解决方案正达到它们的实际极限,因为系统正达到仍然可以有效进行风冷的最高组件密度。因此,这些系统的下一阶段开发涉及一个新步骤:CMP(芯片多处理器)5。
针对服务器市场的首批CMP在一个芯片上实现了两个或多个传统的超标量处理器6, 7, 8, 9。这样做的主要动机是减少体积——现在多个处理器可以安装在以前只能安装一个处理器的空间中,因此可以提高每单位体积的整体性能。由于单个芯片上的所有处理器都可以共享与系统其余部分的单个连接,因此也实现了一些功耗节省,从而减少了所需的高速通信基础设施量,此外还可以在传统多处理器中实现共享。一些CMP,例如AMD和英特尔宣布的首批CMP,仅在处理器核心之间共享系统接口(如图4b所示),但其他CMP共享一个或多个级别的片上高速缓存(图4c),这允许CMP核心之间的处理器间通信,而无需片外访问。
通过利用服务器工作负载需要高吞吐量,但每个请求的延迟通常不像那么关键的事实,可以实现进一步的功耗节省10。如果网页加载时间稍长一点,大多数用户不会感到困扰,但如果网站因为没有足够的吞吐量容量而丢弃页面请求,他们就会抱怨。可以设计基于CMP的系统来利用这种情况。
当双路CMP取代单处理器时,在面向服务器的工作负载上,只需原始时钟速度的一半即可实现基本相同或更好的吞吐量。由于时钟速率降低,每个请求的处理时间可能会延长一倍。然而,对于许多此类应用程序,速度减慢的幅度会小得多,因为请求处理时间更常受到内存或磁盘性能的限制,而不是处理器性能的限制。然而,由于现在可以同时处理两个请求,因此整体吞吐量现在将相同或更好,除非对相同内存或磁盘资源存在严重的争用。
总体而言,即使性能相同或仅略好一些,这种调整在系统级别仍然是有利的。较低的时钟速率允许我们设计具有显着较低电源电压的系统,通常是接近线性的降低。然而,由于功耗与电压的平方成正比,因此获得原始性能所需的功耗要低得多——通常约为一半(电压平方的一半 = 功率的四分之一,每个处理器,因此两个处理器所需的功率总共约为一半),尽管潜在的节省可能会受到静态功耗和底层晶体管所需的任何最小电压水平的限制。
对于面向吞吐量的工作负载,通过将“延迟不重要”的想法推向极致,并构建具有许多小型核心而不是少量大型核心的CMP,可以实现更高的功耗/性能和性能/芯片面积。由于典型服务器工作负载的指令级并行性非常低且内存停顿很多,因此与超标量指令发射相关的大多数硬件对于这些应用程序基本上是浪费的。然而,典型的服务器一次会有数十个或数百个正在进行的请求,因此有足够的工作可以保持许多处理器同时忙碌。
因此,用几个小型处理器替换CMP中的每个大型超标量处理器,正如Sun Niagara11成功演示的那样,是一种成功的策略。每个小型处理器处理其请求的速度将比大型超标量处理器慢,但这种延迟减慢被以下事实充分补偿:相同的芯片面积可以被更多的处理器占据——在Niagara的情况下约为四倍,它在一个可以容纳一对超标量UltraSPARC核心的技术中具有八个单发射SPARC处理器核心。
将这个想法更进一步,通过在每个核心内包含多线程逻辑,仍然可以用更多的延迟换取更高的吞吐量12, 13, 14。由于每个核心倾向于花费相当多的时间等待内存请求得到满足,因此通过在每个核心内包含多个寄存器文件(每个线程一个),为每个核心分配多个线程是有意义的(图4d)。当某些线程正在等待内存响应时,处理器仍然可以执行来自其他线程的指令。
更多数量的线程还可以允许每个处理器并行发送更多请求到内存,从而提高当今处理器上高度流水线化的内存系统的利用率。总体而言,线程通常会有稍长的延迟,因为有时所有线程都是活动的,并且争用处理器核心的使用权。在内存停顿期间执行计算的增益以及同时启动大量内存访问的能力,超过了在Niagara等系统上的这种更长延迟的补偿,Niagara每个处理器有四个线程或整个芯片有32个线程,以及具有英特尔超线程的奔腾芯片,它允许两个线程共享一个奔腾4核心。
许多重要应用程序的性能是以单个任务的执行延迟而不是许多基本无关任务的高整体吞吐量来衡量的。大多数桌面处理器应用程序仍然属于这一类,因为用户通常更关心他们的计算机尽可能快地响应他们的命令,而不是他们的计算机同时处理许多命令的能力,尽管这种情况随着时间的推移正在缓慢变化,因为越来越多的应用程序被编写为包含许多“后台”任务。许多其他计算密集型应用程序(如大多数模拟和编译)的用户通常也更关心程序执行需要多长时间,而不是并行执行多少程序。
多处理器可以加速这些类型的应用程序,但这需要程序员付出努力,将每个长延迟执行线程分解为大量可以在多个处理器上并行执行的较小线程,因为自动并行化技术通常仅在描述密集矩阵数值计算的Fortran程序上起作用。从历史上看,处理器之间的通信相对于单个处理器的速度而言通常很慢,因此程序员必须确保在单独处理器上运行的线程彼此之间只需要最少的通信,这一点至关重要。
由于减少通信通常很困难,因此只有少数用户费心投入时间和精力来并行化他们的程序,从而实现加速,因此这些技术仅在高级研究生计算机科学课程中教授。相反,在大多数情况下,程序员发现等待下一代单处理器出现并“免费”加速他们的应用程序比投入精力并行化他们的程序更容易。因此,除非在非常大型的系统中,否则多处理器很难与单处理器竞争,在这些大型系统中,目标性能简单地超过了可用的最快单处理器的能力。
随着可以通过超标量调度和流水线等技术“免费”实现的所有性能提升基本耗尽,我们现在正进入一个程序员必须切换到更并行编程模型的时代,以便有效地利用多处理器,如果他们希望提高单程序性能。这是因为除了摩尔定律之外,处理器性能提升实际上只有三个“维度”:时钟频率、超标量指令发射和多处理。我们已经将前两个维度推向了它们的逻辑极限,现在必须拥抱多处理,即使这意味着程序员将被迫更改为并行编程模型以实现尽可能高的性能。
方便的是,从多芯片系统到芯片多处理器的过渡大大简化了传统上与并行编程相关的问题。以前,有必要将独立线程之间的通信减少到极低的水平,因为每次通信可能需要数百甚至数千个处理器周期。然而,在任何具有共享片上高速缓存存储器的CMP中,每次通信事件通常仅需少量处理器周期。使用这样的延迟,通信延迟对整体系统性能的影响要小得多。程序员仍然必须将他们的工作划分为并行线程,但不需要像以前那样担心确保这些线程是高度独立的,因为通信相对便宜。然而,这并非万能灵药,因为程序员仍然必须正确地构建他们的线程间同步,否则程序可能会产生不正确的结果或死锁,但至少通信延迟的性能影响被最小化了。
并行线程也可以小得多并且仍然有效——只有数百或几千个周期长的线程通常可以用于提取这些系统中的并行性,而不是传统并行机器通常需要的数百万个周期长的线程。研究人员表明,通过向CMP添加事务硬件,可以使应用程序的并行化更加容易,方案包括多种15, 16, 17, 18, 19。这些系统添加了缓冲逻辑,允许线程尝试并行执行,然后动态地确定它们在运行时是否真正并行。如果在运行时未检测到线程间依赖关系,则线程正常完成。如果存在依赖关系,则清除某些线程的缓冲区并重新启动这些线程,从而动态地串行化这些线程。
这种硬件仅在CMP等紧密耦合的并行机器上实用,它消除了程序员在并行化程序时确定线程是否并行的需要——他们只需要选择潜在的并行线程。总体而言,从传统处理器到CMP的转变对于程序员来说应该比从传统处理器到多芯片多处理器的转变更轻松,因为CMP通信延迟短,并且具有事务内存等增强功能,这些功能应在未来几年内上市。因此,这种范式转变应该在“典型”程序员可行的范围内,而不是仅限于研究生级别的计算机科学主题。
除了现在和未来的软件优势之外,CMP相对于传统单处理器对于硬件设计人员也具有重大优势。CMP对于每一代处理器只需要相当适度的工程工作量。处理器系列中的每个成员只需要印制额外的核心处理器副本,然后对连接处理器的相对较慢的逻辑进行一些修改,以适应每一代中额外的处理器——而不是完全重新设计高速处理器核心逻辑。此外,系统板设计通常只需要从一代到一代进行微小的调整,因为从外部来看,CMP从一代到一代看起来基本相同,即使其中的处理器数量增加。
唯一的真正区别是,随着CMP的扩展,主板将需要处理更高的I/O带宽要求。在几个硅工艺世代中,工程成本的节省可能是显着的,因为每次印制更多几个核心相对容易。此外,相同的工程工作量可以在一个大型相关处理器系列中分摊。简单地改变处理器的数量和时钟频率,就可以使基本相同的硬件在许多不同的性价比点上发挥作用。
由于这些趋势,我们正处于芯片多处理器在市场上取得重大进展的时刻。吞吐量计算是CMP正在产生影响的第一个也是最紧迫的领域。这是因为得益于这些已经是多线程应用程序中可用的大量独立线程,它们可以在没有任何软件更改的情况下开箱即用地改进功耗/性能结果。在不久的将来,CMP也应该在延迟关键型计算的更常见领域产生影响。尽管有必要将大多数延迟关键型软件并行化为多个并行执行线程,以真正利用芯片多处理器,但由于CMP的处理器间通信延迟较短,CMP使此过程比传统多处理器更容易。
从另一个角度来看,向CMP的转变是不可避免的,因为过去努力通过不修改基本冯·诺依曼计算模型的技术(如流水线和超标量发射)来加速处理器架构遇到了硬性限制。因此,微处理器行业正在引领多核架构的发展;然而,只有当软件行业完全拥抱并行编程时,这些架构的全部优势才能得到发挥。多处理器编程的艺术,目前仅由少数程序员掌握,比单处理器机器编程更复杂,并且需要理解新的计算原理、算法和编程工具。
1. Moore, G. E. 1965. Cramming more components onto integrated circuits. Electronics (April): 114–117.
2. Hennessy, J. L., and Patterson, D. A. 2003. Computer Architecture: A Quantitative Approach, 3rd Edition, San Francisco, CA: Morgan Kaufmann Publishers.
3. Wall, D. W. 1993. Limits of Instruction-Level Parallelism, WRL Research Report 93/6, Digital Western Research Laboratory, Palo Alto, CA.
4. Barroso, L., Dean, J., and Hoezle, U. 2003. Web search for a planet: the architecture of the Google cluster. IEEE Micro 23 (2): 22–28.
5. Olukotun, K., Nayfeh, B. A., Hammond, L. Wilson, K. and Chang, K. 1996. The case for a single chip multiprocessor. Proceedings of the 7th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS-VII): 2–11.
6. Kapil, S. 2003. UltraSPARC Gemini: Dual CPU Processor. In Hot Chips 15 (August), Stanford, CA; http://www.hotchips.org/archives/.
7. Maruyama, T. 2003. SPARC64 VI: Fujitsu’s next generation processor. In Microprocessor Forum (October), San Jose, CA.
8. McNairy, C., and Bhatia, R. 2004. Montecito: the next product in the Itanium processor family. In Hot Chips 16 (August), Stanford, CA; http://www.hotchips.org/archives/.
9. Moore, C. 2000. POWER4 system microarchitecture. In Microprocessor Forum (October), San Jose, CA.
10. Barroso, L. A., Gharachorloo, K., McNamara, R., Nowatzyk, A., Qadeer, S., Sano, B., Smith, S., Stets, R., and Verghese, B. 2000. Piranha: a scalable architecture based on single-chip multiprocessing. In Proceedings of the 27th International Symposium on Computer Architecture (June): 282–293.
11. Kongetira, P., Aingaran, K., and Olukotun, K. 2005. Niagara: a 32-way multithreaded SPARC processor. IEEE Micro 25 (2): 21–29.
12. Alverson, R., Callahan, D., Cummings, D., Koblenz, B., Porterfield, A., and Smith, B. 1990. The Tera computer system. In Proceedings of the 1990 International Conference on Supercomputing (June): 1–6.
13. Laudon, J., Gupta, A., and Horowitz, M. 1994. Interleaving: a multithreading technique targeting multiprocessors and workstations. Proceedings of the 6th International Conference on Architectural Support for Programming Languages and Operating Systems: 308–316.
14. Tullsen, D. M., Eggers, S. J., and Levy, H. M. 1995. Simultaneous multithreading: maximizing on-chip parallelism. In Proceedings of the 22nd International Symposium on Computer Architecture (June): 392–403.
15. Hammond, L., Carlstrom, B. D., Wong, V., Chen, M., Kozyrakis, C., and Olukotun, K. 2004. Transactional coherence and consistency: simplifying parallel hardware and software. IEEE Micro 24 (6): 92–103.
16. Hammond, L., Hubbert, B., Siu, M., Prabhu, M., Chen, M., and Olukotun, K. 2000. The Stanford Hydra CMP. IEEE Micro 20 (2): 71–84.
17. Krishnan, V., and Torrellas, J. 1999. A chip multiprocessor architecture with speculative multithreading. IEEE Transactions on Computers 48 (9): 866–880.
18. Sohi, G., Breach, S., and Vijaykumar, T. 1995. Multi-scalar processors. In Proceedings of the 22nd International Symposium on Computer Architecture (June): 414–425.
19. Steffan, J. G., and Mowry, T. 1998. The potential for using thread-level data speculation to facilitate automatic parallelization. In Proceedings of the 4th International Symposium on High-Performance Computer Architecture (February): 2–13.
KUNLE OLUKOTUN 是斯坦福大学电气工程和计算机科学副教授,他在那里领导了斯坦福 Hydra 单芯片多处理器研究项目,该项目开创了在单个硅芯片上使用多个处理器的先河。他创立了 Afara Websystems,以开发采用芯片多处理器技术的商业服务器系统。Afara 被 Sun Microsystems 收购,Afara 微处理器技术现在称为 Niagara。Olukotun 参与计算机体系结构、并行编程环境和可扩展并行系统的研究。
LANCE HAMMOND 是斯坦福大学的博士后研究员。作为博士生,Hammond 是 Hydra 芯片多处理器的首席架构师和实施者。Hammond 最近关于事务一致性和一致性的工作目标是使并行编程对普通程序员来说易于访问。
最初发表于 Queue 杂志,第 3 卷,第 7 期—
在 数字图书馆 中评论本文
Michael Mattioli - 客户端计算硬件中的 FPGA
FPGA(现场可编程门阵列)非常通用。它们被广泛应用于各种应用程序和行业,在这些应用和行业中,使用 ASIC(专用集成电路)在经济上不太可行。尽管设计人员在将 FPGA 集成到设备中时面临面积、成本和功耗挑战,但它们提供了显着的安全性和性能优势。其中许多优势可以在客户端计算硬件(如笔记本电脑、平板电脑和智能手机)中实现。
Christoph Lameter - NUMA(非均匀内存访问):概述
NUMA(非均匀内存访问)是一种现象,即处理器地址空间中不同点的内存具有不同的性能特征。在当前的处理器速度下,从处理器到内存的信号路径长度起着重要作用。信号路径长度的增加不仅增加了内存的延迟,而且如果信号路径由多个处理器共享,则很快会成为吞吐量瓶颈。首先在大型系统中注意到内存的性能差异,在这些系统中,数据路径跨越母板或机箱。这些系统需要经过修改的、具有 NUMA 支持的操作系统内核,这些内核显式地理解系统的内存的拓扑属性(例如内存区域所在的机箱),以避免过长的信号路径长度。
Bill Hsu, Marc Sosnick-Pérez - 实时 GPU 音频
今天的 CPU 能够为许多流行的应用程序支持实时音频,但一些计算密集型音频应用程序需要硬件加速。本文着眼于一些实时声音合成应用程序,并分享了作者在 GPU(图形处理单元)上实现这些应用程序的经验。
David Bacon, Rodric Rabbah, Sunil Shukla - 面向大众的 FPGA 编程
当考察硬件如何影响计算性能时,我们在一端有 GPP(通用处理器),另一端有 ASIC(专用集成电路)。处理器具有高度可编程性,但在功耗和性能方面通常效率低下。ASIC 实现专用和固定功能,并提供最佳的功耗和性能特性,但任何功能更改都需要完全(且极其昂贵的)电路重新设计。