5.4 Stream Buffer

来源:互联网 发布:爱特数据恢复中心 编辑:程序博客网 时间:2024/06/06 13:19

Stream Buffer是一种广义Cache,主要功能是避免因为预读而造成的Cache Pollution问题。当采用该机制时,处理器可以将预读的数据序列放入Stream Buffer中而不是放入Cache,如果处理器使用的数据没有在Cache中命中,将首先在Stream Buffer中查找,采用这种方法可以消除预读对Cache的污染,但是也因此增加了系统设计的复杂性。Stream Buffer的组成结构如59所示。

5.4 <wbr>Stream <wbr>Buffer

在一个StreamBuffer中,由多个Entry组成,在这个Entry中可以存放一个或者多个Cache Block,也包含若干个状态位。Stream Buffer的每一个EntryCache BlockValid位和与此对应的地址Tag组成。其中Valid位表示当前Cache Block中的数据是否有效,而地址Tag用来进行地址比较。Stream Buffer的使用方法与FIFO类似,从Front指针处开始使用,新的数据将填入Rear指针的位置。

出现CacheMiss时,微架构首先在Stream BufferFront开始寻找数据,如果命中,该数据才预读进入Cache,从而不会造成Cache Pollution,同时预读进行Cache的数据将从Stream Buffer的头部移除。随后微架构根据Prefetch Address从其下Cache Hierarchy中获得Cache Block,并填写Rear指针对应EntryTag信息,数据返回时将填写相应的Cache Block,并将Valid位置为有效。

如果数据在StreamBufferMiss,而且系统中只有一个Stream Buffer,该Stream Buffer将被刷新,并试图建立新的预读序列。显然在多数情况下,设立一个Stream Buffer并不合理,在一个实际的应用中,一个任务经常会访问多个Stride不同的数据序列,如58所示。为此在现代微架构中,一般设置多个Stream Buffer,即Multi-Way Stream Buffers,其组成结构如510所示。

5.4 <wbr>Stream <wbr>Buffer

当出现Stream BufferMiss时,将使用某种替换算法,LRU或者PLRU,替换其中的一个Stream Buffer,以装填新的访问序列。当使用这种结构时,如果一个任务需要访问Stride不同的几种数据序列时,可以使用不同的Stream Buffer,从而有效提高了Stream Buffer的利用率。在一个微架构的具体实现中还可以将Stream BufferLookahead Data Prefetching方式联合使用,其结构示意如511所示。

5.4 <wbr>Stream <wbr>Buffer

即便是使用这种硬件预读方式,也无法彻底解决因为预读带来的Cache Pollution问题,很难解决预读数据的及时有效等一系列。硬件预读机制不断的发展演变过程,与程序的分支预测有某些相近之处,其本质都是硬件自学习数据访问轨迹的过程。

各类StridePrefechingDistance PrefechingGlobal Histrory Buffer Prefeching算法,其本质均是如此,没有必要对此再一一进行介绍。很多从Qualitative Research看起来非常不错的预读算法,其Quantitative Analysis的最终结果未必能够超过OBL算法。这些优化方法都有较强的针对性,在某类Access Pattern之下有较好的表现,而在其他情况之下并不适用。在Prefectch这个领域,有时简单逻辑获得的效果并不弱于复杂逻辑。

这也引发了一个思考,是否应该把更多的硬件资源用于微架构的其他部分,而非用于硬件预读。一些简单的方法可能就是最优,比如OBL实现和最基本的Stream Buffer。这一切依然是一个深层次的Trade-Off问题,没有优劣之分。




[1][20]中的Stream Buffer示意图相比,[94]中的图片更为直观一些。

0 0