多线程行为从计算机更改为其他线程

时间:2019-01-06 08:41:24

标签: multithreading pthreads multicore numa cpu-cores

我有一个使用多线程的应用程序,因为它的主要操作分为在独立数据结构上执行的同一代码块。

将其视为一棵树,其中每个节点独立于其他节点执行操作。所以我为每个节点的操作创建线程。

我在2台计算机上测试了此代码的性能,并显示了执行时间与线程图的对比。

我的问题是 ... 给出了相同的代码。为什么会发生这种差异? (为什么它会比其他机器更快地饱和)

还要在48台计算机上运行相同的代码会导致更糟糕的结果吗?

enter image description here

红线机器规格 : 处理器:16 在线CPU列表:0-15 每个核心线程数:1 每个插槽的核心数:4 插座:4 NUMA个节点:2

蓝线机器规格 : 处理器:8 在线CPU列表:0-7 每个核心线程数:1 每个插槽的核心数:4 插座:2 NUMA个节点:1

相同和相同的缓存值的核心速度

从答案中确认:: 尝试过

  
    

numactl --cpunodebind = 0 --membind = 0 {exe}

  

在单个numa节点上运行,结果是一致的。这是numa问题

1 个答案:

答案 0 :(得分:0)

机器非常不同。一个是NUMA,另一个不是。在不同的NUMA节点上运行的线程大大增加了同步成本。即使分配内存的方式对于性能也很重要。

编写能够很好地适应大型NUMA机器的并行代码可能非常困难。重要的是避免线程之间不必要的同步,并在主要使用它的NUMA节点上分配内存。如果一个高速缓存行频繁地由一个或多个线程写入并从另一个NUMA节点读取,这也非常昂贵。 (这就是使与常规并发原语(例如互斥锁或读写锁)进行同步的成本在NUMA计算机上非常昂贵的原因。)自旋锁的性能也很差。

作为一种权宜之计,如果将进程固定到位于同一NUMA节点上的内核,则在NUMA情况下可能会获得更好的性能。

相关问题