计算机组成原理笔记

计算机组成原理笔记

ch01 冯·诺依曼体系结构

计算机基本硬件组成:

  • CPU
  • Memory
  • Mother Board
    • Chipset
      • SouthBridge 控制 CPU 和外部 I/O 设备的通信
      • NorthBridge 控制 CPU 和内存、显卡的通信,但实际已不存在了,在 CPU 内部实现
    • Bus
  • I/O 设备:显示器,鼠标、键盘
  • Graphic Card
  • GPU
  • 硬盘

冯·诺依曼体系结构:

计算机的抽象概念,也叫存储程序计算机。

  • 可编程。计算器是不可编程的,因为在硬件层面写死了逻辑。
  • 存储

First Draft 描述的计算机结构:

  • Processing Unit 处理器单元
    • ALC(Arithmetic Logic Unit) 算数逻辑单元
    • Processor Register 处理器寄存器
  • Control Unit 控制器单元
  • Instruction Register 指令寄存器
  • Program Counter 程序计数器
  • 内存
  • 外部存储
  • 输入输出设备 网卡既是输入设备又是输出设备

任何一台计算机的任何一个部件都可以归到运算器、控制器、存储器、输入设备和输出设备中,而所有的现代计算机也都是基于这个基础架构来设计开发的。

所有的计算机程序,也都可以抽象为从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中。而我们所有撰写的无论高级还是低级语言的程序,也都是基于这样一个抽象框架来进行运作的

冯·诺依曼体系结构确立了计算机硬件的基础架构。

ch03 性能是什么

  • Response time
  • Throughput/Bandwidth

Linux 下有一个叫 time 的命令,它会返回三个值,第一个是 real time,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。程序实际占用的 CPU 时间一般比 Elapsed Time 要少不少。

即使我们已经拿到了 CPU 时间,我们也不一定可以直接“比较”出两个程序的性能差异。即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。除了 CPU 之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。

程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time

想要解决性能问题,其实就是要优化这三者。

  • 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的 80386 主频只有 33MHz,现在手头的笔记本电脑就有 2.8GHz,在主频层面,就提升了将近 100 倍。
  • 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。在后面讲解 CPU 结构的时候,我们会看到,现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。因此,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
  • 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式

ch04 功耗

想要计算得快,一方面,我们要在 CPU 里,同样的面积里面,多放一些晶体管,也就是增加密度;另一方面,我们要让晶体管“打开”和“关闭”得更快一点,也就是提升主频。而这两者,都会增加功耗,带来耗电和散热的问题。

一个 CPU 的功率,可以用这样一个公式来表示:功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量

从奔腾 4 开始,Intel 意识到通过提升主频比较“难”去实现性能提升,边开始推出 Core Duo 这样的多核 CPU,通过提升“吞吐率”而不是“响应时间”,来达到目的。

阿姆达尔定律:优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间

在“摩尔定律”和“并行计算”之外,在整个计算机组成层面,还有这样几个原则性的性能提升方法。

  • 加速大概率事件。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算,于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。本来一个 CPU 需要跑几小时甚至几天的程序,GPU 只需要几分钟就好了。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。
  • 通过流水线提高性能。现代的工厂里的生产线叫“流水线”。我们可以把装配 iPhone 这样的任务拆分成一个个细分的任务,让每个人都只需要处理一道工序,最大化整个工厂的生产效率。类似的,我们的 CPU 其实就是一个“运算工厂”。我们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一。
  • 通过预测提高性能。通过预先猜测下一步该干什么,而不是等上一步运行的结果,提前进行运算,也是让程序跑得更快一点的办法。典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步我们会访问数组的下一项。后面要讲的“分支和冒险”、“局部性原理”这些 CPU 和存储系统设计方法,其实都是在利用我们对于未来的“预测”,提前进行相应的操作,来提升我们的程序性能。

ch05 指令

计算机指令集 Instruction Set

// test.c
int main()
{
  int a = 1; 
  int b = 2; 
  a = a + b;
}
gcc -g -c test.c
objdump -disassemble -source test.o

gcc -g 表示创建符号表,关闭优化,保留源码信息,-c 表示生成中间文件。
objdump 用于反汇编

ch06 指令跳转

你可能感兴趣的:(计算机组成原理笔记)