CPU密集型线程智慧

时间:2011-06-02 20:13:23

标签: windows multithreading cpu

我想在一台机器上运行一批20个CPU密集型comps(基本上很长时间嵌套for循环)。

这20个工作中的每一个都不与其他工作共享数据。

如果机器有N个核心,那么我应该将这些作业中的N-1分开吗?还是N?或者我应该只启动所有20个,并让Windows弄清楚如何安排它们?

3 个答案:

答案 0 :(得分:5)

不幸的是,没有简单的答案。确切知道的唯一方法是实施并随后分析您的应用程序。

通常,为了获得最大吞吐量,如果作业是纯CPU,则每个核心需要一个。根据工作类型,这将包括每个超线程代码一个或每个“真正的物理核心”一个。 (如果所有20个工作的工作相同,那么超线程通常会减慢整体工作......)

如果作业具有任何非CPU功能(例如读取文件,等待任何内容等),那么>每个核心的1个工作项往往会好得多。在许多情况下,这会有所改善。

答案 1 :(得分:3)

通常情况下,如果您不共享数据,不会阻塞IO,并且使用大量CPU,并且使用所有CPU(例如N个线程)的框中没有任何其他内容正在运行(可能还有一些注意事项)最好的主意。

最好的选择可能是让它可配置并对其进行分析,看看会发生什么。

答案 2 :(得分:2)

您应该使用某种线程池,因此(合理地)可以轻松调整线程数而不影响程序结构。

完成上述操作后,相对于可用处理器数量,找到相当理想的线程数是一个相当简单的测试问题。有可能即使它们/如果它们看起来应该是纯粹的CPU绑定,你将获得更好的线程数> N的效率,但关于唯一的方法是确保测试。