据我了解,对于 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 相同的虚拟页面。
但是,我被告知,在现代处理器上,第二种情况不再是问题。套接字之间的线程可以有效地写入相同的虚拟页面(只要它们不写入相同的缓存行)。
案例二不再是问题了吗?如果它仍然是一个问题,那么正确的术语是什么?将这两种情况称为一种虚假分享是否正确?