CPU/GPU真融合!Intel新酷睿权威评测
第三章/第二节 SandyBridge架构解析:指令缓存和分支预测
从高级层面角度看,SandyBridge架构只是一次进化,但是如果看看Nehalem/Westmere以来晶体管变化的规模,绝对是一次革命。
Core 2引入了一种叫作循环流检测器(LSD)的逻辑块,检测到CPU执行软件循环的时候就会关闭分支预测器、预取/解码引擎,然后通过自身缓存的微指令(micro-ops)供给执行单元。这种做法通过在循环执行的时候关闭前端节省了功耗,并改进了性能。Core i系列处理器沿用了这种设计。
SandyBridge里面又增加了一个微指令缓存,用于在指令解码时临时存放。这里没有什么严格的算法,指令只要在解码就会放入缓存。预取硬件获得一个新指令的时候,会首先检查它是否存在于微指令缓存中,如是则由缓存为其余的管线服务,前端随之关闭。解码硬件是x86管线里非常复杂的部分,关闭它能够节约大量的功耗。
这个缓存是直接映射的,能存储大约1.5K微指令,相当于6KB指令缓存。它位于一级指令缓存内,大多数程序的命中率都能达到80%左右,而且带宽也相比一级指令缓存更高、更稳定。真正的一级指令和数据缓存并没有变,仍然都是32KB,合计64KB。这看起来有点儿像Pentium 4的追踪缓存,但最大的不同是它并不缓存追踪,而更像是一个指令缓存,存储的是微指令,而非x86指令(macro-ops)。
与此同时,Intel还完全重新了一个分支预测单元(BPU),精确度更高,并在三个方面进行了创新。
第一,标准的BPU都是2-bit预测器,每个分支都使用相关可信度(强/弱)进行标记。Intel发现,这种双模预测器所预测的分支几乎都是强可信度的,因此SNB里多个分支都使用一个可信度位,而不是每个分支对应一个可信度位,结果就是在分支历史表中同样的位可以对应更多分支,进而提高预测精确度。
第二,分支目标同样做了翻新。之前的架构中分支目标的大小都是固定的,但是大多数目标都是相对近似的。SNB现在支持多个不同的分支目标大小,而不是一味扩大寻址能力、保存所有分支目标,因而浪费的空间更少,CPU能够跟踪更多目标、加快预测速度。
第三,提高分支预测器精度的传统方法是使用更多的历史位,但这只对要求长指令的特定类型分支有效,SNB于是将分支按照长短不同历史进行划分,从而提高预测精度。