1

我目前有一个从多线程中受益匪浅的程序。它启动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

(精度越高越好)

我使用具有 2 x Intel Xeon E5-2670 的 Amazon EC2“集群计算 8 个超大型实例”据我了解,它有 16 个真正的内核,因此程序的线性改进高达 16 个内核。它还具有 2 倍的“超线程”,我的程序从中有所收获。使线程数超过 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#)类似于亚马逊计算机,这对我来说不清楚,因为根据 cpu MHz (~1600 vs ~2600) 和http://www.cpubenchmark.net/cpu_list.php,Xeon E5-2670 中的每个内核都快了 ~1.5 “Passmark CPU Mark”数字调整为

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

更新:

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

算法随机探索具有 3500 个节点的树。树的高度为 7。每个节点包含 250 个双精度数,它们也是随机访问的。很可能几乎没有数据被缓存。

4

2 回答 2

5

您列出的两个 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)

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

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

至少在基本意义上,答案可能不是 RAM,而是“L1/L2 缓存”。对于应用程序性能而言,L1/L2 缓存比 RAM 吞吐量更重要。现代 Intel 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 都已经失效了。如前所述,这些芯片在设计时考虑到了高 L1/L2 命中率:L3 缓存安排的构建方式是为了弥补 L1/L2 的偶尔未命中,而不是很好地将数据作为主缓存本身)

于 2013-02-18T16:52:47.177 回答
0

两个提示:
1)将线程数设置为 num cores + 1。2
)cpu 速度影响不大,它也是一级和二级 cpu 缓存的速度和大小。还有记忆。(我的 Quadcore 名义上比我的双核笔记本电脑快 20%,但实际上使用单线程高 cpu 应用程序。它快 400 - 800%。(由于更快的内存、cpu 设计、缓存等)

服务器处理能力通常低于私人 PC,因为它们的设计更注重稳健性和 24 小时正常运行时间。

于 2013-02-18T13:52:30.173 回答