NUMA 会影响内存带宽还是仅影响延迟?

Ste*_*ton 4 numa memory-bandwidth

我遇到的问题是内存带宽有限——我需要从 RAM 中顺序读取大量(许多 GB)数据,进行一些快速处理,然后将其顺序写入 RAM 中的不同位置。内存延迟不是问题。

将工作分配给不同 NUMA 区域中的两个或多个核心是否有任何好处?同样,跨区域工作是否会减少可用带宽?

Joh*_*pin 6

对于带宽有限的多线程代码,NUMA 系统中的行为主要取决于每个线程数据访问的“本地”程度,其次取决于远程访问的详细信息。

在典型的 2 插槽服务器系统中,两个 NUMA 节点可用的本地内存带宽是单个节点可用的本地内存带宽的两倍。(但请记住,可能需要在多个内核上运行多个线程才能达到每个套接字的渐近带宽。)

例如,STREAM Benchmark 通常在允许来自每个线程的几乎所有访问都是“本地”的配置中运行这是通过假设“第一次接触”NUMA 布局来实现的——当第一次写入分配的内存时,操作系统必须创建从进程虚拟地址空间到物理地址的映射,并且(默认情况下)操作系统选择位于与执行存储指令的核心相同的 NUMA 节点。

大多数系统中的“本地”带宽(到 DRAM)大致对称(对于读取和写入)并且相对容易理解。“远程”带宽对于读取和写入而言更加不对称,并且芯片之间的读/写命令与芯片之间移动的数据之间通常存在严重的争用。不同代处理器之间本地与远程带宽的总体比率也存在显着差异。对于某些处理器(例如,Xeon E5 v3,可能还有 v4)​​,互连速度相对较快,因此局部性较差的作业通常可以在两个插槽之间交错所有内存的情况下运行。从那时起,本地带宽显着增加,最近的处理器通常强烈支持本地访问。

Intel Xeon Platinum 8160 的示例(芯片之间有 2 个 UPI 链路):

  • 本地读取带宽(每个插槽)~112 GB/s
  • 远程读取带宽(一次一个方向)~34 GB/s
  • 本地带宽在双套接字系统中可以完美扩展,而在使用两个套接字(每个套接字从另一个套接字读取数据)时,远程带宽也可以很好地扩展。

套接字之间的读写流量组合会变得更加复杂,因为从节点 0 到节点 1 的读取流量与从节点 1 到节点 0 的写入流量竞争,等等。

  • 1R 的本地带宽:1W(每个插槽)~101 GB/s(由于读/写调度开销而减少)
  • 1R 的远程带宽:1W(一次运行一个套接字)~50 GB/s——更多带宽可用,因为两个方向都在使用,但这也意味着如果两个套接字都在做同样的事情,就会出现冲突。当两个套接字同时运行 1R:1W 远程时,我发现聚合速度低于 60 GB/s。

当然,本地与远程访问的不同比例会改变缩放比例。时间也可能是一个问题——如果线程同时进行本地访问,然后同时进行远程访问,远程访问部分将会出现更多的争用(与线程同时进行本地访问的情况相比)不同时间的远程访问)。