我想为hw设计一个问题,我需要看看下面的嵌套循环有多少缓存未命中
for i=0; i < 32 ; i++
for j=0; j < 32; j++
sum += arr[i][j];
我有一个完全关联的缓存,它有16个缓存行,每个缓存行可以存储32个字。缓存最初为空,arr [0] [0]映射到第一个缓存行
现在根据我的理解,总共会有32个未命中。最初在发出请求时,缓存为空,因此计为未命中,根据完全关联的缓存,所有块都会填充,然后LRU被申请;被应用。
我在这里有点困惑,可以在这里使用一些指导
答案 0 :(得分:2)
假设整数存储在单词中。
让我们从1 st 内存访问开始,即。 arr[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在评论中所说,完全关联的缓存在特定情况下的行为方式与直接映射缓存完全相同。