Nehalem在高速缓存层次进行了重大的改变,而在其他方面的改进也不少。
Nehalem的TLB规格
首先是在TLB方面的改进。一方面当前的应用程序正在变得越来越庞大,而另一方面处理器的核心越来越多、又加入了SMT技术,这两方面都使得同时处理的应用程序需要更多的内存空间去执行。这就使得TLB的设计改进成为必然。对于之前的Core2微结构的处理器而言,只具有一级TLB。Core2处理器的一级指令TLB具有128个表项,而一级数据TLB为256个表项。而在Nehalem中,一级指令TLB仍然为128个表项,但是一级数据TLB削减到了64个表项。Nehalem加入了统一的512表项二级TLB,二级TLB被一级指令和数据TLB所共享。从目前而言,Nehalem的这个改动可能对性能的提升作用并不明显。但是二级TLB相对比较容易扩充,后续设计中有可能通过进一步扩充二级TLB的容量以提升存储映射的性能。
其次是在非对齐高速缓存访问方面的改进。Intel的指令集支持两种16字节的SSE存储访问指令:对齐访问与非对齐访问指令。对齐访问指令只能执行对齐访问,所访问的数据的起始地址都是16字节的整数倍数,也就是16字节对齐的。由于Intel的高速缓存行宽都是64字节,因此对齐访问所需要的数据都是位于一个高速缓存行内(如果所需要的数据存在于高速缓存中)。在执行对齐式的访问时,只需要访问一次高速缓存即可得到所需要的所有数据。而非对齐访问则没有这么幸运。对于之前的设计而言,对于非对齐访问指令的处理相当糟糕。Core2微结构的处理器需要产生多个微操作才能完成一条非对齐访问指令,延迟很高、带宽很低,同时也会浪费能量。甚至于,即便这条指令所需要的数据是对齐的(非对齐访问指令所需要的数据可以是对齐也可以是非对齐的),Core2微结构的处理器完成一条非对齐访问指令的时间也比完成相同功能的两条指令的时间更长。
Nehalem处理器改进了这一点。如果非对齐访问指令所需要的数据是对齐的,那么处理器会把它当作一条对齐访问指令来处理,效率与完成相同功能的对齐访问指令一样。如果所需要的数据是非对齐的,Nehalem在跨越高速缓存行边界的访问也进行了优化,效率得到了提升。因此软件对Nehalem处理器进行优化时,已经没有必要再使用对齐访问指令。
然后是同步原语。原语是指机器执行多条指令时,必须将其作为一个整体进行执行——要么这些指令全部被执行、要么全部不执行。由于多个程序可能同时访问一个数据,因此必须需要原语才能保证这些程序在访问数据时不会产生冲突。为了方便理解我们可以用一个例子来说明:如果你到ATM机上去取款,输入密码键入需要的取款金额后,如果ATM机扣除了你帐号里的钱,但是不给你钞票那你一定会很震惊并且恼火。这是因为扣除帐号中的钱和吐出钞票虽然是两个动作,但是必须作为一个整体来处理。
对于当前的应用来说,多线程的应用越来越广泛,因此同步原语的速度也更加重要。Nehalem提升了Lock Prefix、XCHG等同步原语的速度,为传统的软件减少了同步延迟,提升了系统在多线程应用中的表现。