关于伪相联Cache实现细节的讨论

来源:互联网 发布:麻生明知乎 编辑:程序博客网 时间:2024/06/08 05:50

    几乎所有谈到伪相联Cache的书都采用了一种模糊不清的说明方法,以以致会对读者产生误导而心生疑惑。

    书中谈到伪相联Cache的实现时,大都讲可以采用索引位最高位取反来找到“伪组”。但这样读者会产生一个疑问:如果发生了伪命中,那命中的Cache块真是我们需要的吗?我们知道Cache块的查找是通过查地址实现的。Cache地址分三部分:

标志位 索引位 块内地址

    因为Cache是以块为单位选取的,所以块内地址不用考虑,当伪命中时,会出现的情况是:

标志位 索引位 块内地址

                            我们期望的数据地址:t…………t  1i…………im…………m

                    我们希望找到的Cache块:t…………t  1i…………i?…………?

  而根据书中说法,命中的Cachce块:t…………t  0i…………i?…………?

    由此可见,伪命中的Cache地址并非我们所需要的,它有一位与所需的不符!!

    但我们相信伪相联的原理和思想是正确的,那让我们找出伪命中的真实情形吧!

    产生上述疑问的根源的在于书中描述伪相联实现时用了“索引位中最高位取反”这样的表述!这种说法实际上是有问题的,因为取反的这一位实际上不应再属于索引位。

    我们知道在Cache的块总数一定的情况下,相联程度越高索引位所需的位数就越少。那么,在伪相联后,相当于增加了相联程序,所以所需的索引位数较之采用伪相联之前要减少一位。

    那么减少的这一位就是用来取反的那一位!这一位的实际意义是一位特殊的标志位,通过这一位将“伪2路”分成了“奇路”和“偶路”。因此这一位在判断是否命中时,也要参与比对。所以伪命中的情形应如下:

                        我们期望的数据地址:t…………t  Ti…………im…………m

    根据T取1和0找出伪2路Cache块:a…………a  1…………i?…………?和b…………b  0…………i?…………?

    红色的为索引位,根据索引位选中后,将a…………a  1和b…………b  0依次与t…………t  T相比较来判断是否命中,第一次比较命中,则为命中;第二次比较命中,则为伪命中!课件中的说明图表达了这一含义:

 

 

原创粉丝点击