深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

04 | 穿越功耗墙,我们该从哪些方面提升“性能”?

徐文浩 2019-05-01
上一讲,在讲 CPU 的性能时,我们提到了这样一个公式:
程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time
这么来看,如果要提升计算机的性能,我们可以从指令数、CPI 以及 CPU 主频这三个地方入手。要搞定指令数或者 CPI,乍一看都不太容易。于是,研发 CPU 的硬件工程师们,从 80 年代开始,就挑上了 CPU 这个“软柿子”。在 CPU 上多放一点晶体管,不断提升 CPU 的时钟频率,这样就能让 CPU 变得更快,程序的执行时间就会缩短。
于是,从 1978 年 Intel 发布的 8086 CPU 开始,计算机的主频从 5MHz 开始,不断提升。1980 年代中期的 80386 能够跑到 40MHz,1989 年的 486 能够跑到 100MHz,直到 2000 年的奔腾 4 处理器,主频已经到达了 1.4GHz。而消费者也在这 20 年里养成了“看主频”买电脑的习惯。当时已经基本垄断了桌面 CPU 市场的 Intel 更是夸下了海口,表示奔腾 4 所使用的 CPU 结构可以做到 10GHz,颇有一点“大力出奇迹”的意思。

功耗:CPU 的“人体极限”

然而,计算机科学界从来不相信“大力出奇迹”。奔腾 4 的 CPU 主频从来没有达到过 10GHz,最终它的主频上限定格在 3.8GHz。这还不是最糟的,更糟糕的事情是,大家发现,奔腾 4 的主频虽然高,但是它的实际性能却配不上同样的主频。想要用在笔记本上的奔腾 4 2.4GHz 处理器,其性能只和基于奔腾 3 架构的奔腾 M 1.6GHz 处理器差不多。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(79)

  • pyhhou
    对于思考题:
            * 加速大概率事件
              通常我们使用 big-O 去表示一个算法的好坏,我们优化一个算法也是基于 big-O,但是 big-O 其实是一个近似值,就好比一个算法时间复杂度是 O(n^2) + O(n),这里的 O(n^2) 是占大比重的,特别是当 n 很大的时候,通常我们会忽略掉 O(n),着手优化 O(n^2) 的部分

            * 通过流水线提高性能
            能够想到的是任务分解,把一个大的任务分解成好多个小任务,一般来说,分的越细,小任务就会越简单,整个框架、思路也会变得更加清晰

            * 通过预测提高性能
            常常在计算近似值的时候,例如计算圆周率,我们可以根据条件预设立一个精确率,高过这个精确率就会停止计算,防止无穷无尽的一直计算下去;另外就是深度优先搜索算法里面的 “剪枝策略”,防止没有必要的分支搜索,这会大幅度提升算法效率

    作者回复: 👍算法的例子举得很好,剪枝策略的例子也很好。

    不过流水线和圆周率的例子不太好,可以再想想。

    2019-05-01
    2
    24
  • 活的潇洒
    通读三遍全文,花了3个多小时做了笔记链接如下:
    https://www.cnblogs.com/luoahong/p/10800379.html

    作者回复: 👍感谢分享给大家

    2019-05-01
    2
    22
  • 大熊
    重新学习后,我又来了……
    1. 加大概率事件:
       缓存机制,提高平均概率下的性能;
       运行时编译热点代码的机制;
       Spring框架使用的单例模式(个人还不确定);

    2. 通过流水线提高性能:
       工作中可以尝试把一个大规模的SQL分成几个规模适当的小SQL进行执行;
       并发编程;

    3. 通过预测提高性能:
       以前有的软件安装的时候,有一秒就安装好的感觉,之前我就在想,是不是我选择完安装路径之后,就已经开始有预安装的操作了;
       使用chrome在打开几个tab页的情况下,直接关闭浏览器,再次打开浏览器之前强制关闭的tab页直接默认打开的操作(不知道是否属于预测,预测我还是需要这几个页面);
       在自己练习的博客中,多张图片在上传的时候,先让图片及时上传并处于“预删除”状态,待点击提交之后,才让现有的图片变成保存的状态。
       热点数据、常用的固定数据,可以先保存在redis等缓存中,等到需要的时候先从缓存中获得,如果获取失败再去查询数据库

    作者回复: 👍你学得非常认真努力,给大家做了一个好榜样。

    2019-05-07
    21
  • 须臾即
    有两个问题没想明白:
    1.增加晶体管怎么提高运算速度?
    提高主频好理解,计算的频繁一些,增加晶体管是干了什么,增加计算单元么,或者说是增加流水线控制单元。
    2.cpu的电压是受了什么因素限制的?
    既然电压低功耗低,那么各厂商应该都想把电压做的越低越好,现实是不容易办到,是哪些因素限制的?

    作者回复: 须臾即他9同学你好
    增加晶体管可以增加硬件能够支持的指令数量,增加数字通路的位数,以及利用好电路天然的并行性,从硬件层面更快地实现特定的指令,所以增加晶体管也是常见的提升cpu性能的一种手段。
    电压的问题在于两个,一个是电压太低就会导致电路无法联通,因为不管用什么作为电路材料,都是有电阻的,所以没有办法无限制降低电压,另外一个是对于工艺的要求也变高了,成本也更贵啊。

    2019-05-01
    20
  • Seventy、
    老师您好,有个疑问,上节课我们讲过“程序运行CPU执行时间 = 指令数 * CPI * 时钟周期时间(Clock Cycle Time)”,而这节中提到增加晶体管数量会提升CPU性能,请问"晶体管数量"与上面的公式有什么关系呢? 还是说晶体管数量会影响上面公式的三个部分中的哪一部分?? 盼老师答复。

    作者回复: 增加晶体管数量,其实是通过提供更复杂的电路支持更多的“指令”。也就会减少运行同样程序需要的指令数。
    打个比方,比如我们最简单的电路可以只有加法功能,没有乘法功能。乘法都变成很多个加法指令,那么实现一个乘法需要的指令数就比较多。但是如果我们增加晶体管在电路层面就实现了这个,那么需要的指令数就变少了,执行时间也可以缩短。

    2019-05-11
    1
    11
  • JiangPQ
    关于这一课的组织结构上一点建议:

    1. 在电路设计上,并行和流水线通常是相互配合同时存在的,但是老师在讲述时将这两点分离了,我个人感觉会让不懂电路设计的读者会产生困惑。

    2. 切流水线的意思是在电路的关键路径中的特定位置处插入寄存器,用空间换时间,使得切分后的关键路径的每一段具有更短的执行时间,但在总体上看单条指令的总体运行时间并不会减少。在切流水线后,电路可以使用更高的时钟频率,所以其主要目的还是在于提高主频。在文中“也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一”的表达似乎不是那么精确。

    我的理解可能也有不准确的地方,还麻烦老师指正。

    前两天搞毕设,天天就是并行流水的捣腾,做硬件真的使人头秃...
    2019-05-11
    1
    4
  • 莫问流年
    1.加速大概率事件
    各种缓存(内存缓存、CDN缓存)
    2.流水线
    并发编程、异步编程
    音视频播放器边播放边缓冲
    3.预测
    小说的下一页预加载
    电商大促的CDN预热

    作者回复: 几个例子举得都很好!而且和实践应用结合得也很好!

    2019-05-20
    3
  • arvin
    老师您好,两个问题没能理解。1:程序如何自动执行的。2,二进制概念的0和1计算机又是如何对应到高电压低电压的。

    作者回复: arvin你好,第一个问题我们会在讲解cpu的第一部分详细讲解。核心是一个时钟信号和一个自动计数器。
    第二个问题我们在后面讲电路的时候会介绍,可以认为就是电路的开闭。

    2019-05-11
    3
  • 古夜
    打孔编程那里说得太简略了,而且,看题目的意思似乎是要从打孔编程讲起,然后一步步来说计算机怎么理解打孔,如何编译,如何运行的吧,感觉文章里写反了,是不是五一有点仓促了

    作者回复: 古夜同学你好,谢谢反馈。对于计算机如何编译运行,是一个挺复杂的话题了,恐怕一讲之内讲不清楚。这一讲的主要目标,还是让大家明白指令和机器码是怎么回事儿。

    关于计算机如何阅读指令运行的整理流程,会在17讲讲解CPU部分的时候做深入的剖析。

    2019-05-06
    3
  • KR®
    对于我这种小白来说,能啃完这些知识点要感谢初中物理老师为我打下的物理基础 哈哈,

    徐老师的讲解也太清晰了吧!!!
    能看懂跟得上节奏的感觉真好~

    还要感谢高阶的同学们,我没有开发经验,看文章时遇到一些专业名词会一脸懵, 好在高阶的同学会在答疑区提问互动, 看你们的提问和回答我都会有收获!

    作者回复: 👍谢谢支持,要坚持和大家多交流

    2019-05-02
    3
  • DreamItPossible
    手机跑分能作弊吗?怎么做?

    首先,要明确手机跑分的标准,即测量的是整体性能,比如响应时间,还是单项指标性能,比如文中提到的CPU时间,或者吞吐率等
    其次,手机跑分能作弊,以手机跑分测量的是程序运行的CPU时间为例,应用本文的原理:程序的CPU时间等于指令数乘以CPI乘以CPU周期,逐个来分析;

    由于手机跑分是用预设好的程序来运行,那么方法一:使用针对这些预设程序专门优化的编译器和汇编器,可以减少指令数;方法二:使用流水线、预测等技术,可以减小CPI;方法三:使用超频,可以在跑分时提高主频,减小CPU周期等

    作弊后的手机跑分还有参考意义吗?
    如果作弊的手机跑分是针对单项指标的话,而且你又关注的该单项指标,则有意义;
    如果你关注的是整体性能,那么参考意义不大;
    注意,要有局部视角和系统观。
    2019-06-27
    2
  • 不记年
    作者大大,关于协程是流水线的问题其实我是这样想的,流水线的目的就是减少cpu空闲的电路, 尽量让cpu每一部分都工作起来。而协程的也是减少cpu空闲的时间,更好的利用cpu,感觉两者有异曲同工之妙就写下来啦

    作者回复: 赞思路,不过我觉得还是不太一样的。它更像“抢跑”而不像防止浪费和空闲。

    2019-05-10
    2
  • 不记年
    加速大概率事件 优化工程中使用次数最多的算法
    流水线 协程
    预测 剪枝

    作者回复: 👍 关于协程是流水线能具体解释一下么?我没有太明白。

    2019-05-07
    2
  • Sunny
    为什么增加晶体管会使计算加快?

    作者回复: Sunny同学,

    你好,增加晶体管通常可以做到以下这些

    1. 设计了一个更复杂的电路,让原先软件执行的事情,直接通过硬件电路解决了。也就是在CPU里增加了新指令,自然同样的程序就运行得更快了。

    2. 同样功能的电路更多了,比如有了更多更大的寄存器,更多的可以并行的流水线,这样同样的指令可以同时运行不受限于有限的资源,也可以让程序算得更快。

    2019-08-20
    1
  • DreamItPossible
    性能提升的5个基本途径

    摩尔定律(主频)
    响应时间

    并行计算(多核)
    吞吐率
    Amdahl定律

    流水线法
    将CPU指令执行过程拆分,细化运行

    加速大概率事件

    预测法
    局部性原理,分支与冒险,热点数据缓存
    2019-06-27
    1
  • 永涛
    没基础的只能看到这里,试了两遍了,可能需要硬着头皮往下看。一旦涉及到和程序相关就觉得困难。
    2019-06-06
    1
  • ginger
    哦对了,之前就听说,其实在淘宝买东西时候,页面显示购买成功了,其实并不是真正的成功过了,后台还有很多数据流程没有跑完,那么我觉得,这个一定是属于预测的,在我的提交动作触发之前,代码需要先确定我是一定鞥呢成功的,那么提交动作一旦触发,页面就会告诉我,成功了,但是实际上,还有很多事情在有条不紊的执行着.

    作者回复: 这个淘宝买东西和预测的关系不大,最多算是异步计算。

    2019-05-23
    1
  • ginger
    算法小白想到的预测例子:
        通过预测集合大小,来定义集合初始化容量.哈哈
        统计学中肯定有一些预测分析算法可以用到代码思路中.
        分支算不算就是一种预测.
        等以后学习了些法,我要再举一些例子出来.

    作者回复: 👍第一个例子不错

    2019-05-23
    1
  • ginger
    终于理解为什么很多笔记本会出低压版本了,原来是电压的平方和功耗是正比的,也就是电压的降低对于功耗来说,降低效益最好,还记得之前选笔记本时候,我发现几乎所有的超薄本,都是低压版本的.大致是因为超薄设计导致不能使用很"给力"的散热系统吧,所以通过低压来降低功耗,尽管低压也会让CPU性能有所下降.

    作者回复: 👍

    2019-05-23
    1
  • shark
    总结:
    性能提升上,参照上节的公式,首先还是提高主频,方法考虑提高晶体管密度,有缩小制程和提高电路性能,但这种硬件方式都会碰到功耗墙,一是晶体管所需的电压必须保证,二是密度大了功耗自然大了,我其实听我们老师说开始考虑3D电路了。之后解决方案是并行处理多核提高吞吐率。
     实际上现阶段的发展考虑的是以下三中,一是大概率计算的优化,感觉类似是简化cpi;二是预测结果,三是并行

    作者回复: 是的,比如最近比较热的RISC-V其实就是想让大家能根据自己的实际应用的Load在开源的指令集上去设计自己的CPU

    2019-05-19
    1
收起评论
79
返回
顶部