从程序员的角度看cache(三)

cache alias问题的产生:

L1cache:VIPT型;

               32K,(S、E、B)=(256、4、32)

way-size=8KB

假定TLBSIZE为4KB,有如下两个地址映射关系:

VA0:0X0000_0020 -> PA 0X0000_0020

VA1:0X0000_1020 -> PA 0X0000_0020

得到VA0 的index为1,VA1的index为129,假定此时为cold cache,那么当访问VA0时,PA数据进入index1,访问VA1时,PA数据再次进入index129,因此在cache中有同一物理地址的两份数据,这就产生了cache alias。

cache alias会在VIPT且way-size>page-size时出现。对于sep612,这是一个必须解决的问题,想通了再写吧。

 

顺便记下cache的寻址方式: VIVT、VIPT、PIPT、PIVT

PIVT从未见过,也没有意义,所以……

VIVT,ARM中有些cache使用了此种方式,问题在于进程切换必须刷cache,同时也会引起cache alias问题(因为是VI)

VIPT,ARM和Unicore及MIPS中都有采用此种方式的cache,只要S*B<= page size就不会引起cache alias问题,同时在进程切换时可以只刷TLB(mips中引入了ASID,因此TLB都不需刷)

PIPT,按照Computer organization and design上所述,PIPT不存在cache alias问题,速度比VIPT慢

 

2014年10月19日

解决cache alias问题的两种方式:

  • 《超标量处理器设计》p_80, 图3.30。在同一way中,引入blank,解决cache alias.

  • 《超标量处理器设计》p_91, 图3.40前后,阐述了如何通过L2 cache来解决cache alias问题,个人觉得这是一种方法,实现代价很大,不利于流水化,load时间会变长,miss penalty变大,功耗也会变大。

posted on 2012-04-16 14:44  阿加  阅读(1464)  评论(0编辑  收藏  举报

导航