文章目录
- 南北桥芯片结构.
- NUMA以前.
- CPU高频化.
- CPU多核化.
- NUMA.
南北桥芯片结构.
- 南桥-北桥芯片结构是一种历史悠久的结构,以一块电脑主板来说,最靠近CPU的一块芯片就是北桥芯片,而离CPU较远,位于整个主板的较下方位置的芯片就是南桥芯片,南北桥芯片各司其职,完成不同的功能,结构图示如下(来自知乎某用户):
- 从这张图中能够将CPU、北桥以及南桥之间的关系看得很清楚,我个人理解这是一种层次设计,用于平衡不同组成部分的速度差异。CPU的处理速度最快,现代的CPU已经超出内存速度很大量级了,所以CPU不再希望直接和内存进行交流和沟通了(旁边有人~),那么直接和内存(实际上还有显卡)进行数据交换的人就是北桥芯片,在这基础上CPU通过前端总线FrontSide-Bus(FSB)和北桥芯片进行沟通即可;类似地,北桥芯片也有样学样,他也不想直接和更加低速的IO设备进行交换,所以也在旁边找了个人——南桥芯片。所以南桥芯片负责通过PCI总线等连接各种IO设备,并通过内部总线Internal-Bus向北桥芯片汇报工作。
Any problem in computer science can be solved by another layer of indirection.
- 这句话也不知道是谁说的,但电脑各个组成部分之间的处理速度不匹配问题,确实通过添加各种中间层得到了解决。总结来说就是CPU将比较低速的工作交付给北桥芯片来完成,而北桥芯片则将这部分中更加低速的工作交付给南桥芯片来完成,实际上下面还有这种分层的机制,南桥芯片会将超级低速的工作再一次转交给Super IO来完成。
Super IO,也就是超级输入输出控制器,通过LPC(Low Pin Count)总线与南桥芯片进行通信,Super IO本身就是一个MCU(Microcontroller Unit),能够独立地控制输入输出设备。
NUMA以前.
CPU高频化.
- CPU刚刚出现的远古时期,高频化是主流的发展方向,很著名的Moore定律预见了这样的高速发展趋势。高频化时期的CPU发展很容易,大多数的产品几乎不需要进行版本的更新换代,甚至原封不动就能够持续享受到性能的提升。从500MHz到1GHz,再到现今主流CPU接近3GHz的频率,我们见证了CPU频率指数级的膨胀发展。虽然最终由于物理学极限的约束(光速不可超越),这样的指数增长趋势不可能一直延续(如今已经出现了减缓,否则我们应该拥有10GHz的CPU了),但现实中的CPU高频化,面临着比光速极限多得多的障碍。
- Herb Sutter 于2005年的论文《The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software》指出了这一情况:由于散热(高频CPU工作发热量太大且难以驱散)、功耗太高以及泄漏问题,CPU时钟频率已经很难再提高。实际上早在2001年,Intel就推出了2GHz的CPU,那么现在,2020年我们使用的CPU,频率是多少呢?
- 在右上角可以看到——2.8GHz,而现行的CPU频率仅仅达到了0.9GHz,这也说明了CPU的高频化,并不是计算机芯片发展的康庄大道。
CPU多核化.
- Herb 在上述文章中就已经提到,未来新型计算机芯片性能的提升主要来自于三个方面:超线程、多核以及片内缓存。第一项技术指的是在一个CPU中并发运行多个线程。
《The Free Lunch Is Over》:不过这种CPU还是存在短板,虽然给它增加了部分硬件如寄存器,但它和绝大多数普通CPU一样,缓存、整数和浮点运算器仍然是唯一的。有资料表明,写得较好的多线程应用,在超线程CPU上能获得5%-15%的性能提升;假设趋于理想状态,即多线程程序写得好到极点,那么性能可以提高40%。不错了,不过还是做不到成倍提升,而且对单线程应用毫无帮助。
- 第三项技术并不是触及根本的措施,说它是饮鸩止渴也有点过,但2020年的现状说明了缓存无法解救CPU。
- 多核化的思想很暴力,一个CPU不够,我就在一片芯片上集成多个CPU,众人拾柴火焰高嘛,最早的多核处理器确实就是将两块CPU粘一块儿了。虽然多核CPU的出现不会对计算性能有立竿见影的提升,因为当时的程序大多数还只是单线程,根本无法发挥出多核CPU的效果。但随着并发编程的发展,这是软件开发史上一个重大的变革,多线程程序开发技术逐渐成熟并且程序大量出现,多核CPU开始显露峥嵘头角。
- 回忆最开始我们介绍的南北桥芯片结构(虽然现在的芯片很多都不采用这样的结构了),CPU要想访问内存,就要通过北桥芯片,并且是所有的CPU都要经由北桥芯片来完成,这样的访问机制叫做一致性内存访问Uniform Memory Access(UMA).
- 在对称多处理SMP的多核CPU架构之中,每个CPU都是经由FSB与北桥芯片交换信息,北桥芯片通过内存总线Memory Bus与内存交换信息(现今的某些CPU已经吞并了北桥芯片,那就是各个CPU直接通过总线与内存交换信息了),如下图所示(图片来自开源小站):
- 多个CPU都通过一条总线(无论有无北桥存在,都是直接或间接地通过同一条总线)来进行内存访问,就会出现资源争用的问题。这一情况就类似于,我们在局域网中多个用户争用同一条信道,需要避免碰撞的出现,所以CPU访问内存时,就需要一个类似CSMA/CD那样的协议来完善整个并发的访存过程。这就导致随着CPU数量的逐渐增加(因为我们想要更加高速的性能),资源的争用就变得愈发激烈,部分性能随着大量争用的发生被蒸发掉了,所以会出现4核CPU跑分甚至达不到2核CPU1.5的性能。
NUMA.
- Intel的解决UMA方式出现的多核架构中内存访问大量争用问题的方式是,将CPU分组到不同的Node中,每个Node就像UMA访问那样拥有自己的一块内存空间,这个Node中的CPU通过集成内存控制器Integrated Memory Controller(IMC)对之进行访问,但由于并发规模的减小,争用也随之降低;不同的Node之间通过高速路径互联,英文术语为QuickPath Interconnect(QPI),当一个CPU要访问不属于自己这个Node中的内存数据时,本Node的IMC就需要通过QPI前往其它的Node进行访问,这样的内存访问方式就是NUMA,即非一致性内存访问,示意图如下所示(来自开源小站):
- 注意到UMA访问方式中,不同CPU到内存的路径(如果我们想象访存是一个酒店登记入住的过程,那么就意味着这些CPU顾客的房间都在同一层)是一样长的,这就会导致大量对于同一块内存空间的并发访存从而空耗性能,而NUMA中的CPU顾客,是要前往不同层房间的(这个比喻有些奇怪,我想表达意思是他们到内存的绝对距离是不一样的,因为进行了分组),也就是说CPU对于内存的访问出现了本地Local和远程Remote的区别,两者之间的延时虽然很小,但相对于高速运转的CPU而言已经很大了,从而达到降低资源争用的规模,减少多核CPU性能由于内部竞争产生的空耗。
- 关于NUMA更多的内容,可以前往开源小站阅读《NUMA原理》以及《深挖NUMA》,两篇文章的作者应该不同,当中采用的某些术语并不统一,但理解了原理之后并无大碍。