gpt4 book ai didi

java - 更快的 CPU 不会提高性能,而增加线程数会。业内最好的共享内存计算机?

转载 作者:行者123 更新时间:2023-11-29 08:00:04 25 4
gpt4 key购买 nike

我目前有一个程序从多线程中受益匪浅。它启动了 n 个线程,每个线程执行 100M 次迭代。它们都使用共享内存,但根本没有同步。它近似于一些方程的解,当前的基准是:

1 thread:  precision 1 time: 150s
4 threads: precision 4 time: 150s

16 threads: precision 16 time: 150s
32 threads: precision 32 time: 210s
64 threads: precision 64 time: 420s

(精度越高越好)

我使用 Amazon EC2“集群计算八超大型实例”,它有 2 个 Intel Xeon E5-2670据我了解,它有 16 个真正的核心,因此程序线性改进到 16 个核心。它还具有 2x“超线程”,我的程序从中受益匪浅。使线程数超过 32 显然没有任何改进。

这些基准测试证明访问 RAM 不是“瓶颈”。

我还在 Intel Xeon E5645 上运行了这个程序,它有 12 个真正的内核。结果是:

1 thread: precision 1 time: 150s
4 threads: precision 4 time 150s
12 threads: precision 12 time 150s
24 threads: precision 24 time 220s

precision/(time*thread#) 类似于 Amazon 计算机,我不清楚,因为根据 cpu MHz (~1600对比~2600)和 http://www.cpubenchmark.net/cpu_list.php 'Passmark CPU Mark' 数字调整为

  1. 为什么使用更快的处理器并不能提高单线程性能,而增加线程数量却可以?
  2. 是否可以在使用共享 RAM 的同时租用比 2 x Intel Xeon E5-2670 更强大的多个 CPU 的服务器,这样我就可以在不做任何更改的情况下运行我的程序并获得更好的结果?

更新:

Xeon5645 上的 13 个线程需要 196 秒。

算法随机探索具有 3500 个节点的树。树的高度为 7。每个节点包含 250 个同样随机访问的 double 。很可能几乎没有数据被缓存。

最佳答案

您列出的两个 Intel CPU 的规范:

E5-2670 - 2.6ghz minimum [8 active cores]  (3.3ghz turbo on a single core)
E5645 - 2.4ghz minimum [6 active cores] (2.8ghz turbo on a single core)

所以这里至少有一个重要的问题要问你自己:

为什么您的应用作为单核没有更快?从 1 核到 1 核,速度下降更多 E5-2670 上的 8 个内核比切换到 E5645 时速度下降。您不应该注意到从 1 个线程到 16 个线程的线性进展,即使您的应用程序的线程间锁为零——随着更多线程被添加到它们的工作负载中,所有当前一代的 CPU 都会降低时钟速率。

至少在基本意义上,答案可能不是 RAM,而是“L1/L2 缓存”。 L1/L2 缓存对于应用程序性能比 RAM 吞吐量重要得多。现代英特尔 CPU 的设计理念是 L1/L2 缓存命中率可能会很好(如果不是很好的话)。如果 L1/L2 缓存被一种在没有频繁重用模式的情况下搅动数兆字节内存的算法变得无用,那么 CPU 基本上将成为 RAM 延迟 的瓶颈。

RAM 延迟不是 RAM 吞吐量

虽然 ram 的吞吐量可能足以随着时间的推移跟上您的所有线程,但延迟却不是。从 RAM 读取延迟为 80-120 个周期,具体取决于 CPU 时钟倍频器。相比之下,L1 的延迟读取为 3 个周期,L2 为 11-12 个周期。因此,如果您的算法的某些部分总是导致从 RAM 中获取数据,那么该部分将始终需要很长时间才能执行,并且在不同的 CPU 上大约需要相同的时间,因为 ram 延迟会大致相同。 Xeon 上的 100 个周期足够长,即使是针对 RAM 的单个停顿也可能成为算法中的主要热点(考虑到这些芯片每个周期平均 3 条指令)。

我不知道这是否是您的应用程序的真正瓶颈,因为我不知道它在每次迭代中处理了多少数据,或者它使用什么访问 ram 模式。但这是跨多个线程配置和不同 Xeon CPU 进行恒定时间算法的唯一解释之一。

(编辑:这些 Xeon 芯片上也有一个共享的 L3 缓存,但它的用处非常有限。L3 访问的延迟为 50-60 个周期——比 RAM 好,但也好不了多少。而且有机会达到 L3如果 L1/L2 都已经无效,则非常 slim 。如前所述,这些芯片在设计时考虑了高 L1/L2 命中率:L3 缓存安排的构建方式是为了弥补 L1/L2 偶尔的失误,并且本身不能很好地将数据作为主缓存提供)

关于java - 更快的 CPU 不会提高性能,而增加线程数会。业内最好的共享内存计算机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com