MaxDegreeOfParallelism决定最佳价值

时间:2011-03-23 06:41:30

标签: c# .net multithreading parallel-processing task-parallel-library

简单的问题。

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

2 个答案:

答案 0 :(得分:12)

我认为这取决于,如果您的所有任务都是“CPU绑定”,那么它可能等于您机器中的CPU数量。然而,如果你的任务是“IO绑定”,你可以开始增加数量。

当CPU必须从一个线程切换到另一个线程(上下文切换)时,它有成本,因此如果您使用太多线程并且CPU一直在切换,则会降低性能。另一方面,如果你过分限制该参数,并且操作是长“IO绑定”操作,并且CPU空闲了很长时间等待这些任务完成...你没有充分利用你的机器的资源(这就是多线程的意义)

我认为这取决于每个算法,正如@ Amdahls的法律所指出的那样,并且没有你可以遵循的主经验法则,你将不得不计划它并调整它:D

干杯。

答案 1 :(得分:3)

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

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

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

对于必须等待资源的进程(db查询,文件检索),扩展可以提供帮助。如果你必须等待80%的时间进程繁忙,那么经验法则是为它启动5个线程,这样一个线程就会随时忙碌。每个过程最大化5x20%需要本地化。