我想在一台机器上运行批处理,比如20个CPU密集型比较(基本上是非常长的嵌套for循环)。
这20个作业中的每一个都不与其他19个作业共享数据。
如果机器有N个内核,我是否应该剥离其中的N-1个作业?或者N?或者我应该启动所有的20个,并让Windows找出如何安排它们?
发布于 2011-06-03 04:16:41
不幸的是,没有简单的答案。唯一确定的方法是实现并分析您的应用程序。
通常,为了获得最大吞吐量,如果作业是纯CPU作业,则每个核心需要一个作业。根据工作类型的不同,这将包括每个超线程代码一个或每个“真正的物理核心”一个。(如果所有20个作业的工作都是相同的,那么超线程通常会降低整个工作的速度……)
如果作业具有任何非CPU功能(例如读取文件、等待任何内容等),那么每个内核>1个工作项往往更好。对于许多情况,这将会有所改善。
发布于 2011-06-03 04:16:20
通常,如果您不共享数据,不阻塞IO,并且使用大量CPU而没有在计算机上运行其他任何东西(可能还有更多的警告),那么使用所有CPU(例如N个线程)可能是最好的想法。
最好的选择可能是让它成为可配置的,并分析它,看看会发生什么。
发布于 2011-06-03 04:17:05
您应该使用某种类型的线程池,以便在不影响程序结构的情况下(合理地)轻松地调整线程的数量。
完成这项工作后,就可以通过测试找到与可用处理器数量相关的合理的最佳线程数量。有可能的是,即使它们看起来像是纯粹的CPU限制,当线程数>N时,您也会获得更好的效率,但确定的唯一方法是测试。
https://stackoverflow.com/questions/6219830
复制相似问题