performance - 现代计算机缓存的相邻数据的大小以利于局部性

标签 performance caching optimization cpu-architecture

我有 1024 个缓冲区的连续内存,每个缓冲区大小为 2K 字节。我使用一个链表来记录可用的缓冲区(这里的缓冲区可以认为是由生产者和消费者使用的)。经过一些操作后,链表中缓冲区的顺序变得随机。

现代计算机体系结构非常有利于紧凑的数据和局部性。当需要访问某个位置时,它会缓存相邻数据。我的计算机的缓存行是 64(从 64K 更正)字节。

问题 1. 对于我的情况,是否由于我的访问模式是随机的而导致大量缓存未命中?

问题 2. 现代计算机缓存的相邻数据的大小是多少?我认为如果您访问整数数组中的某个位置,它将缓存相邻的整数。但是我的单位数据(2K)比int(4)大很多。所以,我不确定有多少邻居会被缓存。

最佳答案

首先我怀疑“我的计算机的缓存行是 64K 字节”。它很可能仅为 64 字节。让我尝试回答您的问题:

问题 1. 对于我的情况,是否由于我的访问模式是随机的而导致大量缓存未命中?

不一定。这取决于缓冲区被缓存后您对其执行的操作次数。

  • 因此,如果您缓存 2K 缓冲区并对其进行大量连续工作,那么您的 缓存命中率会很好。正如 Paul 所建议的,在启用硬件预取的情况下效果会更好
  • 但是,如果您不断地在缓冲区之间跳转并进行相对 每个缓冲区的工作量较少,缓存命中率将会下降。 然而,1024 x 2KB = 2MB,因此这可能是 L2 缓存的大小(如果您还有 L3,则 L2 通常较小)。所以即使 如果你错过了 L1,那么在这两种情况下你很有可能会 点击 L2。

问题 2. 现代计算机缓存的相邻数据的大小是多少?

通常,获取的邻居数量由缓存行大小给出。如果行大小为 64B,则可以获取 16 个整数值。因此,每次读取时,都会填充一个缓存行。但是您需要考虑预取如果您的 CPU 检测到内存读取是连续的,它将预取更多邻居并提前带来更多缓存行。

希望这有帮助!

关于performance - 现代计算机缓存的相邻数据的大小以利于局部性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26750797/

相关文章:

css - 浏览器如何知道如何使用缓存清除?

c# - DataGridView 优化

永久缓存的 Java 小程序,不下载新版本?

c - 让 gcc 使用条件移动

c# - 使用ftp c#高效异步上传多个文件

c++ - 使用 std::move 进行 vector 构建优化

python - 两个解决方案之间的运行时差异大 : Project Euler #14

c++ - 加速 C/Rcpp 中 Dice 系数的计算

javascript - 使用 javascript 检测设备 CPU/GPU 性能?

arrays - 使用数组 View 时出现意外的内存分配 (julia)