;第一次触摸";(在NUMA系统的情况下,用于指示虚拟内存映射的一个特殊术语(写操作导致内存页映射到与首先向其写入的线程相关联的NUMA节点。阅读了这一页,对于新手来说很难理解,根据我的理解,当使用默认内存映射策略时,情况就是这样。根据可能使用的不同政策,我们可能会认为这不再是真的。请随时纠正我对此事的理解。
我现在的问题是:如果我的调度策略(想想#pragma omp for schedule(static, chunk_size)
(要求来自两个不同NUMA节点的两个线程处理来自同一内存页的数据,那么第一次触写操作会按照Linux上的默认映射策略将内存页加载到两个节点吗?
您链接的文档页面显示默认策略为"本地分配";这意味着接触存储器的第一个任务将导致页面被分配在任务正在运行的CPU本地的NUMA节点上。
当系统"启动并运行"时,系统默认策略将使用下面描述的"本地分配"。
[…]
"本地";分配策略可以被视为从包含进行分配的cpu的节点开始的首选策略。
一个页面只进行一次分配。例如,假设映射的页面由两个线程T0(在NUMA节点0上(和T1(在NUMA节点1上(共享,默认策略为T0第一次触摸时,页面将在节点0上分配。当T1在页面被分配后触摸页面时,它不会移动到节点1节点或在那里再次被重新分配。
发生的是:
- 页面已映射
- T0写入(第一次触摸,这会导致页面故障(
- 页面已在节点0上分配
- T1写入
- 没有分配,只有非本地访问
Christoph Lameter的这篇文章也对Linux 下的NUMA恶作剧进行了全面的解释,以供参考