@iwktd981220
2019-04-22T13:17:21.000000Z
字数 1556
阅读 1617
(提示:访存行为包括程序一共发生了多少次访存操作,每次访存操作的地址之间有什么样的关系等)
访存仅在:
lw $t3, 0($t0) #t3 = array[i+0] load1
lw $t4, 4($t0) #t4 = array[i+1] load2
lw $t5, 8($t0) #t5 = array[i+2] load3
sw $t2, 12($t0) #array[i+3] = t2 store1
这个部分发生,循环之行了25次,故有100次访存。后面三次访存都与第一次访存有4、8、12byte的偏移量,而前一个周期和后一个周期所读取的整个数据块都有4byte的偏移量。
运行上述的程序,得到24%命中率。详细原因下一题解释。
根据对程序的运行以及手工模拟过程,可以得知前后周期(也就是进行三次lw,一次sw),都会产生一个元素的偏移量,因此在除了第一个周期以外,其他周期都会产生一次cache hit与三次cache miss。
可以计算得命中率为24/100=24%(除了第一个周期一定会产生义务失效,没有cache hit)。
运行上述的程序,得到0%命中率。详细原因下一题解释。
由于使用了全相联与LRU的替换策略,每一个周期三次lw和sw的访问对应位置相同。根据全相联策略,只要有空缺就使用空缺,结合LRU替换策略,lw0产生在slot0,lw1产生在slot1,lw2产生在slot0。根据LRU替换策略,由于上一次替换产生在slot0,因此下一个产生的替换在slot1。
不同组策略的cache命中率稳定在72%,而且不随着cache容量增大而增大。根据我的模拟,除第一次义务失效,直接映射下每一次都会会有新的一个新的数据需要读取,产生cache miss,其他情况下都会cache hit,计算可得命中率为24*3/100=72%;全相联映射下,LRU替换策略会使得新加入的数据刚好在上一轮最后加入数据的下一个slot;四路组相连也与全相联映射类似,只不过他是产生在用一个set当中。
但是在上述条件情况下,如果扩大cache block size,就可以发现有明显的提升,因为他一次性会读取两个word,会使得第一轮第二个lw产生cache hit,因此扩大cache block size是非常有必要的。