据我所知,对于NUMA系统的性能,有两种情况需要避免:
一个简单的例子会有所帮助。假设我有一个双插槽系统,每个插槽都有一个带有两个物理内核的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相同的虚拟页面。
然而,我被告知在现代处理器上,第二种情况不再是一个问题。套接字之间的线程可以有效地写入同一个虚拟页面(只要它们不写入同一个缓存行)。
案例二不再是问题吗?如果仍然存在问题,那么正确的术语是什么?将这两种情况称为虚假分享是否正确?
答案 0 :(得分:2)
关于案例1你是对的。关于案例2的更多细节:
基于操作系统NUMA policy和任何相关的migration issues,线程0和2正在写入的页面的物理位置可以是套接字0或套接字1。是对称的,所以让我们说sa first touch policy并且线程0首先到达那里。操作顺序可以是:
您可以交换2.和3.的顺序而不影响结果。无论哪种方式,步骤3中套接字之间的往返行程将比步骤2中的套接字本地访问花费更长的时间,但是每次线程2需要将其线路置于修改状态时,该成本仅发生一次。如果在该缓存行的状态之间的转换之间继续执行足够长的时间,则额外的成本将摊销。