20·第1章计算机概要与技术 每类指令的CPI A C CPI 2 3 对于某行高级语言语句的实现,两个代码序列所需的指令数量如下: 每类指令的数量 代码序列 A B 1 2 1 2 2 4 1 1 娜个代码序列执行的指令数更多?哪个执行速度更快?每个代码序列的CP是多少? 答案 代码序列1共执行2+1+2=5条指令。代码序列2共执行4+1+1=6条指令。所以,代码 序列2执行的指令数更多。 基于指令数和CPI,我们可以用CPU时钟周期公式计算出每个代码序列的总时钟周期数为: CPU时钟周期数=三(CPL,×C,) 因此,代码序列1的CPU时钟周期数=(2×1)+(1×2)+(2×3)=10周期,代码序列2的CPU 时钟周期数=(4×1)+(1×2)+(1×3)=9周期。故代码序列2更快,尽管它多执行了一条指 令。由于代码序列2总时钟周期数较少,而指令数较多,它一定具有较小的CPI。CPI的计算公 式为: CPI=CPU时钟周期数/指令数 代入相应数据可得 CPL=CPU时钟周期数,/指令数,=10/5=2· CPL2=CPU时钟周期数,/指令数2=9/6=1.5。 重点 图1-14给出了计算机在不同层次上的性能测试指标及其测试单位。通过这些指标的组合可 以计算出程序的执行时间(单位为秒): 执行时间=秒/程序=指令数/程序×时钟周期数/指令×秒/时钟周期 永远记住,唯一能够被完全可靠测量的计算机性能指标是时间。例如,对指令集减少指令数 目的改进可能降低时钟周期时间或提高CPI,从而抵消了改进的效果。类似地,CPI与执行的指 令类型相关,执行指令数最少的代码其执行速度未必是最快的。 性能指标 测量单位 程序的CPU执行时间 程序执行的秒数 指令数 程序执行的指令数 CPI 每条指令的平均时钟周期数 时钟周期时间 每时钟周期的秒数 图1-14基本的性能指标及其测量单位 PDG 如何确定性能公式中这些因素的值呢?我们可以通过运行程序来测量CPU的执行时间,并 且计算机的说明书中通常介绍了时钟周期时间。难以测量的是指令数和CPI。当然,如果确定了
第1章计算机概要与技术·21 时钟频率和CPU执行时间,我们只需要知道指令数或者CPI两者之一,就可以依据性能公式计 算出另一个。 用仿真器等软件工具可以测量出指令数,也可以用现代处理器中的硬件计数器来测量执行 的指令数、平均CPI和性能损失源等。由于指令数量取决于计算机体系结构,并不依赖于计算机 的具体实现,因而我们可以在不知道计算机全部实现细节的情况下对指令数进行测量。但是, CPI与计算机的各种设计细节密切相关,.包括存储系统和处理器结构(我们将在第4、5章中看 到),以及应用程序中不同类型的指令所占的比例。因此,CPI对于不同应用程序是不同的,对 于相同指令集的不同实现方式也是不同的。 上述的例子表明,只用一种因素(如指令数)去评价性能是危险的。当比较两台计算机时, 必须考虑全部三个因素,它们组合起来才能确定执行时间。如果某个因素相同(如上例中的时 钟频率),必须考虑不同的因素,才能确定性能的优劣。因为CPI随着指令组合(instruction mix) 而变化,这样指令的条数和CPU必须被比较,即使时钟频率是相同的。在本章最后的练习题中, 有几个是关于计算机和编译程序的性能评价。在1.8节,我们将讨论一种因没有全面考虑各种因 素而导致的对性能的误解。 理解程序性能 程序的性能与算法、编程语言、编译程序、体系结构以及实际的硬件有关。下表概括了这些 成分是如何影响CPU性能公式中的各种因素的。 硬件或软件指标 影响什么 如何影响 算法决定源程序执行指令的数目,从而也决定了CPU执行指令的数目。 算法 指令数,CPI 算法也可能通过使用较快或较慢的指令影响CPI。例如,当算法使用更多 的浮点运算时,将会导致CPI增大。 编程语言显然会影响指令数,因为编程语言中的语句必须翻译为指令, 编程语言 指令数,CPI 从而决定了指令数。编程语言也可影响CPI,例如,Java语言对数据抽象 进行了大量支持,将进行间接调用,需要使用CPI较高的指令。 编译程序 指令数,CPI 编译程序的效率,既影响指令数,又影响CPI。因为编译程序决定了最 后生成的计算机指令,所以会以复杂的方式影响CPI。 指令集体系结构 指令数,时钟频 指令集体系结构影响CPU性能的所有方面,因为它影响完成某功能所需 率,CPI 的指令数、每条指令的周期数以及处理器的时钟频率。 精解:也许你期望CPI最小值为1.0。在第4章我们将看到,有些处理器在每个时钟周期可对多条指令 取指并执行。有些设计者用PC(instruction per clock cycle)来代替CPI。如一个处理器每时钟周期可执行2 条指令,则它的PC=2,CPI=0.5。 小测验 某Java程序在桌面处理器上运行需时l5秒。一个新版本的Java编译程序发行了,其编译产生的指令 数量是I旧版本Java编译程序的0.6倍,但不幸的是CPI增加为原来的1.1倍。请问该程序在新版本的Java 编译程序中运行速度是多少?从以下三个选项中选出正确答案。 A.15×0.6/1.1=8.2秒 B.15×0.6×1.1=9.9秒 C.15×1.1/0.6=27.5秒 1.5功耗墙 图1-15表示25年间ntel八代微处理器的时钟频率和功耗的增长趋势。两者的增长几乎保持 了将近20年,但近几年来突然缓和下来。其原因在于两者是密切相关的,而且功耗已经到达了
22·第1章计算机概要与技术 极限,无法再将处理器冷却下来。 10000T 120 3600 2000 2667 100 1000 103 时钟频率200 95 摩75.3 80 100 66 60 女 25 16 垂 12.5 功耗 40 罴 10 ●29.1 10.1 20 3.3 4.9 -0 1000 图1-1525年间Intel86八代微处理器的时钟频率和功耗 奔腾4处理器时钟频率和功耗提高很大,但是性能提升不大。Prescott发热(thermal)问题导致奔腾4处理 器(生产线)的放弃。Co心2(生产线)恢复使用低时钟频率的简单流水线和片上多处理器。 占统治地位的集成电路技术是CMOS(互补型金属氧化半导体),其主要的功耗来源是动态 功耗,即在晶体管开关过程中产生的功耗。动态功耗取决于每个晶体管的负载电容、工作电压和 晶体管的开关频率: 功耗=负载电容×电压2×开关频率 开关频率是时钟频率的函数,负载电容是连接到输出上的晶体管数量(称为扇出)和工艺 的函数,该函数决定了导线和晶体管的电容。 为什么时钟频率增长为1000倍,而功耗只增长为30倍呢?因为功耗是电压平方的函数,能 够通过降低电压来大幅减少,每次工艺更新换代时都会这样做。一般来说,每代的电压降低大约 15%。20多年来,电压从5V降到了1V。这就是功耗只增长为30倍的原因所在。 举例相对功耗 假设我们需要开发一种新处理器,其负载电容只有旧处理器的85%。再假设其电压可以调 节,与旧处理器相比电压降低了15%,进面导致频率也降低了15%,问这对新处理器的动态功 耗有何影响? 答案 P=(电容负载×0.85)×(电压×0.85)'×(开关频率×0.85) 电容负载×电压2×开关频率 因此功耗比为 0.85=0.52 新处理器的功耗大约为旧处理器的一半。 目前的问题是如果电压继续下降会使晶体管泄漏电流过大,就像水龙头不能被完全关闭 一样。目前40%的功耗是由于泄漏造成的,如果晶体管的泄漏电流再大,情况将会变得无法 收拾。 为了解决功耗问题,设计者连接大设备,增加冷却,而且将芯片中的一些在给定时钟周期内 暂时不用的部分关闭。尽管有很多更加昂贵的方式来冷却芯片,而继续提高芯片的功耗到300瓦 特,但对桌面计算机来说成本太高了。 由于计算机设计者遇到了功耗墙问题,他们需要开辟新的路径,选择不同于已经用了30多
第1章计算机概要与技术·23 年的方法继续前进。 精解:虽然动态功耗是CMOS功耗的主要来源,但静态功耗也是存在的。因为即使在晶体管关闭的情 况下,还是有泄漏电流存在。2008年时典型的电流泄漏占40%的功耗。因此,增加晶体管的数目,就会增 加漏电功耗,即使这些晶体管总是关闭的。各种各样的设计和工艺创新被用来控制电流泄漏,但还是难以 进一步降低电压。 1.6沧海巨变:从单处理器向多处理器转变 迄今为止,很多软件很像独唱编写者所写的音乐;使用当代的芯片,我们对于编写二重唱、 四重唱,以及小型的合奏具有少量的经验,但是为大型交响乐或者合唱谱曲则是一个不同的 挑战。 一Brian Hayes,《并行领域的计算》,2007 功耗的极限迫使微处理器的设计产生了巨变。图1-16给出了桌面微处理器的程序响应时间 的发展。从2002年起,其每年的增长速率从1.5下降到不足1.2。 10000 Intel Xeon.GHz 64-bit Intel Xz AMD0品C装s45764 Intel Pentium 4.3.0 GHz AMD Athlon,1.6 GHz 4195 Intel Pentium IIL,1.0 GHz 2584 Alpha 21264A.0.7 GHz1779 1000 Alpha 21264,0.6 GHz 1267 Alpha 214.0 G 993 Alpha 21164.0.5 GHz -481 Apia2I164,0.3GH280 Apha21064A.0.3GH83 =20% PowerPC 604.0.1GHz17 Alpha 21064.0 G HP PA-RISC,0.05 GHz 51 1BMRS6000/54024 52%/年 MIPS M200018 10 MIPS M/12013 Sun-4/2609 VAX87005 VAX-11/780. 25%/年5,VAX-11/785 01978 1980 19821984 1986 1988199019921994199619982000200220042006 图1-16自20世纪80年代中期以来处理器性能的发展 本图描绘了和VAX1l/780相比,采用SPECint测试程序得到的性能数据(见1.8节)。在20世纪80年代 中期以前,性能的增长主要靠技术驱动,平均每年增长25%。在这个阶段之后,增长速度达到52%,这些归 功于体系结构的创新和结构变化。到2002年,这种性能增长发生了变化,大约是7的因子(a factor of$v- e),面向浮点计算的性能大幅度增长。从2002年开始,受到功耗、指令级并行程度和长的存储器延迟的限 制,单核处理器的性能增长放缓,大约每年20%。 在2006年,所有桌面和服务器公司都在单片微处理器中加入了多个处理器,以求更大的吞 吐率,而不再继续追求降低单个程序运行在单个处理器上的响应时间。为了减少processor和mi- croprocessor(微处理器)这两个词语之间的混淆,一些公司将processor作为“cores”的代称, ●G 这样的微处理器(microprocessor)就是多核处理器了。因此,一个“四核”微处理器是一个芯 片,包含了4个processor或者4个core。 图1-17给出了最近微处理器中核的数目、功耗和时钟频率。在许多公司宣布的产品计划中
24·第1章计算机概要与技术 核的数目大约每2年将会翻一番(见第7章)。 AMD Sun 产品 Opteron X4 Intel Nehalem IBM Power 6 Ultra SPARC T2 (Barcelona) (Niagara 2) 每片核数 4 4 2 8 时钟频率 2.5 GHz 约2.5GHz 4.7 GHz 1.4 GHz 微处理器的功耗 120W 约100W 约100W 94W 图1-172008年多核微处理器每芯片的核数、时钟频率和功耗 在过去,程序员可以依赖于硬件、体系结构和编译程序的创新,无需修改一行代码,程序的 性能每18个月翻一番。而今天,程序员要想显著改进响应时间,必须重写他们的程序。而且, 随着核的数目不断加倍,程序员也必须不断改进他们的代码。 为了强调软件和硬件系统的协同工作,我们在本书用“硬件/软件接口”的概念来进行描 述,并对这一接口概括一些重要的观点,下面是本书中的第一个。 硬件软件接口 并行性对计算性能一直十分重要,但它往往是隐蔽的。第4章将说明流水线,它是一种漂亮 的技术,通过指令重叠执行使程序运行得更快。这是指令级并行性的一个例子。在抽取了硬件的 并行本质之后,程序员或编译程序可认为在硬件中指令是串行执行的。 迫使程序员意识到硬件的并行性,并显式地按并行方式重写其程序,曾经是计算机体系结 构的“第三抱怨”,以致很多采用此种方式进行革新的公司都失败了(见光盘上7.14节)。从历 史发展的角度来观察,整个T行业已经把它放到了未来的发展方向上,程序员最终将成功地跃 进到显式并行编程。 为什么程序员编写显式并行程序如此困难呢?第一个原因是并行编程以提高性能为目的, 必然增加编程的难度。不仅程序必须要正确,能够解决重要问题,而且运行速度要快,还需要为 用户或其他程序提供接口以便使用,否则编写一个串行程序就足够了。 第二个原因是为了发挥并行硬件的速度,程序员必须将应用划分为每个核大致相同数量的 任务,并同时完成。还要尽可能减小调度的开销,以不至于把并行的性能都浪费掉。 作一个比喻,现在有一个写新闻故事的任务,如果由8名记者共同来完成,能否提高8倍的 写作速度呢?为了实现这一目标,这个新闻故事需要进行划分,让每个记者都有事可做。假如某 名记者分到的任务比其他7名记者加起来的任务还要多,那用8名记者的好处就不存在了。因 此,任务分配必须平衡才能得到理想的加速。另一个存在的危险是记者要花费时间互相交流才 能完成所分配的任务。如果故事的一部分,例如结论,在所有其他部分完成之前不能编写,则你 缩短故事编写时间的计划将会失败。所以,必须尽量减少通信和同步的开销。对于本文的比喻和 并行编程来说,挑战包括:调度、负载平衡、通信以及同步等开销。你也许会想到,当更多的记 者来写一个故事,或是核的数目更多时,并行编程的挑战将更大。 为了反映业界的这个沧海巨变,后面的五章里每章都会有一节介绍有关并行性革命的内容: ·第2章,2.11节:并行与指令:同步。通常独立的并行任务需要一次次地协调,以便通 报它们何时完成了所分配的任务。本章将解释多核处理器任务同步所使用的指令。 ·第3章,3.6节:并行性和计算机算术:结合律。许多并行程序员往往从正在使用中的 串行程序开始。要确认他们的并行版程序是否能工作就要回答以下问题:是否和串行程 序得到了同样的结果?如果答案是否定的,那么并行版的新程序就存在错误。这个逻辑 假定计算机运算是遵守结合律的:将一百万个数相加,无论次序如何,得到的和是相同 的。本章将解释该逻辑对整数是成立的,但对浮点数并不成立