我想找出硬件问题,我需要查看以下嵌套循环发生了多少缓存未命中
for i=0; i < 32 ; i++
for j=0; j < 32; j++
sum += arr[i][j];
我有一个完全关联的缓存,它有 16 个缓存行,每个缓存行可以存储 32 个单词。缓存初始为空,arr[0][0] 映射到第一个缓存行
现在根据我的理解,总共会有 32 次未命中。最初发出请求时缓存为空,因此它算作未命中,根据完全关联的缓存,所有 block 都会被填充,然后是 LRU被申请;被应用。
我在这里有点困惑,可以在这里使用一些指导
最佳答案
假设一个整数存储在一个单词中。
让我们从第一个st 内存访问开始,即。 到达[0][0]
。这将导致未命中,属于强制性未命中。这会将 32 个整数放入缓存。 为了我们的利益,我们将在进一步的访问中访问这些确切的内存位置。从 arr[0][0]
到 arr[0][ 31]
。
现在,当我们访问 arr[1][0]
时,我们正在访问第 33 个位置,而这不在我们的缓存中。所以这又是一个失误。
一般来说,您访问的每 32 个值都会有一个未命中。请注意,这仅适用于您展示的那种循环:
for i=0; i < 32 ; i++ for j=0; j < 32; j++ sum += arr[i][j];
这里的内存访问是连续的。此外,正如@Peter Cordes 在评论中所说,在您的特定情况下,完全关联缓存的行为方式与直接映射缓存的行为方式完全相同。
关于c++ - 全关联缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39865287/