CPU密集型线程智慧



我想在一台机器上运行一个批处理,比如说20个CPU密集型编译(基本上是为循环嵌套的)。

这20个职位中的每一个都不会与其他19个职位共享数据。

如果机器有N个核心,那么我应该剥离其中的N-1个作业吗?还是N?或者我应该启动所有20个,让Windows知道如何安排它们?

不幸的是,没有简单的答案。唯一可以确定的方法是实现并配置您的应用程序。

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

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

一般来说,如果你不共享数据,不阻塞IO,使用大量CPU,而盒子上没有其他东西运行(可能还有一些注意事项),那么使用所有CPU(例如N个线程)可能是最好的主意。

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

您应该使用某种类型的线程池,这样在不影响程序结构的情况下调整线程数量(相当)容易。

一旦你做到了这一点,就可以很简单地进行测试,找到相对于可用处理器数量合理优化的线程数量。很有可能,即使它们看起来应该是纯粹的CPU绑定,线程数量>N时,您也会获得更好的效率,但唯一可以确定的方法是测试。

最新更新