最大并行度决定最佳值

9

简单问题。

对于任何给定的算法,如何确定MaxDegreeOfParallelism的最佳值?需要考虑哪些因素以及需要权衡哪些方面?


2
它对每个算法都是特定的Amdahl's Law - Sanjeevakumar Hiremath
1
@Sanjeevakumar Hiremat 显然是我的观点,那么如何在不使用蛮力方法的情况下做出决定呢?虽然感谢您提供的链接。我会阅读的。 - Maxim Gershkovich
2个回答

14

我认为这取决于任务的性质。如果所有的任务都是"CPU绑定",那么并发线程数可能等于计算机中的CPU数量。然而,如果你的任务是"IO绑定",那么你可以逐步增加线程数。

当CPU需要从一个线程切换到另一个线程(上下文切换)时,会产生一定的开销,因此如果使用太多的线程,并且CPU在频繁地进行上下文切换,性能会降低。另一方面,如果限制该参数过多,并且操作是长时间的"IO绑定"操作,而CPU大部分时间都处于空闲状态等待这些任务完成...这意味着你没有充分利用你的计算机资源(而这正是多线程的目的)。

我认为这取决于每个算法,正如@Amdahls's Law指出的那样,没有通用的规则可以遵循,你需要进行计划和调整:D

干杯。


3

对于本地计算密集型进程,您应该尝试两个值:

  • 物理核心或处理器数量
  • 虚拟核心数(包括超线程的物理核心)

根据我的经验,其中一个是最佳的选择。有时使用超线程会减慢速度,通常它会有所帮助。在C#中,使用Environment.ProcessorCount查找包括超线程虚假核心在内的核心数。实际物理核心更难确定,请查看其他问题。

对于必须等待资源(数据库查询、文件检索)的进程,扩展规模可能会有所帮助。如果您必须等待80%的时间,那么每个进程需要启动5个线程,因此一个线程将随时处于繁忙状态。在本地最大化每个进程所需的5x20%。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接