2011-06-09 69 views
1

好吧,我正在解决一个非常隐隐的问题。 - 从一个共同的源生成素数(这不是安静尴尬的并行,因为它们被写入(如果他们是一个因素从检查读取) 利息:http://pastebin.com/sQQLpMgB最佳线程数

在任何情况下,事情启发了我写这个(部分)是实现我的访问this 双Xeon E5520的CPU(带IIRC 16GB RAM与它去)

所以我知道,每个CPU支持8个活动线程。 但随后有背景进程(以及可能的其他用户)使用其中的一些(实际上可能更多的是所有这些) 那么什么是星期四的好规则多少个线程让事情变得更快,在他们被头顶阻挡之前。 (我想这条规则需要考虑有多少线程可以同时激活)

回答

2

没有这样的规则。这取决于很多因素,特别是你的应用程序是否受I/O限制(听起来像你的不是)。要做的事情是参数化线程的数量,以便可以从配置文件或命令行指定它,然后使用该数字进行处理,直到找到适合您的特定问题和配置的最佳位置。

+0

你可以建议一个适合的工具,如果我已经击中最佳位置了吗? – 2011-06-10 00:13:39

+0

@Oxinabox二进制搜索? – 2011-06-10 00:29:45

+0

Binery搜索会起作用,是的。好想法。 (花了我30秒来解决你的问题)。我甚至可以把决定理想线程数的位,在每次启动hte程序时运行,因此它总是以最佳方式运行。 – 2011-06-10 01:01:36

1

如果操作大部分是CPU绑定的(不等待I/O操作),那么第一个猜测与逻辑CPU内核的数目是1对1。考虑到生成素数大多是CPU绑定的,并且您将拥有16个逻辑内核,那么我将使用16个线程开始开始。做一些测试,看看会发生什么。我预计性能会在16个线程左右达到峰值,但这取决于发生多少I/O来存储已生成的素数。