2.3.1
1、哪两个程序参数会影响命中率?
步长(stepsize)和循环次数(repcount)
2、增加 repcount 的值,命中率会如何变化,为什么?
增加repcount的值,命中率不会改变,依然是0。因为根据初始参数的运行结果可知:128B的数组,repcount是4,步长是8,且cache 命中率是0的情况下,Memory access count 是32,所以数组的元素个数是(32/4)*8 =64个,而cache只有4块,且每一块的大小是8字节,所以不管repcount是多少,每次迭代访问的都是0、8、16、24(cache满)、32(根据LRU算法cache中的数据被替换)、40、48、56;所以不管迭代多少次,cache的命中率都是0。
3、在允许同一个数组元素多次访问的前提下,能否只修改一个程序参数就可提升 cache 命中率?将___修改为___,将会提升 cache 命中率。
将步长(stepsize)修改为1,将会提高cache的命中率。
2.3.2
1、每个内循环有多少次主存访问?
每个内循环有320次主存访问
2、每 4 次主存访问就有一次缺失,为什么?程序运行完后命中率是多少?为什么?
因为cache block size是4 words,也就是16字节=2^4,所以block offset有4位;而步长是2,每向前走4次,内存地址就会加8,8的二进制是1000,加上8index的值必然会发生变化,所以第4k+1(k=0,1,2……)个将会被放到下一组,从而造成miss。每一组的block1、block2、block3同理,所以一共有16次miss。
程序运行完后命中率是95%,因为经过前64次的访问,数组元素的内存地址已经与缓存行对齐了,后续无论再访问数组中哪一个元素,都会hit,而miss次数只有16,不会再增加了。
3、因为步长较小,cache block Size 又足够大,整个数组的地址都被存放在cache中了,所以只有在前期会是每4次访问miss一次,之后的每次访问就都是hit了。
4、为什么本实验的命中率相当高?
因为本实验的 caxhe 比较大,且大小正好和数组大小一样。
宇宙声明:我这答案不保真