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