从程序员的角度看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变大,功耗也会变大。