-->

PLINQ,内核和WithDegreeOfParallelism?(Plinq, Cores and

2019-06-27 04:16发布

据我了解,PLINQ决定多少线程打开(在每一个不同的内核线程)的核数。

__________

  Core 1
  Core 2
  Core 3
  Core 4
___________

所以,如果我有一个PLINQ的任务,找到所有前1000张质数的Plink将打开一个新Thread on each Core ,以最大限度地提高效率。

所以在这里,每个核心将在四分之千号码,发现素数的逻辑运行。

但是我读过,如阻塞操作IO应使用WithDegreeOfParallelism这样CPU就不会认为这是一个密集的CPU运算,并允许使用more线程比cores

题 :

1)它是准确的? 难道我理解正确的话?

2)如果我设置WithDegreeOfParallelism (7)所以它肯定会使用所有4个内核,但对于其他的3? (7-4),其中将它们运行? 在其核心/ s的?

Answer 1:

首先,.NET不选择哪个核心执行哪个线程的操作系统一样。 如果在系统上运行的任何其他CPU密集型应用程序,你可以期望每个线程将执行在一个单独的核心。 但是,如果有一些其他的应用程序,例如操作系统可能会决定在单一内核上运行的所有线程,它们之间切换。

它甚至比这更复杂。 线程通常不会在单核上运行,操作系统切换它从核心网到核心的所有时间。 例如,看看从任务管理器下面的屏幕截图示出了一个单线程CPU密集型应用程序的执行。

你会发现,在单个线程上的所有我的4个内核的执行,它跑了几秒钟,在利用每个核心的约25%。

.Net有没有您的计算机的CPU使用率的知识,所以它假定线程做CPU密集型工作的最佳数量是相同的内核数量。

我不知道究竟怎样PLINQ的工作,但我不希望每个核心在你的榜样产生完全相同四分之千素数。 如果一个线程已经生产出了素数的份额,另外一个还没有完成,它不会是有效的,让第一线留下的空闲。

是的,与IO操作,线程的最佳数量不依赖于核心数量,所以你应该手动设置并行度。 (别忘了最佳线程数可为1;硬碟是用最快的顺序读取,不求来回多个文件之间)。

如果设置WithDegreeOfParallelism(7)它一定会用7个线程 (同样不上的内核数量担保)。 操作系统将决定如何在4个内核运行的7成一线。 如果这些线程是CPU密集型的,它很可能给每个线程像一个核心的4/7≈57%。 如果他们IO的限制,它会执行代码的线程,只是在任何核心,这只是提供醒来(畅通)。

WithDegreeOfParallelism()确实将线程的确切数量,而不是他们的最大数量,可参见Stephen Toub的ParallelOptions.MaxDegreeOfParallelism VS PLINQ的WithDegreeOfParallelism



文章来源: Plinq, Cores and WithDegreeOfParallelism?