直写:数据立即通过缓存写入主存储器
回写:数据是在后一段时间写的。我有一个共享内存,位于NUMA节点1,假设在节点0中执行的进程A修改了共享内存的内容,那么在节点1中执行的进程B喜欢读取共享内存的内容
如果处于直写模式,则进程A修改的内容将在节点1的主内存中,因为当节点0向节点1主内存写入数据时,将通过节点1的L3缓存,然后进程B可以从节点1的L3缓存中获取进程A修改的内容,而不是从节点1的主内存中获取。
如果是回写模式,那么当节点1中的进程B想要读取共享内存的内容时,缓存行将在节点0的L3缓存中, 得到它会花费更多,因为它在节点0缓存中。
我想知道英特尔(R)Xeon(R)CPU E5-2643,它会选择哪种模式? 或Xeon将决定它将使用哪种模式,程序员无法做到?!
编辑:
dmidecode -t cache
表示Xeon缓存操作模式是回写,看起来合理,参考
http://www.cs.cornell.edu/courses/cs3410/2013sp/lecture/18-caches3-w.pdf
答案 0 :(得分:1)
英特尔(和AMD)x86-64 NUMA架构的缓存一致性不像RAID阵列那样工作......两个或四个处理器软件包不具备单个直写或回写缓存窥探&用于同步和共享其L3缓存的传输协议。操作系统级别对控制此类事物的支持通常非常粗糙,尽管NUMA已经成为主流大约十年了。
具体谈到Linux,对缓存设置的控制实际上归结为少数几个流程级设置:
默认情况下,Linux内核将从进程正在运行的NUMA节点分配进程内存,如果本地节点上存在内存压力,则回退到另一个节点上的分配。
您可以使用像LOCK这样的x86程序集原语控制将数据推入和移出本地节点的L3缓存,但一般来说,真的,真的,真的不应该关心更多而不是你的进程在本地运行时使用已分配的内存。
有关这方面的更多信息,我建议您阅读有关NUMA的一些Linux文档,也可能还有英特尔(QPI是缓存共享技术的名称)。
一个良好的开端可能是Linux'numactl'联机帮助页(https://linux.die.net/man/8/numactl)