计算机系统结构[第二课摘要]

计算机系统结构第二课摘要


CPU性能公式

计算机体系结构,除了研究体系结构层面的抽象和通用性之外,还需要考虑的是“性能”问题。

衡量计算机性能通常有俩个标准:

  • 执行时间(Execution time):(CPU)执行一个程序,需要花多少时间;

  • 吞吐率(Throughput):在一定的时间范围内,(CPU)到底能执行多少指令。

在这两个重要指标下,要提升性能,核心是优化第一个【执行时间】,而执行时间公式如下:

  • 执行时间 = 时钟周期数 × 时钟周期时间(时钟频率)

时钟周期时间(简称为主频或者频率),格式如:xxGHz,

比如,上图的是 1.6GHz。

如果是运算,每秒可以运算 1.6 * 10 亿次。

1 GHz = 每秒运算 10 亿次,1.6 GHz 是CPU时钟的频率,那么频率就是 1 16 \frac{1}{16} 亿秒。

也可以说是指令数,每秒可以执行的简单指令的数量是 1.6G 条,1G 其实就是 10 亿次。

缩短时钟周期时间,最简单的莫过于,换一块好一点的 CPU 或者等摩尔定律来优化。

不过,这个是我们这些软件工程师控制不了的事情。

所以,我们只能把目光看向【时钟周期数】了。

如果能够减少程序需要的 CPU 时钟周期数量,一样能够提升程序性能。

所以呀,【时钟周期数】才是我们提升计算机性能的关键,因此我们再细细的划分一下时钟周期数。

时钟周期数:指令数 × 每条指令的平均时钟周期数(CPI)

指令数很好理解,指令的数量。

每条指令的平均时钟周期数,指令集里面有很多条指令,比如,加法、乘法等,加法肯定比乘法要慢…时间就不同了。

  • 执行时间 = 【时钟周期数】 × 时钟周期时间(频率)

转为:

  • 执行时间 = 【指令数 × 每条指令的平均时钟周期数】 × 频率

如果我们想要解决性能问题,其实就是要优化这三者:

  • 频率:摩尔定律,每年CPU性能提高 60%。
  • 每条指令的平均时钟周期数(CPI):CPU设计方面的艺术了,什么流水线技术啥的。
  • 指令数:执行程序到底需要多少条指令、用哪些指令,主要是编译器优化。

我们可以把自己想象成一个 CPU,坐在那里写程序。

  • 计算机主频就好像是打字速度,打字越快,自然可以多写一点程序。
  • CPI 相当于写程序的时候,熟悉各种快捷键,越是打同样的内容,需要敲击键盘的次数就越少。
  • 指令数相当于程序设计得够合理,同样的程序要写的代码行数就少。

如果三者皆能实现,自然可以很快地写出一个优秀的程序,“性能”从外面来看就是好的。


复杂指令集和精简指令集

在现实生活中,指令集分为【复杂指令集 CISC】和【精简指令集 RISC】。

比较属性 CISC RISC
指令系统 复杂、可变 简单、定长
指令数目 大于200 小于100
指令格式 大于4 小于4
寻址方式 大于4 小于4
可访存指令 无限制 只有LOAD/STORE指令
指令使用频率 相差很大 相差无几
指令执行时间 相差很大 一个周期
优化编译 容易
程序代码长度
控制器实现方式 微程序 硬布线
软件系统开发时间

我们现在用的 windows计算机 都是 CISC,而手机处理器、苹果计算机是 RISC,CPU支持的指令集不同。

在计算机历史的早期,其实没有什么 CISC 和 RISC 之分,所有的 CPU 其实都是 CISC。

1974年,大卫·帕特森(David Patterson)教授[^大卫·帕特森教授写了《计算机组成与设计:硬件 / 软件接口》、《计算机体系结构:量化研究方法》这两本教科书。]证明了,实际在 CPU 运行的程序里,80% 的时间都是在使用 20% 的简单指令。

于是,他就提出了 RISC 的理念,只包含了 20% 的简单、常用的指令。

在 RISC 架构里面,CPU 选择把指令“精简”到 20% 的简单指令。而原先的复杂指令,则通过用简单指令组合起来来实现,让软件来实现硬件的功能。这样,CPU 的整个硬件设计就会变得更简单了,在硬件层面提升性能也会变得更容易了。

RISC 的 CPU 里完成指令的电路变得简单了,于是也就腾出了更多的空间。这个空间,常常被拿来放通用寄存器。因为 RISC 完成同样的功能,执行的指令数量要比 CISC 多,所以,如果需要反复从内存里面读取指令或者数据到寄存器里来,那么很多时间就会花在访问内存上。于是,RISC 架构的 CPU 往往就有更多的通用寄存器。除了寄存器这样的存储空间,RISC 的 CPU 也可以把更多的晶体管,用来实现更好的分支预测等相关功能,进一步去提升 CPU 实际的执行效率。

总的来说,对于 CISC 和 RISC 的对比:

  • 执行时间 = 【指令数 × 每条指令的平均时钟周期数】 × 频率

CISC 的架构,其实就是通过优化指令数,来减少 CPU 的执行时间。而 RISC 的架构,其实是在优化 CPI。因为指令比较简单,需要的时钟周期就比较少。因为 RISC 降低了 CPU 硬件的设计和开发难度,所以从 80 年代开始,大部分新的 CPU 都开始采用 RISC 架构。从 IBM 的 PowerPC,到 SUN 的 SPARC,都是 RISC 架构,除了Intel。

虽然 RISC 是很小、好处也极多,但 RISC 意味着 CPU 从硬件或电路层面支持的指令数比较少,这个意味着很多复杂的操作需要执行更多的指令而不是更少的、用 RISC 指令开发软件的时间也会长很多…


最短编码:平均访问时间最短

计算机的底层世界是 0 和 1,而就是因为只有 0 和 1,才可能出现重复和反复加以利用。

信息论里有一个香农大佬的定律(香农第一定律),证明了编码长度理论上有一个最小值。

后来,MIT教授哈夫曼在香农第一定律的基础上,做了进一步的扩展,形成了哈夫曼编码。

哈夫曼编码:将【最短的编码】给出现【概率最大的信息】。这样可以使平均访问时间最短,但必须事前知道每个码出现的频率。

如同密码学家破译羊皮卷上的文字,前提是知道各个字母的频率:

在现实生活中,很多信息的组合,比单独一条信息,其概率分布差异更大,因此对它们使用哈夫曼编码进行信息压缩,压缩比会更高。比如说,在汉语中,如果对汉字的频率进行统计、压缩,一篇文章通常能压缩掉 50% 以上,但是如果按照词进行频率统计,再用哈夫曼编码压缩,可以压缩掉 70% 以上。

精简指令集,取 20% 的指令即可完成 80% 的事情。

  • 【最短的编码】/【最宝贵的资源】具象化为【80% 的时间】
  • 【概率最大的信息】具象化为【20% 的指令】

在实际生活里,我们能不能提高到最优效率、几倍收益率,主要看哈夫曼思想用的妙不妙!!

如果您哪天追求最短编码,一定要试一试【哈夫曼方法】,发现不同事物之间的共同点,再抽象化或者具象化。


无处不在的缓存、局部性原理

之所以大家认为 RISC 优于 CISC,来自于大卫·帕特森的证明,在实际的程序运行过程中,有 80% 运行的代码用着 20% 的常用指令。

这意味着,CPU 里执行的代码有很强的局部性[^在一段时间内,整个程序的执行仅限于程序中的某一部分],而对于有着很强局部性的问题,常见的一个解决方案就是使用缓存。

局部性分为【时间局部性】和【空间局部性】。

  • 时间局部性:如果一个数据被访问了,那么它在短时间内还会被再次访问。

比如说,《斗破苍穹》这本小说,我今天读了一会儿,没读完,明天还会继续读。

  • 空间局部性:如果一个数据被访问了,那么和它相邻的数据也很快会被访问。

比如说,我读完了土豆写的《斗破苍穹》之后,感觉这书不错,所以也会看他别的作品。

在实际的计算机日常的开发和应用中,我们对于数据的访问总是会存在一定的局部性。

有时候,这个局部性是时间局部性,就是我们最近访问过的数据还会被反复访问。

有时候,这个局部性是空间局部性,就是我们最近访问过数据附近的数据很快会被访问到。

而局部性的存在,使得我们可以在应用开发中使用缓存这个有利的武器。

假设:

  • 内存,0.015MB/元(1MB,0.015人民币)
  • 机械式硬盘,0.00004MB/元 (1MB,0.00004人民币)

我们可以利用局部性原理,通过将热点数据加载并保留在速度更快的存储设备里面(如内储存器),我们可以用更低的成本来支撑服务器(如外储存器)。

假设淘宝有 12亿 商品数量,每件商品需要 4MB 的存储空间,那么一共需要 4800TB( => 12 亿 × 4MB)的数据存储。这 12 亿件商品中,不是每一件商品都会被经常访问。

如果只是 1% 的热点数据做为缓存则需要 48TB 的内存 72 万元( => 48TB/1MB × 0.015 元 = 72 万元)

另外还需要 99% 的硬盘 19 万元( => 4752TB/1MB × 0.00004 元 = 19 万元)

这样就利用 缓存+内存+硬盘+磁盘 的访问速度和容量大小,根据局部性原理 ,来设计存储器的层次结构。

这样既享受 CPU Cache 的速度,又享受内存、硬盘巨大的容量和低廉的价格。

在今天,CPU 和内存的访问速度已经有了 120 倍的差距。随着时间的增长,摩尔定律的指数增长下,差距大概还会不断拉大。

CPU 的速度好比风驰电掣的高铁,然而,内存却只能等着旁边腿脚不太灵便的老太太。

为了弥补两者之间的性能差异,我们能真实地把 CPU 的性能提升用起来,而不是让它在那儿空转,我们在现代 CPU 中引入了高速缓存。

从 CPU Cache 被加入到现有的 CPU 里开始,内存中的指令、数据,会被加载到 L1-L3 Cache 中,而不是直接由 CPU 访问内存去拿。在 95% 的情况下,CPU 都只需要访问 L1-L3 Cache,从里面读取指令和数据,而无需访问内存。

计算机不仅 CPU 里有缓存(Cache、TLB 让CPU更高效),

  • 操作系统的缓存:页缓存、slab,让系统更高效
  • 应用层的缓存:内存管理、IO应用缓存、让应用更高效

Cache 是现代的计算机特色,它是利用了一个算法思想:「空间换时间」。以小空间换取更快运算速度,那么我们再设计算法时,就需要考虑缓存进来。

计算机的解决方案通常是一个系统性的优化问题,单纯一部分的改进可能会引起另一个部分的问题。

我们的大脑就像计算机的CPU,不受时间、空间的限制,而身体、心灵却不行,如果把大脑当成了自己,大脑就在一种全能模式下运作(也可以简单理解为“自恋”)。

在这种全能模式下,大脑会把自己当成主人,身体和心灵都被ta看成了下属。。。。。。这时强迫身体和心灵做一些ta们不愿意的事情,身体、心灵会选择拖延、懒惰,大脑就会暴怒,您也会随之暴怒…

这个想法是否知道可行,我想,您得加一个【缓存】,凡事留点余地,凡事不要太较真。

缓存,说起来简单,做起来不容易。

最后,我送给您一个有用的操作方法,叫:巴菲特内控法。

巴菲特说自己如果不在一张纸上写下自己的理由,就绝不交易。这个交易可能是错的,但自己必须有一个“交易答案”。

比方说,在纸上写:“我今天要花 500 亿美金来买苹果公司,因为……”

如果不能回答这个问题,就不要买。

写在纸上能有什么用呢?

其实,就是建立了一个缓存,人为制造了一个“缓存点”,防止爱欺骗自己的大脑过于冲动。
 


复盘

发布了124 篇原创文章 · 获赞 362 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_41739364/article/details/104870706
今日推荐