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

时间:2014-02-14 21:09:49

标签: multithreading parallel-processing openmp numa

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

  1. 同一套接字中的线程写入同一缓存行(通常为64字节)
  2. 来自不同套接字的线程写入同一个虚拟页面(通常为4096字节)
  3. 一个简单的例子会有所帮助。假设我有一个双插槽系统,每个插槽都有一个带有两个物理内核的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相同的虚拟页面。

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

    案例二不再是问题吗?如果仍然存在问题,那么正确的术语是什么?将这两种情况称为虚假分享是否正确?

1 个答案:

答案 0 :(得分:2)

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

基于操作系统NUMA policy和任何相关的migration issues,线程0和2正在写入的页面的物理位置可以是套接字0或套接字1。是对称的,所以让我们说sa first touch policy并且线程0首先到达那里。操作顺序可以是:

  1. 线程0分配页面。
  2. 线程0写入它正在处理的缓存行。套接字0上缓存中的缓存行transitions from invalid to modified
  3. 线程2写入它正在处理的缓存行。要将该行置于独占状态,套接字1必须将读取所有权发送到套接字0并接收响应。
  4. 线程0和2可以用于他们的业务。只要线程0没有触及线程2的高速缓存行,反之亦然,没有其他人做任何会改变任一行状态的事情,线程0和线程2正在做的所有操作都是socket-(并且可能是核心 - )本地。
  5. 您可以交换2.和3.的顺序而不影响结果。无论哪种方式,步骤3中套接字之间的往返行程将比步骤2中的套接字本地访问花费更长的时间,但是每次线程2需要将其线路置于修改状态时,该成本仅发生一次。如果在该缓存行的状态之间的转换之间继续执行足够长的时间,则额外的成本将摊销。