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



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

在不同的NUMA区域中的两个或多个核心之间划分工作有什么好处吗?同样,跨区域工作是否会减少可用带宽?

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

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

例如,STREAM基准测试通常在允许来自每个线程的几乎所有访问都是"本地"的配置中运行。这是通过假设"第一次接触"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

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

最新更新