目前的绝大部分的Intel的CPU都是基于Core微架构的,而Core架构则是源于早年的Pentium M处理器,具有一定的移动计算的特点,并且在市场上获得了极大的成功。但是随着时间的流逝,这种没有考虑过高性能计算需求的移动计算的特点给Core架构带来了不少麻烦,比如原生双核的设计导致了在需要更多CPU核的时候只能采用“粘连”双核的方式,比如4核的基于Core架构的CPU是两个双核的粘连起来的,也就是说原生4核的情况Core架构并不能支持。此外,Intel已经使用了很久的前端总线(FSB)技术也在多核/SMP环境下成为了制约整个系统性能的瓶颈。
由于Core架构存在的种种弊端,它已经很难适应需要高性能多处理器的企业级计算领域的需求。因此Intel提出了新的Nehalem微架构。Nehalem也不是平地起楼,而是在Core架构的基础上进行了改动。主要的改动有如下几点:
1)修改了双核的设计,采用了原生4核(但不局限于4核)的设计
2)使用了QPI总线取代老旧的FSB
3)在CPU上整合了内存控制器(和SoC类似??)
4)引入了升级的NetBurst超线程技术(同步多线程SMT)
5)SSE4指令集的扩展
6)L3 Cache
7)电源管理等节能特性
下面对上述的新增特性中的重要部分进行详细介绍:
Nehalem的重要特性
1)QPI总线
QPI是QuickPath Interconnect技术的缩写,是Intel为Nehalem架构新增加的一种系统总线,用于取代老式的FSB。QPI总线的特点是基于数据包传输数据,其速度是6.4GT/s,也就是说每秒传递6.4G次数据,QPI的物理总线宽度是20bit,其中16bit用于数据传输,其他bit用于控制和校验等信息。因此单次可以传递16bit也就是2B的数据,由于QPI总线允许数据双向传递,因此QPI总线的带宽可达到12.8GB/s。QPI总线主要担任CPU和CPU之间以及CPU和IOH之间的连接总线。其在Nehalem架构中的部署位置见下图:
Intel把CPU中的QPI总线以及集成内存控制器(IMC)等叫做uncore,认为这些不应该属于CPU核的范围内,也体现出了一种新的模块化设计的思路。那么在上图中同样很明确的表现出了Nehalem架构的CPU在访问内存的时候不再需要通过FSB了,而是通过集成到CPU中的内存控制器(IMC)来达到访问RAM的目的,接下来就说说IMC。
2)IMC(Integrated Memory Controller)Nehalem架构为每个CPU集成了内存控制器,CPU对内存的访问不再需要通过缓慢的FSB,在多CPU的情况下也不会出现总线拥堵的情况。Nehalem的内存控制器支持3个通道的DDR3内存,峰值带宽可以达到32GB/s。由于引入了内存控制器,整个系统的的内存访问就变成了每个CPU独立的事情,一个CPU对内存的访问不会影响到另外一个CPU,也就是说内存不再是以往的统一访问的模型,而是引入了本地内存和远程内存的概念,对于本地内存直接通过IMC访问,对于远程内存则需要走QPI来实现访问。换句话说,Nehalem采用的是一种非一致的内存访问的模型,也就是NUMA(Non-uniform Memory Access)。这种NUMA系统对于程序员来说是无法忽略其存在的,不同位置的内存的访问速度不一致,如果能利用这一特点,则可以大幅提高程序的性能。出了内存的不一致之外,其他的资源也是这样,比如一个线程在同一CPU里不同核之间的转移要比在不同CPU之间转移要快。
对于NUMA的研究以及Linux对NUMA的支持会在本文的(下)部分中总结。
3)SMT(Simultaneous Multi-Threading)这是一种类似Pentium 4中HT技术的超线程技术,可以让一个核同时跑2个线程,这样对于4核CPU来说,就可以同时跑8个线程。
目前市面上常见的Nehalem架构的CPU就是Core i7了,还有就是下一代的Xeon系列,比如5500系列什么的。NUMA系统可以缓解SMP环境下的拥堵,而且Linux很早就已经支持NUMA了,也许这种早年只有在大型主机上才拥有的东西不就的将来也会来到民间吧。
To be continued...