首页 文章

NUMA系统,虚拟页面和虚假共享

提问于
浏览
5

据我所知,对于NUMA系统的性能,有两种情况需要避免:

同一个套接字中的

  • 个线程写入同一个缓存行(通常为64个字节)
    来自不同套接字的
  • 个线程写入同一个虚拟页面(通常为4096字节)

一个简单的例子会有帮助 . 假设我有一个双插槽系统,每个插槽都有一个带有两个物理内核的CPU(和两个逻辑内核,即每个模块没有Intel超线程或AMD两个内核) . 让我在OpenMP: for schedule借用数字图书馆

| socket 0    | core 0 | thread 0 |
|             | core 1 | thread 1 |

| socket 1    | core 2 | thread 2 |
|             | core 3 | thread 3 |

因此,基于案例1,最好避免例如线程0和线程1写入相同的高速缓存行,并且基于案例2,最好避免例如线程0写入与线程2相同的虚拟页面 .

但是,我被告知在现代处理器上,第二种情况不再是一个问题 . 套接字之间的线程可以有效地写入同一个虚拟页面(只要它们不写入同一个缓存行) .

Is case two no longer a problem? And if it is still a problem what's the correct terminology for this? Is is correct to call both cases a kind of false sharing?

1 回答

  • 2

    关于案例1你是对的 . 关于案例2的更多细节:

    基于操作系统的NUMA policy和任何相关的migration issues,线程0和2正在写入的页面的物理位置可以是套接字0或套接字1.这些情况是对称的,所以让's say that there' s为first touch policy,并且线程0首先到达那里 . 操作顺序可以是:

    • 线程0分配页面 .

    • 线程0写入它将要处理的缓存行 . 该缓存行transitions from invalid to modified在套接字0上的缓存中 .

    • 线程2写入它将要处理的缓存行 . 要将该行置于独占状态,套接字1必须将读取所有权发送到套接字0并接收响应 .

    • 线程0和2可以用于他们的业务 . 只要线程0没有高速缓存行,反之亦然,没有其他人做任何会改变任一行状态的事情,线程0和线程2所做的所有操作都是socket-(可能是core-)本地 .

    您可以交换2.和3.的顺序而不影响结果 . 无论哪种方式,步骤3中套接字之间的往返行程将比步骤2中的套接字本地访问花费更长的时间,但是每次线程2需要将其线路置于修改状态时,该成本仅发生一次 . 如果在该缓存行的状态中的转换之间继续执行足够长的时间,则额外的成本将摊销 .

相关问题