组相联缓存缺失率计算及MIPS代码相关技术问题咨询
关于MIPS链表遍历的缓存与虚拟内存问题咨询
相关代码与已知条件
MIPS链表遍历代码
.data first-node : .word 10,next-node next-node: ....... .text la $s0,first-node move $s1,$zero loop: la $t0,0($s0) add $s1,$s1,$t0 lw $s0,4($s0) bne $s0,$zero,loop
已知硬件/数据条件
- 链表共包含4096个节点
- 缓存:1路组相联(直接映射),16组,块大小128字节
- 虚拟内存页大小:4KB
对课堂结论的推导疑问
课堂上给出了以下结论,但我完全摸不清推导逻辑,想请大佬拆解细节:
1) 缓存缺失率计算
课堂结论分阶段给出了缺失率,但我对每个阶段的计算依据都有疑问:
- 前16次迭代的缺失率:4/(4+2)≈66%(注:4为循环内指令数,2为循环前指令数)
疑问:这里的“前16次操作”指的是前16次循环迭代吗?为什么缺失数是4?循环里的指令和数据加载的缺失是怎么统计的?
- 第17次迭代的缺失率:1/6≈17%(我自己猜测是因为加载新节点,但不确定这个逻辑对不对)
- 第18-32次迭代的缺失率:0/6=0%
疑问:明明每次循环都要加载新节点的数据和下一个节点的地址,为什么这阶段完全没有缓存缺失?
- 总缺失率:(4×16+1×15)/(16×16×6)≈5%
疑问:分子和分母的数字都是怎么来的?完全看不懂这个计算的逻辑。
2) 页故障次数:9次
疑问:每个链表节点是8字节(一个word存数据,一个存下一个节点地址),4096个节点总大小是4096×8=32KB,按4KB的页大小算应该是8页,为什么会出现9次页故障?
3) TLB缺失率:9/(6×4096)≈0.03%
疑问:分母的6×4096是总指令数吗?循环前有2条指令,循环每次4条,4096次循环的话总指令应该是2+4×4096,为什么是6×4096?分子的9是页故障次数,TLB缺失和页故障的对应关系是什么?
额外咨询:缓存路数的差异
想请教一下:1路组相联(直接映射)和2路组相联缓存的核心差异是什么?是不是路数越多,缓存缺失率就一定越低?如果要计算这两种缓存对这段代码的缺失率差异,应该怎么入手?
内容的提问来源于stack exchange,提问作者Kukuriku
相关产品推荐
相关产品推荐

