我目前有一个从多线程中受益匪浅的程序。它启动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”数字调整为
- 为什么使用更快的处理器并不能提高单线程性能,而增加线程数却可以?
- 是否可以在使用共享 RAM 的同时租用多个 CPU 比 2 x Intel Xeon E5-2670 更强大的服务器,这样我就可以在不进行任何更改的情况下运行我的程序并获得更好的结果?
更新:
Xeon5645 上的 13 个线程需要 196 秒。
算法随机探索具有 3500 个节点的树。树的高度为 7。每个节点包含 250 个双精度数,它们也是随机访问的。很可能几乎没有数据被缓存。