第1章 量化设计与分析基础

1.1 引言

如今一台价格不足500美元的手机,性能便堪比1993年世界上最快的售价5000万美元的计算机,这种快速发展既得益于计算机制造技术的发展,也得益于计算机设计的创新。

纵观计算机发展的历史,技术一直在稳定地提升,但体系结构的革新相对具有一定的周期性

在电子计算机问世前后25年,两大支柱均贡献巨大,使计算机性能每年提升25%。20世界70年代后,微处理器问世。依靠集成电路技术的进步,微处理器每年提升35%的性能。

计算机市场的两个重大变化也使得新体系结构比以往更容易取得商业上的成功。第一个重大变化是人们几乎不再使用汇编语言进行编程,从而降低了对目标代码兼容性的要求。第二个重大变化是出现了独立于厂商的标准化操作系统降低了引入新体系结构的成本和风险

基于以上原因,人们在20世纪80年代早期成功开发出一套指令更为清晰的新结构--RISC。设计人员在设计基于RISC计算机时,将主要精力聚焦在2种关键性能技术上,既指令级并行的利用(起初通过流水线,后来是通过多指令发射)和缓存的使用(最初采用的一些很简单的形式,后来使用了更为复杂的组织与优化方式)。

20世纪90年代后期,随着晶体管数量飙升,转换更复杂的x86体系结构的硬件开销可以忽略不计。在低端应用(手机),x86转换开销所带来的能耗与硅面积成本推动了一种RISC体系结构逐渐成为了主流,既ARM。

在20世纪80年代中期之前,处理器性能增长主要由计算机制造技术驱动,性能年平均增长25%。在1986~2003年间,归功于以RISC架构为代表的更先进的体系结构与组织方式思想,年增长率52%。2003年,登纳德缩放比例定律的终结和可用指令级并行造成的功耗限制,导致单处理器性能的年增长率降低到23%,直到2011年。在2011年到2015年,性能年增长率不到12%,部分是因为Amdahl定律的限制。从2015年开始,摩尔定律走向终结,性能年增长率仅为3.5%

之前计算机性能增长的效果如下:
        (1)它显著增强了计算机的处理器能力
        (2)性价比的大幅度提高促进了新型计算机的问世
        (3)正如摩尔定律所预测的那样,半导体制造业的发展使基于微处理器的计算机在整个计算机设计领域占据主导地位。
        (4)对软件开发的驱动。今天的程序员能够以性能换取生产效率提升。

硬件方面的创新带来了计算机设计的复兴--既强调体系结构方面的创新,也重视新技术的高效运用。

为了保持生产效率并尝试缩小性能差距,采用即使编译器和跟踪编译器的解释器区代理传统编译器和连接器。软件的部署也在发生变化,互联网上使用的“软件既服务”取代了必须在本地计算机安装和运行的紧缩套餐。

应用程序的形状也在变化。语音、音效、图像和视频变得越来越重要,可预测的响应时间对于提供良好的用户体验非常关键。

遗憾的是,长达17年的硬件复兴结束,根本原因是持续几十年的两个半导体工艺规律(摩尔定律和登纳德缩放定律)难以维系了

1974年,Dennard发现,即使增加晶体管的数量,对于给定的硅面积,功率密度也是恒定的,这是因为晶体管的尺寸变小的。Dennard scaling定律在2004年左右终结,因为无法在减少电流和降低电压的同时,仍然保持集成电路的可靠性。这一改变促使半导体行业采用高效的多处理器或多核设计,替代低效的单处理器架构。

为了提升处理器性能,应当在每个芯片上集成多个处理器,而不是采用更快的单处理器。这标志着处理器性能的提升从单纯依赖指令级并行ILP转向数据级并行DLP和线程级并行TLP。

编译器和硬件都是隐式利用ILP,不会引起程序员的注意,而DLP、TLP和请求级RLP则是显式并行的,需要重构应用程序才能利用显式并行,这在大多数情况会成为程序员的主要新增负担。

Amdahl定律给出了每个芯片上可用核数量的实际上限。如果10%的任务是串行的,那么无论在芯片上放入多少个核,通过并行化所能实现的最大性能收益不会超过10。

最近终结的第二个经验定律是摩尔定律,1965年,摩尔极其准确地预测到,芯片上可容纳的晶体管数量每隔一年翻倍;1975年,这一预测修正为每2年翻倍。

以下4个原因导致了处理器性能的提升速度放缓,变为每20年翻倍,而不再是1986~2003年中每1.5年翻倍。
        (1)由于摩尔定律的放缓和登纳德比例定律,晶体管不在大幅改进
        (2)微处理器的功耗预算不变
        (3)用多个高效能处理器替代了单个大功耗的处理器
        (4)多处理器达到Amdahl定律的上限

提升能耗-性能-成本的唯一途径就是专用。

本书主要探讨促使计算机性能在20世纪取得飞速增长的体系结构思想和编译器改进,导致这些剧变的原因,以及21世纪体系结构思想、编译器和解释器面临的调整和富有前景的方法。其核心是一种量化的计算机设计与分析方法,这种方法采用的工具包括程序的经验数据、试验和模拟。

1.2 计算机的分类

计算机使用方式的变化促进了5种计算市场的形成,其中每一种都有自己不同的应用、需求和计算技术。

特征个人移动设备桌面计算机服务器

集群/

仓储计算机

物联网
系统价格100~1000美元300~2500美元5000~1千万美元10万~2亿美元10~10万美元
微处理器价格10~100美元50~500美元200~2000美元50~250美元0.01~100美元
关键的系统设计问题成本、能耗、媒体性能、响应速度性价比、能耗、图形性能吞吐量、可用性、可扩展性、能耗性价比、吞吐量、能耗均衡性价格、能耗、应用的特有性能

1.2.1 物联网嵌入式计算机

嵌入式计算机在日常电器中随处可见。物联网指的是通常以无线方法连接到互联网的嵌入式计算机。当辅以传感器和驱动器时,物联网设备可以收集有用数据,并与物理世界进行互动,从而实现各种各样的“智慧”应用。

嵌入式计算机的处理能力和成本差别最大,尽管嵌入式计算机市场中各种设备的计算能力参差不齐,但价格是嵌入式计算机设计中关键。性能要求的主要目标是通常是以最低价格满足性能需要。

1.2.2 个人移动设备

个人移动设备是指带有多媒体用户界面的无线设备。由于整个产品的零售价格为数百美元,所以成本是一个关键因素。因为缺少风扇散热,所以也限制了总功耗。

将能否运行第三方软件作为嵌入式计算机与非嵌入式计算机的标准。

响应时间和可预测性能是多媒体应用程序的关键特征。实时性能需求是指应用程序的一个程序段有一个确定的最大执行时间。许多个人移动设备还有一些其他关键特征:需要将存储器占用减至最少,需要高效利用能源。电池容量和散热问题决定了需要提高能效。存储器成本在系统成本占很大比例,在这种情况下,优化存储容量非常重要。由于应用程序决定了在数据规模的大小,因此对存储容量的重视就转换对代码规模的重视。

1.2.3 桌面计算机

以资金论,第一个市场(可能仍然是最大市场)是桌面计算机市场。从2008年开始,每年生产的个人计算机中,有一半以上是电池供电的笔记本计算机,台式机的销量正在下降。

在整个价格和性能范围内,桌面计算机市场趋向于最佳性价比。系统的性能(主要以计算机性能和图形性能来衡量)和价格对这个市场的客户来说是最重要的。

1.2.4 服务器

自从20世纪80年代开始转向个人计算机以来,服务器的角色逐渐变为提供更大规模、更可靠的文件和计算服务,取代了传统了大型机,成为大规模企业计算的中枢。

服务器的关键特征不同于桌面计算机。首先,可用性至关重要。这些服务器必须7*24小时不间断工作,所以服务器系统发生故障的后果远比单台计算机发生故障严重,产生了因应用程序死机所造成的成本。

服务器系统的第二个关键特征是可扩展性。服务器系统经常需要扩展,以满足对其所支持服务的日益增长的需求。因此,服务器扩展计算能力、内存、存储和io带宽的能力极为重要。

最后一个特征是,服务器的设计应使其具有很高的吞吐能力。这就是说,服务器的整体性能(每分钟处理的事务数或者每秒提供的网页数)很重要。尽管响应单个请求的速度依旧重要,但总体效率和成本效益(由单位时间内能够处理的请求数决定)才是大多数服务器的关键指标。

1.2.5 集群/仓库级计算机

软件既服务应用(比如搜索、社交网络、视频分享、多人游戏、在线销售等)的发展推动了一类被称为集群的计算机的发展。集群是指一组桌面计算机或服务器通过局域网连接在一起,运转方式类似于一台更大型的计算机。每个节点都运行自己的操作系统,节点之间使用网络协议进行通信。最大规模的集群称为仓库级计算机WSC,其设计方式使数万台服务器就像一台服务器一样运行。

WSC是如此之大,因此性价比和功耗非常关键。WSC的大部分成本与仓库内计算机的功耗和冷却技术有关,这些按年摊销的计算机和网络设备的年费用可能高达4000万美元,因为它们通常每隔几年就必须更换一次。

WSC与服务器相似之处在于,可用性对它们来说非常重要。WSC与服务器之间差别在于,WSC以很多廉价组件为模块进行构建,依靠软件层来捕获和隔离在这一级别进行计算时发生的许多故障,从而提供这类应用程序所需的可用性。注意,WSC的可扩展性是由连接这些计算机的局域网实现的,而不是像服务器那样,通过集成计算机硬件来实现。

超级计算机和WSC的相似之处在于它们都非常昂贵,不同之处在于超级计算机强调浮点性能、运行大型的、通信密集的批程序,而WSC更强调交互式应用程序、大规模存储、可靠性和高互联网络带宽。

1.2.6 并行度和并行体系结构的分类

多种级别的并行度已成为计算机设计的驱动力,而能耗和成本是主要约束应用程序主要有以下2种并行:

        1. 数据级并行DLP,是因为许多数据项可以同时处理;
        2. 任务级并行TLP,是因为创建的工作任务可以单独执行并且主要采用并行方式执行;

计算机硬件又以以下4种主要方式来利用这两种并行性:

        1. 指令级并行,在两个层面对数据级并行进行了利用。首先在编译器的帮助下,借助流水线之类的思想适度利用,其次借助多发射、推测执行之类的思想进一步利用。
        2. 向量体系结构、图形处理器和多媒体指令将多条指令并行用于一组数据,以利用数据级并行。
        3. 线程级并行在紧耦合硬件模型中利用数据级并行或任务级并行,这种模型允许并行线程之间进行交互。
        4. 请求级并行利用程序员或者操作系统指定的大量解耦任务之间的并行性。

Flynn在20世界60年代研究并行计算工作量时,对指令流和数据流中的并行进行了研究。指出:
        1. SISD,这个类别是单处理器。程序员将其看做标准的顺序处理器,但可以利用数据级并行。(超标量和推测执行)
        2. SIMD,同一指令由多个使用不同数据流的处理器执行。SIMD利用数据级并行,对多个数据项并行执行相同操作。每个处理器都有自己的数据存储器,但只有一个指令存储器和控制处理器,用来读取和分派指令。(向量体系结构、标准指令集的多媒体扩展和GPU)
        3. MISD,到目前为止,还没有这类的商用处理器,但包含这类型后,简单的分类才完整。
        4. MIMD,每个处理器都提取自己的指令,对自己的数据进行操作,它针对的是任务级并行。一般来说,MIMD比SIMD更灵活,适用性也更强,但是它比SIMD要贵一些。例如,MIMD还能利用数据级并行,当然,其开销要比SIMD更高一些,意味着粒度要足够大,以便高效地利用并行度。在紧耦合MIMD体系结构中,由于多个互相协作的线程是并行操作的,所以它利用了线程级并行。请求级并行的松耦合MIMD结构可以很自然地并行执行独立任务,几乎不需要通信和同步。

1.3 计算机体系结构的定义

计算机设计人员面临着一个非常复杂的任务:判断那些属性对于新计算机来说至关重要,然后在设计这种计算机时使性能和能效达到最佳,同时还要满足成本、功耗和可用性约束条件。这项任务包括许多方面:指令集设计、功能组织、逻辑设计、实现方式。实现方式可能包含集成电路设计、封装、电源和散热。为使设计方案到达最优效果,设计人员需熟悉从编译器、操作系统到逻辑设计与封装等各种技术

几十年前,计算机体系结构一词通常是指指令集设计。计算机设计的其他方法称为实现,隐含之意就是实现方式通常不重要。目前本书作者认为这种观点是不对的。

1.3.1 指令集结构:计算机体系结构的近距离审视

指令集体系结构ISA来指代程序员可以看到的实际指令集。ISA相当于软件和硬件之间的界限

RISC-V的诞生于RISC指令集,它继承了“前辈”的出色理念--大组寄存器、易于实现流水线的指令、一组精简的操作,同时又避免它们的疏漏和错误。

指令集重点包括
        
(1)ISA分类。现今几乎所有的ISA被划分到通用寄存器体系结构中,在这种体系结构中,操作数要么是寄存器,要么是存储地址。80x86有16个通用寄存器和16个浮点寄存器,而RISC-V则有32个通用寄存器和32个浮点寄存器。这一类别中有两种版本,一种是寄存器-存储器ISA,比如80x86,可以在许多指令中访问存储器;另一种是载入-存储ISA,比如ARMv8和RISC-V,它们只能用载入指令或者存储指令来访问存储器。自1985年之后,发布的所有ISA都是载入-存储ISA。
        (2)存储器寻址 。几乎所有桌面计算机和服务器计算机,都是用字节寻址来访问存储操作数。有些体系结构ARMv8要求必须是对齐的。80x86和RISC-V不要求对齐,但如果操作数是对齐的,访问速度通常会更快一点。
        (3)寻址模式。除了指定寄存器和常量操作数之外,寻址模式还指定了一个存储器对象的地址。RISC-V寻址模式为:寄存器寻址、立即数寻址和位移量寻址。在位移量寻址模式中,将一个固定偏移量加到寄存器,得出存储器地址。80x86支持以上3种模式,再加上位移量(寻址)的3种变化形式。ARMv8拥有3中RISC-V寻址模式,再加上相对PC的寻址方式,两个寄存器之和,以及递增\递减寻址。
        (4)操作数的类型和大小。和大多数ISA类似,80x86、ARMv8和RISC-V支持8位、16位、32位和64位整型,以及32位浮点,64位浮点。80x86还支持80位浮点数。
        (5)操作指令。常见的操作类别为数据传输指令、算术逻辑指令、控制指令和浮点指令。
        (6)控制指令。包括上述3种在内的几乎所有ISA都支持条件分支、无条件跳转、过程调用和返回。这3种ISA都是使用PC相对寻址方式,其中的分支地址由一个地址字段指定,该地址被加到PC中。3者之间细微差别是:RISC-V条件分支检验寄存器中的内容;ARMv8和RISC-V过程调用将返回地址放在一个寄存器中;而80x86调用将返回地址放在存储器中一个栈内。
        (7)ISA的编码。有两种基本编码选择:固定长度和可变长度。所有ARMv8和RISC-V指令的长度都是32位,从而简化了指令译码。80x86编码为可变长度,变化范围在1~18字节。与固定长度相比,可变长度的指令占用的空间更少,所以80x86编译的程序通常小于RISC-V编译的程序。注意,编码选择会影响指令转换为二进制编码的方式。例如,由于寄存器字段和寻址模式字段可以在一条指令中出现多次,所以寄存器的数目和寻址模式的数目都对指令的大小有很大影响。ARMv8和RISC-V都进行了扩展,支持长16位和3位的指令,以便缩小程序规模。

1.3.2 真正的计算机体系结构:设计满足目标和功能需求的组成和硬件

计算机的实现包括:组成和硬件。组成一词包含了计算机设计的高阶内容,比如存储器系统、存储器互连、内部存储器或CPU的设计。优势也是用微体系结构来替代“组成”。

由于单个微处理器开始采用多个处理器,所以人们开始使用核core来称呼处理器。

硬件是指计算机的具体实现,包括计算机的详尽逻辑设计和封装技术。同一系列的计算机通常具有相同的指令集体系结构和非常相似的组成,但在具体硬件实现上有所不同。

本书的体系结构涵盖了计算机设计的所有的3个方面:指令集体系结构、组成或微体系结构、硬件。

架构师设计的计算机必须满足需求,并达到价格、功耗、性能和可用性指标的要求。通常,架构师必须判断有那些功能需求,而这可能是一项主任务。需求可能是由市场驱动的特定功能。应用软件决定了计算机的使用方式,从而经常会驱动对特定功能需求的选择。如果存在为大量特定指令集体系结构设计的软件,那么架构师可能会认为新计算机应当实现现有指令集。

架构师还必须了解技术和计算机应用这两方面的重要趋势,因为这些趋势不仅会影响未来的成本,还会影响体系结构的生命期。

1.4 技术趋势

一种指令集体系结构要取得成功,它的设计必须能够适应计算机技术的快速变化。以下5种实现技术是现代计算机实现所可不或缺,它们都在快速变化:
        (1)集成电路逻辑技术。晶体管密度每年大约增长35%,相当于每4年翻2番。但是目前摩尔定律不再成立。单个芯片上的器件数量还在增加,但增速减慢了,预期的数量翻番的时间将随着每一代新技术的发展而拉长。
        (2)半导体DRAM,是主存储器的基础。貌似32GB的DRAM可能不会出现了。
        (3)半导体闪存。最近几年(2017年前),单个闪存芯片的容量每年大约增加50%~60%,价格则为DRAM的1/10~1/8。
        (4)磁盘技术。近来磁盘密度的增加速度已经减缓至每年不足5%。提高磁盘容量的一种方式是以相同的面密度来增加更多盘片。HAMR是持续提升硬盘驱动器面密度的最后一个机会,硬盘驱动器的价格是闪存的1/10~1/8,是服务器存储和仓库级存储的核心技术。
        (5)网络技术。网络性能取决于交换机性能和传输系统的性能。

设计人员在设计时经常要考虑下一代技术,因为他们知道。当一个产品开始大量交付时,下一代技术可能最具成本效益或拥有性能优势。

1.4.1 性能趋势:带宽胜过延迟

带宽和吞吐量是指在给定时间内完成的总工作量,比如在进行磁盘读写时每秒传输的兆字节数。与之相对,延迟或响应时间是指一个事件从开始到完成所经过的时间,比如一次磁盘访问需要的毫秒数。

性能是微处理器和网络的主要区别,所以历年来取得了最大的改进。带宽增加了32000~40000倍,延迟性能改进了50~90倍。对存储器和磁盘来说,容量通常比性能更加重要,所以容量增加了很多,而带宽增加了400~2400倍,仍然高于延迟方面8~9倍的改进。

显然,带宽的改进速度超过延迟。一个简单的经验法则是:带宽增加的速度至少是延迟改进速度的平方。

1.4.2 晶体管性能与连线的发展

集成电路的制造工艺使用特征尺寸来衡量的,所谓特征尺寸就是一个晶体管或一条连线在x轴或者y轴方向的最小尺寸。特征尺寸已从1971年的10微米减少至2017的16纳米。由于每平方毫米硅片上的晶体管数量是由单个晶体管的表面积决定的,所以当特征尺寸线性减少时,晶体管的密度将呈二次方增长。大致地说,晶体管性能的提高与特征尺寸的减少呈线性关系。

当特征尺寸减少时,晶体管的性能线性提升,而晶体管的数量却呈二次方增长,这既是挑战,也是机遇。在微处理器发展的早期,借助晶体管密度的这种快速增长,微处理器迅速从4位发展至8位、16位、32位乃至64位。最近几年,密度的增长已经足以支持在一个芯片会引入多个处理器,支持更宽的SIMD单元、推测执行和缓存中许多创新。

尽管晶体管的性能通常会随着特征尺寸的减少而提升,但集成电路中的连线却不会如此。具体来说,一段连线的信号延迟与电阻和电容的乘积成正比。一般来说,与晶体管性能相比,连线延迟方面的改进小得可怜,这增大了设计人员面临的挑战。在过去的几年里,除了功耗限制之外,连线延迟已经成为大型集成电路的主要设计障碍、而且往往比晶体管开关延迟还要重要。信号在连线上的传播延迟消耗了越来越多的时钟周期,而功耗对时钟周期的影响大于连线延迟。

1.5 集成电路中的功耗和能耗趋势

能耗都是计算机设计人员面对的最大挑战:
        
(1)必须将电源引入芯片,并进行分配,而现代微处理器仅仅为供电和接地就使用了数百个管脚和多个互联层。
        (2)功耗以热的形式耗散,必须降低。

1.5.1 功耗和能耗:系统视角

系统架构师或用户应当如何考虑性能、功耗和能耗呢?共有3个关注事项:
        (1)处理器需要的最大功耗是多少?满足功耗要求对于确保正确操作非常重要。如果处理器的预期功耗大于电源系统能够提供的功耗,通常会导致电压下降,而电压下降可能会导致器件无法正常工作。
        (2)持续功耗是多少?这个指标通常被称为热设计功耗。如果散热能力不足,处理器中的结点温度可能会超出最大值,导致器件故障,甚至永久损坏。所以现代处理器提供了两项功能来帮助管理热量--当温度接近结点温度上限时,降低电路时钟频率,从而减少功耗;如果这个动作不管用,则启用热过载保护装置,强制芯片断电。
        (3)能耗和能效。能耗指标更适合对比处理器,因为它与特定任务以及该项任务所需的时间相关联。只要工作负载是固定的,那么无论是仓库规模的云还是智能手机,在对比处理器时使用能耗指标总是正确的方法。功耗的主要用途是作为一种约束条件。

1.5.2 微处理器内部的能耗和功耗

配电、散热和防热点的难度日益增加。能耗是现在使用晶体管的主要限制因素。因此,现代微处理器提供了许多技术,试图在时钟频率和电源电压保持不变的情况下,提高能效。
        (1)以逸待劳。今天大多数微处理器会关闭非活动模块的时钟,以降低能耗和动态功耗。
        (2)动态电压-频率调整,在活跃程度较低时期,在此期间不需以最高时钟频率和电压运转。
        (3)针对典型情景的设计。在高工作温度下密集使用,该设计依靠片上温度传感器检测应当在什么时候自动减少活动,以避免过热。
        (4)超频。芯片可以判断在少数几个核上以较高时钟频率短时运行是安全的,直到温度开始上升为止。超频频率大概比标钟频率高10%。

最后,由于处理器只是系统功耗的一部分,所以如果使用一个速度较快但能效较低的处理器,使系统的其他部分能够进入睡眠模式,可能有助于降低整体能耗,该策略被称为竞相暂停。

1.5.3 计算机体系结构因为能耗限制而发生的变化

在给定能耗预算下,今天很容易设计出一种微处理器,其拥有的晶体管数多到不能同时全部开启。这种现象被称为暗硅。

现代计算机各组成模块的能耗开销和面积开销。例如,一个32位的浮点加法的能耗是一个8位数整数加法的30倍,和面积开销差异为116倍。最大的差异在存储器:DRAM读/写32位的能耗是一次8位加法的21333倍。一个小型的SRAM的能效是DRAM的128倍,这充分说明仔细选用缓存和存储缓冲区的重要性。

将任务的平均能耗将至最低的设计原理为计算机架构师提供了一个新方向:领域专用处理器减少了宽浮点运算,并部署专用存储器来减少对DRAM的访问,从而节省了能耗。它们又利用这些节省的能耗供应更多(较窄)整数运算单元--比传统处理器多供应10~100个。

1.9 计算机设计的量化原理

知道如何对性能、成本、可靠性、能耗和功耗进行定义、测量和汇总,可以开始研究计算机设计与分析中非常有用的指导原则了。

1.9.1 充分利用并行

充分利用并行是提高性能的重要方法之一。此处给出3个例子:
        (1)在系统级别利用并行。为了提高典型服务器基准测试上的吞吐量性能,可以使用多个处理器和多个存储设备。随后可以在处理器和存储设备上分散处理请求,从而提高吞吐量。扩展内存以及增加处理器和存储设备数量的能力称为可扩展性,这对服务器来说是非常有用的优点。
        (2)在单个处理器级别,充分利用指令间的并行对于实现高性能非常关键。实现该并行最简单的办法是流水线。流水线的基本思路是将指令的执行重叠起来,以缩短完成指令序列的总时间。流水线的一个关键之处在于并非每条指令都依赖于前一条指令,所以完全或部分并行地执行这些指令是有可能的。
      (3)具体的数字设计级别。例如,组相连缓存使用多体存储器,通常可以对它们进行并行查询,以查找所需项。算术逻辑单元使用先行进位,使用并行来加速求和过程,使线性时间变为对数时间。

1.9.2 局部性原理

最常用的一个程序特性是局部性原理:程序常常重用其最近使用过的指令和数据。

一条广泛适用的经验法则是:程序的90%执行时间花在10%的代码上

人们已经观察到两种局部性。时间局部性是指最近访问过的内容很可能会在短期内被再次访问。空间局部性是指地址相邻近的项往往会在相近的时间被使用到。

1.9.3 重点关注常见情形

最重要、最普遍的计算机设计原则可能是重点关注常见情形:在进行设计折中时,常见情形优于非常见情形。

处理器的取指与译码单元可能比乘法处理器使用得频繁得多,所以应当优先对其进行优化。此外,常见情形通常比非常见情景更简单,完成速度更快。比如,在处理器中对两个数值求和,溢出是一种罕见情形,因此可以通过优化更常见的无溢出情况来提高性能。

1.9.4 Amdahl定律

利用Amdahl定律,可以计算出通过改进计算机的某一部分而获得的性能增益。加速取决于下面2个因素:
        (1)原计算机计算时间中可改进部分所占的比例。例如,100秒的程序中有40秒可改进,40/100被称为改进比例。
        (2)通过改进执行模式得到的改进,也就是说在为整个程序使用这一执行模式时,任务的运行速度会提高多少倍。如果原程序中40秒仅需4秒,则提升值为40/4,即10,被称为改进加速比。

Amdahl定律阐述了回报递减定律。若某项改进对一项任务的一部分使用,即对该任务的总加速比会有一个上限。Amdahl定律可用来判断某项改进使性能提高多少,以及如何分配资源来提高性价比。显然,目标是使资源的分配和时间的分配成正比。

1.9.5 处理器性能公式

基本上所有计算机都有一个以固定频率运行的时钟。这些离散时间时间被称为时钟周期、时钟、周期或脉冲周期。计算机设计人员用时钟周期的持续时间来描述时钟周期的时间。程序的CPU时间表示方式:
                                CPU时间=程序的CPU时钟周期数 * 时钟周期时间;

除了执行一个程序所需的时钟周期数之外,还可以计算所执行的指令数:指令路径长度或指令数IC。如果知道时钟周期数和指令数,就可以计算每条指令的时钟周期数CPI。设计人员有时也使用每时钟周期数,它是CPI的倒数。CPI的计算公式:

                                CPI = 程序的CPU时钟周期数 / 指令数

通过这个处理器指标值可以深入了解不同类型的指令集和实现方式。通过变换以上公式中的指令数,时钟周期数可以定义为IC * CPI。这样就可以在执行时间公式中使用CPI了:

                                CPU时间 = IC * CPI * 时钟周期时间

从上式可以看出,处理器性能取决于3个特性:时钟周期、每条指令的时钟周期数CPI和指令数IC。

遗憾的是,用于改变这3项特性的基本技术是相互关联的,所以很难在不改变其他2个参数的情况下改变其中一个参数。
        (1)时钟周期时间:硬件技术与组成;
        (2)CPI:组成与指令集体系结构;
        (3)指令数IC:指令集体系结构和编译器技术;

有时,在设计处理器时,采用以下公式计算处理器总时钟周期数目会有所帮助:
                               CPU time = \Sigma IC_{i} * CPI_{i}
CPI = CPU time / IC = 指令频率 * CPIi公式使用了指令在程序所占比例,应当通过测量得出,而不是根据一个经验值,因为它必须包括流水线效应、缓存缺失和存储系统中任何其他低效场景或情形。

要把处理器性能公式用作一种设计工具,需要保证各种因素具有可测性。难点在于如何求得指令数和CPI。大多数处理器中包含对所执行指令和时钟周期进行计数的计算器。通过定期观察这些计数器,还可以将执行时间和指令数与代码段关联在一起。

1.11 谬论与易犯错误

易犯错误:所有指数定律都必将终结。

第一个终结的定律是登纳德缩放比例定律。在被发现的30年后终结,倒不是因为晶体管不再持续变小,而是因为集成电路的可靠性限制了电流和电压的下降范围。
下一个降低增速的硬盘驱动器。近年来,硬盘的密度增速已经下降至5%。
接下来是摩尔定律。

谬论: 多处理器是银弹。

2005年左右,在每个芯片放置多处理器的转变并不是来自于某种极大地简化了并行编程或使构建多核计算机变得容易突破,而是存在ILP壁垒和功耗壁垒。在一个芯片内设计多个处理器并不能保证降低功耗,但设计一种功耗更高的多核芯片的确可行。其潜在的可能性仅仅在于能够用几个低时钟频率的高效核替代高时钟频率的低效核,从而提高性能。随着缩小晶体管技术的发展,它可以使电容和电压同时略微下降,从而使每一代核的数量小幅增加。

摩尔定律的通俗版本就取决于程序员了。

易犯错误:Amdahl心碎定律的牺牲品

只有在总加速比令人失望时,我们才想起在花费大量精力改进一项功能之前,应当先对其进行测量。

易犯错误:单点故障

有关容错系统的经验法则,那就是要确保所有组件都有冗余,这样单一组件故障不会导致整个系统宕机。

谬论:能够提高性能的硬件改进也可以提高能效,至少不会增加能耗。

谬论:基准测试永远有效

有几个因素会影响基准测试在预测实际性能方面的有效性。一旦某项基准测试变得标准化和流行起来,人们就会面对巨大压力,通过有针对性的优化,或者对基准测试的运行规则做出对自己有利的解读来提高性能。将时间花在少量代码上的小型内核或程序尤其容易受到攻击。

谬论:磁盘的额定平均无故障时间是1200000小时,差不多是137年,所以磁盘实际上永远不会发生故障。

谬论:峰值性能能够反映观测性能。
峰值性能唯一普遍适用的定义是:计算机肯定无法超越的性能水平。

易犯错误:故障检测会降低可用性。
检测到了错误,却没有提供纠正错误的机制。

1.12 结语

这一章介绍了大量的概念,并提供了一种量化框架,还讨论了性能时会增加能效这一指标。

第2章将开始讨论存储器设计的所有重要内容。将研究各种技术,它们共同使存储器看起来无限大,同时尽可能保持快速。硬件和软件的结合已经成为高性能存储器系统的关键。这一章还会介绍虚拟机,这种保护技术的重要性日益增加。

第3章研究指令级并行ILP。流水线是最简单、最常见形式的ILP。

第4章解释3种利用数据级并行的方法。其中最经典、最早的方法是向量体系结构。从此入手,给出了SIMD设计的基本原理。之后详细介绍了GPU的工作方式。

第5章讨论了使用多个处理器实现更高性能的问题。多处理器采用并行机制并不是为了重叠各个指令的执行过程,而是为了同时在不同处理器执行多个指令流。重点讨论共享存储器多处理器。

第6章介绍集群,然后深入讨论仓库级计算机。

第7章讨论领域专用体系结构,将其视为摩尔定律和登纳德缩放比例定律终结之后,继续提升性能和能效的唯一途径。

附录题目
A指令集基本原理
B存储器层次结构回顾
C流水线:基础与中级概念
D存储系统(磁盘)
E嵌入式系统
F互连网络
G深入讨论向量处理器
HVLIW和EPIC的硬件和软件
I大规模多处理器和科学应用
J计算机算术运算
K指令集体系结构概况
L地址变换的进阶概念
M历史回顾和参考文献
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值