gpt4 book ai didi

caching - Intel Xeon CPU 如何写入内存?

转载 作者:行者123 更新时间:2023-12-03 10:28:21 28 4
gpt4 key购买 nike

我试图在两种算法之间做出决定。一个将 8 个字节(两个对齐的 4 字节字)写入 2 个缓存线,另一个写入 3 个完整的缓存线。

如果 CPU 仅将更改后的 8 字节写回内存,则第一种算法使用的内存带宽要少得多:8 字节与 192 字节。如果 CPU 写入整个缓存行,那么 128 和 192 字节之间的差异就不那么明显了。

那么英特尔至强 CPU 如何写回内存呢?你会惊讶地发现,在谷歌中找到一个应该众所周知的东西的答案是多么困难。

据我了解,写入进入存储缓冲区,然后进入缓存。当脏缓存行从缓存中被逐出时,它们可能只会被写入内存,但英特尔是否会跟踪缓存行的哪些部分是脏的,或者只是转储整个内容?我相当怀疑他们跟踪缓存线粒度以下的东西。如果在缓存行被逐出之前有任何内容进入内存,我也会感到非常惊讶。

最佳答案

甚至对于 DRAM 本身,局部性也很重要,即使不考虑缓存也是如此。对脏缓存行进行 64B 连续字节的突发写入比向 16 个不同地址的 4B 写入 16 次要快得多。或者换句话说,写回整个缓存行并不比写回缓存行中的几个更改的字节慢多少。

What Every Programmer Should Know About Memory由 Ulrich Drepper 撰写,解释了很多有关在编程时避免内存瓶颈的内容。他包括了 DRAM 寻址的一些细节。 DRAM Controller 必须先选择一行,然后再选择一列。访问另一个虚拟内存页面也会导致 TLB 未命中。

DRAM 确实具有用于传输连续数据块的突发传输命令。 (显然是为了 CPU 写回缓存行而设计的)。现代计算机中的内存系统针对写入整个缓存行的使用模式进行了优化,因为这几乎总是发生。

缓存线是 CPU 跟踪脏与否的单位。可以使用比存在或不存在缓存线更小的线尺寸来跟踪脏度,但这需要额外的晶体管并且不值得。设置了多级缓存来传输整个缓存行,因此当需要读取整个缓存行时,它们可以尽可能快。

有所谓的非临时读/写 ( movnti/movntdqa ) 绕过缓存。这些用于在无论如何都会从缓存中逐出之前不会再次触及的数据(因此是非时间性的)。对于可以从缓存中受益的数据,它们是一个坏主意,但可以让您将 4 个字节写入内存,而不是整个缓存行。根据该内存范围的 MTRR,写入可能会或可能不会受到写入组合的影响。 (这与内存映射的 I/O 区域相关,其中两个相邻的 4B 写入与一个 8B 写入不同。)

只涉及两个缓存行的算法在这个分数上肯定有优势,除非需要更多的计算,或者特别是分支,才能确定要写入的内存。如果您需要帮助做决定,也许可以问一个不同的问题。 (请参阅 https://stackoverflow.com/tags/x86/info 上的链接,尤其是 Agner Fog 的指南,了解可帮助您自行决定的信息。)

请参阅 Cornstalks 的回答,了解有关在不同 CPU 上有多个线程接触同一内存的危险的警告。与单线程程序的额外写入相比,这可能会导致更大的减速。

关于caching - Intel Xeon CPU 如何写入内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com