首页 文章

写回或写入主存储器

提问于
浏览
0

直写:数据立即通过缓存写入主存储器

回写:数据是在后一次写入的 .

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

如果它处于直写模式,则进程A修改的内容将在节点1的主内存中,因为当节点0向节点1主内存写入数据时,将通过节点1的L3缓存,然后进程B可以获得进程A从节点1的L3缓存修改的内容,而不是从节点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

1 回答

  • 1

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

    特别谈到Linux,对缓存设置的控制实际上归结为少数几个进程级设置:

    • 允许您运行代码的核心 .

    • 是否允许您的进程分配非本地节点内存 .

    • 您的进程是否在Numa节点之间交错所有分配 .

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

    您可以使用像LOCK这样的x86程序集原语来控制数据在本地节点的L3缓存中的推送和输出,但是通常你真的,真的,实际上不应该关心的是除了你的进程在本地运行时使用其分配的内存 .

    有关这方面的更多信息,我建议您阅读有关NUMA的一些Linux文档,也可能还有英特尔(QPI是缓存共享技术的名称) .

    一个好的开始可能是Linux 'numactl'联机帮助页(https://linux.die.net/man/8/numactl

相关问题