第一章 CPU硬件原理

6 阅读5分钟

章节问题

  1. 你的CPU的工作频率是多少?是恒定不变的吗?
  2. top命令中输出的核数是服务器上物理核的数量吗?
  3. 如何查看CPU中的L1,L2,L3等缓存的大小?
  4. 为什么内存对齐之后访问性能更高?
  5. TLB缓存是什么?如何提高它的命中率?

CPU生产过程

  • 步骤

    1. 晶圆的生产
    2. CPU硬件电路的制作
    3. 封装和测试
  • 目的

    • 在单位面积的芯片上布局更多的晶体管。
    • 晶体管的尺寸越小,单位面积上的电路就越丰富,CPU性能越高。
    • 晶体管的尺寸越小,晶体管能耗越低

个人电脑CPU硬件简介

Intel CPU命名规则

  • Intel(R) Core(TM) 品牌标志
  • I5 品牌标识符
  • 7200 代际编号+SKU
  • U 产品线后缀

个人电脑CPU代际简介

  • 制程不断缩小
  • 微架构改进,单个物理核内部的实现
  • 每代CPU的内存控制器和连接外设的PCIE也不断进步

个人电脑CPU内部架构

11代Ice Lake为例

  • 集成显卡
  • 4个物理核
  • 4块L3缓存,所有核共享
  • System Agent模块
    • 内存控制器(Mem Controller):决定内存规格和大小
    • 外围组件快速互联(PCIe):显卡,PCIe接口的固态
    • 图像处理单元(IPU):图像处理相关硬件

服务器CPU硬件简介

区别

  1. 核数和价格不同:服务器多
  2. CPU的内存控制器不同:服务器支持RDIMM,LRDIMM,带有ECC纠错功能,带有寄存器
  3. 通道数:个人一般双通道或四通道,服务器六通道甚至八通道
  4. 扩展性:可通过UPI总线支持多个CPU

服务器CPU代际简介

与个人电脑基本一致

  • 制程缩小
  • 微架构改进

服务器CPU内部架构

三大部分

  • IMC(integrated memory controller) 集成内存控制器
  • 物理核
  • North Cap:包含PCIe总线(显卡,硬盘)和UPI总线(多CPU)

服务器CPU片内总线

单个CPU内部

  • 2017年Skylake之前:
    • Ring架构:所有的核使用一个环连接
    • 核增多,环变大,延迟增加
  • 2017年之后:
    • Mesh架构:行列二维架构
    • 寻找二维的最短路径

服务器CPU片间互联

多CPU之间

  • 使用UPI总线
  • 访问其他CPU连接内存的数据更慢
    • Linux下NUMA特性:把CPU核内存条划分为不同的node
    • 每个node包括一些核以及相近的内存。
    • NUMA绑定可以避免跨node内存IO

CPU核原理

CPU核内部结构

  • 前端 Front End

    • 顺序从内存中获取指令
    • 预解码和解码,转换为微操作
    • 微操作放入队列中,等待CPU执行
  • 后端 Back End

    • 作用:从队列中获取解码好的指令并执行
    • 顺序重排缓存器:解决数据依赖问题
    • 调度器:分配到执行引擎的某个端口
    • 执行引擎,包括n个端口,即n超标量
  • 存储系统 Memory SubSystem

    • L1级Data缓存区
    • L2级缓存
    • Data TLB

CPU的工作频率

  • 时钟频率,一般Ghz级别
  • 主频和睿频:CPU对频率进行智能控制(温度,功率限制)

物理核和逻辑核

  • 物理CPU:主板真正安装的CPU数量。通过physical id查看
  • 物理核:一个CPU会集成多个物理核。通过core id查看
  • 逻辑核:Intel使用了超线程技术,一个物理核可以被模拟出多个逻辑核,processor是逻辑核序号
  • 一个物理核上模拟的两个逻辑核不仅共享与1个物理核,还共享L1/L2缓存
  • 由于共享L1/L2缓存,cache miss增多,性能只增加20%~30%
  • cat /proc/cppuinfo

CPU的L1/L2/L3缓存查看

L1最快,容量最小。

  • L1:
    • 每个核独占。
    • 分为data L1 和 code L1。更新策略不同
  • L2:
    • 每个核独占
  • L3:
    • 整个CPU共享
  • Linxu提供了CPUFreq气筒,提供sysfs接口,查看CPU信息。/sys/devices/system/cpu
  • dmidecode命令

CPU的TLB缓存查看

  • 分页机制,使用多级页表
    • 32位:2级页表
    • 64位(48位地址空间):4级页表
  • 缺页需要多次查询页表,所以做缓存TLB
  • 使用cpuid命令,查看TLB缓存大小
  • perf查看缓存命中率
  • 可开启大页,默认4kb。增加单个页中缓存的页表,减少页,提高TLB的缓存命中率。

本章总结

  1. 你的CPU的工作频率是多少?是恒定不变的吗?
通过观察/proc/cpuinfo,可以看到CPU的工作频率。但是部分CPU支持睿频,所以工作频率随时变化。
  1. top命令中输出的核数是服务器上物理核的数量吗?
不一定。如果开启超线程,则逻辑核比物理核的多一倍。一个物理核被当作两个逻辑核使用,
核上所带的L1L2缓存也被这两个逻辑核共享
  1. 如何查看CPU中的L1,L2,L3等缓存的大小?
Linux的/sys/devices/system/cpu/
  1. 为什么内存对齐之后访问性能更高?
本机缓存向下一级取数据的时候基本单位不是字节,而是cacheline,一般大小位64字节。
哪怕只取1字节,CPU也取一个cacheline放到各级缓存中。
假如有64字节的对象,如果对齐过,则一次内存IO就可以完成访问。但是如果没有经过对齐,需要两次IO。
所以对齐之后,性能会提高。
  1. TLB缓存是什么?如何提高它的命中率?
TLB也是CPU中缓存的一种,用来加速内存中的页表访问。
可以通过大页降低进程中的页数量,进而减少页表项的总数量,这样TLB的命中率能够提升。但是会浪费一些内存。