我有一个使用多线程作为其主要操作的应用程序被划分为在的数据结构上执行的同一块代码。
将其视为一个树,每个节点在其他节点上执行操作。所以我为每个节点的操作创建线程。
我在 2 台机器上测试了此代码的性能,并显示了线程图的执行时间 vs no。
我的问题是...给出相同的代码。为什么会发生这种差异?(为什么它比其他机器快速饱和)
此外,为 48 机器运行相同的代产生更糟糕的结果?
红线机器规格:CPU:16 个联机 CPU 列表:每个内核 0-15 个线程:每个插槽 1 个内核:4 个插槽:4 个 NUMA 节点:2
Blue Line 机器规格:CPU:8 个联机 CPU 列表:每个内核 0-7 个线程:每个插槽 1 个内核:4 个插槽:2 个 NUMA 节点:1
相同的核心速度和相同的缓存值。
从答案确认::试过
numactl--cpunodebind = 0--membind = 0 {exe}
在单个 numa 节点上运行,结果是一致的。。这是 numa 问题
机器非常不同。一个是 NUMA,另一个不是。在不同 NUMA 节点上运行的线程大大增加了同步成本。甚至内存分配的方式对性能也很重要。
编写可很好地扩展到大型 NUMA 计算机的并行代码可能非常困难。避免线程之间不必要的同步并在主要使用它的 NUMA 节点上分配内存很重要。如果一个或多个线程经常写入一个缓存行并从不同的 NUMA 节点读取,这也是非常昂贵的。(这就是为什么在 NUMA 机器上与互斥体或读写锁等常规并发原语的同步非常昂贵。)
作为权宜之计,如果将进程固定到位于同一 NUMA 节点上的内核,则在 NUMA 情况下可能会获得更好的性能。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(8条)