简单的问题。
如何确定MaxDegreeOfParallelism对于任何给定算法的最佳值?需要考虑哪些因素以及权衡取舍?
答案 0 :(得分:12)
我认为这取决于,如果您的所有任务都是“CPU绑定”,那么它可能等于您机器中的CPU数量。然而,如果你的任务是“IO绑定”,你可以开始增加数量。
当CPU必须从一个线程切换到另一个线程(上下文切换)时,它有成本,因此如果您使用太多线程并且CPU一直在切换,则会降低性能。另一方面,如果你过分限制该参数,并且操作是长“IO绑定”操作,并且CPU空闲了很长时间等待这些任务完成...你没有充分利用你的机器的资源(这就是多线程的意义)
我认为这取决于每个算法,正如@ Amdahls的法律所指出的那样,并且没有你可以遵循的主经验法则,你将不得不计划它并调整它:D
干杯。
答案 1 :(得分:3)
对于本地计算密集型流程,您应该尝试两个值;
其中一项在我的经验中是最佳的。有时使用超线程会减慢速度,通常会有所帮助。在C#中使用Environment.ProcessorCount来查找包括超线程假核心的核心数。实际的物理内核更难确定。检查其他问题。
对于必须等待资源的进程(db查询,文件检索),扩展可以提供帮助。如果你必须等待80%的时间进程繁忙,那么经验法则是为它启动5个线程,这样一个线程就会随时忙碌。每个过程最大化5x20%需要本地化。