多线程行为从机器更改为其他

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 情况下获得更好的性能。