我有 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/