【发布时间】:2015-10-16 08:08:00
【问题描述】:
我正在尝试在两种算法之间做出决定。一个写入 8 个字节(两个对齐的 4 字节字)到 2 个缓存行,另一个写入 3 个完整的缓存行。
如果 CPU 只将更改后的 8 个字节写回内存,那么第一个算法使用的内存带宽要少得多:8 个字节对 192 个字节。如果 CPU 写入整个缓存行,那么 128 和 192 字节之间的差异就不那么明显了。
那么英特尔至强 CPU 是如何写回内存的呢?您会惊讶地发现,在 Google 中找到应该众所周知的问题的答案是多么困难。
据我了解,写入进入存储缓冲区,然后进入缓存。它们可能仅在从缓存中清除脏缓存行时才被写入内存,但英特尔是否会跟踪缓存行的哪些部分是脏的,或者只是转储整个内容?我相当怀疑他们是否跟踪缓存行粒度以下的内容。如果在缓存行被驱逐之前有任何东西进入内存,我也会感到非常惊讶。
【问题讨论】:
-
为什么投反对票?这是一个很好的问题!
-
@inf 这个问题的一个问题是使用术语“Intel Xeon CPU”在这里并没有做出有用的区分。 Xeon 商标自 Pentium II 架构以来一直应用于 Intel x86 CPU。从技术上讲,它并没有真正表示处理器的不同类型,而是表示处理器所针对的不同类型的客户。通过将问题限制为“企业级”CPU,它的用处不如仅询问有关 Intel x86 CPU 的问题。无论哪种方式,答案都是一样的。
-
@RossRidge 好吧,那么请您澄清一下他所指的架构,不要大肆投反对票。
-
您的主要目标似乎是在两种算法之间做出决定(基于性能)。是否有充分的理由不只对这两种算法进行基准测试?这可能需要更多的工作,但可以保证为您提供做出选择所需的准确信息。
-
@RossRidge 我的年龄还不足以记住基于 Pentium II 的 Xeon。我将把我的兴趣限制在 Sandy Bridge 和更新的 CPU 上,因为在云服务世界中,它和你发现的一样古老。我在标题中使用 Xeon 是因为更多的人知道 Xeon 是什么,而不是 Sandy Bridge 是什么。
标签: caching optimization x86 intel cpu-cache