c++ - 全关联缓存

标签 c++ caching memory cpu-architecture

我想找出硬件问题,我需要查看以下嵌套循环发生了多少缓存未命中

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/

相关文章:

c++ - 如何在 Linux 上构建 "lzma sdk"

.net - 什么是缓存AppData\Local\assembly\dl3?

linux - 什么是 `top` 指的是无交换机器上的虚拟内存

python - 错误: Error while obtaining start requests - Scrapy

c++ - 忽略调试器中的默认库

c++ - 我可以避免通过 time_t 打印 time_point 吗?

javascript - 关于 Javascript 原型(prototype)的范围求和查询问题(Leetcode)

java - Android/Java - 通过在分配之前检测剩余的可用 RAM 来防止 OutOfMemoryError

c++ - 在 C++ 中包含来自不同目录的 header

MySQL 存储引擎决策