回写或直写到主存

Write back or write through to main memory

write-through : 数据立即通过缓存写入主存

write-back : 数据在后面写入。

我有一个共享内存,位于NUMA节点1,假设进程A在节点0执行,修改了共享内存的内容,然后进程B在节点1执行,想读取其中的内容共享记忆 .

如果是write-through模式,那么进程A修改的内容会在Node 1的主存中,因为Node 0向Node 1主存写入数据时会经过Node 1的L3 cache,然后进程B可以从节点1的L3缓存中获取进程A修改的内容,而不是从节点1的主内存中获取。

如果是回写模式,那么在Node 1中的进程B喜欢读取共享内存的内容时,缓存行会在Node 0的L3缓存中, 获取它会花费更多,因为它在节点 0 缓存中。

我想知道在 Intel(R) Xeon(R) CPU E5-2643 中,它会选择哪种模式?! 或者 Xeon 将自行决定使用哪种模式,程序员无能为力?!

编辑:

dmidecode -t 缓存

显示Xeon cache运行模式是write back,看起来合理,参考

http://www.cs.cornell.edu/courses/cs3410/2013sp/lecture/18-caches3-w.pdf

英特尔(和 AMD)x86-64 NUMA 架构上的缓存一致性不像 RAID 阵列那样工作...两个或四个处理器包没有单个直写或回写缓存,而是具有用于同步和共享其 L3 缓存的侦听和传输协议。 OS 对控制此类事物的级别支持通常非常粗糙,尽管 NUMA 已经成为主流大约十年了。

具体来说 Linux,对缓存设置的控制实际上归结为少数进程级设置:

  • 您的代码允许 运行 在哪些内核上。
  • 是否允许您的进程分配非本地节点内存。
  • 您的进程是否在 Numa 节点之间交错其所有分配。

默认情况下,Linux 内核将从进程正在 运行 开启的 NUMA 节点分配进程内存,如果本地存在内存压力,则回退到另一个节点上的分配节点。

您可以使用像 LOCK 这样的 x86 汇编原语来控制数据进出本地节点的 L3 缓存,但通常您 真的,真的,真的 应该只关心你的进程 运行 在本地使用分配的内存。

有关这方面的更多信息,我鼓励您阅读一些关于 NUMA 的 Linux 文档,也可能阅读 Intel 的文档(QPI 是缓存共享技术的名称)。

Linux 'numactl' 联机帮助页 (https://linux.die.net/man/8/numactl)

可能是您的良好开端