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

Does NUMA impact memory bandwidth, or just latency?

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

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

对于带宽受限的多线程代码,NUMA 系统中的行为将主要取决于 "local" 每个线程的数据访问方式,其次取决于远程访问的详细信息。

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

例如,STREAM Benchmark 在允许来自每个线程的几乎所有访问的配置中通常是 运行 "local"。这是通过假设 "first touch" NUMA 放置来实现的——当首次写入分配的内存时,OS 必须创建从进程虚拟地址 space 到物理地址的映射,并且(默认情况下) OS 选择与执行存储指令的核心位于同一 NUMA 节点中的物理地址。

"Local" 大多数系统中的带宽(到 DRAM)大致对称(对于读取和写入)并且相对容易理解。 "Remote" 带宽对于读取和写入来说更加不对称,并且在芯片之间传输的 read/write 命令与芯片之间移动的数据之间通常存在显着的争用。本地带宽与远程带宽的总体比率在不同处理器代中也有显着差异。对于某些处理器(例如 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(由于 read/write 调度开销而减少)
  • 1R:1W 的远程带宽(一次一个插槽 运行ning)~50 GB/s -- 更多带宽可用,因为两个方向都在使用,但这也意味着如果两个套接字都在做同样的事情,就会发生冲突。当两个套接字同时 运行ning 1R:1W 远程时,我看到聚合少于 60 GB/s。

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