多线程行为从机器更改为其他
Multi threaded behavior changes from machine to other
我有一个使用多线程的应用程序,因为它的主要操作被分成在独立的数据结构上执行的相同代码块。
将其视为一棵树,其中每个节点都独立于其他节点执行操作。所以我为每个节点的操作创建线程。
我在 2 台机器上测试了这段代码的性能,显示了执行时间与线程数的关系图。
我的问题是 ... 给定相同的代码。为什么会发生这种差异? (为什么它在机器上比另一个饱和得快)
此外,运行对 48 台机器使用相同的代码会得到更差的结果?
RED line 机器规格:
CPU(s): 16
在线 CPU(s) 名单:0-15
每核心线程数:1
每个插槽的核心数:4
插座:4
NUMA 节点:2
蓝线机器规格:
CPU(s): 8
在线 CPU(s) 名单:0-7
每核心线程数:1
每个插槽的核心数:4
插座:2
NUMA 节点:1
相同的核心速度和相同的缓存值。
从回答中确认::
尝试过
numactl --cpunodebind=0 --membind=0 {exe}
在单个 numa 节点上 到 运行,结果一致。这是 numa 问题
机器非常不同。一个是 NUMA,另一个不是。不同 NUMA 节点上的线程 运行 大大增加了同步成本。甚至内存分配方式对性能也很重要。
编写可很好扩展到大型 NUMA 机器的并行代码可能非常困难。重要的是要避免线程之间不必要的同步,并在主要使用它的 NUMA 节点上分配内存。如果一个缓存行经常由一个或多个线程写入并从不同的 NUMA 节点读取,则成本也会非常高。 (这就是在 NUMA 机器上与常规并发原语(如互斥锁或读写锁)同步的原因如此昂贵。)自旋锁也可能具有非常差的性能。
作为权宜之计,如果您将进程固定到位于同一 NUMA 节点上的内核,您可能会在 NUMA 情况下获得更好的性能。
我有一个使用多线程的应用程序,因为它的主要操作被分成在独立的数据结构上执行的相同代码块。
将其视为一棵树,其中每个节点都独立于其他节点执行操作。所以我为每个节点的操作创建线程。
我在 2 台机器上测试了这段代码的性能,显示了执行时间与线程数的关系图。
我的问题是 ... 给定相同的代码。为什么会发生这种差异? (为什么它在机器上比另一个饱和得快)
此外,运行对 48 台机器使用相同的代码会得到更差的结果?
RED line 机器规格: CPU(s): 16 在线 CPU(s) 名单:0-15 每核心线程数:1 每个插槽的核心数:4 插座:4 NUMA 节点:2
蓝线机器规格: CPU(s): 8 在线 CPU(s) 名单:0-7 每核心线程数:1 每个插槽的核心数:4 插座:2 NUMA 节点:1
相同的核心速度和相同的缓存值。
从回答中确认:: 尝试过
在单个 numa 节点上numactl --cpunodebind=0 --membind=0 {exe}
到 运行,结果一致。这是 numa 问题
机器非常不同。一个是 NUMA,另一个不是。不同 NUMA 节点上的线程 运行 大大增加了同步成本。甚至内存分配方式对性能也很重要。
编写可很好扩展到大型 NUMA 机器的并行代码可能非常困难。重要的是要避免线程之间不必要的同步,并在主要使用它的 NUMA 节点上分配内存。如果一个缓存行经常由一个或多个线程写入并从不同的 NUMA 节点读取,则成本也会非常高。 (这就是在 NUMA 机器上与常规并发原语(如互斥锁或读写锁)同步的原因如此昂贵。)自旋锁也可能具有非常差的性能。
作为权宜之计,如果您将进程固定到位于同一 NUMA 节点上的内核,您可能会在 NUMA 情况下获得更好的性能。