我有一个内存带宽有限的问题——我需要从 RAM 中顺序读取大量(许多 GB)数据,进行一些快速处理并将其顺序写入 RAM 中的不同位置。内存延迟不是问题。
在不同 NUMA 区域中的两个或多个内核之间分配工作有什么好处?同样,跨区域工作是否会减少可用带宽?
我有一个内存带宽有限的问题——我需要从 RAM 中顺序读取大量(许多 GB)数据,进行一些快速处理并将其顺序写入 RAM 中的不同位置。内存延迟不是问题。
在不同 NUMA 区域中的两个或多个内核之间分配工作有什么好处?同样,跨区域工作是否会减少可用带宽?
对于带宽受限的多线程代码,NUMA 系统中的行为将主要取决于每个线程的数据访问的“本地”程度,其次取决于远程访问的详细信息。
在典型的 2 插槽服务器系统中,两个 NUMA 节点可用的本地内存带宽是单个节点可用的两倍。(但请记住,可能需要在许多内核上运行许多线程才能达到每个套接字的渐近带宽。)
例如,STREAM 基准测试通常在允许来自每个线程的几乎所有访问都是“本地”的配置中运行。这是通过假设“第一次接触”NUMA 位置来实现的——当第一次写入分配的内存时,操作系统必须创建从进程虚拟地址空间到物理地址的映射,并且(默认情况下)操作系统选择位于与执行存储指令的内核相同的 NUMA 节点。
大多数系统中的“本地”带宽(到 DRAM)是近似对称的(用于读取和写入)并且相对容易理解。“远程”带宽对于读写来说更加不对称,并且在芯片之间传输的读/写命令与芯片之间传输的数据之间通常存在严重的争用。本地带宽与远程带宽的总体比率在不同代处理器之间也存在显着差异。对于某些处理器(例如,至强 E5 v3 和可能的 v4),互连速度相对较快,因此局部性较差的作业通常可以在两个插槽之间交错的所有内存的情况下运行。从那时起,本地带宽显着增加,更新的处理器通常强烈支持本地访问。
来自 Intel Xeon Platinum 8160 的示例(芯片之间的 2 个 UPI 链接):
套接字之间的组合读写流量变得更加复杂,因为从节点 0 到节点 1 的读取流量与从节点 1 到节点 0 的写入流量等竞争。
当然,本地访问与远程访问的不同比率会改变缩放比例。时间也可能是一个问题——如果线程同时进行本地访问,然后同时进行远程访问,那么远程访问部分将会有更多的争用(与线程正在执行它们的情况相比)在不同时间进行远程访问)。