在一个微架构中,有两条值得重点关注的流水线,一个是指令流水线。另一个是Cache Controller使用的流水线,下文将其简称为Cache流水线。这两条流水线的实现对于微架构的性能至关重要。指令流水线的设计与Cache流水线相关,反之亦然。
1967年6月,来自IBM的ROBERT MACRO TOMASULO先生发明了最后以自己名字命令的算法[48],这个算法最终使得Alpha处理器,MIPS处理器,Power处理器,x86处理器,ARM系列处理器,所有采用OOO技术的处理器成为可能。1997年Eckert-Mauchly Award正式授予TOMASULO先生, for the ingenious Tomasulo's algorithm, whichenabled out-of-order execution processors to beimplemented.
2008年4月3日,TOMASULO先生永远离开我们。他的算法也历经了多轮改进。即便在针对ILP的优化因为Memory Stall而处境艰难,TOMASULO算法也并不过时。虽然本篇文章的重点并不在Superscalar和OOO,仍然建议所有读者务必能够清晰地理解TOMASULO算法和Superscalar指令流水的细节。为节约篇幅,本篇不会对这些知识做进一步的说明。
而在Cache流水线中,Non-Blocking几乎等同于TOMASULO算法在指令流水中的地位。在现代处理器中,几乎所有Cache Hierarchy的设计都采用了Non-Blocking策略。Non-Blocking Cache实现为Superscalar处理器能够进一步发展提供了可能。
假设在一个Superscalar处理器中,一个时钟周期能够发射n条指令。这要求该处理器需要设置多个执行部件,提供充分的并行性。假设在这个处理器中,某类功能部件x所能提供的带宽为BWX,此处的带宽是借用存储器的概念,如果该功能部件需要4拍才能完成一次操作,那么该功能部件为指令流水线所提供的带宽为1/4。
在一个应用的执行过程中使用这类功能部件所占的百分比为fX。那么只有当BWX/fX不小于n时,Superscalar处理器才能够充分的并行,否则该功能部件必将成为瓶颈。因此在微架构的设计中,通常并行设置多个执行较慢的功能部件以提高BWX参数,当然还有一个方法是缩小fX参数。如何缩小fX参数并不是微架构的关注领域,因为在一个给定的应用中,从微架构设计的角度上看,fX参数没有太大的变化空间。
我们可以将BWX/fX公式扩展到存储器读写指令。假设BWS为提供给指令流水线的存储器访问带宽,而fM为存储器读写指令所占的比例,那么只有在BWS/fM不小于n时,存储器访问单元才不会成为指令流水线的瓶颈。
为此我们建立一个基本的存储器访问模型。为简化起见,假设在一个Superscalar处理器中,存储器结构的最顶层为L1 Cache,其中L1 Cache由指令和数据Cache两部分组成,并使用Write Back方式进行回写,L1 Cache通过L1-L2 Bus与L2 Cache连接。L2 Cache与主存储器系统直接连接。处理器在访问存储器时,首先通过L1 Cache之后再经过L2 Cache,最后到达主存储器系统。该模型也可以进一步扩展到L3 Cache和更多的Cache层次,但是为了简化起见,我们仅讨论L1和L2 Cache的情况。在这个前提之下,我们讨论与Cache相关的延时与带宽,重点关注Cache Hierarchy为指令流水提供的有效带宽,即BWS参数。
当微架构进行存储器访问时,将首先访问L1Cache,此时有Hit与Miss两种情况。如果为Hit,L1 Cache将直接提供数据;如果为Miss,L1 Cache将产生一个Miss请求,并通过L1-L2 Bus从L2 Cache中获得数据。
通常情况下CacheMiss会引发Cache Block的Replacement,如果被替换的Cache Block为Dirty时,还需要向L1-L2 Bus提交Writeback请求,此时L1 Cache Controller将向L2 Cache发送两类数据请求,一个是Cache Miss Request,一个是Write Back Request。为了提高Miss Request的处理效率,在绝大多数微架构中首先向L2 Cache发送Cache Miss Request,之后再发送Write Back Request。
由上文的分析可以发现,BWS参数不能通过简单的计算迅速得出,必须要考虑整个Cache Hierarchy的实现方式。BWS参数与L1-L2 B