在 Linux 上分享小规模数据时的第一次接触

First touch in case of small sized data sharing on Linux

“首次接触”(在 NUMA 系统中用于表示虚拟内存映射的特殊术语)写操作导致内存页面映射到与首先写入它们的线程关联的 NUMA 节点。看了this页,对于新手来说还是比较难理解的,据我理解,这是在使用默认内存映射策略的情况下。根据可能使用的不同政策,我们可以预期这不再是真的。请随时纠正我对此事的理解。

我现在的问题是:如果我的调度策略(认为 #pragma omp for schedule(static, chunk_size))需要来自两个不同 NUMA 节点的两个线程来处理来自 相同 内存页的数据,第一个触摸写操作是否会按照 Linux 上的默认映射策略将内存页面加载到两个节点?

您 link 的文档页面说默认策略是“本地分配”,这意味着第一个接触内存的任务将导致页面分配到 [=35= 本地的 NUMA 节点上] 其中任务是 运行.

When the system is “up and running”, the system default policy will use “local allocation” described below.

[...]

"Local" allocation policy can be viewed as a Preferred policy that starts at the node containing the cpu where the allocation takes place.

页面分配一次。例如,假设一个映射页面由两个线程 T0(在 NUMA 节点 0 上)和 T1(在 NUMA 节点 1 上)共享,默认策略是第一次触摸页面将分配在节点 0 上。当另一个线程触摸该页面时分配后,它不会移动到不同的节点或在另一个线程的节点中再次获得 re-allocated。

发生的事情是:

  • 页面已映射
  • T0写入(第一次触摸,这会导致页面错误)
  • 页面在节点 0 上分配
  • T1 写
  • 没有分配发生,只是non-local访问

作为参考,Christoph Lameter 的 this article 还对 Linux

下的 NUMA 恶作剧进行了详尽的解释