第1章计算机概要与技术·17 因此A是B的1.5倍快。 在以上的例子中,我们可以说,计算机B比计算机A慢1.5倍,因为 性能/性能g=1.5 意味着 性能/1.5=性能。 简单地说,当我们试图将计算机的比较结果量化时,我们通常使用术语“比什么快”。因为 性能和执行时间是个倒数关系,提高性能就需要减少执行时间。为了避免对术语“增加”和 “降低”潜在的误解,当我们想说“改善性能”和“改善执行时间”的时候,我们通常说“增 加性能”或者“降低执行时间”。 1.4.2性能的测量 如果计算机的性能用时间来度量,那么完成同样的计算任务,需要时间最少的计算机是最 快的。程序的执行时间一般以秒为单位。然而,时间可以用不同的方法来表示。对时间最直接的 定义是墙上时钟时间(wall clock time),也叫响应时间(response time)、消逝时间(elapsed time)等。这些术语均表示完成任务所需的总时间,包括了硬盘访问、内存访问、/O操作和操 作系统开销等一切时间。 多用户经常共享同一计算机,一个处理器需要同时运行几个程序。在这种情况下,系统可能 更侧重于优化吞吐率,而不是最小化一个程序的响应时间。因此,我们往往要把运行我们自己的 任务的时间与一般的响应时间区别开来。我们可以使用CPU执行时间,简称CPU时间,它只 表示在CPU上花费的时间,而不包括等待VO或运行其他程序的时间。(需要注意的是,用户所 感受到的是程序的响应时间,而不是CPU时间。)CPU时间还可进一步分为用于用户程序的时间 和操作系统为用户服务花去的CPU时间。前者称为用户CPU时间,后者称为系统CPU时间°。 要精确区分这两种CPU时间是困难的,因为通常难以分清哪些操作系统的活动是属于哪个用户 程序的,而且不同操作系统的功能也千差万别。 为了一致性,我们保持基于响应时间和基于CPU执行时间的性能差异。我们使用术语“系 统性能”(system performance)表示空载系统的响应时间,并用术语“CPU性能”(CPU perform- ance)表示用户CPU时间。本章我们概括介绍了计算机性能,既适用于响应时间的测量,也适 用于CPU时间的测量,但本章的重点将放在CPU性能上。 理解程序性能 不同的应用关注计算机系统的不同方面。许多应用,特别是那些运行在服务器上的应用,主 要关注V0性能,所以此类应用既依赖硬件又依赖软件,对墙上时钟时间最感兴趣。而在其他一 些应用中,用户可能对吞吐率、响应时间或两者的复杂组合更为关注(例如最差响应时间情况 下的最大吞吐率)。要改进一个程序的性能,必须明确性能的定义,然后通过测量程序执行时间 来寻找性能瓶颈。在后面的章节中,我们将介绍如何在系统的各个部分寻找瓶颈,以改进性能。 虽然作为计算机用户我们关心的是时间,但当我们深人研究计算机的细节时,使用其他的度量 可能会更为方便。对计算机设计者来说,他们需要考虑如何度量计算机硬件完成基本功能的速度。 几乎所有计算机都用时钟来驱动硬件中发生的各种事件。时钟间隔的时间称为时钟周期⑧。也可 曰CPU执行时间(CPU execution time):简称CPU时间(CPU time),执行某一任务在CPU上所花费的时间。 ⊙用户CPU时间(user CPU time):在程序本身所花费的CPU时间。 PDG 自 系统CPU时间(system CPU time):为执行程序而花费在操作系统上的时间。 时钟周期(clock eyele):也叫ick、elock tick、clock period、clock或cycle等,为计算机一个时钟周期的时间, 通常是处理器时钟,一般为常数
18·第1章计算机概要与技术 用它的倒数来描述,称为时钟频率(clock rate)。例如,时钟周期为250ps,对应的时钟频率为 4GHz。在下一节,我们将形式化地定义硬件设计者的时钟周期和计算机使用者所指的秒之间的 关系。 小测验 1)假设某个使用桌面客户端和远程服务器的应用受网络性能限制。那么对于下列3种方法,哪种只改进了 吞吐率?哪种同时改进了响应时间和吞吐率?哪种都没有改进? A.在客户端和服务器之间增加一条额外的网络信道,从而增加总的网络吞吐率,并减少获得网络访问 的延迟(现在已经存在2条网络信道)。 B.改进网络软件,从而减少网络通信延迟,但并不增加吞吐率。 C.增加计算机的内存。 2)计算机B运行给定的应用需要28秒,而计算机C的性能是计算机B的4倍。请问计算机C运行同样的 应用需要多少时间? 1.4.3CPU性能及其因素 用户和设计者往往以不同的尺度看待性能。如果我们能掌握这些不同尺度之间的关系,就 能确定一个设计的变化对性能的影响。由于我们都关注CPU性能,因而性能测量实际上针对的 是CPU执行时间。下面一个简单的公式把最基本的尺度(时钟周期数和时钟周期时间)和CPU 时间联系起来: 一个程序的CPU执行时间=一个程序的CPU时钟周期数×时钟周期时间 这个公式清楚地表示,硬件设计者减少一个程序的CPU时钟周期数,或减少时钟周期时间, 就能改进性能。 由于时钟频率和时钟周期时间互为倒数,故 一个程序的CPU执行时间=一个程序的CPU时钟周期数/时钟频率 由此可见,提高时钟频率也能改进性能。在后面几章中我们将看到,设计者经常要面对这些 因素之间的权衡。许多技术在减少时钟周期数的同时也会引起时钟周期时间的增加。 举例性能的改进 某程序在一台时钟频率为2GHz的计算机A上运行需要10秒。现在将设计一台计算机B, 希望将运行时间缩短为6秒。计算机的设计者采用的方法是提高时钟频率,但这会影响CPU其 余部分的设计,使计算机B运行该程序时需要相当于计算机A1.2倍的时钟周期数。那么计算机 设计者应该将时钟频率提高到多少? 答案 我们首先要知道在A上运行该程序需要多少时钟周期数: CPU时间A=CPU时钟周期数,/时钟频率A 10秒=CPU时钟周期数,/2×10°周期数/秒 CPU时钟周期数,=10秒×2×10°周期数/秒=20×10周期数 B的CPU时间公式为: CPU时间。=1.2×CPU时钟周期数/时钟频率g 6秒=1.2×20×10°时钟周期数/时钟频率g 时钟频率.=1.2×20×10°时钟周期数/6秒=0.2×20×10°时钟周期数/秒 PDG =4×10°时钟周期数/秒=4GHz 因此,要在6秒内运行完该程序,B的时钟频率必须提高为A的2倍
第1章计算机概要与技术·19 1.4.4指令的性能 上述的性能公式没有涉及程序所儒的指令数。(在第2章中,我们将看到指令是如何组成程 序的。)然而,由于计算机是通过执行指令来运行程序的,因此执行时间一定依赖于程序中的指 令数。一种考虑执行时间的方法是,执行时间等于执行的指令数乘以每条指令的平均时间。所 以,一个程序需要的时钟周期数可写为: CPU时钟周期数=程序的指令数×每条指令的平均时钟周期数 术语CPI表示执行每条指令所需的时钟周期数的平均值。不同的指令需要的时间可能不 同,CPI是一个程序全部指令所用时钟周期数的平均值。CPI提供了比较相同指令集的不同实现 方式的方法,因为一个程序执行的指令数是一样的。 举例性能公式的使用 假设我们有相同指令集的两种不同实现方式。计算机A的时钟周期为250Ps,对某程序的 CPI为2.0;计算机B的时钟周期为500ps,对同样程序的CPI为1.2。对于该程序,请问哪台计 算机执行的速度更快?快多少? 答案 我们知道,对于固定的程序,每台计算机执行的总指令数是相同的,我们用I来表示。首 先,求每台计算机的CPU时钟周期数: CPU时钟周期数A=I×2.0 CPU时钟周期数g=I×1.2 现在,可以计算每台计算机的CPU时间: CPU时间,=CPU时钟周期数A×时钟周期时间 =/×2.0×250ps=500×Ips 同理, CPU时间g=I×1.2×500ps=600×Ips 显然,计算机A更快。快多少由执行时间之比来计算 CPU性能A_执行时间e=600×Ips=1.2 CPU性能a执行时间A500×Ips 因此,对于该程序计算机A是计算机B的1.2倍快。 1.4.5经典的CPU性能公式 现在我们可以用指令数、CPI和时钟周期时间来写出基本的性能公式: CPU时间=指令数×CPI×时钟周期时间 或 CPU时间=指令数×CPI/时钟频率 这些公式特别有用,因为它们把性能分解为三个关键因素。我们可用这些公式来比较不同 的实现方案或评估某个设计的替代方案。 举例代码段的比较 一个编译器设计者试图在两个代码序列之间进行选择。硬件设计者给出了如下数据: PDG ⊙CPI(clock cycles per instruction):每条指令的时钟周期数,表示执行某个程序或者程序片段时每条指令所需的 时钟周期平均数。 日指令数(instruction count):执行某程序所需的总指令数量
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年,但近几年来突然缓和下来。其原因在于两者是密切相关的,而且功耗已经到达了