加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Plinq,Cores和WithDegreeOfParallelism?

发布时间:2020-12-15 08:08:35 所属栏目:百科 来源:网络整理
导读:据我所知,P linq决定打开多少线程(每个线程在不同核心的线程上) 按核心数计算. __________ Core 1 Core 2 Core 3 Core 4___________ 所以,如果我有一个找到所有前1000个素数的Plinq任务, Plink将在每个Core上打开一个新的Thread,以便最大限度地提高效率. 所
据我所知,P linq决定打开多少线程(每个线程在不同核心的线程上)
按核心数计算.
__________

  Core 1
  Core 2
  Core 3
  Core 4
___________

所以,如果我有一个找到所有前1000个素数的Plinq任务,
Plink将在每个Core上打开一个新的Thread,以便最大限度地提高效率.

所以在这里,每个核心将运行1000/4数字,这是找到素数的逻辑.

但是我已经读过像IO这样的阻塞操作应该与WithDegreeOfParallelism一起使用,这样cpu就不会认为这是一个密集的cpu操作,它允许使用比核心更多的线程.

题 :

1)准确吗?我理解正确了吗?

2)如果我设置WithDegreeOfParallelism(7)所以它肯定会使用所有4个核心,但其他3个核心呢? (7-4)他们将在哪里运行?在哪个核心?

解决方法

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

它甚至更复杂.线程通常不在单个核心上运行,操作系统始终将其从核心切换到核心.例如,请查看任务管理器中的以下屏幕截图,其中显示了单线程CPU密集型应用程序的执行情况.

您会注意到我的所有4个内核上都执行了单个线程,并且在运行的几秒钟内利用了每个内核的大约25%.

.Net不了解您的计算机的CPU使用情况,因此它假定执行CPU密集型工作的最佳线程数与核心数相同.

我不知道PLINQ究竟是如何工作的,但我不希望每个核心在你的例子中产生正好1000/4的素数.如果一个线程已经产生了它的素数份额而另一个线程尚未完成,那么让第一个线程保持空闲是不合适的.

是的,对于IO操作,最佳线程数不依赖于核心数,因此您应手动设置并行度. (不要忘记,最佳线程数可能是1;硬盘在顺序读取时速度最快,而不是在许多文件之间来回搜索.)

如果你设置WithDegreeOfParallelism(7)它肯定会使用7个线程(同样,不保证核心数).操作系统将决定如何在4核上运行这7个线程.如果所有这些线程都是CPU密集型的,那么它很可能会给每个线程提供类似4 /7≈57%核心的线程.如果它们是IO绑定的,它将执行刚刚在任何可用核心上唤醒(解除阻塞)的线程的代码.

并且WithDegreeOfParallelism()确实设置了确切的线程数,而不是它们的最大数量,请参阅Stephen Toub的ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读