据我了解,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的?
首先,.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
。