自OO革命敲门以来,软件开发中最大的海洋变化,其名称是并发。
这篇文章出现在2005年3月30日,30(3)岁的Journal博士中出现在Title&#34下的一个很多Briefer版本;并发革命和#34;在2005年2月23日,23(2)中出现在C / C ++用户期刊中。
更新注意:CPU趋势图上次更新了2009年8月以包括当前 数据并显示趋势继续如预测。本文的其余部分 包括所有文本仍然是2004年12月首次发布的原始文本。
您的免费午餐将很快结束。你能为这个做什么?你在做什么?
主要的处理器制造商和架构,从Intel和AMD到SPARC和PowerPC,大多数传统方法都耗尽了促进CPU性能的空间。他们代替驾驶时钟速度和直线指令吞吐量,而是转向enmasse到超线程和多核架构。这两个功能都在今天的芯片上提供;特别是,Multicore可在当前PowerPC和SPARC IV处理器上提供,并于2005年从英特尔和AMD推出。实际上,2004年IN-STAT / MDR秋季处理器论坛的大主题是多核设备,因为许多公司都显示了新的或更新的多核处理器。回顾一下,它并不大部分延伸到2004年多夜的年。
这让我们在软件开发中的一个基本转折点,至少在未来几年内,针对通用桌面计算机和低端服务器的应用程序(恰好占销售的软件的广泛大部分美元价值)今天)。在这篇文章中,生病描述了硬件的变化面,为什么它突然对软件有关,并具体康全革命对您的事项有何重要,并将改变您将来可能是在未来编写软件的方式。
可以说,自由午餐已经过了一两年或两个人,才刚刚刚刚注意到。
这是一个有趣的现象,被称为Andy Giveth和Bill Taketh离开。无论处理器如何快速,软件一直发现新的进食额外速度的方法。将CPU速度制作十倍,软件通常会找到十倍的时间(或者,在某些情况下,在某些情况下会感到自由,以便有效地减少十倍)。大多数阶段的应用程序已经享受了几十年的自由和定期的性能提升,即使没有发布新版本或做任何特殊的东西,因为CPU制造商(主要)和内存和磁盘制造商(其次)可靠地启用了更新,更新主流系统。时钟速度是唯一的性能衡量标准,甚至必然是一个好的,但它是一个有益的人:被习惯看到500MHz的CPU让位于1GHz CPU,让位于2GHz CPU,等等。今天在主流电脑上的3GHz范围内。
关键问题是:它什么时候结束?毕竟,摩尔人法律预测指数增长,并且在达到硬物质限制之前,明显的指数增长无法继续;光不得不变得更快。增长最终必须减速甚至结束。 (警告:是的,Moores法则主要适用于晶体管密度,但在钟表速度等相关领域发生了同样的指数增长。其他空间的增长甚至更快,最重要的是数据存储爆炸,但重要趋势属于数据存储爆炸在不同的文章中。)
如果您是软件开发人员,可能已经乘坐免费午餐浪潮的桌面计算机性能。您的应用程序性能是否为某些本地操作界限?不担心,传统(如果怀疑)智慧就会去;明天处理器将具有更多的吞吐量,无论如何,今天的应用程序越来越逐渐被CPU吞吐量和内存速度以外的因素痉挛(例如,它们通常是I / O绑定,网络绑定,数据库绑定)。正确的?
好消息是,处理器将继续变得更加强大。坏消息是,至少在短期内,增长将主要是在不采取大多数目前的应用程序的方向前往他们习惯的自由骑行。
在过去的30年中,CPU设计师在三个主要领域取得了性能提升,其中前两个专注于直线执行流程:
增加时钟速度是关于获得更多周期。更快地运行CPU或更少直接意味着更快地执行相同的工作。
优化执行流程是关于每周期执行更多工作。今天的CPUS体育一些更强大的指示,它们执行优化,从行人到异国情调,包括流水线,分支预测,在同一时钟周期中执行多个指令,甚至重新排序指令流up-订单执行。这些技术旨在使指令更好地流动和/或更快地流动,并通过减少延迟并最大化每个时钟周期所完成的工作来挤出每个时钟周期的最大部分工作。
芯片设计人员在这么大的压力下,提供了更快的CPU,他们会导致更改程序的含义,并可能打破它,以便使其运行更快
在除教学重新排序和内存模型之外:请注意,我刚才被称为优化的一些实际上远远超过优化,因为它们可以改变程序的含义并导致可能破坏合理的程序员期望的可见效果。这是显着的。 CPU设计师通常是明智的,并且通常会伤害飞行的良好的人,并且不会想到通常伤害你的代码。但近年来,他们一直愿意追求积极的优化,只是为了拧出每个周期的速度,甚至知道这些激进重排可以危及代码的语义。这是海德先生的外表吗?一点也不。这种意愿只是一个明确的指标,芯片设计师面临的极限压力,旨在提供更快的CPU;在这么大的压力下,他们会冒险改变程序的含义,并可能打破它,以便使其运行更快。在这方面的两个值得注意的例子是编写重新排序和读取重新排序:允许处理器重新排序写入操作对此令人惊讶的后果,并且打破了许多程序员期望,这通常必须关闭,因为程序员太难了在任意写入重新排列的情况下正确地正确地了解其计划的意义。重新排序的读取操作也可以产生惊人的可见效果,但是这更常见于启用,因为它在程序员上不太努力,以及对操作系统和操作环境的性能设计人员的需求妥协,并选择更大的型号的模型在程序员上,因为这被视为较小的邪恶,而不是放弃优化机会。
最后,增加片上缓存的大小是远离RAM的。主要内存比CPU更慢,使得将数据更近于处理器和较近的CPU比在模具上更近得多。 On-Die缓存大小已经飙升,今天大多数主要芯片供应商都会销售您的CPU,具有2MB,更多的板载L2缓存。 (在这三种主要的历史方法中提高了CPU性能,增加了缓存是唯一一个将在近期继续的方法。稍后会更加关于缓存的重要性。)
关于该列表的根本重要的是,所有这些领域都是并发 - 不可知的。任何这些区域的加速将直接导致顺序(非平行,单线程,单程)应用程序的加速,以及使用并发性的应用程序。这是重要的,因为绝大多数今天的应用是单线程的,出于恶劣的原因,弊病进一步进一步。
当然,编制者必须跟上;有时您需要重新编译您的应用程序,并针对特定的最低限度级别的CPU,以便受益于新的指示(例如MMX,SSE)和一些新的CPU功能和特性。但是,甚至旧应用程序始终在不被重新编译的情况下始终运行大量的FastEreven,以利用最新CPU提供的所有新指令和功能。
CPU性能增长,因为我们已知它两年前击中了一堵墙。大多数人最近只开始注意到。
您可以获得其他芯片的类似图形,但我将在此处使用英特尔数据。图1通过时钟速度和晶体管数来图表英特尔芯片介绍的历史。至少现在,晶体管的数量继续攀升。然而,时钟速度是一个不同的故事。
图1: 英特尔CPU介绍(图2009年8月更新;文本原创 2004年12月)
在2003年初,您将注意到以前趋势的令人不安的急剧转向更快的CPU时钟速度。 IVE添加的线条以最大时钟速度显示限制趋势;如薄虚线所示,代替继续前一条路径,而不是薄虚线所示。由于不仅仅是一个但几个物理问题,较高的时钟速度越来越难以努力,显着的热量(太多并且太难以消散),功耗(太高)和电流泄漏问题。
快速:当前工作站中CPU上的时钟速度是什么?你在10GHz上运行吗?在英特尔筹码上,我们很久以前达到了2GHz(2001年8月),并根据2003年之前的CPU趋势,现在在2005年初,我们应该拥有第一个10GHz Pentium-Family Chips。快速环顾四周,嗯,实际上,我们没有。更重要的是,这种筹码甚至在地平线上都没有好主意,当我们可能看到它们出现时都没有好主意。
那么,那么4GHz怎么样?在3.4ghz alreadysurely 4ghz不远处?唉,甚至4GHz似乎是遥远的。 2004年中期,正如您所知,英特尔首先延迟了计划引入4GHz芯片,直到2005年,然后在2004年秋季完全抛弃了4GHz计划。根据本文,英特尔计划在2005年初开始进一步升至3.73GHz(已包含在图1中作为最右上大点),但时钟竞赛确实结束,至少现在; Intels和大多数处理器供应商的未来在其他地方成为芯片公司积极追求相同的新的多核方向。
有一天,可能会在主流桌面机上看到4GHz CPU,但它不会在2005年。当然,英特尔只有在劳动力的速度下运行的芯片的样品,才能通过英勇的工作,例如安装完全不切实际的冷却设备。您不会很快在您的办公室内使用那种冷却硬件,在平面上计算时,请在圈子上孤立在膝盖上。
没有免费午餐的东西。 R. A. Heinlein,月亮是一个苛刻的情妇
这是否均衡了这一意味着什么?有趣的是,一般答案似乎是没有。当然,就像所有指数进展一样,Moores法定必须结束一天,但似乎似乎还有几年了。尽管芯片工程师遭遇了果实的玉米果实,但晶体管计数继续爆炸,似乎CPU将继续追随Moores Law Live吞吐量的吞吐量超过一年时间。
因此,组合两个3GHz核心的双核CPU实际上提供了6GHz的处理能力。正确的?
错误的。即使在两个物理处理器上运行的两个线程也不意味着达到两倍性能。同样,大多数多线程应用程序不会在双核框上运行两倍。它们应该比单核CPU更快地运行;性能增益只是线性,即所有的。
为什么不?首先,核心之间存在开销,以确保高速缓存一致性(高速缓存的一致视图,以及主存储器)并执行其他握手。今天,即使对于多线程应用,两种或四个处理器机器也不是单个CPU的两到四倍。即使问题所讨论的CPU坐在同一个骰子上,问题也存在于此相同。
其次,除非两个核心正在运行不同的进程,或者单个过程的不同线程是单独的单独运行,否则单独运行以独立运行并且几乎从不等待彼此,但它们不会很好地利用。 (尽管如此,我会推测今天的单线程应用程序,如实际使用的单线程应用程序实际上可以通过进入双核芯片来实际上看到大多数用户的性能提升,而不是因为额外的核心实际上是有用的,但是因为它正在运行诸多用户系统的广告软件和间谍软件,否则否则缩小用户今天的单个CPU。我留给您来决定添加CPU是否运行间谍软件是该问题的最佳解决方案。)
如果您正在运行单线程应用程序,则应用程序只能使用一个核心。应该有一些加速作为操作系统,并且应用程序可以在单独的核心上运行,但通常操作系统无法达到CPU的最大化,所以其中一个核心将主要是空闲的。 (再次,间谍软件大部分时间都可以共享OSS核心。)
关键差异是这篇文章的核心,是,至少是下一对处理器代来以根本不同的方式完成性能提升。大多数当前应用程序将不再受益于自由骑行,而无需重新设计。
对于近期未来,意味着未来几年,新芯片的性能收益将被三种主要方法推动,其中一个与过去相同。近期未来性能增长司机是:
Warning: Can only detect less than 5000 characters
从今天开始,性能午餐不再是免费的。 当然,每个人都可以继续适用的绩效增长,每个人都可以接收,主要感谢高速缓存大小改进。 但是,如果您希望您的应用程序受益于新处理器的持续指数吞吐量的进步,则需要成为一款写成良好的并发(通常是多线程)的应用程序。 而且,这比完成更容易,因为并非所有问题都是并行化的,因为并发编程很难。 我可以听到抗议的嚎叫:并发? 那不是新闻! 人们已经在编写并发应用程序。 这是真的。 一小部分开发人员。 请记住,人们在20世纪60年代后期至少在Simula的日子以来一直在做面向对象的编程。 但Oo没有成为一场革命 ......